= this.accountService.activeAccount$.pipe(
@@ -191,6 +209,14 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
switchMap((id) => this.organizationService.organizations$(id)),
);
+ protected readonly submitButtonText = computed(() => {
+ return this.cipher()?.isArchived &&
+ !this.userHasPremium() &&
+ this.cipherArchiveService.hasArchiveFlagEnabled$
+ ? this.i18nService.t("unArchiveAndSave")
+ : this.i18nService.t("save");
+ });
+
protected hasArchivedCiphers$ = this.userId$.pipe(
switchMap((userId) =>
this.cipherArchiveService.archivedCiphers$(userId).pipe(map((ciphers) => ciphers.length > 0)),
@@ -237,18 +263,6 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
) {}
async ngOnInit() {
- this.accountService.activeAccount$
- .pipe(
- filter((account): account is Account => !!account),
- switchMap((account) =>
- this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id),
- ),
- takeUntil(this.componentIsDestroyed$),
- )
- .subscribe((canAccessPremium: boolean) => {
- this.userHasPremiumAccess = canAccessPremium;
- });
-
// Subscribe to filter changes from router params via the bridge service
// Use combineLatest to react to changes in both the filter and archive flag
combineLatest([
@@ -306,30 +320,40 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
this.showingModal = false;
break;
case "copyUsername": {
- if (this.cipher?.login?.username) {
- this.copyValue(this.cipher, this.cipher?.login?.username, "username", "Username");
+ if (this.cipher()?.login?.username) {
+ this.copyValue(
+ this.cipher(),
+ this.cipher()?.login?.username,
+ "username",
+ "Username",
+ );
}
break;
}
case "copyPassword": {
- if (this.cipher?.login?.password && this.cipher.viewPassword) {
- this.copyValue(this.cipher, this.cipher.login.password, "password", "Password");
+ if (this.cipher()?.login?.password && this.cipher().viewPassword) {
+ this.copyValue(
+ this.cipher(),
+ this.cipher().login.password,
+ "password",
+ "Password",
+ );
await this.eventCollectionService
- .collect(EventType.Cipher_ClientCopiedPassword, this.cipher.id)
+ .collect(EventType.Cipher_ClientCopiedPassword, this.cipher().id)
.catch(() => {});
}
break;
}
case "copyTotp": {
if (
- this.cipher?.login?.hasTotp &&
- (this.cipher.organizationUseTotp || this.userHasPremiumAccess)
+ this.cipher()?.login?.hasTotp &&
+ (this.cipher().organizationUseTotp || this.userHasPremium())
) {
const value = await firstValueFrom(
- this.totpService.getCode$(this.cipher.login.totp),
+ this.totpService.getCode$(this.cipher().login.totp),
).catch((): any => null);
if (value) {
- this.copyValue(this.cipher, value.code, "verificationCodeTotp", "TOTP");
+ this.copyValue(this.cipher(), value.code, "verificationCodeTotp", "TOTP");
}
}
break;
@@ -453,7 +477,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
return;
}
this.cipherId = cipher.id;
- this.cipher = cipher;
+ this.cipher.set(cipher);
this.collections =
this.filteredCollections?.filter((c) => cipher.collectionIds.includes(c.id)) ?? null;
this.action = "view";
@@ -472,7 +496,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
}
async openAttachmentsDialog() {
- if (!this.userHasPremiumAccess) {
+ if (!this.userHasPremium()) {
return;
}
const dialogRef = AttachmentsV2Component.open(this.dialogService, {
@@ -633,7 +657,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
},
});
}
- if (cipher.login.hasTotp && (cipher.organizationUseTotp || this.userHasPremiumAccess)) {
+ if (cipher.login.hasTotp && (cipher.organizationUseTotp || this.userHasPremium())) {
menu.push({
label: this.i18nService.t("copyVerificationCodeTotp"),
click: async () => {
@@ -690,7 +714,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
return;
}
this.cipherId = cipher.id;
- this.cipher = cipher;
+ this.cipher.set(cipher);
await this.buildFormConfig("edit");
if (!cipher.edit && this.config) {
this.config.mode = "partial-edit";
@@ -704,7 +728,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
return;
}
this.cipherId = cipher.id;
- this.cipher = cipher;
+ this.cipher.set(cipher);
await this.buildFormConfig("clone");
this.action = "clone";
await this.go().catch(() => {});
@@ -753,7 +777,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
return;
}
this.addType = type || this.activeFilter.cipherType;
- this.cipher = new CipherView();
+ this.cipher.set(new CipherView());
this.cipherId = null;
await this.buildFormConfig("add");
this.action = "add";
@@ -785,14 +809,14 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
);
this.cipherId = cipher.id;
- this.cipher = cipher;
+ this.cipher.set(cipher);
await this.go().catch(() => {});
await this.vaultItemsComponent?.refresh().catch(() => {});
}
async deleteCipher() {
this.cipherId = null;
- this.cipher = null;
+ this.cipher.set(null);
this.action = null;
await this.go().catch(() => {});
await this.vaultItemsComponent?.refresh().catch(() => {});
@@ -807,7 +831,7 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
async cancelCipher(cipher: CipherView) {
this.cipherId = cipher.id;
- this.cipher = cipher;
+ this.cipher.set(cipher);
this.action = this.cipherId ? "view" : null;
await this.go().catch(() => {});
}
@@ -881,14 +905,16 @@ export class VaultComponent implements OnInit, OnDestroy, CopyClickListener {
/** Refresh the current cipher object */
protected async refreshCurrentCipher() {
- if (!this.cipher) {
+ if (!this.cipher()) {
return;
}
- this.cipher = await firstValueFrom(
- this.cipherService.cipherViews$(this.activeUserId!).pipe(
- filter((c) => !!c),
- map((ciphers) => ciphers.find((c) => c.id === this.cipherId) ?? null),
+ this.cipher.set(
+ await firstValueFrom(
+ this.cipherService.cipherViews$(this.activeUserId!).pipe(
+ filter((c) => !!c),
+ map((ciphers) => ciphers.find((c) => c.id === this.cipherId) ?? null),
+ ),
),
);
}
From 1be55763a3f87de5efdbccd1282ec92ca9da611a Mon Sep 17 00:00:00 2001
From: Brad <44413459+lastbestdev@users.noreply.github.com>
Date: Thu, 12 Feb 2026 11:17:09 -0800
Subject: [PATCH 023/134] [PM-31689] Fix Org 2FA report: cipher names should
always show #18927
Fix issue where ciphers appearing in the Org 2FA report would render without the cipher name shown. This was happening for all ciphers in Collections the active User did not have access to.
---
.../inactive-two-factor-report.component.html | 54 ++++++++-----------
1 file changed, 23 insertions(+), 31 deletions(-)
diff --git a/apps/web/src/app/dirt/reports/pages/inactive-two-factor-report.component.html b/apps/web/src/app/dirt/reports/pages/inactive-two-factor-report.component.html
index 4999d572969..83c7e566619 100644
--- a/apps/web/src/app/dirt/reports/pages/inactive-two-factor-report.component.html
+++ b/apps/web/src/app/dirt/reports/pages/inactive-two-factor-report.component.html
@@ -60,42 +60,34 @@
@if (!organization || canManageCipher(row)) {
-
- {{ row.name }}
-
+ {{ row.name }}
} @else {
-
- {{ row.name }}
-
+ {{ row.name }}
}
@if (!organization && row.organizationId) {
-
-
- {{ "shared" | i18n }}
-
+
+ {{ "shared" | i18n }}
}
@if (row.hasAttachments) {
-
-
- {{ "attachments" | i18n }}
-
+
+ {{ "attachments" | i18n }}
}
{{ row.subTitle }}
From 2a72d2e74d08c4ea05ac22ac5414d9484e5ab0fb Mon Sep 17 00:00:00 2001
From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com>
Date: Thu, 12 Feb 2026 13:52:29 -0800
Subject: [PATCH 024/134] [PM-25685][PM-31077] - Migrate all Folder models
(#17077)
* enforce strict types on folders
* fix folder api service
* fix tests
* fix test
* fix type issue
* fix test
* add extra checks for folders. add specs
* fix folder.id checks
* fix id logic
* remove unecessary check
* name name and id optional in folder model
* fix tests
* Update folder and folderview
* fix folder with id export
* fix tests
* fix tests
* more defensive typing
* fix tests
* no need to check for presence
* check for empty name in folder toDomain
* fixes to folder
* initialize id in folder constructor. fix failing tests
* remove optional param to folder constructor
* fix folder
* fix test
* remove remaining checks for null folder id
* fix logic
* pass null for empty folder ids
* make id more explicit
* fix failing test
* fix failing test
* fix "No Folder" filter
---
.../vault-popup-list-filters.service.spec.ts | 4 +-
.../vault-popup-list-filters.service.ts | 12 ++----
.../models/vault-filter.model.spec.ts | 11 +++++
.../vault-filter/models/vault-filter.model.ts | 15 +++++--
.../services/vault-filter.service.ts | 2 +-
.../common/src/models/export/folder.export.ts | 10 ++---
.../src/vault/models/data/folder.data.ts | 19 +++++----
.../src/vault/models/domain/folder.spec.ts | 42 +++++++++++++------
libs/common/src/vault/models/domain/folder.ts | 39 +++++++----------
.../models/request/folder-with-id.request.ts | 2 +-
.../src/vault/models/view/folder.view.ts | 21 ++++++----
.../services/folder/folder-api.service.ts | 6 +--
.../services/folder/folder.service.spec.ts | 11 ++---
.../src/components/import.component.ts | 2 +-
libs/importer/src/importers/base-importer.ts | 7 ++--
.../importers/keepass2-xml-importer.spec.ts | 2 +-
.../password-depot-17-xml-importer.spec.ts | 9 +++-
.../individual-vault-export.service.spec.ts | 20 ++++-----
.../individual-vault-export.service.ts | 6 +--
.../add-edit-folder-dialog.component.spec.ts | 2 +-
libs/vault/src/models/filter-function.spec.ts | 8 ++++
libs/vault/src/models/filter-function.ts | 6 ++-
.../routed-vault-filter-bridge.model.ts | 2 +-
libs/vault/src/models/vault-filter.model.ts | 2 +-
.../routed-vault-filter-bridge.service.ts | 2 +-
.../src/services/vault-filter.service.spec.ts | 4 +-
.../src/services/vault-filter.service.ts | 4 +-
27 files changed, 157 insertions(+), 113 deletions(-)
diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts
index 1358c5faebe..52703284679 100644
--- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts
+++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts
@@ -438,7 +438,7 @@ describe("VaultPopupListFiltersService", () => {
describe("folders$", () => {
it('returns no folders when "No Folder" is the only option', (done) => {
- folderViews$.next([{ id: null, name: "No Folder" }]);
+ folderViews$.next([{ id: "", name: "No Folder" }]);
service.folders$.subscribe((folders) => {
expect(folders).toEqual([]);
@@ -448,7 +448,7 @@ describe("VaultPopupListFiltersService", () => {
it('moves "No Folder" to the end of the list', (done) => {
folderViews$.next([
- { id: null, name: "No Folder" },
+ { id: "", name: "No Folder" },
{ id: "2345", name: "Folder 2" },
{ id: "1234", name: "Folder 1" },
]);
diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts
index 85c415d01fe..3b220e4719c 100644
--- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts
+++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts
@@ -387,7 +387,7 @@ export class VaultPopupListFiltersService {
FolderView[],
PopupCipherViewLike[],
] => {
- if (folders.length === 1 && folders[0].id === null) {
+ if (folders.length === 1 && !folders[0].id) {
// Do not display folder selections when only the "no folder" option is available.
return [filters as PopupListFilter, [], cipherViews];
}
@@ -396,7 +396,7 @@ export class VaultPopupListFiltersService {
folders.sort(Utils.getSortFunction(this.i18nService, "name"));
let arrangedFolders = folders;
- const noFolder = folders.find((f) => f.id === null);
+ const noFolder = folders.find((f) => !f.id);
if (noFolder) {
// Update `name` of the "no folder" option to "Items with no folder"
@@ -406,7 +406,7 @@ export class VaultPopupListFiltersService {
};
// Move the "no folder" option to the end of the list
- arrangedFolders = [...folders.filter((f) => f.id !== null), updatedNoFolder];
+ arrangedFolders = [...folders.filter((f) => f.id), updatedNoFolder];
}
return [filters as PopupListFilter, arrangedFolders, cipherViews];
},
@@ -545,11 +545,7 @@ export class VaultPopupListFiltersService {
// When the organization filter changes and a folder is already selected,
// reset the folder filter if the folder does not belong to the new organization filter
- if (
- currentFilters.folder &&
- currentFilters.folder.id !== null &&
- organization.id !== MY_VAULT_ID
- ) {
+ if (currentFilters.folder && currentFilters.folder.id && organization.id !== MY_VAULT_ID) {
// Get all ciphers that belong to the new organization
const orgCiphers = this.cipherViews.filter((c) => c.organizationId === organization.id);
diff --git a/libs/angular/src/vault/vault-filter/models/vault-filter.model.spec.ts b/libs/angular/src/vault/vault-filter/models/vault-filter.model.spec.ts
index a2f8aa7a352..b45472ad01c 100644
--- a/libs/angular/src/vault/vault-filter/models/vault-filter.model.spec.ts
+++ b/libs/angular/src/vault/vault-filter/models/vault-filter.model.spec.ts
@@ -143,6 +143,17 @@ describe("VaultFilter", () => {
expect(result).toBe(true);
});
+
+ it("should return true when filtering on unassigned folder via empty string id", () => {
+ const filterFunction = createFilterFunction({
+ selectedFolder: true,
+ selectedFolderId: "",
+ });
+
+ const result = filterFunction(cipher);
+
+ expect(result).toBe(true);
+ });
});
describe("given an organizational cipher (with organization and collections)", () => {
diff --git a/libs/angular/src/vault/vault-filter/models/vault-filter.model.ts b/libs/angular/src/vault/vault-filter/models/vault-filter.model.ts
index d3ad29142e2..e99cb5e9eeb 100644
--- a/libs/angular/src/vault/vault-filter/models/vault-filter.model.ts
+++ b/libs/angular/src/vault/vault-filter/models/vault-filter.model.ts
@@ -63,10 +63,19 @@ export class VaultFilter {
if (this.cipherType != null && cipherPassesFilter) {
cipherPassesFilter = CipherViewLikeUtils.getType(cipher) === this.cipherType;
}
- if (this.selectedFolder && this.selectedFolderId == null && cipherPassesFilter) {
- cipherPassesFilter = cipher.folderId == null;
+ if (
+ this.selectedFolder &&
+ (this.selectedFolderId == null || this.selectedFolderId === "") &&
+ cipherPassesFilter
+ ) {
+ cipherPassesFilter = cipher.folderId == null || cipher.folderId === "";
}
- if (this.selectedFolder && this.selectedFolderId != null && cipherPassesFilter) {
+ if (
+ this.selectedFolder &&
+ this.selectedFolderId != null &&
+ this.selectedFolderId !== "" &&
+ cipherPassesFilter
+ ) {
cipherPassesFilter = cipher.folderId === this.selectedFolderId;
}
if (this.selectedCollection && this.selectedCollectionId == null && cipherPassesFilter) {
diff --git a/libs/angular/src/vault/vault-filter/services/vault-filter.service.ts b/libs/angular/src/vault/vault-filter/services/vault-filter.service.ts
index 9b34890cbce..4a12bed1c66 100644
--- a/libs/angular/src/vault/vault-filter/services/vault-filter.service.ts
+++ b/libs/angular/src/vault/vault-filter/services/vault-filter.service.ts
@@ -83,7 +83,7 @@ export class VaultFilterService implements DeprecatedVaultFilterServiceAbstracti
const ciphers = await this.cipherService.getAllDecrypted(userId);
const orgCiphers = ciphers.filter((c) => c.organizationId == organizationId);
folders = storedFolders.filter(
- (f) => orgCiphers.some((oc) => oc.folderId == f.id) || f.id == null,
+ (f) => orgCiphers.some((oc) => oc.folderId == f.id) || !f.id,
);
}
diff --git a/libs/common/src/models/export/folder.export.ts b/libs/common/src/models/export/folder.export.ts
index 96f0f1058b8..1bffcee8c2d 100644
--- a/libs/common/src/models/export/folder.export.ts
+++ b/libs/common/src/models/export/folder.export.ts
@@ -1,5 +1,3 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
import { EncString } from "../../key-management/crypto/models/enc-string";
import { Folder as FolderDomain } from "../../vault/models/domain/folder";
import { FolderView } from "../../vault/models/view/folder.view";
@@ -7,6 +5,8 @@ import { FolderView } from "../../vault/models/view/folder.view";
import { safeGetString } from "./utils";
export class FolderExport {
+ name: string = "";
+
static template(): FolderExport {
const req = new FolderExport();
req.name = "Folder name";
@@ -19,14 +19,12 @@ export class FolderExport {
}
static toDomain(req: FolderExport, domain = new FolderDomain()) {
- domain.name = req.name != null ? new EncString(req.name) : null;
+ domain.name = new EncString(req.name);
return domain;
}
- name: string;
-
// Use build method instead of ctor so that we can control order of JSON stringify for pretty print
build(o: FolderView | FolderDomain) {
- this.name = safeGetString(o.name);
+ this.name = safeGetString(o.name ?? "") ?? "";
}
}
diff --git a/libs/common/src/vault/models/data/folder.data.ts b/libs/common/src/vault/models/data/folder.data.ts
index c2eb585a6f4..5358cd713b3 100644
--- a/libs/common/src/vault/models/data/folder.data.ts
+++ b/libs/common/src/vault/models/data/folder.data.ts
@@ -1,5 +1,3 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
import { Jsonify } from "type-fest";
import { FolderResponse } from "../response/folder.response";
@@ -10,12 +8,19 @@ export class FolderData {
revisionDate: string;
constructor(response: Partial) {
- this.name = response?.name;
- this.id = response?.id;
- this.revisionDate = response?.revisionDate;
+ this.name = response.name ?? "";
+ this.id = response.id ?? "";
+ this.revisionDate = response.revisionDate ?? new Date().toISOString();
}
- static fromJSON(obj: Jsonify) {
- return Object.assign(new FolderData({}), obj);
+ static fromJSON(obj: Jsonify) {
+ if (obj == null) {
+ return null;
+ }
+ return new FolderData({
+ id: obj.id,
+ name: obj.name,
+ revisionDate: obj.revisionDate,
+ });
}
}
diff --git a/libs/common/src/vault/models/domain/folder.spec.ts b/libs/common/src/vault/models/domain/folder.spec.ts
index d9e9e265d91..fd1455dbb66 100644
--- a/libs/common/src/vault/models/domain/folder.spec.ts
+++ b/libs/common/src/vault/models/domain/folder.spec.ts
@@ -8,7 +8,7 @@ import {
mockFromJson,
} from "../../../../spec";
import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service";
-import { EncryptedString, EncString } from "../../../key-management/crypto/models/enc-string";
+import { EncString } from "../../../key-management/crypto/models/enc-string";
import { FolderData } from "../../models/data/folder.data";
import { Folder } from "../../models/domain/folder";
@@ -49,6 +49,30 @@ describe("Folder", () => {
});
});
+ describe("constructor", () => {
+ it("initializes properties from FolderData", () => {
+ const revisionDate = new Date("2022-08-04T01:06:40.441Z");
+ const folder = new Folder({
+ id: "id",
+ name: "name",
+ revisionDate: revisionDate.toISOString(),
+ });
+
+ expect(folder.id).toBe("id");
+ expect(folder.revisionDate).toEqual(revisionDate);
+ expect(folder.name).toBeInstanceOf(EncString);
+ expect((folder.name as EncString).encryptedString).toBe("name");
+ });
+
+ it("initializes empty properties when no FolderData is provided", () => {
+ const folder = new Folder();
+
+ expect(folder.id).toBe("");
+ expect(folder.name).toBeInstanceOf(EncString);
+ expect(folder.revisionDate).toBeInstanceOf(Date);
+ });
+ });
+
describe("fromJSON", () => {
jest.mock("../../../key-management/crypto/models/enc-string");
jest.spyOn(EncString, "fromJSON").mockImplementation(mockFromJson);
@@ -57,17 +81,13 @@ describe("Folder", () => {
const revisionDate = new Date("2022-08-04T01:06:40.441Z");
const actual = Folder.fromJSON({
revisionDate: revisionDate.toISOString(),
- name: "name" as EncryptedString,
+ name: "name",
id: "id",
});
- const expected = {
- revisionDate: revisionDate,
- name: "name_fromJSON",
- id: "id",
- };
-
- expect(actual).toMatchObject(expected);
+ expect(actual?.id).toBe("id");
+ expect(actual?.revisionDate).toEqual(revisionDate);
+ expect(actual?.name).toBe("name_fromJSON");
});
});
@@ -89,9 +109,7 @@ describe("Folder", () => {
const view = await folder.decryptWithKey(key, encryptService);
- expect(view).toEqual({
- name: "encName",
- });
+ expect(view.name).toBe("encName");
});
it("assigns the folder id and revision date", async () => {
diff --git a/libs/common/src/vault/models/domain/folder.ts b/libs/common/src/vault/models/domain/folder.ts
index c336095f15d..5f7f17ee751 100644
--- a/libs/common/src/vault/models/domain/folder.ts
+++ b/libs/common/src/vault/models/domain/folder.ts
@@ -1,5 +1,3 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
import { Jsonify } from "type-fest";
import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service";
@@ -9,16 +7,10 @@ import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-cr
import { FolderData } from "../data/folder.data";
import { FolderView } from "../view/folder.view";
-export class Test extends Domain {
- id: string;
- name: EncString;
- revisionDate: Date;
-}
-
export class Folder extends Domain {
- id: string;
- name: EncString;
- revisionDate: Date;
+ id: string = "";
+ name: EncString = new EncString("");
+ revisionDate: Date = new Date();
constructor(obj?: FolderData) {
super();
@@ -26,17 +18,9 @@ export class Folder extends Domain {
return;
}
- this.buildDomainModel(
- this,
- obj,
- {
- id: null,
- name: null,
- },
- ["id"],
- );
-
- this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null;
+ this.id = obj.id;
+ this.name = new EncString(obj.name);
+ this.revisionDate = new Date(obj.revisionDate);
}
decrypt(key: SymmetricCryptoKey): Promise {
@@ -62,7 +46,14 @@ export class Folder extends Domain {
}
static fromJSON(obj: Jsonify) {
- const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);
- return Object.assign(new Folder(), obj, { name: EncString.fromJSON(obj.name), revisionDate });
+ if (obj == null) {
+ return null;
+ }
+
+ const folder = new Folder();
+ folder.id = obj.id;
+ folder.name = EncString.fromJSON(obj.name);
+ folder.revisionDate = new Date(obj.revisionDate);
+ return folder;
}
}
diff --git a/libs/common/src/vault/models/request/folder-with-id.request.ts b/libs/common/src/vault/models/request/folder-with-id.request.ts
index 9d8078c12c1..8af890048ba 100644
--- a/libs/common/src/vault/models/request/folder-with-id.request.ts
+++ b/libs/common/src/vault/models/request/folder-with-id.request.ts
@@ -7,6 +7,6 @@ export class FolderWithIdRequest extends FolderRequest {
constructor(folder: Folder) {
super(folder);
- this.id = folder.id;
+ this.id = folder.id ?? "";
}
}
diff --git a/libs/common/src/vault/models/view/folder.view.ts b/libs/common/src/vault/models/view/folder.view.ts
index bc908e98eb8..6052ae9df37 100644
--- a/libs/common/src/vault/models/view/folder.view.ts
+++ b/libs/common/src/vault/models/view/folder.view.ts
@@ -1,19 +1,17 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
import { Jsonify } from "type-fest";
import { View } from "../../../models/view/view";
-import { DecryptedObject } from "../../../platform/models/domain/domain-base";
import { Folder } from "../domain/folder";
import { ITreeNodeObject } from "../domain/tree-node";
export class FolderView implements View, ITreeNodeObject {
- id: string = null;
- name: string = null;
- revisionDate: Date = null;
+ id: string = "";
+ name: string = "";
+ revisionDate: Date;
- constructor(f?: Folder | DecryptedObject) {
+ constructor(f?: Folder) {
if (!f) {
+ this.revisionDate = new Date();
return;
}
@@ -22,7 +20,12 @@ export class FolderView implements View, ITreeNodeObject {
}
static fromJSON(obj: Jsonify) {
- const revisionDate = obj.revisionDate == null ? null : new Date(obj.revisionDate);
- return Object.assign(new FolderView(), obj, { revisionDate });
+ const folderView = new FolderView();
+ folderView.id = obj.id ?? "";
+ folderView.name = obj.name ?? "";
+ if (obj.revisionDate != null) {
+ folderView.revisionDate = new Date(obj.revisionDate);
+ }
+ return folderView;
}
}
diff --git a/libs/common/src/vault/services/folder/folder-api.service.ts b/libs/common/src/vault/services/folder/folder-api.service.ts
index fe9c3218a84..d5bd7fe9847 100644
--- a/libs/common/src/vault/services/folder/folder-api.service.ts
+++ b/libs/common/src/vault/services/folder/folder-api.service.ts
@@ -17,11 +17,11 @@ export class FolderApiService implements FolderApiServiceAbstraction {
const request = new FolderRequest(folder);
let response: FolderResponse;
- if (folder.id == null) {
+ if (folder.id) {
+ response = await this.putFolder(folder.id, request);
+ } else {
response = await this.postFolder(request);
folder.id = response.id;
- } else {
- response = await this.putFolder(folder.id, request);
}
const data = new FolderData(response);
diff --git a/libs/common/src/vault/services/folder/folder.service.spec.ts b/libs/common/src/vault/services/folder/folder.service.spec.ts
index a520fd4852d..412e67e77d7 100644
--- a/libs/common/src/vault/services/folder/folder.service.spec.ts
+++ b/libs/common/src/vault/services/folder/folder.service.spec.ts
@@ -122,6 +122,7 @@ describe("Folder Service", () => {
encryptedString: "ENC",
encryptionType: 0,
},
+ revisionDate: expect.any(Date),
});
});
@@ -132,7 +133,7 @@ describe("Folder Service", () => {
expect(result).toEqual({
id: "1",
name: makeEncString("ENC_STRING_" + 1),
- revisionDate: null,
+ revisionDate: expect.any(Date),
});
});
@@ -150,12 +151,12 @@ describe("Folder Service", () => {
{
id: "1",
name: makeEncString("ENC_STRING_" + 1),
- revisionDate: null,
+ revisionDate: expect.any(Date),
},
{
id: "2",
name: makeEncString("ENC_STRING_" + 2),
- revisionDate: null,
+ revisionDate: expect.any(Date),
},
]);
});
@@ -167,7 +168,7 @@ describe("Folder Service", () => {
{
id: "4",
name: makeEncString("ENC_STRING_" + 4),
- revisionDate: null,
+ revisionDate: expect.any(Date),
},
]);
});
@@ -203,7 +204,7 @@ describe("Folder Service", () => {
const folderViews = await firstValueFrom(folderService.folderViews$(mockUserId));
expect(folderViews.length).toBe(1);
- expect(folderViews[0].id).toBeNull(); // Should be the "No Folder" folder
+ expect(folderViews[0].id).toEqual(""); // Should be the "No Folder" folder
});
describe("getRotatedData", () => {
diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts
index d58859ac163..86f5d765d31 100644
--- a/libs/importer/src/components/import.component.ts
+++ b/libs/importer/src/components/import.component.ts
@@ -354,7 +354,7 @@ export class ImportComponent implements OnInit, OnDestroy, AfterViewInit {
switchMap((userId) => {
return this.folderService.folderViews$(userId);
}),
- map((folders) => folders.filter((f) => f.id != null)),
+ map((folders) => folders.filter((f) => !!f.id)),
);
this.formGroup.controls.targetSelector.disable();
diff --git a/libs/importer/src/importers/base-importer.ts b/libs/importer/src/importers/base-importer.ts
index a32a53f3e60..9c617971f8f 100644
--- a/libs/importer/src/importers/base-importer.ts
+++ b/libs/importer/src/importers/base-importer.ts
@@ -2,12 +2,12 @@
// @ts-strict-ignore
import * as papa from "papaparse";
-import { CollectionView, Collection } from "@bitwarden/common/admin-console/models/collections";
+import { CollectionView } from "@bitwarden/common/admin-console/models/collections";
import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service";
-import { OrganizationId } from "@bitwarden/common/types/guid";
+import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid";
import { FieldType, SecureNoteType, CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
@@ -277,8 +277,7 @@ export abstract class BaseImporter {
const collection = new CollectionView({
name: f.name,
organizationId: this.organizationId,
- // FIXME: Folder.id may be null, this should be changed when refactoring Folders to be ts-strict
- id: Collection.isCollectionId(f.id) ? f.id : null,
+ id: f.id && f.id !== "" ? (f.id as CollectionId) : null,
});
return collection;
});
diff --git a/libs/importer/src/importers/keepass2-xml-importer.spec.ts b/libs/importer/src/importers/keepass2-xml-importer.spec.ts
index c1c0947936b..e934a442ff5 100644
--- a/libs/importer/src/importers/keepass2-xml-importer.spec.ts
+++ b/libs/importer/src/importers/keepass2-xml-importer.spec.ts
@@ -23,7 +23,7 @@ describe("KeePass2 Xml Importer", () => {
const actual = [folder];
const result = await importer.parse(TestData);
- expect(result.folders).toEqual(actual);
+ expect(result.folders[0].name).toEqual(actual[0].name);
});
it("parse XML should contains login details", async () => {
diff --git a/libs/importer/src/importers/password-depot/password-depot-17-xml-importer.spec.ts b/libs/importer/src/importers/password-depot/password-depot-17-xml-importer.spec.ts
index 8b78b33c154..121c1b5dd66 100644
--- a/libs/importer/src/importers/password-depot/password-depot-17-xml-importer.spec.ts
+++ b/libs/importer/src/importers/password-depot/password-depot-17-xml-importer.spec.ts
@@ -57,10 +57,15 @@ describe("Password Depot 17 Xml Importer", () => {
const importer = new PasswordDepot17XmlImporter();
const folder = new FolderView();
folder.name = "tempDB";
- const actual = [folder];
const result = await importer.parse(PasswordTestData);
- expect(result.folders).toEqual(actual);
+ expect(result.folders).toEqual([
+ expect.objectContaining({
+ id: "",
+ name: "tempDB",
+ revisionDate: expect.any(Date),
+ }),
+ ]);
});
it("should parse password type into logins", async () => {
diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts
index 7d28d857403..55ad39bc8e0 100644
--- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts
+++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.spec.ts
@@ -138,7 +138,7 @@ function expectEqualCiphers(ciphers: CipherView[] | Cipher[], jsonResult: string
}
function expectEqualFolderViews(folderViews: FolderView[] | Folder[], jsonResult: string) {
- const actual = JSON.stringify(JSON.parse(jsonResult).folders);
+ const actual = JSON.parse(jsonResult).folders;
const folders: FolderResponse[] = [];
folderViews.forEach((c) => {
const folder = new FolderResponse();
@@ -148,21 +148,19 @@ function expectEqualFolderViews(folderViews: FolderView[] | Folder[], jsonResult
});
expect(actual.length).toBeGreaterThan(0);
- expect(actual).toEqual(JSON.stringify(folders));
+ expect(actual).toEqual(folders);
}
function expectEqualFolders(folders: Folder[], jsonResult: string) {
- const actual = JSON.stringify(JSON.parse(jsonResult).folders);
- const items: Folder[] = [];
- folders.forEach((c) => {
- const item = new Folder();
- item.id = c.id;
- item.name = c.name;
- items.push(item);
- });
+ const actual = JSON.parse(jsonResult).folders;
+
+ const expected = folders.map((c) => ({
+ id: c.id,
+ name: c.name?.encryptedString,
+ }));
expect(actual.length).toBeGreaterThan(0);
- expect(actual).toEqual(JSON.stringify(items));
+ expect(actual).toEqual(expected);
}
describe("VaultExportService", () => {
diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts
index b30f14872ca..a5e9f8aea6e 100644
--- a/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts
+++ b/libs/tools/export/vault-export/vault-export-core/src/services/individual-vault-export.service.ts
@@ -240,7 +240,7 @@ export class IndividualVaultExportService
};
folders.forEach((f) => {
- if (f.id == null) {
+ if (!f.id) {
return;
}
const folder = new FolderWithIdExport();
@@ -268,7 +268,7 @@ export class IndividualVaultExportService
private buildCsvExport(decFolders: FolderView[], decCiphers: CipherView[]): string {
const foldersMap = new Map();
decFolders.forEach((f) => {
- if (f.id != null) {
+ if (f.id) {
foldersMap.set(f.id, f);
}
});
@@ -302,7 +302,7 @@ export class IndividualVaultExportService
};
decFolders.forEach((f) => {
- if (f.id == null) {
+ if (!f.id) {
return;
}
const folder = new FolderWithIdExport();
diff --git a/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts b/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts
index 9bf53826333..a783bdc7406 100644
--- a/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts
+++ b/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts
@@ -101,7 +101,7 @@ describe("AddEditFolderDialogComponent", () => {
const newFolder = new FolderView();
newFolder.name = "New Folder";
- expect(encrypt).toHaveBeenCalledWith(newFolder, "");
+ expect(encrypt).toHaveBeenCalledWith(expect.objectContaining({ name: "New Folder" }), "");
expect(save).toHaveBeenCalled();
});
diff --git a/libs/vault/src/models/filter-function.spec.ts b/libs/vault/src/models/filter-function.spec.ts
index 1ffc1b119a8..de544a1a0d5 100644
--- a/libs/vault/src/models/filter-function.spec.ts
+++ b/libs/vault/src/models/filter-function.spec.ts
@@ -116,6 +116,14 @@ describe("createFilter", () => {
expect(result).toBe(true);
});
+
+ it("should return true when filtering on empty-string folder id", () => {
+ const filterFunction = createFilterFunction({ folderId: "" });
+
+ const result = filterFunction(cipher);
+
+ expect(result).toBe(true);
+ });
});
describe("given an organizational cipher (with organization and collections)", () => {
diff --git a/libs/vault/src/models/filter-function.ts b/libs/vault/src/models/filter-function.ts
index 0252ef13094..bbd4127863b 100644
--- a/libs/vault/src/models/filter-function.ts
+++ b/libs/vault/src/models/filter-function.ts
@@ -55,8 +55,11 @@ export function createFilterFunction(
return false;
}
}
+ const isNoFolderFilter = filter.folderId === Unassigned || filter.folderId === "";
+ const cipherHasFolder = cipher.folderId != null && cipher.folderId !== "";
+
// No folder
- if (filter.folderId === Unassigned && cipher.folderId != null) {
+ if (isNoFolderFilter && cipherHasFolder) {
return false;
}
// Folder
@@ -64,6 +67,7 @@ export function createFilterFunction(
filter.folderId !== undefined &&
filter.folderId !== All &&
filter.folderId !== Unassigned &&
+ filter.folderId !== "" &&
cipher.folderId !== filter.folderId
) {
return false;
diff --git a/libs/vault/src/models/routed-vault-filter-bridge.model.ts b/libs/vault/src/models/routed-vault-filter-bridge.model.ts
index 1d6d73ba7c5..32523684125 100644
--- a/libs/vault/src/models/routed-vault-filter-bridge.model.ts
+++ b/libs/vault/src/models/routed-vault-filter-bridge.model.ts
@@ -87,7 +87,7 @@ export class RoutedVaultFilterBridge implements VaultFilter {
return this.legacyFilter.selectedFolderNode;
}
set selectedFolderNode(value: TreeNode) {
- const folderId = value != null && value.node.id === null ? Unassigned : value?.node.id;
+ const folderId = value?.node.id ? value.node.id : Unassigned;
this.bridgeService.navigate({
...this.routedFilter,
folderId,
diff --git a/libs/vault/src/models/vault-filter.model.ts b/libs/vault/src/models/vault-filter.model.ts
index 4617102cebe..5452a9f5c38 100644
--- a/libs/vault/src/models/vault-filter.model.ts
+++ b/libs/vault/src/models/vault-filter.model.ts
@@ -134,7 +134,7 @@ export class VaultFilter {
if (this.selectedFolderNode) {
// No folder
if (this.folderId === null && cipherPassesFilter) {
- cipherPassesFilter = cipher.folderId === null;
+ cipherPassesFilter = cipher.folderId == null || cipher.folderId === "";
}
// Folder
if (this.folderId !== null && cipherPassesFilter) {
diff --git a/libs/vault/src/services/routed-vault-filter-bridge.service.ts b/libs/vault/src/services/routed-vault-filter-bridge.service.ts
index 1bff764964e..25c75f464f0 100644
--- a/libs/vault/src/services/routed-vault-filter-bridge.service.ts
+++ b/libs/vault/src/services/routed-vault-filter-bridge.service.ts
@@ -145,7 +145,7 @@ function createLegacyFilterForEndUser(
);
}
- if (filter.folderId !== undefined && filter.folderId === Unassigned) {
+ if (filter.folderId !== undefined && (filter.folderId === Unassigned || filter.folderId === "")) {
legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, null);
} else if (filter.folderId !== undefined && filter.folderId !== Unassigned) {
legacyFilter.selectedFolderNode = ServiceUtils.getTreeNodeObject(folderTree, filter.folderId);
diff --git a/libs/vault/src/services/vault-filter.service.spec.ts b/libs/vault/src/services/vault-filter.service.spec.ts
index 90af45e571f..537e9c9f542 100644
--- a/libs/vault/src/services/vault-filter.service.spec.ts
+++ b/libs/vault/src/services/vault-filter.service.spec.ts
@@ -195,8 +195,8 @@ describe("vault filter service", () => {
];
folderViews.next(storedFolders);
- await expect(firstValueFrom(vaultFilterService.filteredFolders$)).resolves.toEqual([
- createFolderView("folder test id", "test"),
+ await expect(firstValueFrom(vaultFilterService.filteredFolders$)).resolves.toMatchObject([
+ { id: "folder test id", name: "test" },
]);
});
diff --git a/libs/vault/src/services/vault-filter.service.ts b/libs/vault/src/services/vault-filter.service.ts
index 445764827eb..5dbab72e1d3 100644
--- a/libs/vault/src/services/vault-filter.service.ts
+++ b/libs/vault/src/services/vault-filter.service.ts
@@ -290,9 +290,7 @@ export class VaultFilterService implements VaultFilterServiceAbstraction {
// Otherwise, show only folders that have ciphers from the selected org and the "no folder" folder
const orgCiphers = ciphers.filter((c) => c.organizationId == org?.id);
- return storedFolders.filter(
- (f) => orgCiphers.some((oc) => oc.folderId == f.id) || f.id == null,
- );
+ return storedFolders.filter((f) => orgCiphers.some((oc) => oc.folderId == f.id) || !f.id);
}
protected buildFolderTree(folders?: FolderView[]): TreeNode {
From 8d3cbd3da617e718a4664f4b5973fca6bc261658 Mon Sep 17 00:00:00 2001
From: Brad <44413459+lastbestdev@users.noreply.github.com>
Date: Thu, 12 Feb 2026 13:59:27 -0800
Subject: [PATCH 025/134] [PM-31801] Fix: Allow admins/owners to edit all
ciphers in reports when Org setting is enabled#18856
This PR fixes an issue where admins couldn't edit ciphers in organization reports when the "Allow Admin Access to All Collection Items" setting was enabled.
The fix adds a check for organization.allowAdminAccessToAllCollectionItems in the canManage() method across all organization report components. When this setting is enabled, admins/owners can now properly edit all ciphers regardless of collection membership.
---
.../pages/organizations/exposed-passwords-report.component.ts | 3 +++
.../organizations/inactive-two-factor-report.component.ts | 3 +++
.../pages/organizations/reused-passwords-report.component.ts | 3 +++
.../pages/organizations/unsecured-websites-report.component.ts | 3 +++
.../pages/organizations/weak-passwords-report.component.ts | 3 +++
5 files changed, 15 insertions(+)
diff --git a/apps/web/src/app/dirt/reports/pages/organizations/exposed-passwords-report.component.ts b/apps/web/src/app/dirt/reports/pages/organizations/exposed-passwords-report.component.ts
index 603c01bd2ab..ea1e6137d71 100644
--- a/apps/web/src/app/dirt/reports/pages/organizations/exposed-passwords-report.component.ts
+++ b/apps/web/src/app/dirt/reports/pages/organizations/exposed-passwords-report.component.ts
@@ -103,6 +103,9 @@ export class ExposedPasswordsReportComponent
if (c.collectionIds.length === 0) {
return true;
}
+ if (this.organization?.allowAdminAccessToAllCollectionItems) {
+ return true;
+ }
return this.manageableCiphers.some((x) => x.id === c.id);
}
}
diff --git a/apps/web/src/app/dirt/reports/pages/organizations/inactive-two-factor-report.component.ts b/apps/web/src/app/dirt/reports/pages/organizations/inactive-two-factor-report.component.ts
index 4104e16b3b5..ce81bef5f4b 100644
--- a/apps/web/src/app/dirt/reports/pages/organizations/inactive-two-factor-report.component.ts
+++ b/apps/web/src/app/dirt/reports/pages/organizations/inactive-two-factor-report.component.ts
@@ -108,6 +108,9 @@ export class InactiveTwoFactorReportComponent
if (c.collectionIds.length === 0) {
return true;
}
+ if (this.organization?.allowAdminAccessToAllCollectionItems) {
+ return true;
+ }
return this.manageableCiphers.some((x) => x.id === c.id);
}
}
diff --git a/apps/web/src/app/dirt/reports/pages/organizations/reused-passwords-report.component.ts b/apps/web/src/app/dirt/reports/pages/organizations/reused-passwords-report.component.ts
index 683b195b271..edb9001488f 100644
--- a/apps/web/src/app/dirt/reports/pages/organizations/reused-passwords-report.component.ts
+++ b/apps/web/src/app/dirt/reports/pages/organizations/reused-passwords-report.component.ts
@@ -102,6 +102,9 @@ export class ReusedPasswordsReportComponent
if (c.collectionIds.length === 0) {
return true;
}
+ if (this.organization?.allowAdminAccessToAllCollectionItems) {
+ return true;
+ }
return this.manageableCiphers.some((x) => x.id === c.id);
}
}
diff --git a/apps/web/src/app/dirt/reports/pages/organizations/unsecured-websites-report.component.ts b/apps/web/src/app/dirt/reports/pages/organizations/unsecured-websites-report.component.ts
index 893a5058bd2..7edcb003e4f 100644
--- a/apps/web/src/app/dirt/reports/pages/organizations/unsecured-websites-report.component.ts
+++ b/apps/web/src/app/dirt/reports/pages/organizations/unsecured-websites-report.component.ts
@@ -105,6 +105,9 @@ export class UnsecuredWebsitesReportComponent
if (c.collectionIds.length === 0) {
return true;
}
+ if (this.organization?.allowAdminAccessToAllCollectionItems) {
+ return true;
+ }
return this.manageableCiphers.some((x) => x.id === c.id);
}
}
diff --git a/apps/web/src/app/dirt/reports/pages/organizations/weak-passwords-report.component.ts b/apps/web/src/app/dirt/reports/pages/organizations/weak-passwords-report.component.ts
index aadd015e29d..62f91ff06b2 100644
--- a/apps/web/src/app/dirt/reports/pages/organizations/weak-passwords-report.component.ts
+++ b/apps/web/src/app/dirt/reports/pages/organizations/weak-passwords-report.component.ts
@@ -104,6 +104,9 @@ export class WeakPasswordsReportComponent
if (c.collectionIds.length === 0) {
return true;
}
+ if (this.organization?.allowAdminAccessToAllCollectionItems) {
+ return true;
+ }
return this.manageableCiphers.some((x) => x.id === c.id);
}
}
From c9a125b338317a503149b15ac7bfa3b7b19d6501 Mon Sep 17 00:00:00 2001
From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com>
Date: Fri, 13 Feb 2026 10:24:50 +0100
Subject: [PATCH 026/134] Autosync the updated translations (#18961)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/browser/src/_locales/ar/messages.json | 11 +-
apps/browser/src/_locales/az/messages.json | 11 +-
apps/browser/src/_locales/be/messages.json | 11 +-
apps/browser/src/_locales/bg/messages.json | 13 +-
apps/browser/src/_locales/bn/messages.json | 11 +-
apps/browser/src/_locales/bs/messages.json | 11 +-
apps/browser/src/_locales/ca/messages.json | 11 +-
apps/browser/src/_locales/cs/messages.json | 11 +-
apps/browser/src/_locales/cy/messages.json | 11 +-
apps/browser/src/_locales/da/messages.json | 11 +-
apps/browser/src/_locales/de/messages.json | 11 +-
apps/browser/src/_locales/el/messages.json | 11 +-
apps/browser/src/_locales/en_GB/messages.json | 11 +-
apps/browser/src/_locales/en_IN/messages.json | 11 +-
apps/browser/src/_locales/es/messages.json | 11 +-
apps/browser/src/_locales/et/messages.json | 11 +-
apps/browser/src/_locales/eu/messages.json | 11 +-
apps/browser/src/_locales/fa/messages.json | 11 +-
apps/browser/src/_locales/fi/messages.json | 11 +-
apps/browser/src/_locales/fil/messages.json | 11 +-
apps/browser/src/_locales/fr/messages.json | 11 +-
apps/browser/src/_locales/gl/messages.json | 11 +-
apps/browser/src/_locales/he/messages.json | 11 +-
apps/browser/src/_locales/hi/messages.json | 11 +-
apps/browser/src/_locales/hr/messages.json | 11 +-
apps/browser/src/_locales/hu/messages.json | 11 +-
apps/browser/src/_locales/id/messages.json | 11 +-
apps/browser/src/_locales/it/messages.json | 11 +-
apps/browser/src/_locales/ja/messages.json | 11 +-
apps/browser/src/_locales/ka/messages.json | 11 +-
apps/browser/src/_locales/km/messages.json | 11 +-
apps/browser/src/_locales/kn/messages.json | 11 +-
apps/browser/src/_locales/ko/messages.json | 11 +-
apps/browser/src/_locales/lt/messages.json | 11 +-
apps/browser/src/_locales/lv/messages.json | 11 +-
apps/browser/src/_locales/ml/messages.json | 11 +-
apps/browser/src/_locales/mr/messages.json | 11 +-
apps/browser/src/_locales/my/messages.json | 11 +-
apps/browser/src/_locales/nb/messages.json | 11 +-
apps/browser/src/_locales/ne/messages.json | 11 +-
apps/browser/src/_locales/nl/messages.json | 23 ++--
apps/browser/src/_locales/nn/messages.json | 11 +-
apps/browser/src/_locales/or/messages.json | 11 +-
apps/browser/src/_locales/pl/messages.json | 13 +-
apps/browser/src/_locales/pt_BR/messages.json | 11 +-
apps/browser/src/_locales/pt_PT/messages.json | 11 +-
apps/browser/src/_locales/ro/messages.json | 11 +-
apps/browser/src/_locales/ru/messages.json | 11 +-
apps/browser/src/_locales/si/messages.json | 11 +-
apps/browser/src/_locales/sk/messages.json | 11 +-
apps/browser/src/_locales/sl/messages.json | 11 +-
apps/browser/src/_locales/sr/messages.json | 11 +-
apps/browser/src/_locales/sv/messages.json | 11 +-
apps/browser/src/_locales/ta/messages.json | 11 +-
apps/browser/src/_locales/te/messages.json | 11 +-
apps/browser/src/_locales/th/messages.json | 11 +-
apps/browser/src/_locales/tr/messages.json | 11 +-
apps/browser/src/_locales/uk/messages.json | 11 +-
apps/browser/src/_locales/vi/messages.json | 11 +-
apps/browser/src/_locales/zh_CN/messages.json | 13 +-
apps/browser/src/_locales/zh_TW/messages.json | 121 +++++++++---------
61 files changed, 491 insertions(+), 308 deletions(-)
diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json
index 9f2428f2890..78cf90c3555 100644
--- a/apps/browser/src/_locales/ar/messages.json
+++ b/apps/browser/src/_locales/ar/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden لن يطلب حفظ تفاصيل تسجيل الدخول لهذه النطاقات. يجب عليك تحديث الصفحة حتى تصبح التغييرات سارية المفعول."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden لن يطلب حفظ تفاصيل تسجيل الدخول لهذه النطافات لجميع الحسابات مسجلة الدخول. يجب عليك تحديث الصفحة لكي تصبح التغييرات نافذة المفعول."
- },
"blockedDomainsDesc": {
"message": "لن يتم توفير الملء التلقائي والمميزات الأخرى ذات الصلة لهذه المواقع. يجب عليك تحديث الصفحة لكي تصبح التغييرات نافذة المفعول."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json
index 6414cdd39f9..6a43475da32 100644
--- a/apps/browser/src/_locales/az/messages.json
+++ b/apps/browser/src/_locales/az/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden, bu domenlər üçün giriş detallarını saxlamağı soruşmayacaq. Dəyişikliklərin qüvvəyə minməsi üçün səhifəni təzələməlisiniz."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden, giriş etmiş bütün hesablar üçün bu domenlərin giriş detallarını saxlamağı soruşmayacaq. Dəyişikliklərin qüvvəyə minməsi üçün səhifəni təzələməlisiniz."
- },
"blockedDomainsDesc": {
"message": "Bu veb saytlar üçün avto-doldurma və digər əlaqəli özəlliklər təklif olunmayacaq. Dəyişikliklərin qüvvəyə minməsi üçün səhifəni təzələməlisiniz."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kart nömrəsi"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Təşkilatınız, artıq Bitwarden-ə giriş etmək üçün ana parol istifadə etmir. Davam etmək üçün təşkilatı və domeni doğrulayın."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "E-poçt qorunur"
},
@@ -6134,4 +6137,4 @@
"message": "Şəxslər, Send-ə baxması üçün parolu daxil etməli olacaqlar",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json
index 6bce3fdd891..9f4a65e3072 100644
--- a/apps/browser/src/_locales/be/messages.json
+++ b/apps/browser/src/_locales/be/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Праграма не будзе прапаноўваць захаваць падрабязнасці ўваходу для гэтых даменаў. Вы павінны абнавіць старонку, каб змяненні пачалі дзейнічаць."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json
index 35fe16b2542..a46ad75065e 100644
--- a/apps/browser/src/_locales/bg/messages.json
+++ b/apps/browser/src/_locales/bg/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове. За да влезе правилото в сила, презаредете страницата."
},
- "excludedDomainsDescAlt": {
- "message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове за всички регистрации, в които сте вписан(а). За да влезе правилото в сила, презаредете страницата."
- },
"blockedDomainsDesc": {
"message": "Автоматичното попълване и други свързани функции няма да бъдат предлагани за тези уеб сайтове. Трябва да презаредите страницата, за да влязат в сила промените."
},
@@ -5671,7 +5668,7 @@
"message": "Много широко"
},
"narrow": {
- "message": "Narrow"
+ "message": "Тясно"
},
"sshKeyWrongPassword": {
"message": "Въведената парола е неправилна."
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Номер на картата"
},
+ "errorCannotDecrypt": {
+ "message": "Грешка: не може да се дешифрира"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Вашата организация вече не използва главни пароли за вписване в Битуорден. За да продължите, потвърдете организацията и домейна."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "потребител@bitwarden.com , потребител@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Сваляне на приложенията на Битуорден"
+ },
"emailProtected": {
"message": "Е-пощата е защитена"
},
@@ -6134,4 +6137,4 @@
"message": "Хората ще трябва да въведат паролата, за да видят това Изпращане",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json
index 4f6402fa8ea..b46d0664231 100644
--- a/apps/browser/src/_locales/bn/messages.json
+++ b/apps/browser/src/_locales/bn/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json
index 36aa422ff0d..e81fc637b5c 100644
--- a/apps/browser/src/_locales/bs/messages.json
+++ b/apps/browser/src/_locales/bs/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json
index 409a11ff253..2bd53876953 100644
--- a/apps/browser/src/_locales/ca/messages.json
+++ b/apps/browser/src/_locales/ca/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden no demanarà que es guarden les dades d’inici de sessió d’aquests dominis. Heu d'actualitzar la pàgina perquè els canvis tinguen efecte."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden no demanarà que es guarden les dades d'inici de sessió d'aquests dominis per a tots els comptes iniciats. Heu d'actualitzar la pàgina perquè els canvis tinguen efecte."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json
index 206566edcd5..1501c7d7c4a 100644
--- a/apps/browser/src/_locales/cs/messages.json
+++ b/apps/browser/src/_locales/cs/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden nebude žádat o uložení přihlašovacích údajů pro tyto domény. Aby se změny projevily, musíte stránku obnovit."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden nebude žádat o uložení přihlašovacích údajů pro tyto domény pro všechny přihlášené účty. Aby se změny projevily, musíte stránku obnovit."
- },
"blockedDomainsDesc": {
"message": "Automatické vyplňování a další související funkce nebudou pro tyto webové stránky nabízeny. Aby se změny projevily, musíte stránku aktualizovat."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Číslo karty"
},
+ "errorCannotDecrypt": {
+ "message": "Chyba: Nelze dešifrovat"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Vaše organizace již k přihlášení do Bitwardenu nepoužívá hlavní hesla. Chcete-li pokračovat, ověřte organizaci a doménu."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Stáhnout aplikace Bitwarden"
+ },
"emailProtected": {
"message": "E-mail je chráněný"
},
@@ -6134,4 +6137,4 @@
"message": "Pro zobrazení tohoto Send budou muset jednotlivci zadat heslo",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json
index dc5ed2d6c7d..6910fe2efb3 100644
--- a/apps/browser/src/_locales/cy/messages.json
+++ b/apps/browser/src/_locales/cy/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Fydd Bitwarden ddim yn gofyn i gadw manylion mewngofnodi'r parthau hyn. Rhaid i chi ail-lwytho'r dudalen i newidiadau ddod i rym."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json
index 72a009b55bc..faf4fc855ec 100644
--- a/apps/browser/src/_locales/da/messages.json
+++ b/apps/browser/src/_locales/da/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden vil ikke bede om at gemme login-detaljer for disse domæner. Du skal opdatere siden for at ændringerne kan træde i kraft."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden vil ikke anmode om at gemme login-detaljer for disse domæner for alle indloggede konti. Siden skal opfriskes for at effektuere ændringerne."
- },
"blockedDomainsDesc": {
"message": "Autofyldning og andre relaterede funktioner tilbydes ikke på disse websteder. Siden skal opdateres for at effektuere ændringerne."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json
index ddebf64adf4..ad5b45159df 100644
--- a/apps/browser/src/_locales/de/messages.json
+++ b/apps/browser/src/_locales/de/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden wird keine Login-Daten für diese Domäne speichern. Du musst die Seite aktualisieren, damit die Änderungen wirksam werden."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden wird für alle angemeldeten Konten nicht danach fragen Zugangsdaten für diese Domains speichern. Du musst die Seite neu laden, damit die Änderungen wirksam werden."
- },
"blockedDomainsDesc": {
"message": "Automatisches Ausfüllen und andere zugehörige Funktionen werden für diese Webseiten nicht angeboten. Du musst die Seite neu laden, damit die Änderungen wirksam werden."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kartennummer"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Deine Organisation verwendet keine Master-Passwörter mehr, um sich bei Bitwarden anzumelden. Verifiziere die Organisation und Domain, um fortzufahren."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "benutzer@bitwarden.com, benutzer@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "E-Mail-Adresse geschützt"
},
@@ -6134,4 +6137,4 @@
"message": "Personen müssen das Passwort eingeben, um dieses Send anzusehen",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json
index 04e2d2568f7..59f757008f2 100644
--- a/apps/browser/src/_locales/el/messages.json
+++ b/apps/browser/src/_locales/el/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Το Bitwarden δεν θα ζητήσει να αποθηκεύσετε τα στοιχεία σύνδεσης για αυτούς τους τομείς. Πρέπει να ανανεώσετε τη σελίδα για να τεθούν σε ισχύ οι αλλαγές."
},
- "excludedDomainsDescAlt": {
- "message": "Το Bitwarden δε θα ρωτήσει για να αποθηκεύσετε τα στοιχεία σύνδεσης για αυτούς τους τομείς, για όλους τους συνδεδεμένους λογαριασμούς. Πρέπει να ανανεώσετε τη σελίδα για να τεθούν σε ισχύ οι αλλαγές."
- },
"blockedDomainsDesc": {
"message": "Η αυτόματη συμπλήρωση και άλλες σχετικές λειτουργίες δεν θα προσφερθούν για αυτούς τους ιστότοπους. Πρέπει να ανανεώσετε τη σελίδα για να τεθούν σε ισχύ οι αλλαγές."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json
index ab3b511a009..e34e20844e6 100644
--- a/apps/browser/src/_locales/en_GB/messages.json
+++ b/apps/browser/src/_locales/en_GB/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organisation is no longer using master passwords to log into Bitwarden. To continue, verify the organisation and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json
index 3c19d7c8af0..9fd388a80d3 100644
--- a/apps/browser/src/_locales/en_IN/messages.json
+++ b/apps/browser/src/_locales/en_IN/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organisation is no longer using master passwords to log into Bitwarden. To continue, verify the organisation and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json
index b6d1f5f793b..ab5fad7e3af 100644
--- a/apps/browser/src/_locales/es/messages.json
+++ b/apps/browser/src/_locales/es/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden no pedirá que se guarden los datos de acceso para estos dominios. Debe actualizar la página para que los cambios surtan efecto."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden no pedirá que se guarden los datos de acceso para estos dominios en todas las sesiones iniciadas. Debe actualizar la página para que los cambios surtan efecto."
- },
"blockedDomainsDesc": {
"message": "El autorrelleno y otras funcionalidades relacionadas no se ofrecerán para estos sitios web. Debe actualizar la página para que los cambios surtan efecto."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Número de tarjeta"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Los individuos tendrán que introducir la contraseña para ver este Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json
index 34ac5f523ca..e8efd12b1e2 100644
--- a/apps/browser/src/_locales/et/messages.json
+++ b/apps/browser/src/_locales/et/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Nendel domeenidel Bitwarden paroolide salvestamise valikut ei paku. Muudatuste jõustamiseks pead lehekülge värskendama."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json
index cd2cbb910ef..e7fcd4998e0 100644
--- a/apps/browser/src/_locales/eu/messages.json
+++ b/apps/browser/src/_locales/eu/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwardenek ez du eskatuko domeinu horietarako saio-hasierako xehetasunak gordetzea. Orrialdea eguneratu behar duzu aldaketek eragina izan dezaten."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json
index ea95452d409..bca4ad20d52 100644
--- a/apps/browser/src/_locales/fa/messages.json
+++ b/apps/browser/src/_locales/fa/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنهها سوال نمیکند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden برای هیچ یک از حسابهای کاربری وارد شده، درخواست ذخیره اطلاعات ورود برای این دامنهها را نخواهد داد. برای اعمال تغییرات باید صفحه را تازهسازی کنید."
- },
"blockedDomainsDesc": {
"message": "ویژگیهای پر کردن خودکار و سایر قابلیتهای مرتبط برای این وبسایتها ارائه نخواهند شد. برای اعمال تغییرات باید صفحه را تازهسازی کنید."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json
index 630c6e91ff2..2997ed6c128 100644
--- a/apps/browser/src/_locales/fi/messages.json
+++ b/apps/browser/src/_locales/fi/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden ei pyydä kirjautumistietojen tallennusta näille verkkotunnuksille. Päivitä sivu ottaaksesi muutokset käyttöön."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden ei pyydä kirjautumistietojen tallennusta näillä verkkotunnuksilla. Koskee kaikkia kirjautuneita tilejä. Ota muutokset käyttöön päivittämällä sivu."
- },
"blockedDomainsDesc": {
"message": "Näille sivustoille ei tarjota automaattista täyttöä eikä muita siihen liittyviä ominaisuuksia. Sinun on päivitettävä sivu, jotta muutokset tulevat voimaan."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kortin numero"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json
index eb6687e810c..11da450cc0f 100644
--- a/apps/browser/src/_locales/fil/messages.json
+++ b/apps/browser/src/_locales/fil/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Hindi tatanungin ng Bitwarden na i-save ang mga detalye ng pag-login para sa mga domain na ito. Kailangan mo nang i-refresh ang page para maipatupad ang mga pagbabago."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json
index 9de933d34df..face33e0087 100644
--- a/apps/browser/src/_locales/fr/messages.json
+++ b/apps/browser/src/_locales/fr/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines. Vous devez actualiser la page pour que les modifications prennent effet."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines pour tous les comptes connectés. Vous devez actualiser la page pour que les modifications prennent effet."
- },
"blockedDomainsDesc": {
"message": "La saisie automatique et d'autres fonctionnalités connexes ne seront pas proposées pour ces sites web. Vous devez actualiser la page pour que les modifications soient prises en compte."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Numéro de carte"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Votre organisation n'utilise plus les mots de passe principaux pour se connecter à Bitwarden. Pour continuer, vérifiez l'organisation et le domaine."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json
index 15ab24b16d7..69ef54f78eb 100644
--- a/apps/browser/src/_locales/gl/messages.json
+++ b/apps/browser/src/_locales/gl/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden non ofrecerá gardar contas para estes dominios. Recarga a páxina para que os cambios fagan efecto."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden non ofrecerá gardar contas para estes dominios en ningunha das sesións iniciadas. Recarga a páxina para que os cambios fornezan efecto."
- },
"blockedDomainsDesc": {
"message": "O autoenchido e outras funcións relacionadas non estarán dispoñibles para estas webs. Debes recargar a páxina para que os cambios teñan efecto."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json
index ab0fbfe9562..22939259639 100644
--- a/apps/browser/src/_locales/he/messages.json
+++ b/apps/browser/src/_locales/he/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden לא יבקש לשמור פרטי כניסה עבור הדומיינים האלה. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden לא יבקש לשמור פרטי כניסה עבור הדומיינים האלה עבור כל החשבונות המחוברים. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף."
- },
"blockedDomainsDesc": {
"message": "לא יוצעו מילוי אוטומטי ותכונות קשורות אחרות עבור האתרים האלה. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "מספר כרטיס"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json
index b07e6bcb5c9..298f0312be7 100644
--- a/apps/browser/src/_locales/hi/messages.json
+++ b/apps/browser/src/_locales/hi/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "बिटवर्डन इन डोमेन के लिए लॉगिन विवरण सहेजने के लिए नहीं कहेगा।परिवर्तनों को प्रभावी बनाने के लिए आपको पृष्ठ को ताज़ा करना होगा |"
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json
index d5f7f21ddb0..d7814a22da0 100644
--- a/apps/browser/src/_locales/hr/messages.json
+++ b/apps/browser/src/_locales/hr/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden neće pitati treba li spremiti prijavne podatke za ove domene. Za primjenu promjena, potrebno je osvježiti stranicu."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden neće nuditi spremanje podataka za prijavu za ove domene za sve prijavljene račune. Moraš osvježiti stranicu kako bi promjene stupile na snagu."
- },
"blockedDomainsDesc": {
"message": "Auto-ispuna i druge vezane značajke neće biti ponuđene za ova web mjesta. Potrebno je osvježiti stranicu zaprimjenu postavki."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Broj kartice"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json
index 36a929a8712..ec4b2d405bf 100644
--- a/apps/browser/src/_locales/hu/messages.json
+++ b/apps/browser/src/_locales/hu/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "A Bitwarden nem fogja kérni a domainek bejelentkezési adatainak mentését. A változások életbe lépéséhez frissíteni kell az oldalt."
},
- "excludedDomainsDescAlt": {
- "message": "A Bitwarden nem kéri a bejelentkezési adatok mentését ezeknél a tartományoknál az összes bejelentkezési fiókra vonatkozva. A változtatások életbe lépéséhez frissíteni kell az oldalt."
- },
"blockedDomainsDesc": {
"message": "Az automatikus kitöltés és az egyéb kapcsolódó funkciók ezeken a webhelyeken nincsenek a kínálatban. A változtatások életbe lépéséhez frissíteni kell az oldalt."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kártya szám"
},
+ "errorCannotDecrypt": {
+ "message": "Hiba: nem fejthető vissza."
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "A szervezet már nem használ mesterjelszavakat a Bitwardenbe bejelentkezéshez. A folytatáshoz ellenőrizzük a szervezetet és a tartományt."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Bitwarden alkalmazások letöltése"
+ },
"emailProtected": {
"message": "Védett email cím"
},
@@ -6134,4 +6137,4 @@
"message": "A személyeknek meg kell adniuk a jelszót a Send elem megtekintéséhez.",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json
index 098879ce6fc..f364b2f7540 100644
--- a/apps/browser/src/_locales/id/messages.json
+++ b/apps/browser/src/_locales/id/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden tidak akan meminta untuk menyimpan detail login untuk domain ini. Anda harus menyegarkan halaman agar perubahan diterapkan."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden tidak akan meminta untuk menyimpan rincian login untuk domain tersebut. Anda harus menyegarkan halaman agar perubahan diterapkan."
- },
"blockedDomainsDesc": {
"message": "Isi otomatis dan fitur terkait lain tidak akan ditawarkan bagi situs-situs web ini. Anda mesti menyegarkan halaman agar perubahan berdampak."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json
index 9cd4efec3ee..9c4ce6a0369 100644
--- a/apps/browser/src/_locales/it/messages.json
+++ b/apps/browser/src/_locales/it/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden non ti chiederà di aggiungere nuovi login per questi domini. Ricorda di ricaricare la pagina perché le modifiche abbiano effetto."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden non chiederà di salvare le credenziali di accesso per questi domini per tutti gli account sul dispositivo. Ricarica la pagina affinché le modifiche abbiano effetto."
- },
"blockedDomainsDesc": {
"message": "Per questi siti, riempimento automatico e funzionalità simili non saranno disponibili. Ricarica la pagina per applicare le modifiche."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Numero di carta"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "La tua organizzazione non utilizza più le password principali per accedere a Bitwarden. Per continuare, verifica l'organizzazione e il dominio."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json
index 8de6fb53c1c..c8a963fc744 100644
--- a/apps/browser/src/_locales/ja/messages.json
+++ b/apps/browser/src/_locales/ja/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden はこれらのドメインのログイン情報を保存するよう尋ねません。変更を有効にするにはページを更新する必要があります。"
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden はログインしているすべてのアカウントで、これらのドメインのログイン情報を保存するよう要求しません。 変更を有効にするにはページを更新する必要があります。"
- },
"blockedDomainsDesc": {
"message": "自動入力やその他の関連機能はこれらのウェブサイトには提供されません。変更を反映するにはページを更新する必要があります。"
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "カード番号"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json
index 49e1eb3cabd..cb6129ed2bb 100644
--- a/apps/browser/src/_locales/ka/messages.json
+++ b/apps/browser/src/_locales/ka/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/km/messages.json
+++ b/apps/browser/src/_locales/km/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json
index 36007446e97..e97ce2a95a4 100644
--- a/apps/browser/src/_locales/kn/messages.json
+++ b/apps/browser/src/_locales/kn/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "ಬಿಟ್ವಾರ್ಡ್ ಈ ಡೊಮೇನ್ಗಳಿಗಾಗಿ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಉಳಿಸಲು ಕೇಳುವುದಿಲ್ಲ. ಬದಲಾವಣೆಗಳನ್ನು ಜಾರಿಗೆ ತರಲು ನೀವು ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಬೇಕು."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json
index b0afb6d12b3..9f570d62abb 100644
--- a/apps/browser/src/_locales/ko/messages.json
+++ b/apps/browser/src/_locales/ko/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden은 이 도메인들에 대해 로그인 정보를 저장할 것인지 묻지 않습니다. 페이지를 새로고침해야 변경된 내용이 적용됩니다."
},
- "excludedDomainsDescAlt": {
- "message": "BItwarden은 로그인한 모든 계정에 대해 이러한 도메인에 대한 로그인 세부 정보를 저장하도록 요청하지 않습니다. 변경 사항을 적용하려면 페이지를 새로 고쳐야 합니다"
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json
index 5489c489de3..6e105f044f3 100644
--- a/apps/browser/src/_locales/lt/messages.json
+++ b/apps/browser/src/_locales/lt/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "„Bitwarden“ neprašys išsaugoti šių domenų prisijungimo duomenų. Turite atnaujinti puslapį, kad pokyčiai pradėtų galioti."
},
- "excludedDomainsDescAlt": {
- "message": "„Bitwarden“ neprašys išsaugoti prisijungimo detalių šiems domenams, visose prisijungusiose paskyrose. Turite atnaujinti puslapį, kad pokyčiai pradėtų galioti."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json
index 603d7e85eaa..8c86d7040fe 100644
--- a/apps/browser/src/_locales/lv/messages.json
+++ b/apps/browser/src/_locales/lv/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden nevaicās saglabāt pieteikšanās datus šiem domēniem. Ir jāpārlādē lapa, lai izmaiņas iedarbotos."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden nevaicās saglabāt pieteikšanās datus visiem šī domēna kontiem, kuri ir pieteikušies. Ir jāpārlādē lapa, lai iedarbotos izmaiņas."
- },
"blockedDomainsDesc": {
"message": "Automātiskā aizpilde un citas saistītās iespējas šajās tīmekļvietnēs netiks piedāvātas. Ir jāatsvaidzina lapa, lai izmaiņas iedarbotos."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kartes numurs"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Apvienība vairs neizmanto galvenās paroles, lai pieteiktos Bitwarden. Lai turpinātu, jāapliecina apvienība un domēns."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Cilvēkiem būs jāievada parole, lai apskatītu šo Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json
index 740d9077351..61f69ffe22b 100644
--- a/apps/browser/src/_locales/ml/messages.json
+++ b/apps/browser/src/_locales/ml/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json
index ae2ef47131f..5cc614c5df7 100644
--- a/apps/browser/src/_locales/mr/messages.json
+++ b/apps/browser/src/_locales/mr/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/my/messages.json
+++ b/apps/browser/src/_locales/my/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json
index 877be294778..ce6c8d5a7d4 100644
--- a/apps/browser/src/_locales/nb/messages.json
+++ b/apps/browser/src/_locales/nb/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden vil ikke be om å lagre innloggingsdetaljer for disse domenene. Du må oppdatere siden for at endringene skal tre i kraft."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/ne/messages.json
+++ b/apps/browser/src/_locales/ne/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json
index 895d6592b93..44522727429 100644
--- a/apps/browser/src/_locales/nl/messages.json
+++ b/apps/browser/src/_locales/nl/messages.json
@@ -35,7 +35,7 @@
"message": "Single sign-on gebruiken"
},
"yourOrganizationRequiresSingleSignOn": {
- "message": "Your organization requires single sign-on."
+ "message": "Je organisatie vereist single sign-on."
},
"welcomeBack": {
"message": "Welkom terug"
@@ -589,10 +589,10 @@
"message": "Eenmaal gearchiveerd wordt dit item uitgesloten van zoekresultaten en suggesties voor automatisch invullen."
},
"archived": {
- "message": "Archived"
+ "message": "Gearchiveerd"
},
"unarchiveAndSave": {
- "message": "Unarchive and save"
+ "message": "Dearchiveren en opslaan"
},
"upgradeToUseArchive": {
"message": "Je hebt een Premium-abonnement nodig om te kunnen archiveren."
@@ -1555,13 +1555,13 @@
"message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo."
},
"premiumSubscriptionEnded": {
- "message": "Your Premium subscription ended"
+ "message": "Je Premium-abonnement is afgelopen"
},
"archivePremiumRestart": {
- "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault."
+ "message": "Herstart je Premium-abonnement om toegang tot je archief te krijgen. Als je de details wijzigt voor een gearchiveerd item voor het opnieuw opstarten, zal het terug naar je kluis worden verplaatst."
},
"restartPremium": {
- "message": "Restart Premium"
+ "message": "Premium herstarten"
},
"ppremiumSignUpReports": {
"message": "Wachtwoordhygiëne, gezondheid van je account en datalekken om je kluis veilig te houden."
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden zal voor deze domeinen niet vragen om inloggegevens op te slaan. Je moet de pagina vernieuwen om de wijzigingen toe te passen."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden zal voor deze domeinen niet vragen om de wachtwoorden op te slaan voor alle ingelogde accounts. Je moet de pagina verversen om de wijzigingen op te slaan."
- },
"blockedDomainsDesc": {
"message": "Autofill en andere gerelateerde functies worden niet aangeboden voor deze websites. Vernieuw de pagina om de wijzigingen toe te passen."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kaartnummer"
},
+ "errorCannotDecrypt": {
+ "message": "Fout: Kan niet ontsleutelen"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Je organisatie maakt niet langer gebruik van hoofdwachtwoorden om in te loggen op Bitwarden. Controleer de organisatie en het domein om door te gaan."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Bitwarden-apps downloaden"
+ },
"emailProtected": {
"message": "E-mail beveiligd"
},
@@ -6134,4 +6137,4 @@
"message": "Individuen moeten het wachtwoord invoeren om deze Send te bekijken",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/nn/messages.json
+++ b/apps/browser/src/_locales/nn/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/or/messages.json
+++ b/apps/browser/src/_locales/or/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json
index fa1c2956e9f..44c7d9e6d47 100644
--- a/apps/browser/src/_locales/pl/messages.json
+++ b/apps/browser/src/_locales/pl/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden nie będzie proponował zapisywania danych logowania dla tych domen. Odśwież stronę, aby zastosowywać zmiany."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden nie będzie proponował zapisywania danych logowania dla tych domen dla wszystkich zalogowanych kont. Odśwież stronę, aby zastosowywać zmiany."
- },
"blockedDomainsDesc": {
"message": "Autouzupełnianie będzie zablokowane dla tych stron internetowych. Zmiany zaczną obowiązywać po odświeżeniu strony."
},
@@ -5671,7 +5668,7 @@
"message": "Bardzo szeroka"
},
"narrow": {
- "message": "Narrow"
+ "message": "Wąska"
},
"sshKeyWrongPassword": {
"message": "Hasło jest nieprawidłowe."
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Numer karty"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json
index 70de48fc293..5ad95b480db 100644
--- a/apps/browser/src/_locales/pt_BR/messages.json
+++ b/apps/browser/src/_locales/pt_BR/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"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 recarregar a página para que as alterações entrem em vigor."
- },
"blockedDomainsDesc": {
"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."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Número do cartão"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "A sua organização não está mais usando senhas principais para se conectar ao Bitwarden. Para continuar, verifique a organização e o domínio."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json
index 351ac934091..604bf054707 100644
--- a/apps/browser/src/_locales/pt_PT/messages.json
+++ b/apps/browser/src/_locales/pt_PT/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "O Bitwarden não pedirá para guardar os detalhes de início de sessão destes domínios. É necessário atualizar a página para que as alterações tenham efeito."
},
- "excludedDomainsDescAlt": {
- "message": "O Bitwarden não pedirá para guardar os detalhes de início de sessão destes domínios para todas as contas com sessão iniciada. É necessário atualizar a página para que as alterações tenham efeito."
- },
"blockedDomainsDesc": {
"message": "O preenchimento automático e outras funcionalidades relacionadas não serão disponibilizados para estes sites. É necessário atualizar a página para que as alterações tenham efeito."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Número do cartão"
},
+ "errorCannotDecrypt": {
+ "message": "Erro: Não é possível desencriptar"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "A sua organização já não utiliza palavras-passe mestras para iniciar sessão no Bitwarden. Para continuar, verifique a organização e o domínio."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "utilizador@bitwarden.com , utilizador@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Descarregar as apps Bitwarden"
+ },
"emailProtected": {
"message": "E-mail protegido"
},
@@ -6134,4 +6137,4 @@
"message": "Os indivíduos terão de introduzir a palavra-passe para ver este Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json
index ebd8063cc4f..12706943e83 100644
--- a/apps/browser/src/_locales/ro/messages.json
+++ b/apps/browser/src/_locales/ro/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden nu va cere să salveze detaliile de conectare pentru aceste domenii. Trebuie să reîmprospătați pagina pentru ca modificările să intre în vigoare."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json
index a669d338fce..dab9a22f03a 100644
--- a/apps/browser/src/_locales/ru/messages.json
+++ b/apps/browser/src/_locales/ru/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden не будет предлагать сохранить логины для этих доменов. Для вступления изменений в силу необходимо обновить страницу."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden не будет предлагать сохранение логинов для этих доменов для всех авторизованных аккаунтов. Для вступления изменений в силу необходимо обновить страницу."
- },
"blockedDomainsDesc": {
"message": "Автозаполнение и другие связанные с ним функции не будут предлагаться для этих сайтов. Чтобы изменения вступили в силу, необходимо обновить страницу."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Номер карты"
},
+ "errorCannotDecrypt": {
+ "message": "Ошибка: невозможно расшифровать"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Ваша организация больше не использует мастер-пароли для входа в Bitwarden. Чтобы продолжить, подтвердите организацию и домен."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Скачать приложения Bitwarden"
+ },
"emailProtected": {
"message": "Email защищен"
},
@@ -6134,4 +6137,4 @@
"message": "Пользователям необходимо будет ввести пароль для просмотра этой Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json
index 3f721641b6a..d228cdb512a 100644
--- a/apps/browser/src/_locales/si/messages.json
+++ b/apps/browser/src/_locales/si/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "බිට්වර්ඩන් මෙම වසම් සඳහා පිවිසුම් තොරතුරු සුරැකීමට ඉල්ලා නොසිටිනු ඇත. බලාත්මක කිරීම සඳහා වෙනස්කම් සඳහා ඔබ පිටුව නැවුම් කළ යුතුය."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json
index 1528079565a..db7efcd8b9f 100644
--- a/apps/browser/src/_locales/sk/messages.json
+++ b/apps/browser/src/_locales/sk/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden nebude požadovať ukladanie prihlasovacích údajov pre tieto domény. Aby sa zmeny prejavili, musíte stránku obnoviť."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden nebude požadovať ukladanie prihlasovacích údajov pre tieto domény pre všetky prihlásené účty. Aby sa zmeny prejavili, musíte stránku obnoviť."
- },
"blockedDomainsDesc": {
"message": "Automatické vypĺňanie a ďalšie súvisiace funkcie sa na týchto webových stránkach nebudú ponúkať. Aby sa zmeny prejavili, musíte stránku obnoviť."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Číslo karty"
},
+ "errorCannotDecrypt": {
+ "message": "Chyba: Nedá sa dešifrovať"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Vaša organizácia už nepoužíva hlavné heslá na prihlásenie do Bitwardenu. Ak chcete pokračovať, overte organizáciu a doménu."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "pouzivate@bitwarden.com, pouzivatel@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Chránené e-mailom"
},
@@ -6134,4 +6137,4 @@
"message": "Jednotlivci budú musieť zadať heslo, aby mohli zobraziť tento Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json
index e95822d96ea..07ee84ab810 100644
--- a/apps/browser/src/_locales/sl/messages.json
+++ b/apps/browser/src/_locales/sl/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Za te domene Bitwarden ne bo predlagal shranjevanja prijavnih podatkov. Sprememba nastavitev stopi v veljavo šele, ko osvežite stran."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json
index 5eef711ea1e..0ad71788514 100644
--- a/apps/browser/src/_locales/sr/messages.json
+++ b/apps/browser/src/_locales/sr/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden неће тражити да сачува податке за пријављивање за ове домене. Морате освежити страницу да би промене ступиле на снагу."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden неће тражити да сачува податке за пријављивање за ове домене за све пријављене налоге. Морате освежити страницу да би промене ступиле на снагу."
- },
"blockedDomainsDesc": {
"message": "Аутоматско попуњавање и сродне функције неће бити понуђене за ове веб сајтове. Морате освежити страницу да би се измене примениле."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Број картице"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Ваша организација више не користи главне лозинке за пријаву на Bitwarden. Да бисте наставили, верификујте организацију и домен."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json
index 756b19a81c0..08cec673d27 100644
--- a/apps/browser/src/_locales/sv/messages.json
+++ b/apps/browser/src/_locales/sv/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden kommer inte att fråga om att få spara inloggningsuppgifter för dessa domäner. Du måste uppdatera sidan för att ändringarna ska träda i kraft."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden kommer inte att be om att få spara inloggningsuppgifter för dessa domäner för alla inloggade konton. Du måste uppdatera sidan för att ändringarna ska träda i kraft."
- },
"blockedDomainsDesc": {
"message": "Autofyll och andra relaterade funktioner kommer inte att erbjudas för dessa webbplatser. Du måste uppdatera sidan för att ändringarna ska träda i kraft."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kortnummer"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Din organisation använder inte längre huvudlösenord för att logga in på Bitwarden. För att fortsätta, verifiera organisationen och domänen."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "användare@bitwarden.com , användare@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individer måste ange lösenordet för att visa denna Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/ta/messages.json b/apps/browser/src/_locales/ta/messages.json
index a872eb9fe53..374c0968d2c 100644
--- a/apps/browser/src/_locales/ta/messages.json
+++ b/apps/browser/src/_locales/ta/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "இந்த டொமைன்களுக்கான உள்நுழைவு விவரங்களைச் சேமிக்க Bitwarden கேட்காது. மாற்றங்கள் நடைமுறைக்கு வர பக்கத்தை மீண்டும் மீட்டமைக்க வேண்டும்."
},
- "excludedDomainsDescAlt": {
- "message": "உள்நுழைந்த அனைத்து கணக்குகளுக்கும் இந்த டொமைன்களுக்கான உள்நுழைவு விவரங்களைச் சேமிக்க Bitwarden கேட்காது. மாற்றங்கள் நடைமுறைக்கு வர பக்கத்தை மீண்டும் மீட்டமைக்க வேண்டும்."
- },
"blockedDomainsDesc": {
"message": "இந்த இணையதளங்களுக்கு தானாக நிரப்புதல் மற்றும் பிற தொடர்புடைய அம்சங்கள் வழங்கப்படாது. மாற்றங்கள் நடைமுறைக்கு வர பக்கத்தை மீண்டும் மீட்டமைக்க வேண்டும்."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "அட்டை எண்"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json
index c6d9d325e00..336e8783b75 100644
--- a/apps/browser/src/_locales/te/messages.json
+++ b/apps/browser/src/_locales/te/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect."
- },
"blockedDomainsDesc": {
"message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Card number"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json
index 19fc6e41ec8..5af1c742f45 100644
--- a/apps/browser/src/_locales/th/messages.json
+++ b/apps/browser/src/_locales/th/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden จะไม่ถามให้บันทึกรายละเอียดการเข้าสู่ระบบสำหรับโดเมนเหล่านี้ คุณต้องรีเฟรชหน้าเว็บเพื่อให้การเปลี่ยนแปลงมีผล"
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden จะไม่ถามให้บันทึกรายละเอียดการเข้าสู่ระบบสำหรับโดเมนเหล่านี้สำหรับทุกบัญชีที่เข้าสู่ระบบ คุณต้องรีเฟรชหน้าเว็บเพื่อให้การเปลี่ยนแปลงมีผล"
- },
"blockedDomainsDesc": {
"message": "การป้อนอัตโนมัติและฟีเจอร์อื่น ๆ ที่เกี่ยวข้องจะไม่พร้อมใช้งานสำหรับเว็บไซต์เหล่านี้ คุณต้องรีเฟรชหน้าเว็บเพื่อให้การเปลี่ยนแปลงมีผล"
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "หมายเลขบัตร"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "องค์กรของคุณไม่ใช้รหัสผ่านหลักในการเข้าสู่ระบบ Bitwarden อีกต่อไป หากต้องการดำเนินการต่อ ให้ยืนยันองค์กรและโดเมน"
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json
index 92b09280cba..33f600fb7a7 100644
--- a/apps/browser/src/_locales/tr/messages.json
+++ b/apps/browser/src/_locales/tr/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden bu alan adlarında hesaplarınızı kaydetmeyi sormayacaktır. Değişikliklerin etkili olması için sayfayı yenilemelisiniz."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden, oturum açmış tüm hesaplar için bu alan adlarının hesap bilgilerini kaydetmeyi sormayacaktır. Değişikliklerin etkili olması için sayfayı yenilemeniz gerekir."
- },
"blockedDomainsDesc": {
"message": "Bu siteler için otomatik doldurma ve diğer ilgili özellikler önerilmeyecektir. Değişikliklerin devreye girmesi için sayfayı yenilemelisiniz."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Kart numarası"
},
+ "errorCannotDecrypt": {
+ "message": "Hata: Deşifre edilemiyor"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "kullanici@bitwarden.com , kullanici@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Bitwarden uygulamalarını indir"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Bu Send'i görmek isteyen kişilerin parola girmesi gerekecektir",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json
index 9f6b376cbc1..b703cfeefce 100644
--- a/apps/browser/src/_locales/uk/messages.json
+++ b/apps/browser/src/_locales/uk/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів. Потрібно оновити сторінку для застосування змін."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden не запитуватиме про збереження даних входу для цих доменів для всіх облікових записів, до яких виконано вхід. Потрібно оновити сторінку для застосування змін."
- },
"blockedDomainsDesc": {
"message": "Автозаповнення та інші пов'язані функції не пропонуватимуться для цих вебсайтів. Вам слід оновити сторінку для застосування змін."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Номер картки"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Ваша організація більше не використовує головні паролі для входу в Bitwarden. Щоб продовжити, підтвердіть організацію та домен."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Е-пошту захищено"
},
@@ -6134,4 +6137,4 @@
"message": "Особам необхідно ввести пароль для перегляду цього відправлення",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json
index ad03e96537a..0082ee1ece7 100644
--- a/apps/browser/src/_locales/vi/messages.json
+++ b/apps/browser/src/_locales/vi/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các miền này. Bạn phải làm mới trang để các thay đổi có hiệu lực."
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các tên miền này đối với tất cả tài khoản đã đăng nhập. Bạn phải làm mới trang để các thay đổi có hiệu lực."
- },
"blockedDomainsDesc": {
"message": "Tự động điền và các tính năng liên quan khác sẽ không được cung cấp cho các trang web này. Bạn phải làm mới trang để các thay đổi có hiệu lực."
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "Số thẻ"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "Tổ chức của bạn không còn sử dụng mật khẩu chính để đăng nhập vào Bitwarden. Để tiếp tục, hãy xác minh tổ chức và tên miền."
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "Download Bitwarden apps"
+ },
"emailProtected": {
"message": "Email protected"
},
@@ -6134,4 +6137,4 @@
"message": "Individuals will need to enter the password to view this Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json
index d9b78ca0d50..860a8c09f27 100644
--- a/apps/browser/src/_locales/zh_CN/messages.json
+++ b/apps/browser/src/_locales/zh_CN/messages.json
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden 将不会提示保存这些域名的登录信息。您必须刷新页面才能使更改生效。"
},
- "excludedDomainsDescAlt": {
- "message": "Bitwarden 将不会提示为所有已登录账户保存这些域名的登录信息。您必须刷新页面才能使更改生效。"
- },
"blockedDomainsDesc": {
"message": "将不会为这些网站提供自动填充和其他相关功能。您必须刷新页面才能使更改生效。"
},
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "卡号"
},
+ "errorCannotDecrypt": {
+ "message": "错误:无法解密"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "您的组织已不再使用主密码登录 Bitwarden。要继续,请验证组织和域名。"
},
@@ -6127,11 +6127,14 @@
"emailPlaceholder": {
"message": "user@bitwarden.com, user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "下载 Bitwarden App"
+ },
"emailProtected": {
- "message": "电子邮件受保护"
+ "message": "电子邮箱保护"
},
"sendPasswordHelperText": {
"message": "个人需要输入密码才能查看此 Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json
index eade6878396..3f387d935d4 100644
--- a/apps/browser/src/_locales/zh_TW/messages.json
+++ b/apps/browser/src/_locales/zh_TW/messages.json
@@ -10,7 +10,7 @@
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
},
"extDesc": {
- "message": "Bitwarden 是一款安全、免費、跨平台的密碼管理工具。",
+ "message": "無論在家、在工作場所或外出時,Bitwarden 都能輕鬆保護您的所有密碼、密碼金鑰及敏感資訊。",
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
},
"loginOrCreateNewAccount": {
@@ -29,13 +29,13 @@
"message": "使用通行金鑰登入"
},
"unlockWithPasskey": {
- "message": "使用通行金鑰解鎖"
+ "message": "使用密碼金鑰解鎖"
},
"useSingleSignOn": {
"message": "使用單一登入(SSO)"
},
"yourOrganizationRequiresSingleSignOn": {
- "message": "您的組織需要單一登入。"
+ "message": "您的組織要求使用單一登入。"
},
"welcomeBack": {
"message": "歡迎回來"
@@ -44,7 +44,7 @@
"message": "設定一組高強度密碼"
},
"finishCreatingYourAccountBySettingAPassword": {
- "message": "設定密碼以完成建立您的帳號"
+ "message": "請設定密碼以完成帳戶建立"
},
"enterpriseSingleSignOn": {
"message": "企業單一登入(SSO)"
@@ -71,7 +71,7 @@
"message": "主密碼提示可在您忘記時幫助您回想主密碼。"
},
"masterPassHintText": {
- "message": "如果您忘記了密碼,可以傳送密碼提示到您的電子郵件。$CURRENT$ / 最多 $MAXIMUM$ 個字元",
+ "message": "若您忘記密碼,可將密碼提示傳送至您的電子郵件。\n$CURRENT$/$MAXIMUM$ 個字元上限。",
"placeholders": {
"current": {
"content": "$1",
@@ -209,7 +209,7 @@
"message": "自動填入登入資料"
},
"autoFillCard": {
- "message": "自動填入卡片資料"
+ "message": "自動填入付款卡"
},
"autoFillIdentity": {
"message": "自動填入身分資料"
@@ -231,7 +231,7 @@
"message": "沒有符合的登入資料"
},
"noCards": {
- "message": "沒有卡片資料"
+ "message": "沒有付款卡"
},
"noIdentities": {
"message": "沒有身分資料"
@@ -240,7 +240,7 @@
"message": "新增登入資料"
},
"addCardMenu": {
- "message": "新增卡片資料"
+ "message": "新增付款卡"
},
"addIdentityMenu": {
"message": "新增身分資料"
@@ -261,7 +261,7 @@
"message": "新增項目"
},
"accountEmail": {
- "message": "帳號電子郵件"
+ "message": "帳戶電子郵件"
},
"requestHint": {
"message": "取得提示"
@@ -2747,9 +2747,6 @@
"excludedDomainsDesc": {
"message": "Bitwarden 不會在這些網域要求儲存登入資料。您必須重新整理頁面,變更才會生效。"
},
- "excludedDomainsDescAlt": {
- "message": "對於所有已登入的帳戶,Bitwarden 不會詢問是否儲存這些網域的登入資訊。您必須重新整理頁面變更才會生效。"
- },
"blockedDomainsDesc": {
"message": "自動填入及其它相關的功能無法在這些網站上使用。您必須重新整理頁面來使變更生效。"
},
@@ -3158,7 +3155,7 @@
"message": "此組織有一項企業政策,會自動將您加入密碼重設。加入後,組織管理員將能變更您的主密碼。"
},
"selectFolder": {
- "message": "選擇資料夾⋯"
+ "message": "選擇資料夾…"
},
"noFoldersFound": {
"message": "未找到資料夾",
@@ -3260,19 +3257,19 @@
}
},
"vaultTimeoutTooLarge": {
- "message": "您的密碼庫逾時時間超過組織設定的限制。"
+ "message": "您的密碼庫逾時時間超過您所屬組織設定的限制。"
},
"vaultExportDisabled": {
- "message": "密碼庫匯出已停用"
+ "message": "密碼庫匯出不可用"
},
"personalVaultExportPolicyInEffect": {
- "message": "一個或多個組織原則禁止您匯出個人密碼庫。"
+ "message": "一項或多項組織政策禁止您匯出個人密碼庫。"
},
"copyCustomFieldNameInvalidElement": {
- "message": "未能找出有效的表單元件。請試試看改用 HTML 檢查功能。"
+ "message": "無法識別有效的表單元素。請嘗試檢查 HTML。"
},
"copyCustomFieldNameNotUnique": {
- "message": "找不到唯一識別碼。"
+ "message": "未找到唯一識別碼。"
},
"organizationName": {
"message": "組織名稱"
@@ -3290,22 +3287,22 @@
"message": "主密碼已移除"
},
"leaveOrganizationConfirmation": {
- "message": "您確定要離開這個組織嗎?"
+ "message": "您確定要離開此組織嗎?"
},
"leftOrganization": {
"message": "您已離開此組織。"
},
"toggleCharacterCount": {
- "message": "切換字元計數"
+ "message": "顯示/隱藏字元數"
},
"sessionTimeout": {
- "message": "您的登入階段已逾時,請返回並嘗試重新登入。"
+ "message": "您的工作階段已逾時,請返回並重新登入。"
},
"exportingPersonalVaultTitle": {
- "message": "正匯出個人密碼庫"
+ "message": "正在匯出個人密碼庫"
},
"exportingIndividualVaultDescription": {
- "message": "僅匯出與 $EMAIL$ 關聯的個人密碼庫項目。組織密碼庫項目將不包括在內。僅匯出密碼庫項目資訊,不包括關聯的附件。",
+ "message": "僅匯出與 $EMAIL$ 相關的個人密碼庫項目,不包含組織密碼庫項目。僅匯出項目資訊,不包含相關附件。",
"placeholders": {
"email": {
"content": "$1",
@@ -3423,13 +3420,13 @@
"description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
},
"plusAddressedEmailDesc": {
- "message": "使用您電子郵件提供者的子地址功能。"
+ "message": "使用您的電子郵件服務提供者的子地址功能。"
},
"catchallEmail": {
"message": "Catch-all 電子郵件"
},
"catchallEmailDesc": {
- "message": "使用您的網域設定的 Catch-all 收件匣。"
+ "message": "使用您網域中已設定的 Catch-all 收件匣。"
},
"random": {
"message": "隨機"
@@ -3444,10 +3441,10 @@
"message": "服務"
},
"forwardedEmail": {
- "message": "轉寄的電子郵件別名"
+ "message": "轉寄電子郵件別名"
},
"forwardedEmailDesc": {
- "message": "使用外部轉寄服務產生一個電子郵件別名。"
+ "message": "使用外部轉寄服務產生電子郵件別名。"
},
"forwarderDomainName": {
"message": "電子郵件網域",
@@ -3594,7 +3591,7 @@
"message": "API 金鑰"
},
"ssoKeyConnectorError": {
- "message": "Key Connector 錯誤:請確保 Key Connector 可用且運作正常。"
+ "message": "Key Connector 錯誤:請確認 Key Connector 可用且運作正常。"
},
"premiumSubcriptionRequired": {
"message": "需要進階版訂閲"
@@ -3603,7 +3600,7 @@
"message": "組織已停用。"
},
"disabledOrganizationFilterError": {
- "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。"
+ "message": "無法存取已停用組織中的項目。請聯絡組織擁有者以取得協助。"
},
"loggingInTo": {
"message": "正在登入至 $DOMAIN$",
@@ -3618,13 +3615,13 @@
"message": "伺服器版本"
},
"selfHostedServer": {
- "message": "自架"
+ "message": "自行託管(自行部署並管理)"
},
"thirdParty": {
"message": "第三方"
},
"thirdPartyServerMessage": {
- "message": "已連線至第三方伺服器實作,$SERVERNAME$。 請使用官方伺服器驗證錯誤,或將其報告給第三方伺服器。",
+ "message": "已連線至第三方伺服器實作:$SERVERNAME$。請使用官方伺服器驗證是否為程式錯誤,或向第三方伺服器回報。",
"placeholders": {
"servername": {
"content": "$1",
@@ -3908,10 +3905,10 @@
"message": "記住這個裝置"
},
"uncheckIfPublicDevice": {
- "message": "若使用公用裝置,請勿勾選"
+ "message": "若為公用裝置,請取消勾選"
},
"approveFromYourOtherDevice": {
- "message": "使用其他裝置核准"
+ "message": "在其他裝置上核准"
},
"requestAdminApproval": {
"message": "要求管理員核准"
@@ -4025,7 +4022,7 @@
"message": "搜尋"
},
"inputMinLength": {
- "message": "必須輸入至少 $COUNT$ 個字元。",
+ "message": "輸入內容至少需 $COUNT$ 個字元。",
"placeholders": {
"count": {
"content": "$1",
@@ -4034,7 +4031,7 @@
}
},
"inputMaxLength": {
- "message": "輸入的內容長度不得超過 $COUNT$ 字元。",
+ "message": "輸入內容不得超過 $COUNT$ 個字元。",
"placeholders": {
"count": {
"content": "$1",
@@ -4070,10 +4067,10 @@
}
},
"multipleInputEmails": {
- "message": "一個或多個電子郵件無效"
+ "message": "一或多個電子郵件地址無效"
},
"inputTrimValidator": {
- "message": "輸入不得僅包含空格。",
+ "message": "輸入內容不得僅包含空白字元。",
"description": "Notification to inform the user that a form's input can't contain only whitespace."
},
"inputEmail": {
@@ -4101,7 +4098,7 @@
}
},
"selectPlaceholder": {
- "message": "-- 選擇 --"
+ "message": "-- 請選擇 --"
},
"multiSelectPlaceholder": {
"message": "-- 輸入以進行篩選 --"
@@ -4295,7 +4292,7 @@
"message": "使用 PIN 碼"
},
"useBiometrics": {
- "message": "用生物識別"
+ "message": "使用生物辨識"
},
"enterVerificationCodeSentToEmail": {
"message": "輸入傳送到你的電子郵件的驗證碼。"
@@ -4364,7 +4361,7 @@
"message": "選擇匯入檔案的格式"
},
"selectImportFile": {
- "message": "選擇要匯入的檔案"
+ "message": "選擇匯入的檔案"
},
"chooseFile": {
"message": "選擇檔案"
@@ -4373,10 +4370,10 @@
"message": "未選擇任何檔案"
},
"orCopyPasteFileContents": {
- "message": "或複製/貼上要匯入的檔案內容"
+ "message": "或複製/貼上匯入檔案的內容"
},
"instructionsFor": {
- "message": "$NAME$ 教學",
+ "message": "$NAME$ 操作說明",
"description": "The title for the import tool instructions.",
"placeholders": {
"name": {
@@ -4386,10 +4383,10 @@
}
},
"confirmVaultImport": {
- "message": "確認匯入密碼庫"
+ "message": "確認密碼庫匯入"
},
"confirmVaultImportDesc": {
- "message": "此檔案受密碼保護,請輸入檔案密碼以匯入資料。"
+ "message": "此檔案受密碼保護。請輸入檔案密碼以匯入資料。"
},
"confirmFilePassword": {
"message": "確認檔案密碼"
@@ -4413,13 +4410,13 @@
"message": "不會將密碼金鑰複製到拓製的項目中。您想繼續拓製該項目嗎?"
},
"logInWithPasskeyQuestion": {
- "message": "使用密碼金鑰登入?"
+ "message": "要使用密碼金鑰登入嗎?"
},
"passkeyAlreadyExists": {
- "message": "用於這個應用程式的密碼金鑰已經存在。"
+ "message": "此應用程式已存在密碼金鑰。"
},
"noPasskeysFoundForThisApplication": {
- "message": "未發現用於這個應用程式的密碼金鑰。"
+ "message": "此應用程式未發現密碼金鑰。"
},
"noMatchingPasskeyLogin": {
"message": "您沒有符合該網站的登入資訊。"
@@ -4449,16 +4446,16 @@
"message": "密碼金鑰項目"
},
"overwritePasskey": {
- "message": "要覆寫密碼金鑰嗎?"
+ "message": "要覆寫目前的密碼金鑰嗎?"
},
"overwritePasskeyAlert": {
- "message": "該項目已包含密碼金鑰。您確定要覆寫目前的密碼金鑰嗎?"
+ "message": "此項目已包含密碼金鑰。確定要覆寫目前的密碼金鑰嗎?"
},
"featureNotSupported": {
"message": "尚未支援此功能"
},
"yourPasskeyIsLocked": {
- "message": "使用密碼金鑰需要身分驗證。請驗證您的身份以繼續。"
+ "message": "使用密碼金鑰需要身分驗證。請驗證身分以繼續。"
},
"multifactorAuthenticationCancelled": {
"message": "多因素驗證已取消"
@@ -4467,7 +4464,7 @@
"message": "未找到任何 LastPass 資料"
},
"incorrectUsernameOrPassword": {
- "message": "使用者名稱或密碼不正確"
+ "message": "使用者名稱或密碼錯誤"
},
"incorrectPassword": {
"message": "密碼錯誤"
@@ -4509,7 +4506,7 @@
"message": "需要 LastPass 驗證"
},
"awaitingSSO": {
- "message": "等待 SSO 驗證"
+ "message": "正在等待 SSO 驗證"
},
"awaitingSSODesc": {
"message": "請使用您的公司憑證繼續登入。"
@@ -4546,7 +4543,7 @@
"message": "目前帳戶"
},
"bitwardenAccount": {
- "message": "Bitwarden 帳號"
+ "message": "Bitwarden 帳戶"
},
"availableAccounts": {
"message": "可用帳戶"
@@ -4993,7 +4990,7 @@
"message": "下載 Bitwarden"
},
"downloadBitwardenOnAllDevices": {
- "message": "在所有裝置中下載 Bitwarden"
+ "message": "在所有裝置上下載 Bitwarden"
},
"getTheMobileApp": {
"message": "取得手機應用程式"
@@ -5008,7 +5005,7 @@
"message": "在不使用瀏覽器的情況下存取你的密碼庫,然後設定生物辨識解鎖,以加快在桌面應用程式和瀏覽器擴充功能中的解鎖速度。"
},
"downloadFromBitwardenNow": {
- "message": "立即從 bitwarden.com 下載"
+ "message": "立即前往 bitwarden.com 下載"
},
"getItOnGooglePlay": {
"message": "在 Google Play上取得"
@@ -5401,10 +5398,10 @@
"message": "企業政策已套用至您的選項中"
},
"sshPrivateKey": {
- "message": "私密金鑰"
+ "message": "私鑰"
},
"sshPublicKey": {
- "message": "公共金鑰"
+ "message": "公鑰"
},
"sshFingerprint": {
"message": "指紋"
@@ -5431,7 +5428,7 @@
"message": "自訂逾時時間最小為 1 分鐘。"
},
"fileSavedToDevice": {
- "message": "檔案已儲存至裝置。在您的裝置中管理下載的檔案。"
+ "message": "檔案已儲存至裝置。請在裝置的下載項目中管理檔案。"
},
"showCharacterCount": {
"message": "顯示字元數"
@@ -5966,6 +5963,9 @@
"cardNumberLabel": {
"message": "付款卡號碼"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"removeMasterPasswordForOrgUserKeyConnector": {
"message": "您的組織已不再使用主密碼登入 Bitwarden。若要繼續,請驗證組織與網域。"
},
@@ -6127,6 +6127,9 @@
"emailPlaceholder": {
"message": "user@bitwarden.com , user@acme.com"
},
+ "downloadBitwardenApps": {
+ "message": "下載 Bitwarden 應用程式"
+ },
"emailProtected": {
"message": "電子郵件已受保護"
},
@@ -6134,4 +6137,4 @@
"message": "對方必須輸入密碼才能檢視此 Send",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
}
-}
\ No newline at end of file
+}
From 7c6512c78f1a7730de7aba3bf345d3f03501b945 Mon Sep 17 00:00:00 2001
From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com>
Date: Fri, 13 Feb 2026 10:27:35 +0100
Subject: [PATCH 027/134] Autosync the updated translations (#18962)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/desktop/src/locales/af/messages.json | 3 +++
apps/desktop/src/locales/ar/messages.json | 3 +++
apps/desktop/src/locales/az/messages.json | 3 +++
apps/desktop/src/locales/be/messages.json | 3 +++
apps/desktop/src/locales/bg/messages.json | 3 +++
apps/desktop/src/locales/bn/messages.json | 3 +++
apps/desktop/src/locales/bs/messages.json | 3 +++
apps/desktop/src/locales/ca/messages.json | 3 +++
apps/desktop/src/locales/cs/messages.json | 3 +++
apps/desktop/src/locales/cy/messages.json | 3 +++
apps/desktop/src/locales/da/messages.json | 3 +++
apps/desktop/src/locales/de/messages.json | 3 +++
apps/desktop/src/locales/el/messages.json | 3 +++
apps/desktop/src/locales/en_GB/messages.json | 3 +++
apps/desktop/src/locales/en_IN/messages.json | 3 +++
apps/desktop/src/locales/eo/messages.json | 3 +++
apps/desktop/src/locales/es/messages.json | 3 +++
apps/desktop/src/locales/et/messages.json | 3 +++
apps/desktop/src/locales/eu/messages.json | 3 +++
apps/desktop/src/locales/fa/messages.json | 3 +++
apps/desktop/src/locales/fi/messages.json | 3 +++
apps/desktop/src/locales/fil/messages.json | 3 +++
apps/desktop/src/locales/fr/messages.json | 3 +++
apps/desktop/src/locales/gl/messages.json | 3 +++
apps/desktop/src/locales/he/messages.json | 3 +++
apps/desktop/src/locales/hi/messages.json | 3 +++
apps/desktop/src/locales/hr/messages.json | 3 +++
apps/desktop/src/locales/hu/messages.json | 3 +++
apps/desktop/src/locales/id/messages.json | 3 +++
apps/desktop/src/locales/it/messages.json | 3 +++
apps/desktop/src/locales/ja/messages.json | 3 +++
apps/desktop/src/locales/ka/messages.json | 3 +++
apps/desktop/src/locales/km/messages.json | 3 +++
apps/desktop/src/locales/kn/messages.json | 3 +++
apps/desktop/src/locales/ko/messages.json | 3 +++
apps/desktop/src/locales/lt/messages.json | 3 +++
apps/desktop/src/locales/lv/messages.json | 3 +++
apps/desktop/src/locales/me/messages.json | 3 +++
apps/desktop/src/locales/ml/messages.json | 3 +++
apps/desktop/src/locales/mr/messages.json | 3 +++
apps/desktop/src/locales/my/messages.json | 3 +++
apps/desktop/src/locales/nb/messages.json | 3 +++
apps/desktop/src/locales/ne/messages.json | 3 +++
apps/desktop/src/locales/nl/messages.json | 7 +++--
apps/desktop/src/locales/nn/messages.json | 3 +++
apps/desktop/src/locales/or/messages.json | 3 +++
apps/desktop/src/locales/pl/messages.json | 3 +++
apps/desktop/src/locales/pt_BR/messages.json | 3 +++
apps/desktop/src/locales/pt_PT/messages.json | 21 ++++++++-------
apps/desktop/src/locales/ro/messages.json | 3 +++
apps/desktop/src/locales/ru/messages.json | 3 +++
apps/desktop/src/locales/si/messages.json | 3 +++
apps/desktop/src/locales/sk/messages.json | 3 +++
apps/desktop/src/locales/sl/messages.json | 3 +++
apps/desktop/src/locales/sr/messages.json | 3 +++
apps/desktop/src/locales/sv/messages.json | 3 +++
apps/desktop/src/locales/ta/messages.json | 3 +++
apps/desktop/src/locales/te/messages.json | 3 +++
apps/desktop/src/locales/th/messages.json | 3 +++
apps/desktop/src/locales/tr/messages.json | 27 +++++++++++---------
apps/desktop/src/locales/uk/messages.json | 3 +++
apps/desktop/src/locales/vi/messages.json | 3 +++
apps/desktop/src/locales/zh_CN/messages.json | 7 +++--
apps/desktop/src/locales/zh_TW/messages.json | 3 +++
64 files changed, 217 insertions(+), 25 deletions(-)
diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json
index e46d70f01dc..ef221f96878 100644
--- a/apps/desktop/src/locales/af/messages.json
+++ b/apps/desktop/src/locales/af/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json
index eb06f36b20d..bcac0529a8c 100644
--- a/apps/desktop/src/locales/ar/messages.json
+++ b/apps/desktop/src/locales/ar/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json
index 179347a6942..f94ff2417cf 100644
--- a/apps/desktop/src/locales/az/messages.json
+++ b/apps/desktop/src/locales/az/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Vaxt bitmə əməliyyatı"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Sessiya vaxt bitməsi"
},
diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json
index 7712e82a251..3467fe20ae8 100644
--- a/apps/desktop/src/locales/be/messages.json
+++ b/apps/desktop/src/locales/be/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json
index cf5ef5750a8..cab21191e37 100644
--- a/apps/desktop/src/locales/bg/messages.json
+++ b/apps/desktop/src/locales/bg/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Действие при изтичането на времето за достъп"
},
+ "errorCannotDecrypt": {
+ "message": "Грешка: не може да се дешифрира"
+ },
"sessionTimeoutHeader": {
"message": "Изтичане на времето за сесията"
},
diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json
index 91a41c6d08f..544d88a72a6 100644
--- a/apps/desktop/src/locales/bn/messages.json
+++ b/apps/desktop/src/locales/bn/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json
index 25f24d82d1f..289554a237f 100644
--- a/apps/desktop/src/locales/bs/messages.json
+++ b/apps/desktop/src/locales/bs/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json
index 3e3f32f8bd0..7b8d32a798c 100644
--- a/apps/desktop/src/locales/ca/messages.json
+++ b/apps/desktop/src/locales/ca/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json
index b4be94ca123..478343b7e7d 100644
--- a/apps/desktop/src/locales/cs/messages.json
+++ b/apps/desktop/src/locales/cs/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Akce vypršení časového limitu"
},
+ "errorCannotDecrypt": {
+ "message": "Chyba: Nelze dešifrovat"
+ },
"sessionTimeoutHeader": {
"message": "Časový limit relace"
},
diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json
index 23aa85a7de8..4feb0181431 100644
--- a/apps/desktop/src/locales/cy/messages.json
+++ b/apps/desktop/src/locales/cy/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json
index 115bb3c3038..bd6a6f4379a 100644
--- a/apps/desktop/src/locales/da/messages.json
+++ b/apps/desktop/src/locales/da/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json
index 6368e0cd054..205c8e95435 100644
--- a/apps/desktop/src/locales/de/messages.json
+++ b/apps/desktop/src/locales/de/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout-Aktion"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Sitzungs-Timeout"
},
diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json
index a604fc6f9db..97371668dca 100644
--- a/apps/desktop/src/locales/el/messages.json
+++ b/apps/desktop/src/locales/el/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json
index a0d1ad10120..22b482ed04d 100644
--- a/apps/desktop/src/locales/en_GB/messages.json
+++ b/apps/desktop/src/locales/en_GB/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json
index 796cce7e711..42a63ff0db1 100644
--- a/apps/desktop/src/locales/en_IN/messages.json
+++ b/apps/desktop/src/locales/en_IN/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json
index dab5fb211ad..ae37e15d84c 100644
--- a/apps/desktop/src/locales/eo/messages.json
+++ b/apps/desktop/src/locales/eo/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json
index 11cbabc019b..d6210f940b5 100644
--- a/apps/desktop/src/locales/es/messages.json
+++ b/apps/desktop/src/locales/es/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json
index 6d749dd0eee..8c9476cc69e 100644
--- a/apps/desktop/src/locales/et/messages.json
+++ b/apps/desktop/src/locales/et/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json
index b32be546075..75c33286fb7 100644
--- a/apps/desktop/src/locales/eu/messages.json
+++ b/apps/desktop/src/locales/eu/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json
index 01a1a587557..4136edbde06 100644
--- a/apps/desktop/src/locales/fa/messages.json
+++ b/apps/desktop/src/locales/fa/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "اقدام وقفه زمانی"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "وقفه زمانی نشست"
},
diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json
index e63cf83956a..b04b741bd3b 100644
--- a/apps/desktop/src/locales/fi/messages.json
+++ b/apps/desktop/src/locales/fi/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json
index 9087ac83562..c503efc39f9 100644
--- a/apps/desktop/src/locales/fil/messages.json
+++ b/apps/desktop/src/locales/fil/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json
index b10b5fdd675..f04807aaeb9 100644
--- a/apps/desktop/src/locales/fr/messages.json
+++ b/apps/desktop/src/locales/fr/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Action à l’expiration"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Délai d'expiration de la session"
},
diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json
index 69234c1e5bf..76904276732 100644
--- a/apps/desktop/src/locales/gl/messages.json
+++ b/apps/desktop/src/locales/gl/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json
index 50fb5b7f0df..dbb2533e03e 100644
--- a/apps/desktop/src/locales/he/messages.json
+++ b/apps/desktop/src/locales/he/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "פעולת פסק זמן"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "פסק זמן להפעלה"
},
diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json
index 97b33dcede1..1bfc0674ffe 100644
--- a/apps/desktop/src/locales/hi/messages.json
+++ b/apps/desktop/src/locales/hi/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json
index 752df118853..5ef663ab52b 100644
--- a/apps/desktop/src/locales/hr/messages.json
+++ b/apps/desktop/src/locales/hr/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Radnja nakon isteka"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Istek sesije"
},
diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json
index 15c701719f9..5440b53e93d 100644
--- a/apps/desktop/src/locales/hu/messages.json
+++ b/apps/desktop/src/locales/hu/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Időkifutási művelet"
},
+ "errorCannotDecrypt": {
+ "message": "Hiba: nem fejthető vissza."
+ },
"sessionTimeoutHeader": {
"message": "Munkamenet időkifutás"
},
diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json
index d62779a48ed..f4de0deff33 100644
--- a/apps/desktop/src/locales/id/messages.json
+++ b/apps/desktop/src/locales/id/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json
index 68c3e824478..9cd4783407d 100644
--- a/apps/desktop/src/locales/it/messages.json
+++ b/apps/desktop/src/locales/it/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Azione al timeout"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Timeout della sessione"
},
diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json
index 3ba4aab861a..1d46532a980 100644
--- a/apps/desktop/src/locales/ja/messages.json
+++ b/apps/desktop/src/locales/ja/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json
index e12f6df3c01..4618fd024a9 100644
--- a/apps/desktop/src/locales/ka/messages.json
+++ b/apps/desktop/src/locales/ka/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json
index 69234c1e5bf..76904276732 100644
--- a/apps/desktop/src/locales/km/messages.json
+++ b/apps/desktop/src/locales/km/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json
index d527d42e75c..3bb7f513701 100644
--- a/apps/desktop/src/locales/kn/messages.json
+++ b/apps/desktop/src/locales/kn/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json
index f191bf3a5f8..70ffd234941 100644
--- a/apps/desktop/src/locales/ko/messages.json
+++ b/apps/desktop/src/locales/ko/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json
index 6ebb39a8d4f..f703b1f5d53 100644
--- a/apps/desktop/src/locales/lt/messages.json
+++ b/apps/desktop/src/locales/lt/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json
index 4d064653073..e82a4b91487 100644
--- a/apps/desktop/src/locales/lv/messages.json
+++ b/apps/desktop/src/locales/lv/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Noildzes darbība"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Sesijas noildze"
},
diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json
index 773d54d0629..25bb0cbc816 100644
--- a/apps/desktop/src/locales/me/messages.json
+++ b/apps/desktop/src/locales/me/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json
index 6c60486bbaf..43e0dc85fb0 100644
--- a/apps/desktop/src/locales/ml/messages.json
+++ b/apps/desktop/src/locales/ml/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json
index 69234c1e5bf..76904276732 100644
--- a/apps/desktop/src/locales/mr/messages.json
+++ b/apps/desktop/src/locales/mr/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json
index b4af8edba98..ddc8bef0241 100644
--- a/apps/desktop/src/locales/my/messages.json
+++ b/apps/desktop/src/locales/my/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json
index df9f37574be..792c95eb1ec 100644
--- a/apps/desktop/src/locales/nb/messages.json
+++ b/apps/desktop/src/locales/nb/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json
index da1f787edeb..89c3d3ba231 100644
--- a/apps/desktop/src/locales/ne/messages.json
+++ b/apps/desktop/src/locales/ne/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json
index 0a3350bd288..e4b1d6d8abc 100644
--- a/apps/desktop/src/locales/nl/messages.json
+++ b/apps/desktop/src/locales/nl/messages.json
@@ -3755,7 +3755,7 @@
"message": "Ga door met inloggen met de inloggegevens van je bedrijf."
},
"importDirectlyFromBrowser": {
- "message": "Import directly from browser"
+ "message": "Direct importeren vanuit browser"
},
"browserProfile": {
"message": "Browserprofiel"
@@ -4439,7 +4439,7 @@
"message": "En meer!"
},
"advancedOnlineSecurity": {
- "message": "Advanced online security"
+ "message": "Geavanceerde online beveiliging"
},
"upgradeToPremium": {
"message": "Opwaarderen naar Premium"
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Time-out actie"
},
+ "errorCannotDecrypt": {
+ "message": "Fout: Kan niet ontsleutelen"
+ },
"sessionTimeoutHeader": {
"message": "Sessietime-out"
},
diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json
index fb478c5c484..850696f8fcf 100644
--- a/apps/desktop/src/locales/nn/messages.json
+++ b/apps/desktop/src/locales/nn/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json
index 83854ef4406..b63a970e9c2 100644
--- a/apps/desktop/src/locales/or/messages.json
+++ b/apps/desktop/src/locales/or/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json
index bbd204fd385..e2d9fbce4a2 100644
--- a/apps/desktop/src/locales/pl/messages.json
+++ b/apps/desktop/src/locales/pl/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json
index 7ea0be8ea39..3a055bdb03d 100644
--- a/apps/desktop/src/locales/pt_BR/messages.json
+++ b/apps/desktop/src/locales/pt_BR/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Ação do limite de tempo"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Limite de tempo da sessão"
},
diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json
index a6a92896b77..bb99678bde6 100644
--- a/apps/desktop/src/locales/pt_PT/messages.json
+++ b/apps/desktop/src/locales/pt_PT/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Ação de tempo limite"
},
+ "errorCannotDecrypt": {
+ "message": "Erro: Não é possível desencriptar"
+ },
"sessionTimeoutHeader": {
"message": "Tempo limite da sessão"
},
@@ -4589,30 +4592,30 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"emailProtected": {
- "message": "Email protected"
+ "message": "E-mail protegido"
},
"emails": {
- "message": "Emails"
+ "message": "E-mails"
},
"noAuth": {
- "message": "Anyone with the link"
+ "message": "Qualquer pessoa com o link"
},
"anyOneWithPassword": {
- "message": "Anyone with a password set by you"
+ "message": "Qualquer pessoa com uma palavra-passe definida por si"
},
"whoCanView": {
- "message": "Who can view"
+ "message": "Quem pode ver"
},
"specificPeople": {
- "message": "Specific people"
+ "message": "Pessoas específicas"
},
"emailVerificationDesc": {
- "message": "After sharing this Send link, individuals will need to verify their email with a code to view this Send."
+ "message": "Após partilhar este Send através do link, os indivíduos terão de verificar o e-mail com um código para poderem ver este Send."
},
"enterMultipleEmailsSeparatedByComma": {
- "message": "Enter multiple emails by separating with a comma."
+ "message": "Introduza vários e-mails, separados por vírgula."
},
"emailPlaceholder": {
- "message": "user@bitwarden.com , user@acme.com"
+ "message": "utilizador@bitwarden.com , utilizador@acme.com"
}
}
diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json
index 21a36891a8b..6b51cb9fecd 100644
--- a/apps/desktop/src/locales/ro/messages.json
+++ b/apps/desktop/src/locales/ro/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json
index 62c18eb5272..389f4b37dfd 100644
--- a/apps/desktop/src/locales/ru/messages.json
+++ b/apps/desktop/src/locales/ru/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Тайм-аут действия"
},
+ "errorCannotDecrypt": {
+ "message": "Ошибка: невозможно расшифровать"
+ },
"sessionTimeoutHeader": {
"message": "Тайм-аут сессии"
},
diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json
index db8371037b1..9e8a727ad5d 100644
--- a/apps/desktop/src/locales/si/messages.json
+++ b/apps/desktop/src/locales/si/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json
index 5ba6fd05cfe..471984785d8 100644
--- a/apps/desktop/src/locales/sk/messages.json
+++ b/apps/desktop/src/locales/sk/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Akcia pri vypršaní časového limitu"
},
+ "errorCannotDecrypt": {
+ "message": "Chyba: Nedá sa dešifrovať"
+ },
"sessionTimeoutHeader": {
"message": "Časový limit relácie"
},
diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json
index ce93e936c4f..23d9f18fadb 100644
--- a/apps/desktop/src/locales/sl/messages.json
+++ b/apps/desktop/src/locales/sl/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json
index 310a921eae8..1a68810bca3 100644
--- a/apps/desktop/src/locales/sr/messages.json
+++ b/apps/desktop/src/locales/sr/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Акција тајмаута"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Истек сесије"
},
diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json
index a6a7d3e0261..1dd66c409c0 100644
--- a/apps/desktop/src/locales/sv/messages.json
+++ b/apps/desktop/src/locales/sv/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Tidsgränsåtgärd"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Sessionstidsgräns"
},
diff --git a/apps/desktop/src/locales/ta/messages.json b/apps/desktop/src/locales/ta/messages.json
index 04abb91510e..3a7fc795668 100644
--- a/apps/desktop/src/locales/ta/messages.json
+++ b/apps/desktop/src/locales/ta/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json
index 69234c1e5bf..76904276732 100644
--- a/apps/desktop/src/locales/te/messages.json
+++ b/apps/desktop/src/locales/te/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json
index c1f5ec7fea5..bcff8d0849e 100644
--- a/apps/desktop/src/locales/th/messages.json
+++ b/apps/desktop/src/locales/th/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json
index b47c5d28105..936a68516bd 100644
--- a/apps/desktop/src/locales/tr/messages.json
+++ b/apps/desktop/src/locales/tr/messages.json
@@ -4337,7 +4337,7 @@
"message": "Kısayolu yazın"
},
"editAutotypeKeyboardModifiersDescription": {
- "message": "Include one or two of the following modifiers: Ctrl, Alt, Win, and a letter."
+ "message": "Aşağıdaki değiştirici tuşlardan birini veya ikisini (Ctrl, Alt, Win) ve bir harf kullanın."
},
"invalidShortcut": {
"message": "Geçersiz kısayol"
@@ -4448,44 +4448,47 @@
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
"continueWithLogIn": {
- "message": "Continue with log in"
+ "message": "Giriş yaparak devam et"
},
"doNotContinue": {
- "message": "Do not continue"
+ "message": "Devam etme"
},
"domain": {
- "message": "Domain"
+ "message": "Alan Adı"
},
"keyConnectorDomainTooltip": {
"message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin."
},
"verifyYourOrganization": {
- "message": "Verify your organization to log in"
+ "message": "Giriş yapmak için kuruluşunuzu doğrulayın"
},
"organizationVerified": {
- "message": "Organization verified"
+ "message": "Kuruluş doğrulandı"
},
"domainVerified": {
- "message": "Domain verified"
+ "message": "Alan adı doğrulandı"
},
"leaveOrganizationContent": {
- "message": "If you don't verify your organization, your access to the organization will be revoked."
+ "message": "Kuruluşunuzu doğrulamazsanız, kuruluşa erişiminiz iptal edilecektir."
},
"leaveNow": {
- "message": "Leave now"
+ "message": "Şimdi ayrıl"
},
"verifyYourDomainToLogin": {
- "message": "Verify your domain to log in"
+ "message": "Giriş yapmak için alan adınızı doğrulayın"
},
"verifyYourDomainDescription": {
- "message": "To continue with log in, verify this domain."
+ "message": "Giriş yaparak devam etmek için bu alan adını doğrulayın."
},
"confirmKeyConnectorOrganizationUserDescription": {
- "message": "To continue with log in, verify the organization and domain."
+ "message": "Giriş yaparak devam etmek için kuruluşu ve alan adını doğrulayın."
},
"sessionTimeoutSettingsAction": {
"message": "Zaman aşımı eylemi"
},
+ "errorCannotDecrypt": {
+ "message": "Hata: Deşifre edilemiyor"
+ },
"sessionTimeoutHeader": {
"message": "Oturum zaman aşımı"
},
diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json
index ee5537c616c..2b4cfcb7c22 100644
--- a/apps/desktop/src/locales/uk/messages.json
+++ b/apps/desktop/src/locales/uk/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Timeout action"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Session timeout"
},
diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json
index 30327917ba5..56c9d9a5c6e 100644
--- a/apps/desktop/src/locales/vi/messages.json
+++ b/apps/desktop/src/locales/vi/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "Hành động sau khi đóng kho"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "Thời gian hết phiên"
},
diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json
index c0fe02050c6..cf42adba294 100644
--- a/apps/desktop/src/locales/zh_CN/messages.json
+++ b/apps/desktop/src/locales/zh_CN/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "超时动作"
},
+ "errorCannotDecrypt": {
+ "message": "错误:无法解密"
+ },
"sessionTimeoutHeader": {
"message": "会话超时"
},
@@ -4589,13 +4592,13 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"emailProtected": {
- "message": "电子邮件受保护"
+ "message": "电子邮箱保护"
},
"emails": {
"message": "电子邮件"
},
"noAuth": {
- "message": "任何拥有此链接的人"
+ "message": "拥有此链接的任何人"
},
"anyOneWithPassword": {
"message": "拥有您设置的密码的任何人"
diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json
index 0ea329a4409..3157e929e8f 100644
--- a/apps/desktop/src/locales/zh_TW/messages.json
+++ b/apps/desktop/src/locales/zh_TW/messages.json
@@ -4486,6 +4486,9 @@
"sessionTimeoutSettingsAction": {
"message": "逾時後動作"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"sessionTimeoutHeader": {
"message": "工作階段逾時"
},
From 412d1b541da053280b51c31df2f9a487ae7b0faf Mon Sep 17 00:00:00 2001
From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com>
Date: Fri, 13 Feb 2026 12:11:17 +0100
Subject: [PATCH 028/134] Autosync the updated translations (#18963)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/web/src/locales/af/messages.json | 158 +++++++++++++-
apps/web/src/locales/ar/messages.json | 158 +++++++++++++-
apps/web/src/locales/az/messages.json | 174 ++++++++++++++--
apps/web/src/locales/be/messages.json | 158 +++++++++++++-
apps/web/src/locales/bg/messages.json | 156 +++++++++++++-
apps/web/src/locales/bn/messages.json | 158 +++++++++++++-
apps/web/src/locales/bs/messages.json | 158 +++++++++++++-
apps/web/src/locales/ca/messages.json | 158 +++++++++++++-
apps/web/src/locales/cs/messages.json | 158 +++++++++++++-
apps/web/src/locales/cy/messages.json | 158 +++++++++++++-
apps/web/src/locales/da/messages.json | 158 +++++++++++++-
apps/web/src/locales/de/messages.json | 156 +++++++++++++-
apps/web/src/locales/el/messages.json | 158 +++++++++++++-
apps/web/src/locales/en_GB/messages.json | 158 +++++++++++++-
apps/web/src/locales/en_IN/messages.json | 158 +++++++++++++-
apps/web/src/locales/eo/messages.json | 158 +++++++++++++-
apps/web/src/locales/es/messages.json | 158 +++++++++++++-
apps/web/src/locales/et/messages.json | 158 +++++++++++++-
apps/web/src/locales/eu/messages.json | 158 +++++++++++++-
apps/web/src/locales/fa/messages.json | 158 +++++++++++++-
apps/web/src/locales/fi/messages.json | 158 +++++++++++++-
apps/web/src/locales/fil/messages.json | 158 +++++++++++++-
apps/web/src/locales/fr/messages.json | 158 +++++++++++++-
apps/web/src/locales/gl/messages.json | 158 +++++++++++++-
apps/web/src/locales/he/messages.json | 162 ++++++++++++++-
apps/web/src/locales/hi/messages.json | 158 +++++++++++++-
apps/web/src/locales/hr/messages.json | 158 +++++++++++++-
apps/web/src/locales/hu/messages.json | 156 +++++++++++++-
apps/web/src/locales/id/messages.json | 158 +++++++++++++-
apps/web/src/locales/it/messages.json | 158 +++++++++++++-
apps/web/src/locales/ja/messages.json | 158 +++++++++++++-
apps/web/src/locales/ka/messages.json | 158 +++++++++++++-
apps/web/src/locales/km/messages.json | 158 +++++++++++++-
apps/web/src/locales/kn/messages.json | 158 +++++++++++++-
apps/web/src/locales/ko/messages.json | 158 +++++++++++++-
apps/web/src/locales/lv/messages.json | 156 +++++++++++++-
apps/web/src/locales/ml/messages.json | 158 +++++++++++++-
apps/web/src/locales/mr/messages.json | 158 +++++++++++++-
apps/web/src/locales/my/messages.json | 158 +++++++++++++-
apps/web/src/locales/nb/messages.json | 158 +++++++++++++-
apps/web/src/locales/ne/messages.json | 158 +++++++++++++-
apps/web/src/locales/nl/messages.json | 242 +++++++++++++++++-----
apps/web/src/locales/nn/messages.json | 158 +++++++++++++-
apps/web/src/locales/or/messages.json | 158 +++++++++++++-
apps/web/src/locales/pl/messages.json | 158 +++++++++++++-
apps/web/src/locales/pt_BR/messages.json | 158 +++++++++++++-
apps/web/src/locales/pt_PT/messages.json | 158 +++++++++++++-
apps/web/src/locales/ro/messages.json | 158 +++++++++++++-
apps/web/src/locales/ru/messages.json | 156 +++++++++++++-
apps/web/src/locales/si/messages.json | 158 +++++++++++++-
apps/web/src/locales/sk/messages.json | 158 +++++++++++++-
apps/web/src/locales/sl/messages.json | 158 +++++++++++++-
apps/web/src/locales/sr_CS/messages.json | 158 +++++++++++++-
apps/web/src/locales/sr_CY/messages.json | 158 +++++++++++++-
apps/web/src/locales/sv/messages.json | 156 +++++++++++++-
apps/web/src/locales/ta/messages.json | 158 +++++++++++++-
apps/web/src/locales/te/messages.json | 158 +++++++++++++-
apps/web/src/locales/th/messages.json | 158 +++++++++++++-
apps/web/src/locales/tr/messages.json | 250 ++++++++++++++++++-----
apps/web/src/locales/uk/messages.json | 158 +++++++++++++-
apps/web/src/locales/vi/messages.json | 158 +++++++++++++-
apps/web/src/locales/zh_CN/messages.json | 164 ++++++++++++++-
apps/web/src/locales/zh_TW/messages.json | 158 +++++++++++++-
63 files changed, 9608 insertions(+), 536 deletions(-)
diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json
index fb359d3a02e..7b6c7778d70 100644
--- a/apps/web/src/locales/af/messages.json
+++ b/apps/web/src/locales/af/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum Aantal Woorde"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Suksesvol verwyder"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json
index 5a58089abf9..65b8578a206 100644
--- a/apps/web/src/locales/ar/messages.json
+++ b/apps/web/src/locales/ar/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "راجع كلمات المرور المعرضة للخطر (الضعيفة، المكشوفة، أو المعاد استخدامها) عبر التطبيقات. اختر تطبيقاتك الحرجة لتحديد أولويات إجراءات الأمان لمستخدميك لمعالجة كلمات المرور المعرضة للخطر."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json
index a9a25f658b5..6c2150ec158 100644
--- a/apps/web/src/locales/az/messages.json
+++ b/apps/web/src/locales/az/messages.json
@@ -15,7 +15,7 @@
"message": "Risk altında heç bir kritik tətbiq yoxdur"
},
"critical": {
- "message": "Critical ($COUNT$)",
+ "message": "Kritik ($COUNT$)",
"placeholders": {
"count": {
"content": "$1",
@@ -24,7 +24,7 @@
}
},
"notCritical": {
- "message": "Not critical ($COUNT$)",
+ "message": "Kritik olmayan ($COUNT$)",
"placeholders": {
"count": {
"content": "$1",
@@ -33,7 +33,7 @@
}
},
"criticalBadge": {
- "message": "Critical"
+ "message": "Kritik"
},
"accessIntelligence": {
"message": "Giriş məlumatları"
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Bu bəndə düzəliş etmə icazəniz yoxdur"
},
- "reviewAtRiskPasswords": {
- "message": "Proqramlar arasında risk altında olan açarları (zəif, açıq və ya təkrar istifadə olunmuş) nəzərdən keçirin. İstehlakçılarınızın risk altında olan açarları həll etməsinə yönəlmiş təhlükəsizlik tədbirlərinə üstünlük vermək üçün ən vacib proqramlarınızı seçin."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Risk altında olan girişi nəzərdən keçirin"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Müraciətlər kritik olaraq işarələnmədi"
},
@@ -275,7 +311,7 @@
"message": "Tətbiq"
},
"applications": {
- "message": "Applications"
+ "message": "Tətbiqlər"
},
"atRiskPasswords": {
"message": "Riskli parollar"
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum söz sayı"
},
- "overridePasswordTypePolicy": {
- "message": "Parol növü",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$/$SELECTEDCOUNT$ istifadəçi təkrar dəvət edildi. $LIMIT$ dəvət limitinə görə $EXCLUDEDCOUNT$ dəvət edilmədi.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Uğurla çıxarıldı"
},
@@ -6987,16 +7079,16 @@
"message": "Bir və ya daha çox təşkilat siyasəti, fərdi seyfi xaricə köçürməyinizi əngəlləyir."
},
"activateAutofillPolicy": {
- "message": "Activate autofill"
+ "message": "Avto-doldurmanı aktivləşdir"
},
"activateAutofillPolicyDescription": {
"message": "Bütün mövcud və yeni üzvlər üçün brauzer uzantısında \"Səhifə yüklənəndə avto-doldur\" ayarını aktivləşdirin."
},
"autofillOnPageLoadExploitWarning": {
- "message": "Compromised or untrusted websites can exploit autofill on page load."
+ "message": "Təhlükəli və ya güvənilməyən veb saytlar, səhifə yüklənərkən avto-doldurmanı sui-istifadə edə bilər."
},
"learnMoreAboutAutofillPolicy": {
- "message": "Learn more about autofill"
+ "message": "Avto-doldurma barədə daha ətraflı"
},
"selectType": {
"message": "SSO növü seçin"
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Tapşırıq təyin et"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Parol dəyişdirmə bildirişlərini göndər"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Element arxivə göndərildi"
},
- "itemsWereSentToArchive": {
- "message": "Elementlər arxivə göndərildi"
- },
"itemWasUnarchived": {
"message": "Element arxivdən çıxarıldı"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Davam etmək istədiyinizə əminsiniz?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "İstifadəçi doğrulaması uğursuz oldu."
},
@@ -12771,7 +12866,7 @@
"message": "Anbar sahəsini xaric etdiyiniz zaman, növbəti hesabınıza avtomatik olaraq köçürüləcək mütənasib hesab krediti alacaqsınız."
},
"ownerBadgeA11yDescription": {
- "message": "Owner, $OWNER$, show all items owned by $OWNER$",
+ "message": "Sahibi, $OWNER$, $OWNER$ sahibi olduğu bütün elementləri göstər",
"placeholders": {
"owner": {
"content": "$1",
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "bir istifadəçi üçün"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json
index cfe2bf4fa23..ef00d46b4c0 100644
--- a/apps/web/src/locales/be/messages.json
+++ b/apps/web/src/locales/be/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Праглядайце паролі, якія знаходзяцца ў зоне рызыкі (ненадзейныя, скампраметаваныя або паўторна выкарыстаныя) ва ўсіх вашых праграмах. Выберыце найбольш крытычныя праграмы для вызначэння прыярытэту бяспекі дзеянняў для вашых карыстальнікаў, якія выкарыстоўваюць рызыкоўныя паролі."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Мінімум лічбаў або слоў"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Паспяхова выдалена"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json
index 44fc1b675cb..e32b2b3d5f1 100644
--- a/apps/web/src/locales/bg/messages.json
+++ b/apps/web/src/locales/bg/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Нямате право за редактиране на този елемент"
},
- "reviewAtRiskPasswords": {
- "message": "Прегледайте паролите в риск (слаби, преизползвани или разобличени) в различните приложения. Изберете най-важните си приложения, за да дадете приоритет на действията по сигурността за потребителите си, така че те да обърнат внимание на паролите си в риск."
+ "reviewAccessIntelligence": {
+ "message": "Прегледайте докладите по сигурността, за да забележите и отстраните евентуалните рискове свързани с удостоверителните данни, преди те да ескалират."
},
"reviewAtRiskLoginsPrompt": {
"message": "Преглед на елементите за вписване в риск"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ приложения са отбелязани като важни",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ приложения са отбелязани като неважни",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Отбелязване на $COUNT$ като важни",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Отбелязване на $COUNT$ като неважни",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Приложенията не успяха да бъдат отбелязани като важни"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Минимален брой думи"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Тип парола",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "Изпратена е 1 покана"
+ },
+ "bulkReinviteSentToast": {
+ "message": "Изпратени са $COUNT$ покани",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ от $SELECTEDCOUNT$ повторно поканени потребители. $EXCLUDEDCOUNT$ не бяха поканени, поради ограничението от $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "Изпратени са $COUNT$ от $TOTAL$ покани…",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Оставете тази страница отворена, докато приключи изпращането на поканите."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ покани не бяха изпратени",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 покана не беше изпратена"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Възникна грешка при изпращането на покани до $COUNT$ от общо $TOTAL$ членове. Опитайте да изпратите поканите отново, а ако този проблем се повтаря,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Опитайте да изпратите отново"
+ },
"bulkRemovedMessage": {
"message": "Успешно премахване"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Назначаване на задачи"
},
+ "allTasksAssigned": {
+ "message": "Всички задачи бяха разпределени"
+ },
"assignSecurityTasksToMembers": {
"message": "Изпращане на известия за промяна на пароли"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Елементът беше преместен в архива"
},
- "itemsWereSentToArchive": {
- "message": "Елементите бяха преместени в архива"
- },
"itemWasUnarchived": {
"message": "Елементът беше изваден от архива"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Наистина ли искате да продължите?"
},
+ "errorCannotDecrypt": {
+ "message": "Грешка: не може да се дешифрира"
+ },
"userVerificationFailed": {
"message": "Проверката на потребителя беше неуспешна."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Надграждане до екипния план"
+ },
+ "upgradeToEnterprise": {
+ "message": "Надграждане до плана за големи организации"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Споделяйте още повече със Семейния план, или преминете към подсилената защита на паролите с Екипния план или този за големи организации"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Цените не включват данък и се заплащат веднъж годишно."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Възникна грешка при създаването на предварителния вид на фактурата."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Пропорционално членство в план „$PLAN$“ ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Членство в план за големи организации"
+ },
+ "teamsMembership": {
+ "message": "Членство в екипен план"
+ },
+ "plansUpdated": {
+ "message": "Вие надградихте до $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Възникна грешка при обновяването на разплащателния метод."
}
}
diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json
index 6175f78b814..53f29d874e7 100644
--- a/apps/web/src/locales/bn/messages.json
+++ b/apps/web/src/locales/bn/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json
index 53570e37935..1ae5523c9ac 100644
--- a/apps/web/src/locales/bs/messages.json
+++ b/apps/web/src/locales/bs/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json
index 010426e3c55..88e4b0569d6 100644
--- a/apps/web/src/locales/ca/messages.json
+++ b/apps/web/src/locales/ca/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Reviseu les contrasenyes de risc (febles, exposades o reutilitzades) a totes les aplicacions. Seleccioneu les aplicacions més crítiques per prioritzar les accions de seguretat perquè els usuaris aborden les contrasenyes de risc."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Número mínim de paraules"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Suprimit correctament"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json
index 84139941a7b..d85f3fada18 100644
--- a/apps/web/src/locales/cs/messages.json
+++ b/apps/web/src/locales/cs/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Nemáte oprávnění upravit tuto položku"
},
- "reviewAtRiskPasswords": {
- "message": "Zkontrolujte ohrožená hesla (slabá, odhalená nebo opakovaně používaná) ve všech aplikacích. Vyberte nejkritičtější aplikace a stanovte priority bezpečnostních opatření pro uživatele, abyste se vypořádali s ohroženými hesly."
+ "reviewAccessIntelligence": {
+ "message": "Prohlédněte si bezpečnostní zprávy, abyste odhalili a opravili rizika související s přihlašovacími údaji, než se zhorší."
},
"reviewAtRiskLoginsPrompt": {
"message": "Zkontrolovat ohrožená přihlášení"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ aplikací označených jako kritických",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ aplikací označených jako nekritických",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Označit $COUNT$ jako kritických",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Označit $COUNT$ jako nekritických",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Nepodařilo se označit aplikace jako kritické"
},
@@ -3548,7 +3584,7 @@
"message": "Pro osobní použití a sdílení s rodinou či přáteli."
},
"planNameTeams": {
- "message": "Týmy"
+ "message": "Teams"
},
"planDescTeams": {
"message": "Pro společnosti a různé týmy."
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Minimální počet slov"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Typ hesla",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 pozvánka odeslána"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ pozvánek odesláno",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ z $SELECTEDCOUNT$ uživatelů bylo znovu pozváno. $EXCLUDEDCOUNT$ nebylo pozváno z důvodu limitu pozvánky: $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ z $TOTAL$ pozvánek odesláno...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Ponechte tuto stránku otevřenou, dokud nebude vše odesláno."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ pozvánek nebylo odesláno",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 pozvánka nebyla odeslána"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Při odesílání pozvánek pro $COUNT$ z $TOTAL$ členů došlo k chybě. Zkuste je odeslat znovu a pokud problém přetrvává,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Úspěšně odebráno"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Přiřadit úkoly"
},
+ "allTasksAssigned": {
+ "message": "Všechny úkoly byly přiřazeny"
+ },
"assignSecurityTasksToMembers": {
"message": "Odeslat oznámení pro změnu hesla"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Položka byla přesunuta do archivu"
},
- "itemsWereSentToArchive": {
- "message": "Položky byly přesunuty do archivu"
- },
"itemWasUnarchived": {
"message": "Položka byla odebrána z archivu"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Opravdu chcete pokračovat?"
},
+ "errorCannotDecrypt": {
+ "message": "Chyba: Nelze dešifrovat"
+ },
"userVerificationFailed": {
"message": "Ověření uživatele se nezdařilo."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "za uživatele"
+ },
+ "upgradeToTeams": {
+ "message": "Aktualizovat na Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Aktualizovat na Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Sdílejte ještě více s rodinami, nebo získejte mocné, důvěryhodné zabezpečení s Teams nebo Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Ceny nezahrnují daň a účtují se každoročně."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Při generování náhledu faktury došlo k chybě."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Poměrná část členství $PLAN$: ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Kredit předplatného Premium"
+ },
+ "enterpriseMembership": {
+ "message": "Členství Enterprise"
+ },
+ "teamsMembership": {
+ "message": "Členství Teams"
+ },
+ "plansUpdated": {
+ "message": "Aktualizovali jste na $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Při aktualizaci Vaší platební metody došlo k chybě."
}
}
diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json
index 809021b63a3..c566ffaf831 100644
--- a/apps/web/src/locales/cy/messages.json
+++ b/apps/web/src/locales/cy/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json
index fd206ae10cf..42fbf0cf7c4 100644
--- a/apps/web/src/locales/da/messages.json
+++ b/apps/web/src/locales/da/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Gennemgå risikobetonede adgangskoder (svage, eksponerede eller genbrugte) på tværs af applikationer. Vælg de mest kritiske applikationer for at prioritere sikkerhedshandlinger for brugerne til at håndtere risikobetonede adgangskoder."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum antal ord"
},
- "overridePasswordTypePolicy": {
- "message": "Adgangskodetype",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Hermed fjernet"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json
index 016ed2c73f4..89672d615dc 100644
--- a/apps/web/src/locales/de/messages.json
+++ b/apps/web/src/locales/de/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Du bist nicht berechtigt, 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."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Gefährdete Zugangsdaten überprüfen"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Anwendungen konnten nicht als kritisch markiert werden"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Mindestanzahl an Wörtern"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Passworttyp",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ von $SELECTEDCOUNT$ Benutzern erneut eingeladen. $EXCLUDEDCOUNT$ wurden wegen des Einladungslimits von $LIMIT$ nicht eingeladen.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Erfolgreich entfernt"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Aufgaben zuweisen"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Benachrichtigungen zum Ändern von Passwörtern senden"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Eintrag wurde ins Archiv verschoben"
},
- "itemsWereSentToArchive": {
- "message": "Einträge wurden ins Archiv verschoben"
- },
"itemWasUnarchived": {
"message": "Eintrag wird nicht mehr archiviert"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Bist du sicher, dass du fortfahren möchtest?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Benutzerverifizierung fehlgeschlagen."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "pro Benutzer"
+ },
+ "upgradeToTeams": {
+ "message": "Auf Teams upgraden"
+ },
+ "upgradeToEnterprise": {
+ "message": "Auf Enterprise upgraden"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Teile noch mehr mit Families oder erhalte eine leistungsstarke und vertrauenswürdige Passwortsicherheit mit Teams oder Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Die Preise enthalten keine Steuern und werden jährlich in Rechnung gestellt."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Beim Generieren der Rechnungsvorschau ist ein Fehler aufgetreten."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Anteilige $PLAN$-Mitgliedschaft ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium-Abonnement-Guthaben"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise-Mitgliedschaft"
+ },
+ "teamsMembership": {
+ "message": "Teams-Mitgliedschaft"
+ },
+ "plansUpdated": {
+ "message": "Du hast ein Upgrade auf $PLAN$ durchgeführt!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Beim Aktualisieren deiner Zahlungsmethode ist ein Fehler aufgetreten."
}
}
diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json
index cda6c1eddb2..0aef25ee9cb 100644
--- a/apps/web/src/locales/el/messages.json
+++ b/apps/web/src/locales/el/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Ελέξτε τους κωδικούς πρόσβασης (αδύναμους, εκτεθειμένους ή επαναχρησιμοποιούμενους) σε όλες τις εφαρμογές. Επιλέξτε τις πιο κρίσιμες εφαρμογές σας για να δώσετε προτεραιότητα στις ενέργειες ασφαλείας για τους χρήστες σας ώστε να αντιμετωπίσουν τους εκτεθειμένους κωδικούς πρόσβασης."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Ελάχιστος Αριθμός Χαρακτήρων"
},
- "overridePasswordTypePolicy": {
- "message": "Τύπος κωδικού πρόσβασης",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Καταργήθηκε με επιτυχία"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json
index 45a22128710..1617bfb4580 100644
--- a/apps/web/src/locales/en_GB/messages.json
+++ b/apps/web/src/locales/en_GB/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritise security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json
index 33e6c0385ea..8845ef9f042 100644
--- a/apps/web/src/locales/en_IN/messages.json
+++ b/apps/web/src/locales/en_IN/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritise security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json
index b163dfc8603..1e289a324fe 100644
--- a/apps/web/src/locales/eo/messages.json
+++ b/apps/web/src/locales/eo/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimuma Nombro de Vortoj"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json
index 1c44f266bd5..2d85309144f 100644
--- a/apps/web/src/locales/es/messages.json
+++ b/apps/web/src/locales/es/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Número mínimo de palabras"
},
- "overridePasswordTypePolicy": {
- "message": "Tipo de Contraseña",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Eliminado con éxito"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json
index 10e067afadd..60a2690785c 100644
--- a/apps/web/src/locales/et/messages.json
+++ b/apps/web/src/locales/et/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimaalne sõnade arv"
},
- "overridePasswordTypePolicy": {
- "message": "Parooli Tüüp",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Edukalt eemaldatud"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json
index 8d4192cdc35..a75f95994c0 100644
--- a/apps/web/src/locales/eu/messages.json
+++ b/apps/web/src/locales/eu/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Gutxieneko hitz kopurua"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Behar bezala kendua"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json
index 89ef17fa870..5c046211648 100644
--- a/apps/web/src/locales/fa/messages.json
+++ b/apps/web/src/locales/fa/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "شما مجاز به ویرایش این مورد نیستید"
},
- "reviewAtRiskPasswords": {
- "message": "کلمات عبور در معرض خطر (ضعیف، افشا شده یا تکراری) را در برنامهها بررسی کنید. برنامههای حیاتی خود را انتخاب کنید تا اقدامات امنیتی را برای کاربرانتان اولویتبندی کنید و به کلمات عبور در معرض خطر رسیدگی کنید."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "بررسی ورودهای پرخطر"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "علامتگذاری برنامهها به عنوان مهم ناموفق بود"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "حداقل تعداد کلمات"
},
- "overridePasswordTypePolicy": {
- "message": "نوع کلمه عبور",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "با موفقیت حذف شد"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json
index 16a7472fce2..7cc931fd9f8 100644
--- a/apps/web/src/locales/fi/messages.json
+++ b/apps/web/src/locales/fi/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Sanojen vähimmäismäärä"
},
- "overridePasswordTypePolicy": {
- "message": "Salasanan tyyppi",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Poisto onnistui."
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json
index a96ee6ad2df..415793a4b98 100644
--- a/apps/web/src/locales/fil/messages.json
+++ b/apps/web/src/locales/fil/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum na bilang ng mga salita"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Matagumpay na tinanggal"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json
index 7910f9e5816..eb9b2d1c915 100644
--- a/apps/web/src/locales/fr/messages.json
+++ b/apps/web/src/locales/fr/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Vous n'avez pas l'autorisation de modifier cet élément"
},
- "reviewAtRiskPasswords": {
- "message": "Examinez les mots de passe à risque (faibles, exposés ou réutilisés) à travers les applications. Sélectionnez vos applications les plus critiques pour prioriser les actions de sécurité pour que vos utilisateurs s'occupent des mots de passe à risque."
+ "reviewAccessIntelligence": {
+ "message": "Examinez les rapports de sécurité pour trouver et corriger les risques liés aux identifiants avant de les escalader."
},
"reviewAtRiskLoginsPrompt": {
"message": "Examiner les identifiants à risque"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marquées comme critiques",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marquées comme non critiques",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Marquer $COUNT$ comme critique(s)",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Marquer $COUNT$ comme non critique(s)",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Échec du marquage de l'application comme étant critique"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Nombre minimum de mots"
},
- "overridePasswordTypePolicy": {
- "message": "Type de Mot de Passe",
+ "passwordTypePolicyOverride": {
+ "message": "Type de mot de passe",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation envoyée"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations envoyées",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ des utilisateurs de $SELECTEDCOUNT$ ont été ré-invités. $EXCLUDEDCOUNT$ n'ont pas été invités en raison de la limite d'invitation de $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ de $TOTAL$ invitations envoyées...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Garder cette page ouverte jusqu'à ce que tout soit envoyé."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations non pas été envoyées",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation n'a pas été envoyée"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Une erreur s'est produite lors de l'envoi des invitations à $COUNT$ des $TOTAL$ membres. Essayez d'envoyer à nouveau et si le problème persiste,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Essayez d'envoyer à nouveau"
+ },
"bulkRemovedMessage": {
"message": "Supprimé avec succès"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assigner des tâches"
},
+ "allTasksAssigned": {
+ "message": "Toutes les tâches ont été assignées"
+ },
"assignSecurityTasksToMembers": {
"message": "Envoyer des notifications pour modifier les mots de passe"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "L'élément a été envoyé à l'archive"
},
- "itemsWereSentToArchive": {
- "message": "Les éléments ont été envoyés à l'archive"
- },
"itemWasUnarchived": {
"message": "L'élément a été désarchivé"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Êtes-vous sûr de vouloir continuer ?"
},
+ "errorCannotDecrypt": {
+ "message": "Erreur: Impossible de déchiffrer"
+ },
"userVerificationFailed": {
"message": "La vérification de l'utilisateur a échoué."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "par utilisateur"
+ },
+ "upgradeToTeams": {
+ "message": "Mettre à niveau vers Équipes"
+ },
+ "upgradeToEnterprise": {
+ "message": "Mettre à niveau vers Entreprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Partagez encore plus avec Familles, ou obtenez une sécurité de mot de passe puissante et fiable avec Équipes ou Entreprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Les prix excluent les taxes et sont facturés annuellement."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Une erreur s'est produite lors de la génération de l'aperçu de la facture."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Adhésion à $PLAN$ au prorata ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Crédit d'abonnement Premium"
+ },
+ "enterpriseMembership": {
+ "message": "Adhésion à Entreprise"
+ },
+ "teamsMembership": {
+ "message": "Adhésion à Équipes"
+ },
+ "plansUpdated": {
+ "message": "Vous avez mis à niveau vers $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Une erreur s'est produite lors de la mise à jour de votre mode de paiement."
}
}
diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json
index 9fcece92871..8357f5d0747 100644
--- a/apps/web/src/locales/gl/messages.json
+++ b/apps/web/src/locales/gl/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json
index 90acb236f87..b075b91a860 100644
--- a/apps/web/src/locales/he/messages.json
+++ b/apps/web/src/locales/he/messages.json
@@ -39,7 +39,7 @@
"message": "מודיעין גישות"
},
"noApplicationsMatchTheseFilters": {
- "message": "No applications match these filters"
+ "message": "אין יישומים התואמים למסננים האלה"
},
"passwordRisk": {
"message": "סיכון סיסמה"
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "אין לך הרשאות לערוך את הפריט הזה"
},
- "reviewAtRiskPasswords": {
- "message": "סקור סיסמאות בסיכון (חלשות, חשופות, או משומשות) בין יישומים. בחר את היישומים הכי קריטיים שלך על מנת לתעדף פעולות אבטחה עבור המשתמשים שלך כדי לטפל בסיסמאות בסיכון."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "סקור כניסות בסיכון"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ יישומים מסומנים כקריטיים",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ יישומים מסומנים כלא-קריטיים",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "סימון $COUNT$ כקריטיים",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "סימון $COUNT$ כלא-קריטיים",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "סימון יישומים כקריטיים נכשל"
},
@@ -275,7 +311,7 @@
"message": "יישום"
},
"applications": {
- "message": "Applications"
+ "message": "יישומים"
},
"atRiskPasswords": {
"message": "סיסמאות בסיכון"
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "מספר מינימלי של מילים"
},
- "overridePasswordTypePolicy": {
- "message": "סוג סיסמה",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "הוסרו בהצלחה"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "הקצה משימות"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "הפריט נשלח לארכיון"
},
- "itemsWereSentToArchive": {
- "message": "פריטים שנשלחו לארכיון"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json
index cf0a3d625c4..4e261d672bb 100644
--- a/apps/web/src/locales/hi/messages.json
+++ b/apps/web/src/locales/hi/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json
index c01086848f2..ced4fc03b1c 100644
--- a/apps/web/src/locales/hr/messages.json
+++ b/apps/web/src/locales/hr/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Nemaš dozvolu za uređivanje ove stavke"
},
- "reviewAtRiskPasswords": {
- "message": "Pregledaj rizične lozinke (slabe, izložene ili ponovno korištene) u svim aplikacijama. Odaberi svoje najkritičnije aplikacije za davanje prioriteta sigurnosnim radnjama da tvoji korisnici riješe rizične lozinke."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Pregledaj rizične prijave"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Nije uspjelo označavanje aplikacija kao kritičnih"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Najmanji broj riječi"
},
- "overridePasswordTypePolicy": {
- "message": "Vrsta lozinke",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ od $SELECTEDCOUNT$ korisnika ponovno pozvano. $EXCLUDEDCOUNT$ nije pozvatno zbog ograničenja poziva ($LIMIT$).",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Uspješno uklonjeno"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Dodijeli zadatke"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Pošalji podsjetnike za promjenu lozinki"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Stavka poslana u arhivu"
},
- "itemsWereSentToArchive": {
- "message": "Stavke poslane u arhivu"
- },
"itemWasUnarchived": {
"message": "Stavka vraćena iz arhive"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Sigurno želiš nastaviti?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json
index d540c59df3a..f4c9144cc6d 100644
--- a/apps/web/src/locales/hu/messages.json
+++ b/apps/web/src/locales/hu/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Nincs jogosulltság ezen elem szerkesztéséhez."
},
- "reviewAtRiskPasswords": {
- "message": "Tekintsük meg a veszélyeztetett jelszavakat (gyenge, nyilvános vagy újrafelhasznált) az alkalmazásokban. Válasszuk ki a legkritikusabb alkalmazásokat, hogy előnyben részesítsük a biztonsági műveleteket a felhasználók számára a veszélyeztetett jelszavak kezeléséhez."
+ "reviewAccessIntelligence": {
+ "message": "Tekintsük át a biztonsági jelentéseket, hogy megtaláljuk és kijavítsuk a hitelesítő adatok kockázatait, mielőtt azok fokozódnának."
},
"reviewAtRiskLoginsPrompt": {
"message": "Kockázatos bejelentkezések áttekintése"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ alkalmazás kritikusként lett megjelölve.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ alkalmazás nem kritikusként lett megjelölve.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "$COUNT$ megjelölése kritikusként",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "$COUNT$ megjelölése nem kritikusként",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Nem sikerült kritikusként megjelölni a kérelmeket."
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Szavak minimális száma"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Jelszótípus",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 meghívó lett elküldve."
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ meghívó lett elküldve.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ / $SELECTEDCOUNT$ felhasználó ismételten meghívásra került. $EXCLUDEDCOUNT$ nem kapott meghívást $LIMIT$ meghívási korlát miatt.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ / $TOTAL$ meghívó lett elküldve.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Tartsuk nyitva ezt az oldalt, amíg az összes elküldésre kerül."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ meghívó nem lett elküldve.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1meghívó nem lett elküldve."
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Hiba történt a meghívók elküldésekor $COUNT$ / $TOTAL$ részére. Próbáljuk meg újra elküldeni és ha a probléma folytatódik,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Próbáljuk újra elküldeni"
+ },
"bulkRemovedMessage": {
"message": "Az eltávolítás sikeres volt."
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Feladatok hozzárendelése"
},
+ "allTasksAssigned": {
+ "message": "Az összes feladat hozzárendelésre került."
+ },
"assignSecurityTasksToMembers": {
"message": "Értesítések küldése a jelszavak megváltoztatásához"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Az elem az archivumba került."
},
- "itemsWereSentToArchive": {
- "message": "Az elemek az archivumba kerültek."
- },
"itemWasUnarchived": {
"message": "Az elem visszavételre került az archivumból."
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Biztos folytatni szeretnénk?"
},
+ "errorCannotDecrypt": {
+ "message": "Hiba: nem fejthető vissza."
+ },
"userVerificationFailed": {
"message": "A felhasználó ellenőrzése sikertelen volt."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "felhasználónként"
+ },
+ "upgradeToTeams": {
+ "message": "Áttérés Csapatok csomagba"
+ },
+ "upgradeToEnterprise": {
+ "message": "Áttérés Vállalati csomagba"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Osszunk meg még többet a Családi csomaggal vagy kapjunk hatékony, megbízható jelszóbiztonságot a Csapatok vagy a Vállalati segítségével."
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Az árak nem tartalmazzák az adót és évente kerülnek számlázásra."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Hiba történt a számla előnézet generálása közben."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Arányos $PLAN$ tagság ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Prémium előfizetés jóváírás"
+ },
+ "enterpriseMembership": {
+ "message": "Vállalati tagság"
+ },
+ "teamsMembership": {
+ "message": "Csapatok tagság"
+ },
+ "plansUpdated": {
+ "message": "Megtörtént az áttérés $PLAN$ csomagra!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Hiba történt a fizetési mód frissítésekor."
}
}
diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json
index bffb574e894..270b8624c24 100644
--- a/apps/web/src/locales/id/messages.json
+++ b/apps/web/src/locales/id/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Anda tidak memiliki izin untuk mengubah item ini"
},
- "reviewAtRiskPasswords": {
- "message": "Tinjau sandi berisiko (lemah, bocor, atau digunakan ulang) lintas aplikasi. Pilih aplikasi paling genting Anda untuk mengutamakan aksi keamanan untuk pengguna Anda guna menangani sandi berisiko."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Tinjau login yang berisiko"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Gagal menandai aplikasi sebagai penting"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Jumlah kata minimum"
},
- "overridePasswordTypePolicy": {
- "message": "Jenis Sandi",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Penghapusan sukses"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json
index 691c22c2912..c2fb3effdf0 100644
--- a/apps/web/src/locales/it/messages.json
+++ b/apps/web/src/locales/it/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Non hai il permesso 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."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Rivedi i login a rischio"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Impossibile contrassegnare le applicazioni come critiche"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Numero minimo di parole"
},
- "overridePasswordTypePolicy": {
- "message": "Tipo di password",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ utenti su $SELECTEDCOUNT$ ri-invitati. $EXCLUDEDCOUNT$ non hanno ricevuto l'invito a causa del limite di $LIMIT$ inviti.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Rimosso"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assegna attività"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Invia notifiche ai membri per invitarli a modificare le loro password"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Elemento archiviato"
},
- "itemsWereSentToArchive": {
- "message": "Elementi archiviati"
- },
"itemWasUnarchived": {
"message": "Elemento estratto dall'archivio"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Vuoi davvero continuare?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Verifica dell'utente non riuscita."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json
index 963e59c4ffc..cd78e0a269a 100644
--- a/apps/web/src/locales/ja/messages.json
+++ b/apps/web/src/locales/ja/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "危険なパスワード(強度が低い、流出済み、再利用)を、アプリをまたいで調査します。特に重要なアプリを選択して、危険なパスワードに優先対応するようユーザーに促しましょう。"
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "文字の最小数"
},
- "overridePasswordTypePolicy": {
- "message": "パスワードの種類",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "削除しました "
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json
index 73cc59d65e1..6de5179793d 100644
--- a/apps/web/src/locales/ka/messages.json
+++ b/apps/web/src/locales/ka/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json
index 2e96d9b844d..b95256dfacd 100644
--- a/apps/web/src/locales/km/messages.json
+++ b/apps/web/src/locales/km/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json
index 2b6adb295b0..7a378184a39 100644
--- a/apps/web/src/locales/kn/messages.json
+++ b/apps/web/src/locales/kn/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "ಪದಗಳ ಕನಿಷ್ಠ ಸಂಖ್ಯೆ"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "ಯಶಸ್ವಿಯಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json
index d72fcaad6bb..ad9b80b9f6a 100644
--- a/apps/web/src/locales/ko/messages.json
+++ b/apps/web/src/locales/ko/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "단어 최소 개수"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "성공적으로 제거됨"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json
index 406177f0f37..4875dc4fe31 100644
--- a/apps/web/src/locales/lv/messages.json
+++ b/apps/web/src/locales/lv/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Nav nepieciešamo atļauju, lai labotu šo vienumu"
},
- "reviewAtRiskPasswords": {
- "message": "Riskam pakļautu (vāju, atklātu vai vairākkārt izmantotu) paroļu pārskatīšana dažādās lietotnēs. Jāatlasa viskritiskākās paroles, lai noteiktu svarīgas drošības darbības, ko lietotājiem pielietot riskam pakļautām parolēm."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Pārskatīt riskam pakļautos pieteikšanās vienumus"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Neizdevās lietotnes atzīmēt kā būtiskas"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Mazākais pieļaujamais vārdu skaits"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Paroles veids",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "Atkārtoti uzaicināti $LIMIT$ no $SELECTEDCOUNT$ lieotājiem. $EXCLUDEDCOUNT$ netika uzaicināt uzaicinājumu ierobežojuma ($LIMIT$) dēļ.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Veiksmīgi noņemts"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Piešķirt uzdevumus"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Vienums tika ievietots arhīvā"
},
- "itemsWereSentToArchive": {
- "message": "Vienumi tika ievietoti arhīvā"
- },
"itemWasUnarchived": {
"message": "Vienums tika izņemts no arhīva"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Vai tiešām turpināt?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Lietotāja apliecināšana neizdevās."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "1 lietotājam"
+ },
+ "upgradeToTeams": {
+ "message": "Uzlabot uz komandu plānu"
+ },
+ "upgradeToEnterprise": {
+ "message": "Uzlabot uz uzņēmējdarbības plānu"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json
index aa2892a92fa..f0173da95e5 100644
--- a/apps/web/src/locales/ml/messages.json
+++ b/apps/web/src/locales/ml/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "വാക്കുകളുടെ ഏറ്റവും കുറഞ്ഞ എണ്ണം"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json
index 2be3cda468e..35031280ec3 100644
--- a/apps/web/src/locales/mr/messages.json
+++ b/apps/web/src/locales/mr/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json
index 2e96d9b844d..b95256dfacd 100644
--- a/apps/web/src/locales/my/messages.json
+++ b/apps/web/src/locales/my/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json
index d6be0481648..07db562d56b 100644
--- a/apps/web/src/locales/nb/messages.json
+++ b/apps/web/src/locales/nb/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum antall ord"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Fjernet"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json
index 7f69d34a54c..cd5e07cc33e 100644
--- a/apps/web/src/locales/ne/messages.json
+++ b/apps/web/src/locales/ne/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json
index 95e38404b7f..6754c7a0c51 100644
--- a/apps/web/src/locales/nl/messages.json
+++ b/apps/web/src/locales/nl/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Je hebt geen toestemming om dit item te bewerken"
},
- "reviewAtRiskPasswords": {
- "message": "Herzie risicovolle wachtwoorden (zwak, blootgelegd of herbruikt) tussen applicaties. Selecteer je meest belangrijke applicaties om prioriteit te geven aan beveiligingsacties voor je gebruikers om risicovolle wachtwoorden aan te pakken."
+ "reviewAccessIntelligence": {
+ "message": "Bekijk veiligheidsrapportages om risicovolle inloggegevens te vinden en verhelpen voordat ze uit de hand lopen."
},
"reviewAtRiskLoginsPrompt": {
"message": "Risicovolle logins bekijken"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applicaties als belangrijk gemarkeerd",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applicaties als niet-belangrijk gemarkeerd",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "$COUNT$ belangrijk markeren",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "$COUNT$ niet-belangrijk markeren",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Kon applicaties niet als kritiek markeren"
},
@@ -389,10 +425,10 @@
"message": "Nu beoordelen"
},
"allCaughtUp": {
- "message": "All caught up!"
+ "message": "Alles bijgewerkt!"
},
"noNewApplicationsToReviewAtThisTime": {
- "message": "No new applications to review at this time"
+ "message": "Geen nieuwe toepassingen om te beoordelen op dit moment"
},
"organizationHasItemsSavedForApplications": {
"message": "Je organisatie heeft items opgeslagen voor $COUNT$ applicaties",
@@ -428,16 +464,16 @@
"message": "Markeren als kritieke functionaliteit wordt geïmplementeerd in een toekomstige update"
},
"applicationReviewSaved": {
- "message": "Application review saved"
+ "message": "Beoordeling opgeslagen"
},
"newApplicationsReviewed": {
- "message": "New applications reviewed"
+ "message": "Nieuwe toepassingen beoordeeld"
},
"errorSavingReviewStatus": {
- "message": "Error saving review status"
+ "message": "Fout bij opslaan beoordelingsstatus"
},
"pleaseTryAgain": {
- "message": "Please try again"
+ "message": "Probeer opnieuw"
},
"unmarkAsCritical": {
"message": "Markeren als belangrijk ongedaan maken"
@@ -1248,7 +1284,7 @@
"message": "Alles selecteren"
},
"deselectAll": {
- "message": "Deselect all"
+ "message": "Selectie ongedaan maken"
},
"unselectAll": {
"message": "Alles deselecteren"
@@ -1441,7 +1477,7 @@
"message": "Single sign-on gebruiken"
},
"yourOrganizationRequiresSingleSignOn": {
- "message": "Your organization requires single sign-on."
+ "message": "Je organisatie vereist single sign-on."
},
"welcomeBack": {
"message": "Welkom terug"
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Minimum aantal woorden"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Type wachtwoord",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -5664,7 +5700,7 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendCreatedSuccessfully": {
- "message": "Send created successfully!",
+ "message": "Send succesvol aangemaakt!",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"sendCreatedDescriptionV2": {
@@ -5698,7 +5734,7 @@
}
},
"durationTimeHours": {
- "message": "$HOURS$ hours",
+ "message": "$HOURS$ uur",
"placeholders": {
"hours": {
"content": "$1",
@@ -5707,11 +5743,11 @@
}
},
"newTextSend": {
- "message": "New Text Send",
+ "message": "Nieuwe Send (tekst)",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"newFileSend": {
- "message": "New File Send",
+ "message": "Nieuwe Send (bestand)",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"editedSend": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 uitnodiging verzonden"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ uitnodigingen verzonden",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ van $SELECTEDCOUNT$ gebruikers opnieuw uitgenodigd. $EXCLUDEDCOUNT$ werden niet uitgenodigd vanwege de $LIMIT$ uitnodigingslimiet.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ van $TOTAL$ uitnodigingen verzonden...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Houd deze pagina open totdat alles is verstuurd."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ uitnodigingen niet verzonden",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "$COUNT$ uitnodiging niet verzonden"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Er is een fout opgetreden tijdens het verzenden van uitnodigingen naar $COUNT$ van $TOTAL$ leden. Probeer het opnieuw te verzenden en als het probleem aanhoudt,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Probeer opnieuw te verzenden"
+ },
"bulkRemovedMessage": {
"message": "Succesvol verwijderd"
},
@@ -7353,7 +7445,7 @@
"message": "SSO ingeschakeld"
},
"ssoTurnedOff": {
- "message": "SSO turned off"
+ "message": "SSO uitgeschakeld"
},
"emailMustLoginWithSso": {
"message": "$EMAIL$ moet met Single Sign-on inloggen",
@@ -9644,7 +9736,7 @@
"message": "SSO login is vereist"
},
"emailRequiredForSsoLogin": {
- "message": "Email is required for SSO"
+ "message": "E-mail is vereist voor SSO"
},
"selectedRegionFlag": {
"message": "Geselecteerde regionale vlag"
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Taken toewijzen"
},
+ "allTasksAssigned": {
+ "message": "Alle taken zijn toegewezen"
+ },
"assignSecurityTasksToMembers": {
"message": "Meldingen verzenden om wachtwoorden te wijzigen"
},
@@ -11773,7 +11868,7 @@
"message": "Gratis organisaties kunnen maximaal twee collecties hebben. Upgrade naar een betaald abonnement voor het toevoegen van meer collecties."
},
"searchArchive": {
- "message": "Search archive"
+ "message": "Archief doorzoeken"
},
"archiveNoun": {
"message": "Archief",
@@ -11796,7 +11891,7 @@
"message": "Items in archief"
},
"noItemsInArchive": {
- "message": "No items in archive"
+ "message": "Geen items in archief"
},
"noItemsInArchiveDesc": {
"message": "Gearchiveerde items verschijnen hier en worden uitgesloten van algemene zoekresultaten en automatisch invulsuggesties."
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item naar archief verzonden"
},
- "itemsWereSentToArchive": {
- "message": "Item naar archief verzonden"
- },
"itemWasUnarchived": {
"message": "Item uit het archief gehaald"
},
@@ -12490,8 +12582,11 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Weet je zeker dat je wilt doorgaan?"
},
+ "errorCannotDecrypt": {
+ "message": "Fout: Kan niet ontsleutelen"
+ },
"userVerificationFailed": {
- "message": "User verification failed."
+ "message": "Gebruikersverificatie is mislukt."
},
"resizeSideNavigation": {
"message": "Formaat zijnavigatie wijzigen"
@@ -12583,16 +12678,16 @@
"message": "Stel een ontgrendelingsmethode in om je kluis time-out actie te wijzigen"
},
"leaveConfirmationDialogTitle": {
- "message": "Are you sure you want to leave?"
+ "message": "Weet je zeker dat je wilt verlaten?"
},
"leaveConfirmationDialogContentOne": {
- "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features."
+ "message": "Door te weigeren, blijven je persoonlijke items in je account, maar verlies je toegang tot gedeelde items en organisatiefunctionaliteit."
},
"leaveConfirmationDialogContentTwo": {
- "message": "Contact your admin to regain access."
+ "message": "Neem contact op met je beheerder om weer toegang te krijgen."
},
"leaveConfirmationDialogConfirmButton": {
- "message": "Leave $ORGANIZATION$",
+ "message": "$ORGANIZATION$ verlaten",
"placeholders": {
"organization": {
"content": "$1",
@@ -12601,10 +12696,10 @@
}
},
"howToManageMyVault": {
- "message": "How do I manage my vault?"
+ "message": "Hoe beheer ik mijn kluis?"
},
"transferItemsToOrganizationTitle": {
- "message": "Transfer items to $ORGANIZATION$",
+ "message": "Items overdragen aan $ORGANIZATION$",
"placeholders": {
"organization": {
"content": "$1",
@@ -12613,7 +12708,7 @@
}
},
"transferItemsToOrganizationContent": {
- "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.",
+ "message": "$ORGANIZATION$ vereist dat alle items eigendom zijn van de organisatie voor veiligheid en naleving. Klik op accepteren voor het overdragen van eigendom van je items.",
"placeholders": {
"organization": {
"content": "$1",
@@ -12622,13 +12717,13 @@
}
},
"acceptTransfer": {
- "message": "Accept transfer"
+ "message": "Overdacht accepteren"
},
"declineAndLeave": {
- "message": "Decline and leave"
+ "message": "Weigeren en verlaten"
},
"whyAmISeeingThis": {
- "message": "Why am I seeing this?"
+ "message": "Waarom zie ik dit?"
},
"youHaveBitwardenPremium": {
"message": "Je hebt Bitwarden Premium"
@@ -12679,16 +12774,16 @@
"message": "Online beveiliging voltooien"
},
"updatePayment": {
- "message": "Update payment"
+ "message": "Betalingswijze bijwerken"
},
"weCouldNotProcessYourPayment": {
- "message": "We could not process your payment. Please update your payment method or contact the support team for assistance."
+ "message": "We konden je betaling niet verwerken. Werk je betalingsmethode bij of neem contact op met het ondersteuningsteam voor assistentie."
},
"yourSubscriptionHasExpired": {
- "message": "Your subscription has expired. Please contact the support team for assistance."
+ "message": "Je abonnement is verlopen. Neem voor hulp contact op met het supportteam."
},
"yourSubscriptionIsScheduledToCancel": {
- "message": "Your subscription is scheduled to cancel on $DATE$. You can reinstate it anytime before then.",
+ "message": "Je abonnement verloopt op $DATE$. Je kunt het op elk gewenst moment hervatten.",
"placeholders": {
"date": {
"content": "$1",
@@ -12697,10 +12792,10 @@
}
},
"premiumShareEvenMore": {
- "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise."
+ "message": "Deel nog meer met Families, of krijg krachtige, betrouwbare wachtwoordbeveiliging met Teams of Enterprise."
},
"youHaveAGracePeriod": {
- "message": "You have a grace period of $DAYS$ days from your subscription expiration date. Please resolve the past due invoices by $DATE$.",
+ "message": "Je hebt een periode van $DAYS$ dagen tot de vervaldatum van je abonnement. Probeer de achterstallige facturen vóór $DATE$ op te lossen.",
"placeholders": {
"days": {
"content": "$1",
@@ -12713,31 +12808,31 @@
}
},
"manageInvoices": {
- "message": "Manage invoices"
+ "message": "Facturen beheren"
},
"yourNextChargeIsFor": {
- "message": "Your next charge is for"
+ "message": "Je volgende betaling is voor"
},
"dueOn": {
- "message": "due on"
+ "message": "verschuldigd op"
},
"yourSubscriptionWillBeSuspendedOn": {
- "message": "Your subscription will be suspended on"
+ "message": "Je abonnement zal worden opgeschort op"
},
"yourSubscriptionWasSuspendedOn": {
- "message": "Your subscription was suspended on"
+ "message": "Je abonnement is opgeschort op"
},
"yourSubscriptionWillBeCanceledOn": {
- "message": "Your subscription will be canceled on"
+ "message": "Je abonnement zal worden geannuleerd op"
},
"yourSubscriptionWasCanceledOn": {
- "message": "Your subscription was canceled on"
+ "message": "Je abonnement is geannuleerd op"
},
"storageFull": {
- "message": "Storage full"
+ "message": "Opslag is vol"
},
"storageUsedDescription": {
- "message": "You have used $USED$ out of $AVAILABLE$ GB of your encrypted file storage.",
+ "message": "Je hebt $USED$ gebruikt van de $AVAILABLE$ GB versleutelde bestandsopslag.",
"placeholders": {
"used": {
"content": "$1",
@@ -12750,7 +12845,7 @@
}
},
"storageFullDescription": {
- "message": "You have used all $GB$ GB of your encrypted storage. To continue storing files, add more storage."
+ "message": "Je hebt alle $GB$ GB aan versleutelde opslag gebruikt. Voeg meer opslagruimte toe om door te gaan met het opslaan van bestanden."
},
"whoCanView": {
"message": "Wie kan weergeven"
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per gebruiker"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade naar Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgraden naar Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Deel nog meer met Families, of krijg krachtige, betrouwbare wachtwoordbeveiliging met Teams of Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prijzen exclusief btw en worden jaarlijks gefactureerd."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Fout opgetreden bij het genereren van de voorbeeldfactuur."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Verrekening lidmaatschap $PLAN$ ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Krediet Premium-abonnement"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise-lidmaatschap"
+ },
+ "teamsMembership": {
+ "message": "Teams-lidmaatschap"
+ },
+ "plansUpdated": {
+ "message": "Je hebt opgewaardeerd naar $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Er is een fout opgetreden bij het bijwerken van je betaalmethode."
}
}
diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json
index 82a4950f681..7987b4077d1 100644
--- a/apps/web/src/locales/nn/messages.json
+++ b/apps/web/src/locales/nn/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json
index 2e96d9b844d..b95256dfacd 100644
--- a/apps/web/src/locales/or/messages.json
+++ b/apps/web/src/locales/or/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json
index 4017edab3c4..9736337ee0c 100644
--- a/apps/web/src/locales/pl/messages.json
+++ b/apps/web/src/locales/pl/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Przejrzyj hasła zagrożone (słabe, ujawnione lub ponownie używane) we wszystkich aplikacjach. Wybierz swoje najbardziej krytyczne aplikacje, aby nadać priorytet działaniom bezpieczeństwa swoim użytkownikom, aby zająć się hasłami zagrożonymi."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimalna liczba słów"
},
- "overridePasswordTypePolicy": {
- "message": "Rodzaj hasła",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Usunięto"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json
index 4334dba17b1..f29637803f0 100644
--- a/apps/web/src/locales/pt_BR/messages.json
+++ b/apps/web/src/locales/pt_BR/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Você não tem permissão para editar este item"
},
- "reviewAtRiskPasswords": {
- "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."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Revisar credenciais em risco"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Falha ao marcar aplicativos como críticos"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Número mínimo de palavras"
},
- "overridePasswordTypePolicy": {
- "message": "Tipo de senha",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ dos $SELECTEDCOUNT$ usuários foram re-convidados. $EXCLUDEDCOUNT$ não foram convidados devido ao limite de convite de $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removido com sucesso"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Atribuir tarefas"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Envie notificações para alteração de senhas"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "O item foi enviado para o arquivo"
},
- "itemsWereSentToArchive": {
- "message": "Itens foram enviados para o arquivo"
- },
"itemWasUnarchived": {
"message": "O item foi desarquivado"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Tem certeza que deseja continuar?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Falha na verificação do usuário."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json
index 912019b298c..e0626be7255 100644
--- a/apps/web/src/locales/pt_PT/messages.json
+++ b/apps/web/src/locales/pt_PT/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Não tem permissão para editar este item"
},
- "reviewAtRiskPasswords": {
- "message": "Reveja as palavras-passe em risco (fracas, expostas ou reutilizadas) em todas as aplicações. Selecione as suas aplicações mais críticas para dar prioridade a ações de segurança para os seus utilizadores para resolver as palavras-passe em risco."
+ "reviewAccessIntelligence": {
+ "message": "Reveja os relatórios de segurança para identificar e corrigir riscos associados às credenciais antes que se agravem."
},
"reviewAtRiskLoginsPrompt": {
"message": "Rever credenciais em risco"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ aplicações marcadas como críticas",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ aplicações marcadas como não críticas",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Marcar $COUNT$ como críticas",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Marcar $COUNT$ como não críticas",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Falha ao marcar aplicações como críticas"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Número mínimo de palavras"
},
- "overridePasswordTypePolicy": {
- "message": "Tipo de palavra-passe",
+ "passwordTypePolicyOverride": {
+ "message": "Tipo de palavras-passe",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 convite enviado"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ convites enviados",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ de $SELECTEDCOUNT$ utilizadores convidados novamente. $EXCLUDEDCOUNT$ não foram convidados devido ao limite de $LIMIT$ convites.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ de $TOTAL$ convites enviados...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Mantenha esta página aberta até que todos sejam enviados."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ convites não enviados",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 convite não enviado"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "Ocorreu um erro ao enviar convites para $COUNT$ dos $TOTAL$ membros. Tente enviar novamente e, se o problema persistir,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Tente enviar novamente"
+ },
"bulkRemovedMessage": {
"message": "Removido com sucesso"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Atribuir tarefas"
},
+ "allTasksAssigned": {
+ "message": "Todas as tarefas foram atribuídas"
+ },
"assignSecurityTasksToMembers": {
"message": "Enviar notificações para alterar palavras-passe"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "O item foi movido para o arquivo"
},
- "itemsWereSentToArchive": {
- "message": "Os itens foram movidos para o arquivo"
- },
"itemWasUnarchived": {
"message": "O item foi desarquivado"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Tem a certeza de que deseja continuar?"
},
+ "errorCannotDecrypt": {
+ "message": "Erro: Não é possível desencriptar"
+ },
"userVerificationFailed": {
"message": "Falha na verificação do utilizador."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "por utilizador"
+ },
+ "upgradeToTeams": {
+ "message": "Atualizar para o plano Equipas"
+ },
+ "upgradeToEnterprise": {
+ "message": "Atualizar para o plano Empresarial"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Partilhe ainda mais com o plano Familiar ou obtenha uma segurança de palavras-passe poderosa e fiável com os planos Equipas ou Empresarial"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Os preços não incluem impostos e são cobrados anualmente."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Foi encontrado um erro ao gerar a pré-visualização da fatura."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Adesão ao plano $PLAN$ proporcional ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Crédito de subscrição Premium"
+ },
+ "enterpriseMembership": {
+ "message": "Adesão Empresarial"
+ },
+ "teamsMembership": {
+ "message": "Adesão Equipas"
+ },
+ "plansUpdated": {
+ "message": "Atualizou para o plano $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Ocorreu um erro ao atualizar o seu método de pagamento."
}
}
diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json
index f7c232a321e..0b567f2f969 100644
--- a/apps/web/src/locales/ro/messages.json
+++ b/apps/web/src/locales/ro/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Număr minim de cuvinte"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Eliminat cu succes"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json
index 2e4cf303394..5433c0ac312 100644
--- a/apps/web/src/locales/ru/messages.json
+++ b/apps/web/src/locales/ru/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "У вас нет разрешения на редактирование этого элемента"
},
- "reviewAtRiskPasswords": {
- "message": "Проанализируйте пароли, подверженные риску (слабые, скомпрометированные или повторно используемые), во всех приложениях. Выберите наиболее критичные приложения, чтобы определить приоритетные меры безопасности для пользователей, направленные на устранение подверженных риску паролей."
+ "reviewAccessIntelligence": {
+ "message": "Просматривайте отчеты по безопасности, чтобы выявлять и устранять риски, связанные с учетными данными, до того, как они приведут к серьезным последствиям."
},
"reviewAtRiskLoginsPrompt": {
"message": "Обзор логинов, подверженных риску"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "Помечены как критичные приложений: $COUNT$",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "Помечены как некритичные приложений: $COUNT$",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Пометить как критичное: $COUNT$",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Пометить как некритичное: $COUNT$",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Не удалось пометить приложения как критичные"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Минимальное количество слов"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Тип пароля",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ из $SELECTEDCOUNT$ пользователей повторно приглашены. $EXCLUDEDCOUNT$ не был приглашен из-за лимита приглашений $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Удален(-о) успешно"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Назначить задачи"
},
+ "allTasksAssigned": {
+ "message": "Все задачи были назначены"
+ },
"assignSecurityTasksToMembers": {
"message": "Отправляйте уведомления о смене паролей"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Элемент был отправлен в архив"
},
- "itemsWereSentToArchive": {
- "message": "Элементы были отправлены в архив"
- },
"itemWasUnarchived": {
"message": "Элемент был разархивирован"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Вы действительно хотите продолжить?"
},
+ "errorCannotDecrypt": {
+ "message": "Ошибка: невозможно расшифровать"
+ },
"userVerificationFailed": {
"message": "Проверка пользователя не удалась."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "на пользователя"
+ },
+ "upgradeToTeams": {
+ "message": "Перейти на Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Перейти на Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Делитесь еще большим количеством информации с семьями или обеспечьте надежную защиту паролем с командами или организациями"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Цены указаны без учета налогов и оплачиваются ежегодно."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Обнаружена ошибка при создании предварительного просмотра счета."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Кредит на Премиум"
+ },
+ "enterpriseMembership": {
+ "message": "Членство в организации"
+ },
+ "teamsMembership": {
+ "message": "Членство в команде"
+ },
+ "plansUpdated": {
+ "message": "Вы обновились до $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Произошла ошибка при обновлении способа оплаты."
}
}
diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json
index b6cd6268bce..ac073315340 100644
--- a/apps/web/src/locales/si/messages.json
+++ b/apps/web/src/locales/si/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json
index 10e52755a17..dffa3975792 100644
--- a/apps/web/src/locales/sk/messages.json
+++ b/apps/web/src/locales/sk/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Na úpravu tejto položky nemáte oprávnenie"
},
- "reviewAtRiskPasswords": {
- "message": "Skontrolujte ohrozené heslá (slabé, odhalené, alebo opätovne použité) naprieč aplikáciami. Vyberte najkritickejšie aplikácie a priorizujte vaším používateľom bezpečnostné opatrenia ohľadom ohrozených hesiel."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Prehľad ohrozených prihlasovacích mien"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Nepodarilo sa označiť aplikácie za kritické"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimálny počet slov"
},
- "overridePasswordTypePolicy": {
- "message": "Typ hesla",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ z $SELECTEDCOUNT$ používateľov opätovne pozvaných. $EXCLUDEDCOUNT$ nebolo pozvaných kvôli limitu $LIMIT$ pozvánok.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Odstránenie úspešné"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Priradiť úlohy"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Odoslať upozornenia na zmenu hesla"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Položka bola archivovaná"
},
- "itemsWereSentToArchive": {
- "message": "Položky boli archivované"
- },
"itemWasUnarchived": {
"message": "Položka bola odobraná z archívu"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Ste si istí, že chcete pokračovať?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Zlyhalo overenie používateľa."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json
index e6dc9d1b2ab..aef3a8ca3ac 100644
--- a/apps/web/src/locales/sl/messages.json
+++ b/apps/web/src/locales/sl/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Vsaj toliko besed"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json
index 341d0047e14..7e7bcbd97b1 100644
--- a/apps/web/src/locales/sr_CS/messages.json
+++ b/apps/web/src/locales/sr_CS/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Pregledaj rizične lozinke (slabe, izložene ili ponovo korišćene) u aplikacijama. Izaberi svoje najkritičnije aplikacije da bi dao prioritet bezbednosnim radnjama kako bi tvoji korisnici adresirali rizične lozinke."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimalan broj reči"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json
index 2300d3fe67f..d457b16f44e 100644
--- a/apps/web/src/locales/sr_CY/messages.json
+++ b/apps/web/src/locales/sr_CY/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Немате дозволу да уређујете ову ставку"
},
- "reviewAtRiskPasswords": {
- "message": "Прегледај ризичне лозинке (слабе, изложене или поново коришћене) у апликацијама. Изабери своје најкритичније апликације да би дао приоритет безбедносним радњама како би твоји корисници адресирали ризичне лозинке."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Прегледајте ризичне пријаве"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Означавање апликација као критичних није успело"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Минимални број речи"
},
- "overridePasswordTypePolicy": {
- "message": "Тип лозинке",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Успешно уклоњено"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Додели задатке"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Ставка је послата у архиву"
},
- "itemsWereSentToArchive": {
- "message": "Ставке су послате у архиву"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Желите ли заиста да наставите?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json
index bc10ec0ed99..f4bab640104 100644
--- a/apps/web/src/locales/sv/messages.json
+++ b/apps/web/src/locales/sv/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Du har inte behörighet att redigera detta objekt"
},
- "reviewAtRiskPasswords": {
- "message": "Granska risklösenord (svaga, exponerade eller återanvända) i olika applikationer. Välj ut de mest kritiska applikationerna för att prioritera säkerhetsåtgärder för användarna för att hantera risklösenord."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Granska inloggningar i riskzonen"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Misslyckades med att markera applikationer som kritiska"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Minsta antal ord"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Lösenordstyp",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ av $SELECTEDCOUNT$ användare återinbjudna. $EXCLUDEDCOUNT$ blev inte inbjudna på grund av gränsen på $LIMIT$ inbjudningar.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Tog bort"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Tilldela uppgifter"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Skicka aviseringar om att ändra lösenord"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Objektet skickades till arkivet"
},
- "itemsWereSentToArchive": {
- "message": "Objekten har skickats till arkivet"
- },
"itemWasUnarchived": {
"message": "Objektet har avarkiverats"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Är du säker på att du vill fortsätta?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Verifiering av användare misslyckades."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per användare"
+ },
+ "upgradeToTeams": {
+ "message": "Uppgradera till Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Uppgradera till Företag"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "Du har uppgraderat till $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json
index 3189d19e43b..b93591182db 100644
--- a/apps/web/src/locales/ta/messages.json
+++ b/apps/web/src/locales/ta/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "பயன்பாடுகள் முழுவதும் ஆபத்தான கடவுச்சொற்களை (பலவீனமான, அம்பலப்படுத்தப்பட்ட, அல்லது மீண்டும் பயன்படுத்தப்பட்ட) மதிப்பாய்வு செய்யவும். உங்கள் பயனர்களுக்கான ஆபத்தான கடவுச்சொற்களை நிவர்த்தி செய்ய பாதுகாப்பு நடவடிக்கைகளுக்கு முன்னுரிமை அளிக்க, உங்கள் மிக முக்கியமான பயன்பாடுகளைத் தேர்ந்தெடுக்கவும்."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "குறைந்தபட்ச சொற்களின் எண்ணிக்கை"
},
- "overridePasswordTypePolicy": {
- "message": "கடவுச்சொல் வகை",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "வெற்றிகரமாக அகற்றப்பட்டது"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json
index 2e96d9b844d..b95256dfacd 100644
--- a/apps/web/src/locales/te/messages.json
+++ b/apps/web/src/locales/te/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json
index 810be6dadcf..e5e449038ac 100644
--- a/apps/web/src/locales/th/messages.json
+++ b/apps/web/src/locales/th/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "You don't have permission to edit this item"
},
- "reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Review at-risk logins"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Minimum number of words"
},
- "overridePasswordTypePolicy": {
- "message": "Password Type",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Removed successfully"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json
index 93340b58c79..97a29756a89 100644
--- a/apps/web/src/locales/tr/messages.json
+++ b/apps/web/src/locales/tr/messages.json
@@ -39,7 +39,7 @@
"message": "Access Intelligence"
},
"noApplicationsMatchTheseFilters": {
- "message": "No applications match these filters"
+ "message": "Bu filtrelerle eşleşen uygulama yok"
},
"passwordRisk": {
"message": "Parola Riski"
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Bu kaydı düzenleme yetkisine sahip değilsiniz"
},
- "reviewAtRiskPasswords": {
- "message": "Uygulamalar genelinde risk altındaki parolaları (zayıf, açığa çıkmış veya farklı yerlerde kullanılan) gözden geçirin. Kullanıcılarınız için risk altındaki parolalara yönelik güvenlik eylemlerine öncelik vermek üzere en kritik uygulamalarınızı seçin."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Risk altındaki hesapları inceleyin"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ uygulama kritik olarak işaretlendi",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ uygulama kritik değil olarak işaretlendi",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "$COUNT$ tane şeyi kritik olarak işaretle",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "$COUNT$ tane şeyi kritik değil olarak işaretle",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Uygulamaların kritik olarak işaretlenmesi başarısız oldu"
},
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "Minimum kelime sayısı"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "Parola türü",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -5987,7 +6023,7 @@
"description": "This will be used as a hyperlink"
},
"benefits": {
- "message": "Benefits"
+ "message": "Avantajlar"
},
"centralizeDataOwnershipBenefit1": {
"message": "Gain full visibility into credential health, including shared and unshared items."
@@ -6005,7 +6041,7 @@
"message": "If members have items in their individual vault, they will be prompted to either transfer them to the organization or leave. If they leave, their access is revoked but can be restored anytime."
},
"centralizeDataOwnershipWarningLink": {
- "message": "Learn more about the transfer"
+ "message": "Transfer hakkında daha fazla bilgi edinin"
},
"organizationDataOwnership": {
"message": "Kuruluş veri sahipliğini zorunlu kılın"
@@ -6446,10 +6482,10 @@
"message": "Hesap kurtarmaya kaydolundu"
},
"enrolled": {
- "message": "Enrolled"
+ "message": "Kayıtlı"
},
"notEnrolled": {
- "message": "Not enrolled"
+ "message": "Kayıtlı değil"
},
"withdrawAccountRecovery": {
"message": "Hesap kurtarmadan ayrıl"
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 davet gönder"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ davet gönder",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$SELECTEDCOUNT$ kullanıcıdan $LIMIT$ tanesi yeniden davet edildi. $EXCLUDEDCOUNT$ kullanıcı, $LIMIT$ davet sınırı nedeniyle davet edilmedi.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Tüm davetler gönderilene dek bu sayfayı açık tutunuz."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ davet gönderilmedi",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 davet gönderilmedi"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Tekrar göndermeyi dene"
+ },
"bulkRemovedMessage": {
"message": "Başarıyla kaldırıldı"
},
@@ -6975,7 +7067,7 @@
"message": "Kasa zaman aşımı izin verilen aralıkta değil."
},
"disableExport": {
- "message": "Remove export"
+ "message": "Dışa aktarmayı kaldır"
},
"disablePersonalVaultExportDescription": {
"message": "Üyelerin kişisel kasalarındaki verileri dışa aktarmasına izin verme."
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Görev ata"
},
+ "allTasksAssigned": {
+ "message": "Tüm görevler atandı"
+ },
"assignSecurityTasksToMembers": {
"message": "Parolaları değiştirmek için bildirim gönder"
},
@@ -10611,10 +10706,10 @@
"message": "İndeks"
},
"httpEventCollectorUrl": {
- "message": "HTTP Event Collector URL"
+ "message": "HTTP Olay Toplayıcı URL'si"
},
"httpEventCollectorToken": {
- "message": "HTTP Event Collector Token"
+ "message": "HTTP Olay Toplayıcı Token'i"
},
"selectAPlan": {
"message": "Bir plan seçin"
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Kayıt arşive gönderildi"
},
- "itemsWereSentToArchive": {
- "message": "Kayıtlar arşive gönderildi"
- },
"itemWasUnarchived": {
"message": "Kayıt arşivden çıkarıldı"
},
@@ -12449,40 +12541,40 @@
"message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain."
},
"continueWithLogIn": {
- "message": "Continue with log in"
+ "message": "Giriş yaparak devam et"
},
"doNotContinue": {
- "message": "Do not continue"
+ "message": "Devam etme"
},
"domain": {
- "message": "Domain"
+ "message": "Alan Adı"
},
"keyConnectorDomainTooltip": {
"message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin."
},
"verifyYourOrganization": {
- "message": "Verify your organization to log in"
+ "message": "Giriş yapmak için kuruluşunuzu doğrulayın"
},
"organizationVerified": {
- "message": "Organization verified"
+ "message": "Kuruluş doğrulandı"
},
"domainVerified": {
- "message": "Domain verified"
+ "message": "Alan adı doğrulandı"
},
"leaveOrganizationContent": {
- "message": "If you don't verify your organization, your access to the organization will be revoked."
+ "message": "Kuruluşunuzu doğrulamazsanız, kuruluşa erişiminiz iptal edilecektir."
},
"leaveNow": {
- "message": "Leave now"
+ "message": "Şimdi ayrıl"
},
"verifyYourDomainToLogin": {
- "message": "Verify your domain to log in"
+ "message": "Giriş yapmak için alan adınızı doğrulayın"
},
"verifyYourDomainDescription": {
- "message": "To continue with log in, verify this domain."
+ "message": "Giriş yaparak devam etmek için bu alan adını doğrulayın."
},
"confirmKeyConnectorOrganizationUserDescription": {
- "message": "To continue with log in, verify the organization and domain."
+ "message": "Giriş yaparak devam etmek için kuruluşu ve alan adını doğrulayın."
},
"confirmNoSelectedCriticalApplicationsTitle": {
"message": "Hiçbir kritik uygulama seçili değil"
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Devam etmek istediğinizden emin misiniz?"
},
+ "errorCannotDecrypt": {
+ "message": "Hata: Deşifre edilemiyor"
+ },
"userVerificationFailed": {
"message": "Kullanıcı doğrulaması başarısız oldu."
},
@@ -12509,13 +12604,13 @@
"message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?"
},
"recoveryReplacePrivateKeyTitle": {
- "message": "Replace encryption key"
+ "message": "Şifreleme anahtarını değiştir"
},
"recoveryReplacePrivateKeyDesc": {
"message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again."
},
"recoveryStepSyncTitle": {
- "message": "Synchronizing data"
+ "message": "Veri eşitleme"
},
"recoveryStepPrivateKeyTitle": {
"message": "Verifying encryption key integrity"
@@ -12536,13 +12631,13 @@
"message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues."
},
"runDiagnostics": {
- "message": "Run Diagnostics"
+ "message": "Tanılamayı Çalıştır"
},
"repairIssues": {
"message": "Repair Issues"
},
"saveDiagnosticLogs": {
- "message": "Save Diagnostic Logs"
+ "message": "Tanılama Günlüklerini Kaydet"
},
"sessionTimeoutSettingsManagedByOrganization": {
"message": "Bu ayar kuruluşunuz tarafından yönetiliyor."
@@ -12583,16 +12678,16 @@
"message": "Zaman aşımı eyleminizi değiştirmek için kilit açma yönteminizi ayarlayın"
},
"leaveConfirmationDialogTitle": {
- "message": "Are you sure you want to leave?"
+ "message": "Ayrılmak istediğinizden emin misiniz?"
},
"leaveConfirmationDialogContentOne": {
- "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features."
+ "message": "Reddederseniz kişisel kayıtlarınız hesabınızda kalır, ancak paylaşılan kayıtlara ve kuruluş özelliklerine erişiminizi kaybedersiniz."
},
"leaveConfirmationDialogContentTwo": {
- "message": "Contact your admin to regain access."
+ "message": "Erişiminizi yeniden kazanmak için yöneticinizle iletişime geçin."
},
"leaveConfirmationDialogConfirmButton": {
- "message": "Leave $ORGANIZATION$",
+ "message": "$ORGANIZATION$ kuruluşundan ayrıl",
"placeholders": {
"organization": {
"content": "$1",
@@ -12601,10 +12696,10 @@
}
},
"howToManageMyVault": {
- "message": "How do I manage my vault?"
+ "message": "Kasamı nasıl yönetebilirim?"
},
"transferItemsToOrganizationTitle": {
- "message": "Transfer items to $ORGANIZATION$",
+ "message": "Kayıtları $ORGANIZATION$ kuruluşuna aktar",
"placeholders": {
"organization": {
"content": "$1",
@@ -12613,7 +12708,7 @@
}
},
"transferItemsToOrganizationContent": {
- "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.",
+ "message": "$ORGANIZATION$, güvenlik ve mevzuata uyum amacıyla tüm kayıtların kuruluşa ait olmasını zorunlu kılıyor. Kayıtlarınızın sahipliğini devretmek için \"Kabul et\"e tıklayın.",
"placeholders": {
"organization": {
"content": "$1",
@@ -12622,22 +12717,22 @@
}
},
"acceptTransfer": {
- "message": "Accept transfer"
+ "message": "Aktarımı kabul et"
},
"declineAndLeave": {
- "message": "Decline and leave"
+ "message": "Reddet ve ayrıl"
},
"whyAmISeeingThis": {
- "message": "Why am I seeing this?"
+ "message": "Bunu neden görüyorum?"
},
"youHaveBitwardenPremium": {
"message": "Bitwarden Premium abonesisiniz"
},
"viewAndManagePremiumSubscription": {
- "message": "View and manage your Premium subscription"
+ "message": "Premium aboneliğinizi görüntüleyin ve yönetin"
},
"youNeedToUpdateLicenseFile": {
- "message": "You'll need to update your license file"
+ "message": "Lisans dosyanızı güncellemeniz gerekecektir"
},
"youNeedToUpdateLicenseFileDate": {
"message": "$DATE$.",
@@ -12649,16 +12744,16 @@
}
},
"uploadLicenseFile": {
- "message": "Upload license file"
+ "message": "Lisans dosyasını yükle"
},
"uploadYourLicenseFile": {
- "message": "Upload your license file"
+ "message": "Lisans dosyasınızı yükleyin"
},
"uploadYourPremiumLicenseFile": {
- "message": "Upload your Premium license file"
+ "message": "Premium lisans dosyasınızı yükleyin"
},
"uploadLicenseFileDesc": {
- "message": "Your license file name will be similar to: $FILE_NAME$",
+ "message": "Lisans dosyanızın adı şuna benzer olacaktır: $FILE_NAME$",
"placeholders": {
"file_name": {
"content": "$1",
@@ -12667,13 +12762,13 @@
}
},
"alreadyHaveSubscriptionQuestion": {
- "message": "Already have a subscription?"
+ "message": "Halihazırda bir aboneliğiniz var mı?"
},
"alreadyHaveSubscriptionSelfHostedMessage": {
"message": "Open the subscription page on your Bitwarden cloud account and download your license file. Then return to this screen and upload it below."
},
"viewAllPlans": {
- "message": "View all plans"
+ "message": "Tüm planları görüntüle"
},
"planDescPremium": {
"message": "Eksiksiz çevrimiçi güvenlik"
@@ -12722,16 +12817,16 @@
"message": "due on"
},
"yourSubscriptionWillBeSuspendedOn": {
- "message": "Your subscription will be suspended on"
+ "message": "Aboneliğiniz şu tarihte askıya alınacaktır"
},
"yourSubscriptionWasSuspendedOn": {
- "message": "Your subscription was suspended on"
+ "message": "Aboneliğiniz şu tarihte askıya alındı"
},
"yourSubscriptionWillBeCanceledOn": {
- "message": "Your subscription will be canceled on"
+ "message": "Aboneliğiniz şu tarihte iptal edilecektir"
},
"yourSubscriptionWasCanceledOn": {
- "message": "Your subscription was canceled on"
+ "message": "Aboneliğiniz şu tarihte iptal edildi"
},
"storageFull": {
"message": "Depolama alanı dolu"
@@ -12783,7 +12878,7 @@
"message": "Premium abonesiniz"
},
"emailProtected": {
- "message": "Email protected"
+ "message": "E-posta korumalı"
},
"invalidSendPassword": {
"message": "Geçersiz Send parolası"
@@ -12793,6 +12888,55 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"perUser": {
- "message": "per user"
+ "message": "kişi başı"
+ },
+ "upgradeToTeams": {
+ "message": "Ekip planına yükselt"
+ },
+ "upgradeToEnterprise": {
+ "message": "Kurumsal planına yükselt"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Fiyatlara vergi dahil değildir ve yıllık olarak faturalandırılır."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium abonelik kredisi"
+ },
+ "enterpriseMembership": {
+ "message": "Kurumsal üyelik"
+ },
+ "teamsMembership": {
+ "message": "Ekip üyeliği"
+ },
+ "plansUpdated": {
+ "message": "$PLAN$ planına geçtiniz!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "Ödeme yönteminizi güncellerken bir hata oluştu."
}
}
diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json
index edcc4d39cb1..6fc3db5d64e 100644
--- a/apps/web/src/locales/uk/messages.json
+++ b/apps/web/src/locales/uk/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Вам не дозволено редагувати цей запис"
},
- "reviewAtRiskPasswords": {
- "message": "Переглядайте ризиковані паролі в різних програмах (слабкі, викриті, або повторно використані). Виберіть найбільш критичні програми, щоб визначити пріоритети дій щодо безпеки для користувачів, які використовують ризиковані паролі."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Переглянути записи з ризиком"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Failed to mark applications as critical"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Мінімальна кількість слів"
},
- "overridePasswordTypePolicy": {
- "message": "Тип пароля",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Успішно вилучено"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Assign tasks"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Send notifications to change passwords"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Item was sent to archive"
},
- "itemsWereSentToArchive": {
- "message": "Items were sent to archive"
- },
"itemWasUnarchived": {
"message": "Item was unarchived"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Are you sure you want to continue?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "User verification failed."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json
index 5e468b4ed2a..d54ae1933a7 100644
--- a/apps/web/src/locales/vi/messages.json
+++ b/apps/web/src/locales/vi/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "Bạn không có quyền chỉnh sửa mục này"
},
- "reviewAtRiskPasswords": {
- "message": "Kiểm tra các mật khẩu có rủi ro (yếu, bị lộ hoặc được sử dụng lại) trên các ứng dụng. Chọn các ứng dụng quan trọng nhất của bạn để ưu tiên các biện pháp bảo mật cho người dùng nhằm giải quyết các mật khẩu có rủi ro."
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "Xem lại các đăng nhập có rủi ro"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "Không thể đánh dấu các ứng dụng là quan trọng"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "Số từ tối thiểu"
},
- "overridePasswordTypePolicy": {
- "message": "Loại mật khẩu",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "Đã mời lại $LIMIT$ trong số $SELECTEDCOUNT$ người dùng. $EXCLUDEDCOUNT$ người đã không được mời do giới hạn mời là $LIMIT$.",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "Đã xóa thành công"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "Giao tác vụ"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "Gửi thông báo thay đổi mật khẩu"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "Mục đã được chuyển vào kho lưu trữ"
},
- "itemsWereSentToArchive": {
- "message": "Các mục đã được chuyển vào lưu trữ"
- },
"itemWasUnarchived": {
"message": "Mục đã được bỏ lưu trữ"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "Bạn có chắc chắn muốn tiếp tục không?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "Xác minh người dùng thất bại."
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "per user"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json
index b479ae94f36..76b95446091 100644
--- a/apps/web/src/locales/zh_CN/messages.json
+++ b/apps/web/src/locales/zh_CN/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "您没有编辑此项目的权限"
},
- "reviewAtRiskPasswords": {
- "message": "审查各个应用程序中存在风险的密码(弱、暴露或重复使用)。选择最关键的应用程序,优先为您的用户采取安全措施,以处理存在风险的密码。"
+ "reviewAccessIntelligence": {
+ "message": "审查安全报告,在凭据风险升级之前发现并修复它们。"
},
"reviewAtRiskLoginsPrompt": {
"message": "审查存在风险的登录"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ 个应用程序标记为关键",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ 个应用程序标记为非关键",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "将 $COUNT$ 个标记为关键",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "将 $COUNT$ 个标记为非关键",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "将应用程序标记为关键失败"
},
@@ -4919,7 +4955,7 @@
}
},
"subscriptionUserSeatsWithoutAdditionalSeatsOption": {
- "message": "您最多可邀请 $COUNT$ 名成员,而无需额外付费。要升级您的方案并邀请更多成员,请联系客户支持。",
+ "message": "您最多可邀请 $COUNT$ 位成员,而无需额外付费。要升级您的方案并邀请更多成员,请联系客户支持。",
"placeholders": {
"count": {
"content": "$1",
@@ -5394,7 +5430,7 @@
"minimumNumberOfWords": {
"message": "单词最少个数"
},
- "overridePasswordTypePolicy": {
+ "passwordTypePolicyOverride": {
"message": "密码类型",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
@@ -5678,7 +5714,7 @@
}
},
"sendCreatedDescriptionPassword": {
- "message": "复制并分享此 Send 链接。在接下来的 $TIME$ 内,任何拥有此链接以及您设置的密码的人都可以访问此 Send。",
+ "message": "复制并分享此 Send 链接。在接下来的 $TIME$ 内,拥有此链接以及您设置的密码的任何人都可以访问此 Send。",
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.",
"placeholders": {
"time": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "已发送 1 份邀请"
+ },
+ "bulkReinviteSentToast": {
+ "message": "已发送 $COUNT$ 份邀请",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "已重新邀请 $SELECTEDCOUNT$ 位用户中的 $LIMIT$ 位。由于邀请限制为 $LIMIT$ 人,$EXCLUDEDCOUNT$ 位用户没有被邀请。",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "已发送 $TOTAL$ 份邀请中的 $COUNT$ 份...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "全部发送完毕前,请保持此页面打开。"
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ 份邀请未发送",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 份邀请未发送"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "向 $TOTAL$ 位成员中的 $COUNT$ 位发送邀请时发生错误。请尝试重新发送,如果问题仍然存在,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "尝试再次发送"
+ },
"bulkRemovedMessage": {
"message": "移除成功"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "分配任务"
},
+ "allTasksAssigned": {
+ "message": "所有任务已分配"
+ },
"assignSecurityTasksToMembers": {
"message": "发送更改密码的通知"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "项目已发送到归档"
},
- "itemsWereSentToArchive": {
- "message": "项目已发送到归档"
- },
"itemWasUnarchived": {
"message": "项目已取消归档"
},
@@ -12184,7 +12276,7 @@
"message": "使用通行密钥解锁失败。请重试或使用其他解锁方式。"
},
"noPrfCredentialsAvailable": {
- "message": "没有可用于解锁的 PRF 通行密钥。"
+ "message": "没有可用于解锁的支持 PRF 的通行密钥。"
},
"additionalStorageGB": {
"message": "附加存储 GB"
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "确定要继续吗?"
},
+ "errorCannotDecrypt": {
+ "message": "错误:无法解密"
+ },
"userVerificationFailed": {
"message": "用户验证失败。"
},
@@ -12793,6 +12888,55 @@
"description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
},
"perUser": {
- "message": "每位用户"
+ "message": "每用户"
+ },
+ "upgradeToTeams": {
+ "message": "升级为团队版"
+ },
+ "upgradeToEnterprise": {
+ "message": "升级为企业版"
+ },
+ "upgradeShareEvenMore": {
+ "message": "使用家庭版共享更多内容,或使用团队版或企业版获得强大、可信赖的密码安全防护"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "价格不含税,按年计费。"
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "生成账单预览时遇到错误。"
+ },
+ "planProratedMembershipInMonths": {
+ "message": "按比例计费的 $PLAN$ 成员资格($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "高级版订阅信用额度"
+ },
+ "enterpriseMembership": {
+ "message": "企业版成员资格"
+ },
+ "teamsMembership": {
+ "message": "团队版成员资格"
+ },
+ "plansUpdated": {
+ "message": "您已升级为 $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "更新您的付款方式时出错。"
}
}
diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json
index b80112b4d39..8056e49b08a 100644
--- a/apps/web/src/locales/zh_TW/messages.json
+++ b/apps/web/src/locales/zh_TW/messages.json
@@ -47,8 +47,8 @@
"noEditPermissions": {
"message": "您沒有權限編輯此項目"
},
- "reviewAtRiskPasswords": {
- "message": "檢視各項應用程式中具有風險的密碼(包含強度不足、已外洩或重複使用的密碼)。請選取最關鍵的應用程式,以便優先採取安全措施,引導使用者處理風險密碼。"
+ "reviewAccessIntelligence": {
+ "message": "Review security reports to find and fix credential risks before they escalate."
},
"reviewAtRiskLoginsPrompt": {
"message": "檢視高風險登入"
@@ -268,6 +268,42 @@
}
}
},
+ "numCriticalApplicationsMarkedSuccess": {
+ "message": "$COUNT$ applications marked critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "numApplicationsUnmarkedCriticalSuccess": {
+ "message": "$COUNT$ applications marked not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsCritical": {
+ "message": "Mark $COUNT$ as critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "markAppCountAsNotCritical": {
+ "message": "Mark $COUNT$ as not critical",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
"applicationsMarkedAsCriticalFail": {
"message": "標記應用程式為關鍵失敗"
},
@@ -5394,8 +5430,8 @@
"minimumNumberOfWords": {
"message": "最少單字個數"
},
- "overridePasswordTypePolicy": {
- "message": "密碼類型",
+ "passwordTypePolicyOverride": {
+ "message": "Password type",
"description": "Name of the password generator policy that overrides the user's password/passphrase selection."
},
"userPreference": {
@@ -6637,6 +6673,18 @@
}
}
},
+ "reinviteSuccessToast": {
+ "message": "1 invitation sent"
+ },
+ "bulkReinviteSentToast": {
+ "message": "$COUNT$ invitations sent",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "12"
+ }
+ }
+ },
"bulkReinviteLimitedSuccessToast": {
"message": "已重新邀請 $SELECTEDCOUNT$ 位使用者中的 $LIMIT$ 位。有 $EXCLUDEDCOUNT$ 位因達到 $LIMIT$ 的邀請上限而未被邀請。",
"placeholders": {
@@ -6654,6 +6702,50 @@
}
}
},
+ "bulkReinviteProgressTitle": {
+ "message": "$COUNT$ of $TOTAL$ invitations sent...",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkReinviteProgressSubtitle": {
+ "message": "Keep this page open until all are sent."
+ },
+ "bulkReinviteFailuresTitle": {
+ "message": "$COUNT$ invitations didn't send",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ }
+ }
+ },
+ "bulkReinviteFailureTitle": {
+ "message": "1 invitation didn't send"
+ },
+ "bulkReinviteFailureDescription": {
+ "message": "An error occurred while sending invitations to $COUNT$ of $TOTAL$ members. Try sending again, and if the problem continues,",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "1,000"
+ },
+ "total": {
+ "content": "$2",
+ "example": "2,000"
+ }
+ }
+ },
+ "bulkResendInvitations": {
+ "message": "Try sending again"
+ },
"bulkRemovedMessage": {
"message": "已成功移除。"
},
@@ -10092,6 +10184,9 @@
"assignTasks": {
"message": "指派任務"
},
+ "allTasksAssigned": {
+ "message": "All tasks have been assigned"
+ },
"assignSecurityTasksToMembers": {
"message": "傳送變更密碼的通知"
},
@@ -11804,9 +11899,6 @@
"itemWasSentToArchive": {
"message": "項目已移至封存"
},
- "itemsWereSentToArchive": {
- "message": "項目已移至封存"
- },
"itemWasUnarchived": {
"message": "已取消封存項目"
},
@@ -12490,6 +12582,9 @@
"confirmNoSelectedCriticalApplicationsDesc": {
"message": "您確定要繼續嗎?"
},
+ "errorCannotDecrypt": {
+ "message": "Error: Cannot decrypt"
+ },
"userVerificationFailed": {
"message": "使用者驗證失敗。"
},
@@ -12794,5 +12889,54 @@
},
"perUser": {
"message": "每位使用者"
+ },
+ "upgradeToTeams": {
+ "message": "Upgrade to Teams"
+ },
+ "upgradeToEnterprise": {
+ "message": "Upgrade to Enterprise"
+ },
+ "upgradeShareEvenMore": {
+ "message": "Share even more with Families, or get powerful, trusted password security with Teams or Enterprise"
+ },
+ "organizationUpgradeTaxInformationMessage": {
+ "message": "Prices exclude tax and are billed annually."
+ },
+ "invoicePreviewErrorMessage": {
+ "message": "Encountered an error while generating the invoice preview."
+ },
+ "planProratedMembershipInMonths": {
+ "message": "Prorated $PLAN$ membership ($NUMOFMONTHS$)",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ },
+ "numofmonths": {
+ "content": "$2",
+ "example": "6 Months"
+ }
+ }
+ },
+ "premiumSubscriptionCredit": {
+ "message": "Premium subscription credit"
+ },
+ "enterpriseMembership": {
+ "message": "Enterprise membership"
+ },
+ "teamsMembership": {
+ "message": "Teams membership"
+ },
+ "plansUpdated": {
+ "message": "You've upgraded to $PLAN$!",
+ "placeholders": {
+ "plan": {
+ "content": "$1",
+ "example": "Families"
+ }
+ }
+ },
+ "paymentMethodUpdateError": {
+ "message": "There was an error updating your payment method."
}
}
From 69264c884147728fa8a4d27c2326454d6ffa8496 Mon Sep 17 00:00:00 2001
From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com>
Date: Fri, 13 Feb 2026 15:43:42 +0100
Subject: [PATCH 029/134] [PM-32212] Migrate platform font icons to bit-icon
(#18970)
* Changes on browser
* Changes on desktop
* Changes on web
* Fix chromatic story
---------
Co-authored-by: Daniel James Smith
---
.../popup/layout/popup-page.component.html | 2 +-
.../popup/layout/popup-page.component.ts | 4 +-
.../src/app/accounts/settings.component.html | 42 ++++++-------------
.../src/app/accounts/settings.component.ts | 2 +
.../layout/account-switcher.component.html | 17 +++-----
.../app/layout/search/search.component.html | 2 +-
apps/desktop/src/app/shared/shared.module.ts | 3 ++
apps/desktop/src/index.html | 1 +
.../environment-selector.component.html | 10 ++---
.../layouts/header/web-header.component.html | 10 ++---
.../org-switcher/org-switcher.component.html | 17 ++++----
.../account-fingerprint.component.html | 2 +-
.../onboarding/onboarding-task.component.html | 8 +++-
.../onboarding/onboarding-task.component.ts | 4 +-
.../onboarding/onboarding.component.html | 8 +---
.../onboarding/onboarding.stories.ts | 4 +-
apps/web/src/app/shared/shared.module.ts | 3 ++
.../platform/proxy-cookie-redirect.html | 1 +
apps/web/src/index.html | 1 +
19 files changed, 66 insertions(+), 75 deletions(-)
diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.html b/apps/browser/src/platform/popup/layout/popup-page.component.html
index bb24fb800aa..dc07d025e60 100644
--- a/apps/browser/src/platform/popup/layout/popup-page.component.html
+++ b/apps/browser/src/platform/popup/layout/popup-page.component.html
@@ -40,7 +40,7 @@
class="tw-absolute tw-inset-0 tw-flex tw-items-center tw-justify-center tw-text-main"
[ngClass]="{ 'tw-invisible': !loading() }"
>
-
+
diff --git a/apps/browser/src/platform/popup/layout/popup-page.component.ts b/apps/browser/src/platform/popup/layout/popup-page.component.ts
index 7d4b7decb7f..e661bf2ca00 100644
--- a/apps/browser/src/platform/popup/layout/popup-page.component.ts
+++ b/apps/browser/src/platform/popup/layout/popup-page.component.ts
@@ -13,7 +13,7 @@ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { filter, switchMap, fromEvent, startWith, map } from "rxjs";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
-import { ScrollLayoutHostDirective, ScrollLayoutService } from "@bitwarden/components";
+import { IconModule, ScrollLayoutHostDirective, ScrollLayoutService } from "@bitwarden/components";
@Component({
selector: "popup-page",
@@ -21,7 +21,7 @@ import { ScrollLayoutHostDirective, ScrollLayoutService } from "@bitwarden/compo
host: {
class: "tw-h-full tw-flex tw-flex-col tw-overflow-y-hidden",
},
- imports: [CommonModule, ScrollLayoutHostDirective],
+ imports: [CommonModule, IconModule, ScrollLayoutHostDirective],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class PopupPageComponent {
diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html
index d5042918d2f..90ff8f3a791 100644
--- a/apps/desktop/src/app/accounts/settings.component.html
+++ b/apps/desktop/src/app/accounts/settings.component.html
@@ -16,16 +16,10 @@
[attr.aria-expanded]="showSecurity"
appAutofocus
>
-
-
+
{{ "security" | i18n }}
@@ -147,16 +141,10 @@
(click)="showAccountPreferences = !showAccountPreferences"
[attr.aria-expanded]="showAccountPreferences"
>
-
-
+
{{ "accountPreferences" | i18n }}
@@ -222,16 +210,10 @@
(click)="showAppPreferences = !showAppPreferences"
[attr.aria-expanded]="showAppPreferences"
>
-
-
+
{{ "appPreferences" | i18n }}
diff --git a/apps/desktop/src/app/accounts/settings.component.ts b/apps/desktop/src/app/accounts/settings.component.ts
index f2e828b95ce..7bab7db3c29 100644
--- a/apps/desktop/src/app/accounts/settings.component.ts
+++ b/apps/desktop/src/app/accounts/settings.component.ts
@@ -45,6 +45,7 @@ import {
DialogService,
FormFieldModule,
IconButtonModule,
+ IconModule,
ItemModule,
LinkModule,
SectionComponent,
@@ -89,6 +90,7 @@ import { NativeMessagingManifestService } from "../services/native-messaging-man
FormsModule,
ReactiveFormsModule,
IconButtonModule,
+ IconModule,
ItemModule,
JslibModule,
LinkModule,
diff --git a/apps/desktop/src/app/layout/account-switcher.component.html b/apps/desktop/src/app/layout/account-switcher.component.html
index ef177ea1bb6..7d0ee8fac83 100644
--- a/apps/desktop/src/app/layout/account-switcher.component.html
+++ b/apps/desktop/src/app/layout/account-switcher.component.html
@@ -31,11 +31,7 @@
{{ "switchAccount" | i18n }}
-
+
)
-
+ class="bwi-2x text-muted"
+ >
0">
- {{ "addAccount" | i18n }}
+ {{ "addAccount" | i18n }}
diff --git a/apps/desktop/src/app/layout/search/search.component.html b/apps/desktop/src/app/layout/search/search.component.html
index 515385c2076..b5bcd264897 100644
--- a/apps/desktop/src/app/layout/search/search.component.html
+++ b/apps/desktop/src/app/layout/search/search.component.html
@@ -7,5 +7,5 @@
[formControl]="searchText"
appAutofocus
/>
-
+
diff --git a/apps/desktop/src/app/shared/shared.module.ts b/apps/desktop/src/app/shared/shared.module.ts
index 6eed4a197f3..85b3b800e83 100644
--- a/apps/desktop/src/app/shared/shared.module.ts
+++ b/apps/desktop/src/app/shared/shared.module.ts
@@ -7,6 +7,7 @@ import { NgModule } from "@angular/core";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { JslibModule } from "@bitwarden/angular/jslib.module";
+import { IconModule } from "@bitwarden/components";
import { AvatarComponent } from "../components/avatar.component";
import { ServicesModule } from "../services/services.module";
@@ -17,6 +18,7 @@ import { ServicesModule } from "../services/services.module";
A11yModule,
DragDropModule,
FormsModule,
+ IconModule,
JslibModule,
OverlayModule,
ReactiveFormsModule,
@@ -30,6 +32,7 @@ import { ServicesModule } from "../services/services.module";
DatePipe,
DragDropModule,
FormsModule,
+ IconModule,
JslibModule,
OverlayModule,
ReactiveFormsModule,
diff --git a/apps/desktop/src/index.html b/apps/desktop/src/index.html
index 37eb64adf35..044d7eb0e2f 100644
--- a/apps/desktop/src/index.html
+++ b/apps/desktop/src/index.html
@@ -13,6 +13,7 @@
+
diff --git a/apps/web/src/app/components/environment-selector/environment-selector.component.html b/apps/web/src/app/components/environment-selector/environment-selector.component.html
index 9862f62c2e2..44039bfe605 100644
--- a/apps/web/src/app/components/environment-selector/environment-selector.component.html
+++ b/apps/web/src/app/components/environment-selector/environment-selector.component.html
@@ -7,11 +7,11 @@
region == currentRegion ? 'javascript:void(0)' : region.urls.webVault + routeAndParams
"
>
-
+ >
{{ region.domain }}
@@ -19,7 +19,7 @@
{{ "accessing" | i18n }}:
{{ currentRegion?.domain }}
-
+
diff --git a/apps/web/src/app/layouts/header/web-header.component.html b/apps/web/src/app/layouts/header/web-header.component.html
index 995169e3dc1..9288c96237e 100644
--- a/apps/web/src/app/layouts/header/web-header.component.html
+++ b/apps/web/src/app/layouts/header/web-header.component.html
@@ -60,11 +60,11 @@
-
+
{{ "accountSettings" | i18n }}
-
+
{{ "getHelp" | i18n }}
-
+
{{ "getApps" | i18n }}
-
+
{{ "lockNow" | i18n }}
-
+
{{ "logOut" | i18n }}
diff --git a/apps/web/src/app/layouts/org-switcher/org-switcher.component.html b/apps/web/src/app/layouts/org-switcher/org-switcher.component.html
index a9acddeb0b8..b8f7c5ab0c0 100644
--- a/apps/web/src/app/layouts/org-switcher/org-switcher.component.html
+++ b/apps/web/src/app/layouts/org-switcher/org-switcher.component.html
@@ -7,13 +7,14 @@
[routerLinkActiveOptions]="{ exact: true }"
[(open)]="open"
>
-
+ >
-
+ >
-
{{ fingerprint }}
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.html b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.html
index f0c0b01e06e..e52771a282b 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.html
+++ b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.html
@@ -1,10 +1,14 @@
- {{ title }} {{ title }}
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
index 277a4d2d26e..47a618a1269 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
+++ b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
@@ -2,6 +2,8 @@
// @ts-strict-ignore
import { Component, Input } from "@angular/core";
+import { BitwardenIcon } from "@bitwarden/components";
+
// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush
// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection
@Component({
@@ -21,7 +23,7 @@ export class OnboardingTaskComponent {
// FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals
// eslint-disable-next-line @angular-eslint/prefer-signals
@Input()
- icon = "bwi-info-circle";
+ icon: BitwardenIcon = "bwi-info-circle";
// FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals
// eslint-disable-next-line @angular-eslint/prefer-signals
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding.component.html b/apps/web/src/app/shared/components/onboarding/onboarding.component.html
index 2433ec51fcc..ca98ceb8fbf 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding.component.html
+++ b/apps/web/src/app/shared/components/onboarding/onboarding.component.html
@@ -6,11 +6,7 @@
0; else spinner">
{{ "complete" | i18n: amountCompleted : tasks.length }}
-
+
@@ -24,5 +20,5 @@
-
+
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts b/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts
index 6873700e2bc..26c951fb11f 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts
+++ b/apps/web/src/app/shared/components/onboarding/onboarding.stories.ts
@@ -4,7 +4,7 @@ import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/an
import { delay, of, startWith } from "rxjs";
import { JslibModule } from "@bitwarden/angular/jslib.module";
-import { LinkModule, SvgModule, ProgressModule } from "@bitwarden/components";
+import { LinkModule, SvgModule, ProgressModule, IconModule } from "@bitwarden/components";
import { PreloadedEnglishI18nModule } from "../../../core/tests";
@@ -16,7 +16,7 @@ export default {
component: OnboardingComponent,
decorators: [
moduleMetadata({
- imports: [JslibModule, RouterModule, LinkModule, SvgModule, ProgressModule],
+ imports: [JslibModule, RouterModule, LinkModule, IconModule, SvgModule, ProgressModule],
declarations: [OnboardingTaskComponent],
}),
applicationConfig({
diff --git a/apps/web/src/app/shared/shared.module.ts b/apps/web/src/app/shared/shared.module.ts
index b83555fd84e..729238e0b0d 100644
--- a/apps/web/src/app/shared/shared.module.ts
+++ b/apps/web/src/app/shared/shared.module.ts
@@ -18,6 +18,7 @@ import {
DialogModule,
FormFieldModule,
IconButtonModule,
+ IconModule,
SvgModule,
LinkModule,
MenuModule,
@@ -63,6 +64,7 @@ import {
DialogModule,
FormFieldModule,
IconButtonModule,
+ IconModule,
SvgModule,
LinkModule,
MenuModule,
@@ -99,6 +101,7 @@ import {
DialogModule,
FormFieldModule,
IconButtonModule,
+ IconModule,
SvgModule,
LinkModule,
MenuModule,
diff --git a/apps/web/src/connectors/platform/proxy-cookie-redirect.html b/apps/web/src/connectors/platform/proxy-cookie-redirect.html
index 1daa6d2e412..1918fcd771c 100644
--- a/apps/web/src/connectors/platform/proxy-cookie-redirect.html
+++ b/apps/web/src/connectors/platform/proxy-cookie-redirect.html
@@ -18,6 +18,7 @@
+
+
Date: Fri, 13 Feb 2026 10:02:36 -0500
Subject: [PATCH 030/134] [PM-32075] Fix self host bug due to type mismatch
(#18919)
* fix self host bug with data model
* fix type issues
* fix types, make successful required
---
.../members/components/bulk/bulk-status.component.ts | 5 ++---
.../members/deprecated_members.component.ts | 2 +-
.../organizations/members/members.component.spec.ts | 4 ++--
.../organizations/members/members.component.ts | 2 +-
.../member-actions/member-actions.service.spec.ts | 2 +-
.../services/member-actions/member-actions.service.ts | 8 ++------
.../member-dialog-manager.service.ts | 4 +++-
.../providers/manage/deprecated_members.component.ts | 10 ++++++----
.../providers/manage/members.component.ts | 10 ++++++----
9 files changed, 24 insertions(+), 23 deletions(-)
diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.ts
index 5c9bf919ed4..cfddb17627a 100644
--- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.ts
+++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.ts
@@ -9,7 +9,6 @@ import {
} from "@bitwarden/common/admin-console/enums";
import { ProviderUserBulkResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response";
import { ProviderUserUserDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user.response";
-import { ListResponse } from "@bitwarden/common/models/response/list.response";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { DIALOG_DATA, DialogConfig, DialogService } from "@bitwarden/components";
@@ -34,7 +33,7 @@ type BulkStatusEntry = {
type BulkStatusDialogData = {
users: Array;
filteredUsers: Array;
- request: Promise>;
+ request: Promise;
successfulMessage: string;
};
@@ -63,7 +62,7 @@ export class BulkStatusComponent implements OnInit {
async showBulkStatus(data: BulkStatusDialogData) {
try {
const response = await data.request;
- const keyedErrors: any = response.data
+ const keyedErrors: any = (response ?? [])
.filter((r) => r.error !== "")
.reduce((a, x) => ({ ...a, [x.id]: x.error }), {});
const keyedFilteredUsers: any = data.filteredUsers.reduce(
diff --git a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts b/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
index dae9bafbcfe..1f1e19e2a6f 100644
--- a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
+++ b/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
@@ -446,7 +446,7 @@ export class MembersComponent extends BaseMembersComponent
try {
const result = await this.memberActionsService.bulkReinvite(organization, filteredUsers);
- if (!result.successful) {
+ if (result.successful.length === 0) {
throw new Error();
}
diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts b/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
index 1cd90989b12..9a371de1acd 100644
--- a/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
@@ -515,7 +515,7 @@ describe("vNextMembersComponent", () => {
};
jest.spyOn(component["dataSource"](), "isIncreasedBulkLimitEnabled").mockReturnValue(false);
jest.spyOn(component["dataSource"](), "getCheckedUsers").mockReturnValue([invitedUser]);
- mockMemberActionsService.bulkReinvite.mockResolvedValue({ successful: true });
+ mockMemberActionsService.bulkReinvite.mockResolvedValue({ successful: [{}], failed: [] });
await component.bulkReinvite(mockOrg);
@@ -549,7 +549,7 @@ describe("vNextMembersComponent", () => {
jest.spyOn(component["dataSource"](), "isIncreasedBulkLimitEnabled").mockReturnValue(false);
jest.spyOn(component["dataSource"](), "getCheckedUsers").mockReturnValue([invitedUser]);
const error = new Error("Bulk reinvite failed");
- mockMemberActionsService.bulkReinvite.mockResolvedValue({ successful: false, failed: error });
+ mockMemberActionsService.bulkReinvite.mockResolvedValue({ successful: [], failed: error });
await component.bulkReinvite(mockOrg);
diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.ts b/apps/web/src/app/admin-console/organizations/members/members.component.ts
index 6139c5f07a5..826bdfb5f69 100644
--- a/apps/web/src/app/admin-console/organizations/members/members.component.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members.component.ts
@@ -426,7 +426,7 @@ export class vNextMembersComponent {
const result = await this.memberActionsService.bulkReinvite(organization, filteredUsers);
- if (!result.successful) {
+ if (result.successful.length === 0) {
this.validationService.showError(result.failed);
}
diff --git a/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.spec.ts b/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.spec.ts
index 688c7ed77ce..1ba056a24f6 100644
--- a/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.spec.ts
+++ b/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.spec.ts
@@ -507,7 +507,7 @@ describe("MemberActionsService", () => {
const result = await service.bulkReinvite(mockOrganization, users);
- expect(result.successful).toBeUndefined();
+ expect(result.successful).toHaveLength(0);
expect(result.failed).toHaveLength(totalUsers);
expect(result.failed.every((f) => f.error === errorMessage)).toBe(true);
expect(organizationUserApiService.postManyOrganizationUserReinvite).toHaveBeenCalledTimes(2);
diff --git a/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.ts b/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.ts
index e5f8c0c6673..7d573c8eeef 100644
--- a/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.ts
+++ b/apps/web/src/app/admin-console/organizations/members/services/member-actions/member-actions.service.ts
@@ -37,11 +37,7 @@ export interface MemberActionResult {
}
export class BulkActionResult {
- constructor() {
- this.failed = [];
- }
-
- successful?: OrganizationUserBulkResponse[];
+ successful: OrganizationUserBulkResponse[] = [];
failed: { id: string; error: string }[] = [];
}
@@ -316,7 +312,7 @@ export class MemberActionsService {
}
return {
- successful: allSuccessful.length > 0 ? allSuccessful : undefined,
+ successful: allSuccessful,
failed: allFailed,
};
}
diff --git a/apps/web/src/app/admin-console/organizations/members/services/member-dialog-manager/member-dialog-manager.service.ts b/apps/web/src/app/admin-console/organizations/members/services/member-dialog-manager/member-dialog-manager.service.ts
index 18106031fd0..6c367692376 100644
--- a/apps/web/src/app/admin-console/organizations/members/services/member-dialog-manager/member-dialog-manager.service.ts
+++ b/apps/web/src/app/admin-console/organizations/members/services/member-dialog-manager/member-dialog-manager.service.ts
@@ -1,8 +1,10 @@
import { Injectable, WritableSignal } from "@angular/core";
import { firstValueFrom, lastValueFrom } from "rxjs";
+import { OrganizationUserBulkResponse } from "@bitwarden/admin-console/common";
import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
+import { ProviderUserBulkResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user-bulk.response";
import { ProductTierType } from "@bitwarden/common/billing/enums";
import { OrganizationBillingMetadataResponse } from "@bitwarden/common/billing/models/response/organization-billing-metadata.response";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@@ -197,7 +199,7 @@ export class MemberDialogManagerService {
async openBulkStatusDialog(
users: OrganizationUserView[],
filteredUsers: OrganizationUserView[],
- request: Promise,
+ request: Promise,
successMessage: string,
): Promise {
const dialogRef = BulkStatusComponent.open(this.dialogService, {
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
index 1b1ae25c027..464b9982689 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
@@ -223,10 +223,12 @@ export class MembersComponent extends BaseMembersComponent {
}
} else {
// Feature flag disabled - show legacy dialog
- const request = this.apiService.postManyProviderUserReinvite(
- this.providerId,
- new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
- );
+ const request = this.apiService
+ .postManyProviderUserReinvite(
+ this.providerId,
+ new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
+ )
+ .then((response) => response.data);
const dialogRef = BulkStatusComponent.open(this.dialogService, {
data: {
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
index c63bda449c5..308b93ac2e3 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
@@ -236,10 +236,12 @@ export class vNextMembersComponent {
}
} else {
// In self-hosted environments, show legacy dialog
- const request = this.apiService.postManyProviderUserReinvite(
- providerId,
- new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
- );
+ const request = this.apiService
+ .postManyProviderUserReinvite(
+ providerId,
+ new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
+ )
+ .then((response) => response.data);
const dialogRef = BulkStatusComponent.open(this.dialogService, {
data: {
From b567fea7e77ecb3a1f30afb2d6acfddb644f6330 Mon Sep 17 00:00:00 2001
From: Jared
Date: Fri, 13 Feb 2026 11:38:35 -0500
Subject: [PATCH 031/134] [PM-29506] Rid of old feature flag for members
feature flag (#18884)
* [PM-31750] Refactor members routing and user confirmation logic
* Simplified user confirmation process by removing feature flag checks.
* Updated routing to directly use the new members component without feature flagging.
* Removed deprecated members component references from routing modules.
* Cleaned up feature flag enum by removing unused entries.
* trigger claude
* [PM-31750] Refactor members component and remove deprecated files
* Renamed vNextMembersComponent to MembersComponent for consistency.
* Removed deprecated_members.component.ts and associated HTML files.
* Updated routing and references to use the new MembersComponent.
* Cleaned up related tests to reflect the component name change.
* Refactor import statements in security-tasks.service.ts for improved readability
* Update apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
* Remove BaseMembersComponent and related imports from the admin console, streamlining member management functionality.
* Remove unused ConfigService import from UserConfirmComponent to clean up code.
* Implement feature flag logic for user restoration in MemberDialogComponent, allowing conditional restoration based on DefaultUserCollectionRestore flag.
---------
Co-authored-by: Thomas Rittson
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
---
.../common/base-members.component.ts | 245 -------
.../manage/user-confirm.component.ts | 13 -
.../member-dialog/member-dialog.component.ts | 2 +-
.../members/deprecated_members.component.html | 495 --------------
.../members/deprecated_members.component.ts | 624 ------------------
.../members/members-routing.module.ts | 23 +-
.../members/members.component.spec.ts | 14 +-
.../members/members.component.ts | 2 +-
.../organizations/members/members.module.ts | 4 +-
.../manage/deprecated_members.component.html | 225 -------
.../manage/deprecated_members.component.ts | 351 ----------
.../providers/manage/members.component.ts | 2 +-
.../providers/providers-routing.module.ts | 27 +-
.../providers/providers.module.ts | 4 +-
.../shared/security-tasks.service.ts | 6 +-
libs/common/src/enums/feature-flag.enum.ts | 2 -
16 files changed, 34 insertions(+), 2005 deletions(-)
delete mode 100644 apps/web/src/app/admin-console/common/base-members.component.ts
delete mode 100644 apps/web/src/app/admin-console/organizations/members/deprecated_members.component.html
delete mode 100644 apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
delete mode 100644 bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.html
delete mode 100644 bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
diff --git a/apps/web/src/app/admin-console/common/base-members.component.ts b/apps/web/src/app/admin-console/common/base-members.component.ts
deleted file mode 100644
index 5ecf4269a1a..00000000000
--- a/apps/web/src/app/admin-console/common/base-members.component.ts
+++ /dev/null
@@ -1,245 +0,0 @@
-import { Directive } from "@angular/core";
-import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
-import { FormControl } from "@angular/forms";
-import { firstValueFrom, lastValueFrom, debounceTime, combineLatest, BehaviorSubject } from "rxjs";
-
-import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe";
-import { ApiService } from "@bitwarden/common/abstractions/api.service";
-import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service";
-import {
- OrganizationUserStatusType,
- OrganizationUserType,
- ProviderUserStatusType,
- ProviderUserType,
-} from "@bitwarden/common/admin-console/enums";
-import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
-import { ProviderUserUserDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user.response";
-import { ListResponse } from "@bitwarden/common/models/response/list.response";
-import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
-import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
-import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
-import { Utils } from "@bitwarden/common/platform/misc/utils";
-import { DialogService, ToastService } from "@bitwarden/components";
-import { KeyService } from "@bitwarden/key-management";
-
-import { OrganizationUserView } from "../organizations/core/views/organization-user.view";
-import { UserConfirmComponent } from "../organizations/manage/user-confirm.component";
-import { MemberActionResult } from "../organizations/members/services/member-actions/member-actions.service";
-
-import { PeopleTableDataSource, peopleFilter } from "./people-table-data-source";
-
-export type StatusType = OrganizationUserStatusType | ProviderUserStatusType;
-export type UserViewTypes = ProviderUserUserDetailsResponse | OrganizationUserView;
-
-/**
- * A refactored copy of BasePeopleComponent, using the component library table and other modern features.
- * This will replace BasePeopleComponent once all subclasses have been changed over to use this class.
- */
-@Directive()
-export abstract class BaseMembersComponent {
- /**
- * Shows a banner alerting the admin that users need to be confirmed.
- */
- get showConfirmUsers(): boolean {
- return (
- this.dataSource.activeUserCount > 1 &&
- this.dataSource.confirmedUserCount > 0 &&
- this.dataSource.confirmedUserCount < 3 &&
- this.dataSource.acceptedUserCount > 0
- );
- }
-
- get showBulkConfirmUsers(): boolean {
- return this.dataSource
- .getCheckedUsers()
- .every((member) => member.status == this.userStatusType.Accepted);
- }
-
- get showBulkReinviteUsers(): boolean {
- return this.dataSource
- .getCheckedUsers()
- .every((member) => member.status == this.userStatusType.Invited);
- }
-
- abstract userType: typeof OrganizationUserType | typeof ProviderUserType;
- abstract userStatusType: typeof OrganizationUserStatusType | typeof ProviderUserStatusType;
-
- protected abstract dataSource: PeopleTableDataSource;
-
- firstLoaded: boolean = false;
-
- /**
- * The currently selected status filter, or undefined to show all active users.
- */
- status?: StatusType;
-
- /**
- * The currently executing promise - used to avoid multiple user actions executing at once.
- */
- actionPromise?: Promise;
-
- protected searchControl = new FormControl("", { nonNullable: true });
- protected statusToggle = new BehaviorSubject(undefined);
-
- constructor(
- protected apiService: ApiService,
- protected i18nService: I18nService,
- protected keyService: KeyService,
- protected validationService: ValidationService,
- protected logService: LogService,
- protected userNamePipe: UserNamePipe,
- protected dialogService: DialogService,
- protected organizationManagementPreferencesService: OrganizationManagementPreferencesService,
- protected toastService: ToastService,
- ) {
- // Connect the search input and status toggles to the table dataSource filter
- combineLatest([this.searchControl.valueChanges.pipe(debounceTime(200)), this.statusToggle])
- .pipe(takeUntilDestroyed())
- .subscribe(
- ([searchText, status]) => (this.dataSource.filter = peopleFilter(searchText, status)),
- );
- }
-
- abstract edit(user: UserView, organization?: Organization): void;
- abstract getUsers(organization?: Organization): Promise | UserView[]>;
- abstract removeUser(id: string, organization?: Organization): Promise;
- abstract reinviteUser(id: string, organization?: Organization): Promise;
- abstract confirmUser(
- user: UserView,
- publicKey: Uint8Array,
- organization?: Organization,
- ): Promise;
- abstract invite(organization?: Organization): void;
-
- async load(organization?: Organization) {
- // Load new users from the server
- const response = await this.getUsers(organization);
-
- // GetUsers can return a ListResponse or an Array
- if (response instanceof ListResponse) {
- this.dataSource.data = response.data != null && response.data.length > 0 ? response.data : [];
- } else if (Array.isArray(response)) {
- this.dataSource.data = response;
- }
-
- this.firstLoaded = true;
- }
-
- protected async removeUserConfirmationDialog(user: UserView) {
- return this.dialogService.openSimpleDialog({
- title: this.userNamePipe.transform(user),
- content: { key: "removeUserConfirmation" },
- type: "warning",
- });
- }
-
- async remove(user: UserView, organization?: Organization) {
- const confirmed = await this.removeUserConfirmationDialog(user);
- if (!confirmed) {
- return false;
- }
-
- this.actionPromise = this.removeUser(user.id, organization);
- try {
- const result = await this.actionPromise;
- if (result.success) {
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("removedUserId", this.userNamePipe.transform(user)),
- });
- this.dataSource.removeUser(user);
- } else {
- throw new Error(result.error);
- }
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- async reinvite(user: UserView, organization?: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- this.actionPromise = this.reinviteUser(user.id, organization);
- try {
- const result = await this.actionPromise;
- if (result.success) {
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("hasBeenReinvited", this.userNamePipe.transform(user)),
- });
- } else {
- throw new Error(result.error);
- }
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- async confirm(user: UserView, organization?: Organization) {
- const confirmUser = async (publicKey: Uint8Array) => {
- try {
- this.actionPromise = this.confirmUser(user, publicKey, organization);
- const result = await this.actionPromise;
- if (result.success) {
- user.status = this.userStatusType.Confirmed;
- this.dataSource.replaceUser(user);
-
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("hasBeenConfirmed", this.userNamePipe.transform(user)),
- });
- } else {
- throw new Error(result.error);
- }
- } catch (e) {
- this.validationService.showError(e);
- throw e;
- } finally {
- this.actionPromise = undefined;
- }
- };
-
- if (this.actionPromise != null) {
- return;
- }
-
- try {
- const publicKeyResponse = await this.apiService.getUserPublicKey(user.userId);
- const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);
-
- const autoConfirm = await firstValueFrom(
- this.organizationManagementPreferencesService.autoConfirmFingerPrints.state$,
- );
- if (user == null) {
- throw new Error("Cannot confirm null user.");
- }
- if (autoConfirm == null || !autoConfirm) {
- const dialogRef = UserConfirmComponent.open(this.dialogService, {
- data: {
- name: this.userNamePipe.transform(user),
- userId: user.userId,
- publicKey: publicKey,
- confirmUser: () => confirmUser(publicKey),
- },
- });
- await lastValueFrom(dialogRef.closed);
-
- return;
- }
-
- try {
- const fingerprint = await this.keyService.getFingerprint(user.userId, publicKey);
- this.logService.info(`User's fingerprint: ${fingerprint.join("-")}`);
- } catch (e) {
- this.logService.error(e);
- }
- await confirmUser(publicKey);
- } catch (e) {
- this.logService.error(`Handled exception: ${e}`);
- }
- }
-}
diff --git a/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts b/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts
index 03130d0b946..788d01695b0 100644
--- a/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts
+++ b/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts
@@ -2,11 +2,8 @@
// @ts-strict-ignore
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
-import { firstValueFrom } from "rxjs";
import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service";
-import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
-import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { DIALOG_DATA, DialogConfig, DialogRef, DialogService } from "@bitwarden/components";
import { KeyService } from "@bitwarden/key-management";
@@ -17,8 +14,6 @@ export type UserConfirmDialogData = {
name: string;
userId: string;
publicKey: Uint8Array;
- // @TODO remove this when doing feature flag cleanup for members component refactor.
- confirmUser?: (publicKey: Uint8Array) => Promise;
};
// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush
@@ -46,7 +41,6 @@ export class UserConfirmComponent implements OnInit {
private keyService: KeyService,
private logService: LogService,
private organizationManagementPreferencesService: OrganizationManagementPreferencesService,
- private configService: ConfigService,
) {
this.name = data.name;
this.userId = data.userId;
@@ -76,13 +70,6 @@ export class UserConfirmComponent implements OnInit {
await this.organizationManagementPreferencesService.autoConfirmFingerPrints.set(true);
}
- const membersComponentRefactorEnabled = await firstValueFrom(
- this.configService.getFeatureFlag$(FeatureFlag.MembersComponentRefactor),
- );
- if (!membersComponentRefactorEnabled) {
- await this.data.confirmUser(this.publicKey);
- }
-
this.dialogRef.close(true);
};
diff --git a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts
index 6848f76286f..43520449535 100644
--- a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts
+++ b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.ts
@@ -195,9 +195,9 @@ export class MemberDialogComponent implements OnDestroy {
private accountService: AccountService,
organizationService: OrganizationService,
private toastService: ToastService,
- private configService: ConfigService,
private deleteManagedMemberWarningService: DeleteManagedMemberWarningService,
private organizationUserService: OrganizationUserService,
+ private configService: ConfigService,
) {
this.organization$ = accountService.activeAccount$.pipe(
getUserId,
diff --git a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.html b/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.html
deleted file mode 100644
index 65bab31c728..00000000000
--- a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.html
+++ /dev/null
@@ -1,495 +0,0 @@
-@let organization = this.organization();
-@if (organization) {
-
-
-
-
-
-
-
- {{ "inviteMember" | i18n }}
-
-
-
-
-
-
- {{ "all" | i18n }}
- {{
- allCount
- }}
-
-
-
- {{ "invited" | i18n }}
- {{
- invitedCount
- }}
-
-
-
- {{ "needsConfirmation" | i18n }}
- {{
- acceptedUserCount
- }}
-
-
-
- {{ "revoked" | i18n }}
- {{
- revokedCount
- }}
-
-
-
-
-
- {{ "loading" | i18n }}
-
-
- {{ "noMembersInList" | i18n }}
-
-
- {{ "usersNeedConfirmed" | i18n }}
-
-
-
-
-
-
-
-
- {{
- "all" | i18n
- }}
-
- {{ "name" | i18n }}
- {{ (organization.useGroups ? "groups" : "collections") | i18n }}
- {{ "role" | i18n }}
- {{ "policies" | i18n }}
-
-
-
-
-
-
-
-
-
- {{ "activateSecretsManager" | i18n }}
-
-
-
-
-
- {{ (isSingleInvite ? "resendInvitation" : "reinviteSelected") | i18n }}
-
-
-
-
- {{ "confirmSelected" | i18n }}
-
-
-
-
- {{ "restoreAccess" | i18n }}
-
-
-
- {{ "revokeAccess" | i18n }}
-
-
-
-
- {{ "remove" | i18n }}
-
-
-
-
-
- {{ "delete" | i18n }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ u.name ?? u.email }}
-
-
- {{ "invited" | i18n }}
-
-
- {{ "needsConfirmation" | i18n }}
-
-
- {{ "revoked" | i18n }}
-
-
-
- {{ u.email }}
-
-
-
-
-
-
-
-
-
-
-
- {{ u.name ?? u.email }}
-
- {{ "invited" | i18n }}
-
-
- {{ "needsConfirmation" | i18n }}
-
-
- {{ "revoked" | i18n }}
-
-
-
- {{ u.email }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ u.type | userType }}
-
-
-
-
- {{ u.type | userType }}
-
-
-
-
-
-
- {{ "userUsingTwoStep" | i18n }}
-
- @let resetPasswordPolicyEnabled = resetPasswordPolicyEnabled$ | async;
-
-
- {{ "enrolledAccountRecovery" | i18n }}
-
-
-
-
-
-
-
-
-
- {{ "resendInvitation" | i18n }}
-
-
-
- {{ "confirm" | i18n }}
-
-
-
-
- {{ "memberRole" | i18n }}
-
-
- {{ "groups" | i18n }}
-
-
-
- {{ "collections" | i18n }}
-
-
-
- {{ "eventLogs" | i18n }}
-
-
-
-
-
- {{ "recoverAccount" | i18n }}
-
-
-
-
-
- {{ "restoreAccess" | i18n }}
-
-
-
- {{ "revokeAccess" | i18n }}
-
-
-
- {{ "remove" | i18n }}
-
-
-
-
-
- {{ "delete" | i18n }}
-
-
-
-
-
-
-
-
-
-
-
-}
diff --git a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts b/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
deleted file mode 100644
index 1f1e19e2a6f..00000000000
--- a/apps/web/src/app/admin-console/organizations/members/deprecated_members.component.ts
+++ /dev/null
@@ -1,624 +0,0 @@
-import { Component, computed, Signal } from "@angular/core";
-import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop";
-import { ActivatedRoute } from "@angular/router";
-import {
- combineLatest,
- concatMap,
- filter,
- firstValueFrom,
- from,
- map,
- merge,
- Observable,
- shareReplay,
- switchMap,
- take,
-} from "rxjs";
-
-import { OrganizationUserUserDetailsResponse } from "@bitwarden/admin-console/common";
-import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe";
-import { ApiService } from "@bitwarden/common/abstractions/api.service";
-import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
-import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service";
-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 {
- OrganizationUserStatusType,
- OrganizationUserType,
- PolicyType,
-} from "@bitwarden/common/admin-console/enums";
-import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
-import { Policy } from "@bitwarden/common/admin-console/models/domain/policy";
-import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
-import { getUserId } from "@bitwarden/common/auth/services/account.service";
-import { OrganizationMetadataServiceAbstraction } from "@bitwarden/common/billing/abstractions/organization-metadata.service.abstraction";
-import { OrganizationBillingMetadataResponse } from "@bitwarden/common/billing/models/response/organization-billing-metadata.response";
-import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
-import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
-import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
-import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
-import { getById } from "@bitwarden/common/platform/misc";
-import { DialogService, ToastService } from "@bitwarden/components";
-import { KeyService } from "@bitwarden/key-management";
-import { UserId } from "@bitwarden/user-core";
-import { BillingConstraintService } from "@bitwarden/web-vault/app/billing/members/billing-constraint/billing-constraint.service";
-import { OrganizationWarningsService } from "@bitwarden/web-vault/app/billing/organizations/warnings/services";
-
-import { BaseMembersComponent } from "../../common/base-members.component";
-import {
- CloudBulkReinviteLimit,
- MaxCheckedCount,
- PeopleTableDataSource,
-} from "../../common/people-table-data-source";
-import { OrganizationUserView } from "../core/views/organization-user.view";
-
-import { AccountRecoveryDialogResultType } from "./components/account-recovery/account-recovery-dialog.component";
-import { MemberDialogResult, MemberDialogTab } from "./components/member-dialog";
-import {
- MemberDialogManagerService,
- MemberExportService,
- OrganizationMembersService,
-} from "./services";
-import { DeleteManagedMemberWarningService } from "./services/delete-managed-member/delete-managed-member-warning.service";
-import {
- MemberActionsService,
- MemberActionResult,
-} from "./services/member-actions/member-actions.service";
-
-class MembersTableDataSource extends PeopleTableDataSource {
- protected statusType = OrganizationUserStatusType;
-}
-
-// 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: "deprecated_members.component.html",
- standalone: false,
-})
-export class MembersComponent extends BaseMembersComponent {
- userType = OrganizationUserType;
- userStatusType = OrganizationUserStatusType;
- memberTab = MemberDialogTab;
- protected dataSource: MembersTableDataSource;
-
- readonly organization: Signal;
- status: OrganizationUserStatusType | undefined;
-
- private userId$: Observable = this.accountService.activeAccount$.pipe(getUserId);
-
- resetPasswordPolicyEnabled$: Observable;
-
- protected readonly canUseSecretsManager: Signal = computed(
- () => this.organization()?.useSecretsManager ?? false,
- );
- protected readonly showUserManagementControls: Signal = computed(
- () => this.organization()?.canManageUsers ?? false,
- );
- protected billingMetadata$: Observable;
-
- // Fixed sizes used for cdkVirtualScroll
- protected rowHeight = 66;
- protected rowHeightClass = `tw-h-[66px]`;
-
- constructor(
- apiService: ApiService,
- i18nService: I18nService,
- organizationManagementPreferencesService: OrganizationManagementPreferencesService,
- keyService: KeyService,
- validationService: ValidationService,
- logService: LogService,
- userNamePipe: UserNamePipe,
- dialogService: DialogService,
- toastService: ToastService,
- private route: ActivatedRoute,
- protected deleteManagedMemberWarningService: DeleteManagedMemberWarningService,
- private organizationWarningsService: OrganizationWarningsService,
- private memberActionsService: MemberActionsService,
- private memberDialogManager: MemberDialogManagerService,
- protected billingConstraint: BillingConstraintService,
- protected memberService: OrganizationMembersService,
- private organizationService: OrganizationService,
- private accountService: AccountService,
- private policyService: PolicyService,
- private policyApiService: PolicyApiServiceAbstraction,
- private organizationMetadataService: OrganizationMetadataServiceAbstraction,
- private memberExportService: MemberExportService,
- private environmentService: EnvironmentService,
- ) {
- super(
- apiService,
- i18nService,
- keyService,
- validationService,
- logService,
- userNamePipe,
- dialogService,
- organizationManagementPreferencesService,
- toastService,
- );
-
- this.dataSource = new MembersTableDataSource(this.environmentService);
-
- const organization$ = this.route.params.pipe(
- concatMap((params) =>
- this.userId$.pipe(
- switchMap((userId) =>
- this.organizationService.organizations$(userId).pipe(getById(params.organizationId)),
- ),
- filter((organization): organization is Organization => organization != null),
- shareReplay({ refCount: true, bufferSize: 1 }),
- ),
- ),
- );
-
- this.organization = toSignal(organization$);
-
- const policies$ = combineLatest([this.userId$, organization$]).pipe(
- switchMap(([userId, organization]) =>
- organization.isProviderUser
- ? from(this.policyApiService.getPolicies(organization.id)).pipe(
- map((response) => Policy.fromListResponse(response)),
- )
- : this.policyService.policies$(userId),
- ),
- );
-
- this.resetPasswordPolicyEnabled$ = combineLatest([organization$, policies$]).pipe(
- map(
- ([organization, policies]) =>
- policies
- .filter((policy) => policy.type === PolicyType.ResetPassword)
- .find((p) => p.organizationId === organization.id)?.enabled ?? false,
- ),
- );
-
- combineLatest([this.route.queryParams, organization$])
- .pipe(
- concatMap(async ([qParams, organization]) => {
- await this.load(organization!);
-
- this.searchControl.setValue(qParams.search);
-
- if (qParams.viewEvents != null) {
- const user = this.dataSource.data.filter((u) => u.id === qParams.viewEvents);
- if (user.length > 0 && user[0].status === OrganizationUserStatusType.Confirmed) {
- this.openEventsDialog(user[0], organization!);
- }
- }
- }),
- takeUntilDestroyed(),
- )
- .subscribe();
-
- organization$
- .pipe(
- switchMap((organization) =>
- merge(
- this.organizationWarningsService.showInactiveSubscriptionDialog$(organization),
- this.organizationWarningsService.showSubscribeBeforeFreeTrialEndsDialog$(organization),
- ),
- ),
- takeUntilDestroyed(),
- )
- .subscribe();
-
- this.billingMetadata$ = organization$.pipe(
- switchMap((organization) =>
- this.organizationMetadataService.getOrganizationMetadata$(organization.id),
- ),
- shareReplay({ bufferSize: 1, refCount: false }),
- );
-
- // Stripe is slow, so kick this off in the background but without blocking page load.
- // Anyone who needs it will still await the first emission.
- this.billingMetadata$.pipe(take(1), takeUntilDestroyed()).subscribe();
- }
-
- override async load(organization: Organization) {
- await super.load(organization);
- }
-
- async getUsers(organization: Organization): Promise {
- return await this.memberService.loadUsers(organization);
- }
-
- async removeUser(id: string, organization: Organization): Promise {
- return await this.memberActionsService.removeUser(organization, id);
- }
-
- async revokeUser(id: string, organization: Organization): Promise {
- return await this.memberActionsService.revokeUser(organization, id);
- }
-
- async restoreUser(id: string, organization: Organization): Promise {
- return await this.memberActionsService.restoreUser(organization, id);
- }
-
- async reinviteUser(id: string, organization: Organization): Promise {
- return await this.memberActionsService.reinviteUser(organization, id);
- }
-
- async confirmUser(
- user: OrganizationUserView,
- publicKey: Uint8Array,
- organization: Organization,
- ): Promise {
- return await this.memberActionsService.confirmUser(user, publicKey, organization);
- }
-
- async revoke(user: OrganizationUserView, organization: Organization) {
- const confirmed = await this.revokeUserConfirmationDialog(user);
-
- if (!confirmed) {
- return false;
- }
-
- this.actionPromise = this.revokeUser(user.id, organization);
- try {
- const result = await this.actionPromise;
- if (result.success) {
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("revokedUserId", this.userNamePipe.transform(user)),
- });
- await this.load(organization);
- } else {
- throw new Error(result.error);
- }
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- async restore(user: OrganizationUserView, organization: Organization) {
- this.actionPromise = this.restoreUser(user.id, organization);
- try {
- const result = await this.actionPromise;
- if (result.success) {
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("restoredUserId", this.userNamePipe.transform(user)),
- });
- await this.load(organization);
- } else {
- throw new Error(result.error);
- }
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- allowResetPassword(
- orgUser: OrganizationUserView,
- organization: Organization,
- orgResetPasswordPolicyEnabled: boolean,
- ): boolean {
- return this.memberActionsService.allowResetPassword(
- orgUser,
- organization,
- orgResetPasswordPolicyEnabled,
- );
- }
-
- showEnrolledStatus(
- orgUser: OrganizationUserUserDetailsResponse,
- organization: Organization,
- orgResetPasswordPolicyEnabled: boolean,
- ): boolean {
- return (
- organization.useResetPassword &&
- orgUser.resetPasswordEnrolled &&
- orgResetPasswordPolicyEnabled
- );
- }
-
- private async handleInviteDialog(organization: Organization) {
- const billingMetadata = await firstValueFrom(this.billingMetadata$);
- const allUserEmails = this.dataSource.data?.map((user) => user.email) ?? [];
-
- const result = await this.memberDialogManager.openInviteDialog(
- organization,
- billingMetadata,
- allUserEmails,
- );
-
- if (result === MemberDialogResult.Saved) {
- await this.load(organization);
- }
- }
-
- async invite(organization: Organization) {
- const billingMetadata = await firstValueFrom(this.billingMetadata$);
- const seatLimitResult = this.billingConstraint.checkSeatLimit(organization, billingMetadata);
- if (!(await this.billingConstraint.seatLimitReached(seatLimitResult, organization))) {
- await this.handleInviteDialog(organization);
- this.organizationMetadataService.refreshMetadataCache();
- }
- }
-
- async edit(
- user: OrganizationUserView,
- organization: Organization,
- initialTab: MemberDialogTab = MemberDialogTab.Role,
- ) {
- const billingMetadata = await firstValueFrom(this.billingMetadata$);
-
- const result = await this.memberDialogManager.openEditDialog(
- user,
- organization,
- billingMetadata,
- initialTab,
- );
-
- switch (result) {
- case MemberDialogResult.Deleted:
- this.dataSource.removeUser(user);
- break;
- case MemberDialogResult.Saved:
- case MemberDialogResult.Revoked:
- case MemberDialogResult.Restored:
- await this.load(organization);
- break;
- }
- }
-
- async bulkRemove(organization: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- await this.memberDialogManager.openBulkRemoveDialog(organization, users);
- this.organizationMetadataService.refreshMetadataCache();
- await this.load(organization);
- }
-
- async bulkDelete(organization: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- await this.memberDialogManager.openBulkDeleteDialog(organization, users);
- await this.load(organization);
- }
-
- async bulkRevoke(organization: Organization) {
- await this.bulkRevokeOrRestore(true, organization);
- }
-
- async bulkRestore(organization: Organization) {
- await this.bulkRevokeOrRestore(false, organization);
- }
-
- async bulkRevokeOrRestore(isRevoking: boolean, organization: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- await this.memberDialogManager.openBulkRestoreRevokeDialog(organization, users, isRevoking);
- await this.load(organization);
- }
-
- async bulkReinvite(organization: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- let users: OrganizationUserView[];
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- users = this.dataSource.getCheckedUsersInVisibleOrder();
- } else {
- users = this.dataSource.getCheckedUsers();
- }
-
- const allInvitedUsers = users.filter((u) => u.status === OrganizationUserStatusType.Invited);
-
- // Capture the original count BEFORE enforcing the limit
- const originalInvitedCount = allInvitedUsers.length;
-
- // When feature flag is enabled, limit invited users and uncheck the excess
- let filteredUsers: OrganizationUserView[];
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- filteredUsers = this.dataSource.limitAndUncheckExcess(
- allInvitedUsers,
- CloudBulkReinviteLimit,
- );
- } else {
- filteredUsers = allInvitedUsers;
- }
-
- if (filteredUsers.length <= 0) {
- this.toastService.showToast({
- variant: "error",
- title: this.i18nService.t("errorOccurred"),
- message: this.i18nService.t("noSelectedUsersApplicable"),
- });
- return;
- }
-
- try {
- const result = await this.memberActionsService.bulkReinvite(organization, filteredUsers);
-
- if (result.successful.length === 0) {
- throw new Error();
- }
-
- // When feature flag is enabled, show toast instead of dialog
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- const selectedCount = originalInvitedCount;
- const invitedCount = filteredUsers.length;
-
- if (selectedCount > CloudBulkReinviteLimit) {
- const excludedCount = selectedCount - CloudBulkReinviteLimit;
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t(
- "bulkReinviteLimitedSuccessToast",
- CloudBulkReinviteLimit.toLocaleString(),
- selectedCount.toLocaleString(),
- excludedCount.toLocaleString(),
- ),
- });
- } else {
- this.toastService.showToast({
- variant: "success",
- message:
- invitedCount === 1
- ? this.i18nService.t("reinviteSuccessToast")
- : this.i18nService.t("bulkReinviteSentToast", invitedCount.toString()),
- });
- }
- } else {
- // Feature flag disabled - show legacy dialog
- await this.memberDialogManager.openBulkStatusDialog(
- users,
- filteredUsers,
- Promise.resolve(result.successful),
- this.i18nService.t("bulkReinviteMessage"),
- );
- }
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- async bulkConfirm(organization: Organization) {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- await this.memberDialogManager.openBulkConfirmDialog(organization, users);
- await this.load(organization);
- }
-
- async bulkEnableSM(organization: Organization) {
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- await this.memberDialogManager.openBulkEnableSecretsManagerDialog(organization, users);
-
- this.dataSource.uncheckAllUsers();
- await this.load(organization);
- }
-
- openEventsDialog(user: OrganizationUserView, organization: Organization) {
- this.memberDialogManager.openEventsDialog(user, organization);
- }
-
- async resetPassword(user: OrganizationUserView, organization: Organization) {
- if (!user || !user.email || !user.id) {
- this.toastService.showToast({
- variant: "error",
- title: this.i18nService.t("errorOccurred"),
- message: this.i18nService.t("orgUserDetailsNotFound"),
- });
- this.logService.error("Org user details not found when attempting account recovery");
-
- return;
- }
-
- const result = await this.memberDialogManager.openAccountRecoveryDialog(user, organization);
- if (result === AccountRecoveryDialogResultType.Ok) {
- await this.load(organization);
- }
-
- return;
- }
-
- protected async removeUserConfirmationDialog(user: OrganizationUserView) {
- return await this.memberDialogManager.openRemoveUserConfirmationDialog(user);
- }
-
- protected async revokeUserConfirmationDialog(user: OrganizationUserView) {
- return await this.memberDialogManager.openRevokeUserConfirmationDialog(user);
- }
-
- async deleteUser(user: OrganizationUserView, organization: Organization) {
- const confirmed = await this.memberDialogManager.openDeleteUserConfirmationDialog(
- user,
- organization,
- );
-
- if (!confirmed) {
- return false;
- }
-
- this.actionPromise = this.memberActionsService.deleteUser(organization, user.id);
- try {
- const result = await this.actionPromise;
- if (!result.success) {
- throw new Error(result.error);
- }
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t("organizationUserDeleted", this.userNamePipe.transform(user)),
- });
- this.dataSource.removeUser(user);
- } catch (e) {
- this.validationService.showError(e);
- }
- this.actionPromise = undefined;
- }
-
- get showBulkRestoreUsers(): boolean {
- return this.dataSource
- .getCheckedUsers()
- .every((member) => member.status == this.userStatusType.Revoked);
- }
-
- get showBulkRevokeUsers(): boolean {
- return this.dataSource
- .getCheckedUsers()
- .every((member) => member.status != this.userStatusType.Revoked);
- }
-
- get showBulkRemoveUsers(): boolean {
- return this.dataSource.getCheckedUsers().every((member) => !member.managedByOrganization);
- }
-
- get showBulkDeleteUsers(): boolean {
- const validStatuses = [
- this.userStatusType.Accepted,
- this.userStatusType.Confirmed,
- this.userStatusType.Revoked,
- ];
-
- return this.dataSource
- .getCheckedUsers()
- .every((member) => member.managedByOrganization && validStatuses.includes(member.status));
- }
-
- get selectedInvitedCount(): number {
- return this.dataSource
- .getCheckedUsers()
- .filter((member) => member.status === this.userStatusType.Invited).length;
- }
-
- get isSingleInvite(): boolean {
- return this.selectedInvitedCount === 1;
- }
-
- exportMembers = () => {
- const result = this.memberExportService.getMemberExport(this.dataSource.data);
- if (result.success) {
- this.toastService.showToast({
- variant: "success",
- title: undefined,
- message: this.i18nService.t("dataExportSuccess"),
- });
- }
-
- if (result.error != null) {
- this.validationService.showError(result.error.message);
- }
- };
-}
diff --git a/apps/web/src/app/admin-console/organizations/members/members-routing.module.ts b/apps/web/src/app/admin-console/organizations/members/members-routing.module.ts
index 2f22b9871b7..153a2f3a956 100644
--- a/apps/web/src/app/admin-console/organizations/members/members-routing.module.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members-routing.module.ts
@@ -1,30 +1,23 @@
import { NgModule } from "@angular/core";
import { RouterModule, Routes } from "@angular/router";
-import { featureFlaggedRoute } from "@bitwarden/angular/platform/utils/feature-flagged-route";
import { canAccessMembersTab } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
-import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { FreeBitwardenFamiliesComponent } from "../../../billing/members/free-bitwarden-families.component";
import { organizationPermissionsGuard } from "../guards/org-permissions.guard";
import { canAccessSponsoredFamilies } from "./../../../billing/guards/can-access-sponsored-families.guard";
-import { MembersComponent } from "./deprecated_members.component";
-import { vNextMembersComponent } from "./members.component";
+import { MembersComponent } from "./members.component";
const routes: Routes = [
- ...featureFlaggedRoute({
- defaultComponent: MembersComponent,
- flaggedComponent: vNextMembersComponent,
- featureFlag: FeatureFlag.MembersComponentRefactor,
- routeOptions: {
- path: "",
- canActivate: [organizationPermissionsGuard(canAccessMembersTab)],
- data: {
- titleId: "members",
- },
+ {
+ path: "",
+ component: MembersComponent,
+ canActivate: [organizationPermissionsGuard(canAccessMembersTab)],
+ data: {
+ titleId: "members",
},
- }),
+ },
{
path: "sponsored-families",
component: FreeBitwardenFamiliesComponent,
diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts b/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
index 9a371de1acd..72c12fd4d79 100644
--- a/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members.component.spec.ts
@@ -36,7 +36,7 @@ import { OrganizationUserView } from "../core/views/organization-user.view";
import { AccountRecoveryDialogResultType } from "./components/account-recovery/account-recovery-dialog.component";
import { MemberDialogResult } from "./components/member-dialog";
-import { vNextMembersComponent } from "./members.component";
+import { MembersComponent } from "./members.component";
import {
MemberDialogManagerService,
MemberExportService,
@@ -48,9 +48,9 @@ import {
MemberActionResult,
} from "./services/member-actions/member-actions.service";
-describe("vNextMembersComponent", () => {
- let component: vNextMembersComponent;
- let fixture: ComponentFixture;
+describe("MembersComponent", () => {
+ let component: MembersComponent;
+ let fixture: ComponentFixture;
let mockApiService: MockProxy;
let mockI18nService: MockProxy;
@@ -172,7 +172,7 @@ describe("vNextMembersComponent", () => {
mockFileDownloadService = mock();
await TestBed.configureTestingModule({
- declarations: [vNextMembersComponent],
+ declarations: [MembersComponent],
providers: [
{ provide: ApiService, useValue: mockApiService },
{ provide: I18nService, useValue: mockI18nService },
@@ -211,13 +211,13 @@ describe("vNextMembersComponent", () => {
],
schemas: [NO_ERRORS_SCHEMA],
})
- .overrideComponent(vNextMembersComponent, {
+ .overrideComponent(MembersComponent, {
remove: { imports: [] },
add: { template: "
" },
})
.compileComponents();
- fixture = TestBed.createComponent(vNextMembersComponent);
+ fixture = TestBed.createComponent(MembersComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.ts b/apps/web/src/app/admin-console/organizations/members/members.component.ts
index 826bdfb5f69..6b93edc8c6b 100644
--- a/apps/web/src/app/admin-console/organizations/members/members.component.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members.component.ts
@@ -82,7 +82,7 @@ interface BulkMemberFlags {
templateUrl: "members.component.html",
standalone: false,
})
-export class vNextMembersComponent {
+export class MembersComponent {
protected i18nService = inject(I18nService);
protected validationService = inject(ValidationService);
protected logService = inject(LogService);
diff --git a/apps/web/src/app/admin-console/organizations/members/members.module.ts b/apps/web/src/app/admin-console/organizations/members/members.module.ts
index 54e2d1b6373..92ae71123cc 100644
--- a/apps/web/src/app/admin-console/organizations/members/members.module.ts
+++ b/apps/web/src/app/admin-console/organizations/members/members.module.ts
@@ -19,9 +19,8 @@ import { BulkRemoveDialogComponent } from "./components/bulk/bulk-remove-dialog.
import { BulkRestoreRevokeComponent } from "./components/bulk/bulk-restore-revoke.component";
import { BulkStatusComponent } from "./components/bulk/bulk-status.component";
import { UserDialogModule } from "./components/member-dialog";
-import { MembersComponent } from "./deprecated_members.component";
import { MembersRoutingModule } from "./members-routing.module";
-import { vNextMembersComponent } from "./members.component";
+import { MembersComponent } from "./members.component";
import { UserStatusPipe } from "./pipes";
import {
OrganizationMembersService,
@@ -52,7 +51,6 @@ import {
BulkProgressDialogComponent,
BulkReinviteFailureDialogComponent,
MembersComponent,
- vNextMembersComponent,
BulkDeleteDialogComponent,
UserStatusPipe,
],
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.html b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.html
deleted file mode 100644
index 5478601e72c..00000000000
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.html
+++ /dev/null
@@ -1,225 +0,0 @@
-
-
-
-
-
- {{ "inviteMember" | i18n }}
-
-
-
-
-
-
- {{ "all" | i18n }}
-
- {{ allCount }}
-
-
-
- {{ "invited" | i18n }}
-
- {{ invitedCount }}
-
-
-
- {{ "needsConfirmation" | i18n }}
-
- {{ acceptedCount }}
-
-
-
-
-
-
-
-
- {{ "loading" | i18n }}
-
-
-
- {{ "noMembersInList" | i18n }}
-
-
- {{ "providerUsersNeedConfirmed" | i18n }}
-
-
-
-
-
-
-
-
- {{ "all" | i18n }}
-
-
- {{ "name" | i18n }}
- {{ "role" | i18n }}
-
-
-
-
-
- {{ (isSingleInvite ? "resendInvitation" : "reinviteSelected") | i18n }}
-
-
-
-
- {{ "confirmSelected" | i18n }}
-
-
-
-
-
- {{ "remove" | i18n }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ user.name ?? user.email }}
-
-
- {{ "invited" | i18n }}
-
-
- {{ "needsConfirmation" | i18n }}
-
-
- {{ "revoked" | i18n }}
-
-
-
- {{ user.email }}
-
-
-
-
-
- {{ "providerAdmin" | i18n }}
- {{ "serviceUser" | i18n }}
-
-
-
-
-
-
- {{ "resendInvitation" | i18n }}
-
-
-
-
- {{ "confirm" | i18n }}
-
-
-
-
- {{ "eventLogs" | i18n }}
-
-
-
-
- {{ "remove" | i18n }}
-
-
-
-
-
-
-
-
-
-
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
deleted file mode 100644
index 464b9982689..00000000000
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/deprecated_members.component.ts
+++ /dev/null
@@ -1,351 +0,0 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
-import { Component } from "@angular/core";
-import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
-import { ActivatedRoute, Router } from "@angular/router";
-import { combineLatest, firstValueFrom, lastValueFrom, switchMap } from "rxjs";
-import { first, map } from "rxjs/operators";
-
-import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe";
-import { ApiService } from "@bitwarden/common/abstractions/api.service";
-import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service";
-import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
-import { ProviderUserStatusType, ProviderUserType } from "@bitwarden/common/admin-console/enums";
-import { ProviderUserBulkRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-user-bulk.request";
-import { ProviderUserConfirmRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-user-confirm.request";
-import { ProviderUserUserDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user.response";
-import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
-import { getUserId } from "@bitwarden/common/auth/services/account.service";
-import { assertNonNullish } from "@bitwarden/common/auth/utils";
-import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service";
-import { ListResponse } from "@bitwarden/common/models/response/list.response";
-import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
-import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
-import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
-import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
-import { ProviderId } from "@bitwarden/common/types/guid";
-import { DialogRef, DialogService, ToastService } from "@bitwarden/components";
-import { KeyService } from "@bitwarden/key-management";
-import { BaseMembersComponent } from "@bitwarden/web-vault/app/admin-console/common/base-members.component";
-import {
- CloudBulkReinviteLimit,
- MaxCheckedCount,
- peopleFilter,
- PeopleTableDataSource,
-} from "@bitwarden/web-vault/app/admin-console/common/people-table-data-source";
-import { openEntityEventsDialog } from "@bitwarden/web-vault/app/admin-console/organizations/manage/entity-events.component";
-import { BulkStatusComponent } from "@bitwarden/web-vault/app/admin-console/organizations/members/components/bulk/bulk-status.component";
-import { MemberActionResult } from "@bitwarden/web-vault/app/admin-console/organizations/members/services/member-actions/member-actions.service";
-
-import {
- AddEditMemberDialogComponent,
- AddEditMemberDialogParams,
- AddEditMemberDialogResultType,
-} from "./dialogs/add-edit-member-dialog.component";
-import { BulkConfirmDialogComponent } from "./dialogs/bulk-confirm-dialog.component";
-import { BulkRemoveDialogComponent } from "./dialogs/bulk-remove-dialog.component";
-
-type ProviderUser = ProviderUserUserDetailsResponse;
-
-class MembersTableDataSource extends PeopleTableDataSource {
- protected statusType = ProviderUserStatusType;
-}
-
-// 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: "deprecated_members.component.html",
- standalone: false,
-})
-export class MembersComponent extends BaseMembersComponent {
- accessEvents = false;
- dataSource: MembersTableDataSource;
- loading = true;
- providerId: string;
- rowHeight = 70;
- rowHeightClass = `tw-h-[70px]`;
- status: ProviderUserStatusType = null;
-
- userStatusType = ProviderUserStatusType;
- userType = ProviderUserType;
-
- constructor(
- apiService: ApiService,
- keyService: KeyService,
- dialogService: DialogService,
- i18nService: I18nService,
- logService: LogService,
- organizationManagementPreferencesService: OrganizationManagementPreferencesService,
- toastService: ToastService,
- userNamePipe: UserNamePipe,
- validationService: ValidationService,
- private encryptService: EncryptService,
- private activatedRoute: ActivatedRoute,
- private providerService: ProviderService,
- private router: Router,
- private accountService: AccountService,
- private environmentService: EnvironmentService,
- ) {
- super(
- apiService,
- i18nService,
- keyService,
- validationService,
- logService,
- userNamePipe,
- dialogService,
- organizationManagementPreferencesService,
- toastService,
- );
-
- this.dataSource = new MembersTableDataSource(this.environmentService);
-
- combineLatest([
- this.activatedRoute.parent.params,
- this.activatedRoute.queryParams.pipe(first()),
- ])
- .pipe(
- switchMap(async ([urlParams, queryParams]) => {
- this.searchControl.setValue(queryParams.search);
- this.dataSource.filter = peopleFilter(queryParams.search, null);
-
- this.providerId = urlParams.providerId;
- const provider = await firstValueFrom(
- this.accountService.activeAccount$.pipe(
- getUserId,
- switchMap((userId) => this.providerService.get$(this.providerId, userId)),
- ),
- );
-
- if (!provider || !provider.canManageUsers) {
- return await this.router.navigate(["../"], { relativeTo: this.activatedRoute });
- }
- this.accessEvents = provider.useEvents;
- await this.load();
-
- if (queryParams.viewEvents != null) {
- const user = this.dataSource.data.find((user) => user.id === queryParams.viewEvents);
- if (user && user.status === ProviderUserStatusType.Confirmed) {
- this.openEventsDialog(user);
- }
- }
- }),
- takeUntilDestroyed(),
- )
- .subscribe();
- }
-
- async bulkConfirm(): Promise {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- const dialogRef = BulkConfirmDialogComponent.open(this.dialogService, {
- data: {
- providerId: this.providerId,
- users: users,
- },
- });
-
- await lastValueFrom(dialogRef.closed);
- await this.load();
- }
-
- async bulkReinvite(): Promise {
- if (this.actionPromise != null) {
- return;
- }
-
- let users: ProviderUser[];
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- users = this.dataSource.getCheckedUsersInVisibleOrder();
- } else {
- users = this.dataSource.getCheckedUsers();
- }
-
- const allInvitedUsers = users.filter((user) => user.status === ProviderUserStatusType.Invited);
-
- // Capture the original count BEFORE enforcing the limit
- const originalInvitedCount = allInvitedUsers.length;
-
- // When feature flag is enabled, limit invited users and uncheck the excess
- let checkedInvitedUsers: ProviderUser[];
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- checkedInvitedUsers = this.dataSource.limitAndUncheckExcess(
- allInvitedUsers,
- CloudBulkReinviteLimit,
- );
- } else {
- checkedInvitedUsers = allInvitedUsers;
- }
-
- if (checkedInvitedUsers.length <= 0) {
- this.toastService.showToast({
- variant: "error",
- title: this.i18nService.t("errorOccurred"),
- message: this.i18nService.t("noSelectedUsersApplicable"),
- });
- return;
- }
-
- try {
- // When feature flag is enabled, show toast instead of dialog
- if (this.dataSource.isIncreasedBulkLimitEnabled()) {
- await this.apiService.postManyProviderUserReinvite(
- this.providerId,
- new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
- );
-
- const selectedCount = originalInvitedCount;
- const invitedCount = checkedInvitedUsers.length;
-
- if (selectedCount > CloudBulkReinviteLimit) {
- const excludedCount = selectedCount - CloudBulkReinviteLimit;
- this.toastService.showToast({
- variant: "success",
- message: this.i18nService.t(
- "bulkReinviteLimitedSuccessToast",
- CloudBulkReinviteLimit.toLocaleString(),
- selectedCount.toLocaleString(),
- excludedCount.toLocaleString(),
- ),
- });
- } else {
- this.toastService.showToast({
- variant: "success",
- message:
- invitedCount === 1
- ? this.i18nService.t("reinviteSuccessToast")
- : this.i18nService.t("bulkReinviteSentToast", invitedCount.toString()),
- });
- }
- } else {
- // Feature flag disabled - show legacy dialog
- const request = this.apiService
- .postManyProviderUserReinvite(
- this.providerId,
- new ProviderUserBulkRequest(checkedInvitedUsers.map((user) => user.id)),
- )
- .then((response) => response.data);
-
- const dialogRef = BulkStatusComponent.open(this.dialogService, {
- data: {
- users: users,
- filteredUsers: checkedInvitedUsers,
- request,
- successfulMessage: this.i18nService.t("bulkReinviteMessage"),
- },
- });
- await lastValueFrom(dialogRef.closed);
- }
- } catch (error) {
- this.validationService.showError(error);
- }
- }
-
- async invite() {
- await this.edit(null);
- }
-
- async bulkRemove(): Promise {
- if (this.actionPromise != null) {
- return;
- }
-
- const users = this.dataSource.getCheckedUsersWithLimit(MaxCheckedCount);
-
- const dialogRef = BulkRemoveDialogComponent.open(this.dialogService, {
- data: {
- providerId: this.providerId,
- users: users,
- },
- });
-
- await lastValueFrom(dialogRef.closed);
- await this.load();
- }
-
- async confirmUser(user: ProviderUser, publicKey: Uint8Array): Promise {
- try {
- const providerKey = await firstValueFrom(
- this.accountService.activeAccount$.pipe(
- getUserId,
- switchMap((userId) => this.keyService.providerKeys$(userId)),
- map((providerKeys) => providerKeys?.[this.providerId as ProviderId] ?? null),
- ),
- );
- assertNonNullish(providerKey, "Provider key not found");
-
- const key = await this.encryptService.encapsulateKeyUnsigned(providerKey, publicKey);
- const request = new ProviderUserConfirmRequest(key.encryptedString);
- await this.apiService.postProviderUserConfirm(this.providerId, user.id, request);
- return { success: true };
- } catch (error) {
- return { success: false, error: error.message };
- }
- }
-
- removeUser = async (id: string): Promise => {
- try {
- await this.apiService.deleteProviderUser(this.providerId, id);
- return { success: true };
- } catch (error) {
- return { success: false, error: error.message };
- }
- };
-
- edit = async (user: ProviderUser | null): Promise => {
- const data: AddEditMemberDialogParams = {
- providerId: this.providerId,
- user,
- };
-
- const dialogRef = AddEditMemberDialogComponent.open(this.dialogService, {
- data,
- });
-
- const result = await lastValueFrom(dialogRef.closed);
-
- switch (result) {
- case AddEditMemberDialogResultType.Saved:
- case AddEditMemberDialogResultType.Deleted:
- await this.load();
- break;
- }
- };
-
- openEventsDialog = (user: ProviderUser): DialogRef =>
- openEntityEventsDialog(this.dialogService, {
- data: {
- name: this.userNamePipe.transform(user),
- providerId: this.providerId,
- entityId: user.id,
- showUser: false,
- entity: "user",
- },
- });
-
- getUsers = (): Promise> =>
- this.apiService.getProviderUsers(this.providerId);
-
- reinviteUser = async (id: string): Promise => {
- try {
- await this.apiService.postProviderUserReinvite(this.providerId, id);
- return { success: true };
- } catch (error) {
- return { success: false, error: error.message };
- }
- };
-
- get selectedInvitedCount(): number {
- return this.dataSource
- .getCheckedUsers()
- .filter((member) => member.status === this.userStatusType.Invited).length;
- }
-
- get isSingleInvite(): boolean {
- return this.selectedInvitedCount === 1;
- }
-}
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
index 308b93ac2e3..d4a6ba92451 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/manage/members.component.ts
@@ -61,7 +61,7 @@ interface BulkProviderFlags {
templateUrl: "members.component.html",
standalone: false,
})
-export class vNextMembersComponent {
+export class MembersComponent {
protected apiService = inject(ApiService);
protected dialogService = inject(DialogService);
protected i18nService = inject(I18nService);
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-routing.module.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-routing.module.ts
index 447481a8bcb..5fadc935644 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/providers-routing.module.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/providers-routing.module.ts
@@ -2,9 +2,7 @@ import { NgModule } from "@angular/core";
import { RouterModule, Routes } from "@angular/router";
import { authGuard } from "@bitwarden/angular/auth/guards";
-import { featureFlaggedRoute } from "@bitwarden/angular/platform/utils/feature-flagged-route";
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
-import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { AnonLayoutWrapperComponent } from "@bitwarden/components";
import { FrontendLayoutComponent } from "@bitwarden/web-vault/app/layouts/frontend-layout.component";
import { UserLayoutComponent } from "@bitwarden/web-vault/app/layouts/user-layout.component";
@@ -17,9 +15,8 @@ import { ProviderSubscriptionComponent } from "../../billing/providers/subscript
import { ManageClientsComponent } from "./clients/manage-clients.component";
import { providerPermissionsGuard } from "./guards/provider-permissions.guard";
import { AcceptProviderComponent } from "./manage/accept-provider.component";
-import { MembersComponent } from "./manage/deprecated_members.component";
import { EventsComponent } from "./manage/events.component";
-import { vNextMembersComponent } from "./manage/members.component";
+import { MembersComponent } from "./manage/members.component";
import { ProvidersLayoutComponent } from "./providers-layout.component";
import { ProvidersComponent } from "./providers.component";
import { AccountComponent } from "./settings/account.component";
@@ -95,20 +92,16 @@ const routes: Routes = [
pathMatch: "full",
redirectTo: "members",
},
- ...featureFlaggedRoute({
- defaultComponent: MembersComponent,
- flaggedComponent: vNextMembersComponent,
- featureFlag: FeatureFlag.MembersComponentRefactor,
- routeOptions: {
- path: "members",
- canActivate: [
- providerPermissionsGuard((provider: Provider) => provider.canManageUsers),
- ],
- data: {
- titleId: "members",
- },
+ {
+ path: "members",
+ component: MembersComponent,
+ canActivate: [
+ providerPermissionsGuard((provider: Provider) => provider.canManageUsers),
+ ],
+ data: {
+ titleId: "members",
},
- }),
+ },
{
path: "events",
component: EventsComponent,
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts
index 44e2e51637f..abdd35c5e61 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/providers.module.ts
@@ -27,12 +27,11 @@ import { CreateClientDialogComponent } from "./clients/create-client-dialog.comp
import { ManageClientNameDialogComponent } from "./clients/manage-client-name-dialog.component";
import { ManageClientSubscriptionDialogComponent } from "./clients/manage-client-subscription-dialog.component";
import { AcceptProviderComponent } from "./manage/accept-provider.component";
-import { MembersComponent } from "./manage/deprecated_members.component";
import { AddEditMemberDialogComponent } from "./manage/dialogs/add-edit-member-dialog.component";
import { BulkConfirmDialogComponent } from "./manage/dialogs/bulk-confirm-dialog.component";
import { BulkRemoveDialogComponent } from "./manage/dialogs/bulk-remove-dialog.component";
import { EventsComponent } from "./manage/events.component";
-import { vNextMembersComponent } from "./manage/members.component";
+import { MembersComponent } from "./manage/members.component";
import { ProviderActionsService } from "./manage/services/provider-actions/provider-actions.service";
import { ProvidersLayoutComponent } from "./providers-layout.component";
import { ProvidersRoutingModule } from "./providers-routing.module";
@@ -67,7 +66,6 @@ import { VerifyRecoverDeleteProviderComponent } from "./verify-recover-delete-pr
BulkConfirmDialogComponent,
BulkRemoveDialogComponent,
EventsComponent,
- vNextMembersComponent,
MembersComponent,
SetupComponent,
SetupProviderComponent,
diff --git a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/shared/security-tasks.service.ts b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/shared/security-tasks.service.ts
index 65a31896341..2307eab04fe 100644
--- a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/shared/security-tasks.service.ts
+++ b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/shared/security-tasks.service.ts
@@ -1,8 +1,10 @@
import { BehaviorSubject, combineLatest, Observable } from "rxjs";
import { map, shareReplay } from "rxjs/operators";
-import { RiskInsightsDataService } from "@bitwarden/bit-common/dirt/reports/risk-insights";
-import { SecurityTasksApiService } from "@bitwarden/bit-common/dirt/reports/risk-insights";
+import {
+ RiskInsightsDataService,
+ SecurityTasksApiService,
+} from "@bitwarden/bit-common/dirt/reports/risk-insights";
import { CipherId, OrganizationId } from "@bitwarden/common/types/guid";
import { SecurityTask, SecurityTaskStatus, SecurityTaskType } from "@bitwarden/common/vault/tasks";
diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts
index 4db9ff37d42..05fded6bcaf 100644
--- a/libs/common/src/enums/feature-flag.enum.ts
+++ b/libs/common/src/enums/feature-flag.enum.ts
@@ -13,7 +13,6 @@ export enum FeatureFlag {
/* Admin Console Team */
AutoConfirm = "pm-19934-auto-confirm-organization-users",
DefaultUserCollectionRestore = "pm-30883-my-items-restored-users",
- MembersComponentRefactor = "pm-29503-refactor-members-inheritance",
BulkReinviteUI = "pm-28416-bulk-reinvite-ux-improvements",
/* Auth */
@@ -109,7 +108,6 @@ export const DefaultFeatureFlagValue = {
/* Admin Console Team */
[FeatureFlag.AutoConfirm]: FALSE,
[FeatureFlag.DefaultUserCollectionRestore]: FALSE,
- [FeatureFlag.MembersComponentRefactor]: FALSE,
[FeatureFlag.BulkReinviteUI]: FALSE,
/* Autofill */
From fa40de92b140822b640587c9ff6436ede419ebf7 Mon Sep 17 00:00:00 2001
From: Isaiah Inuwa
Date: Fri, 13 Feb 2026 11:01:27 -0600
Subject: [PATCH 032/134] Remove unneeded workaround to get credential ID from
request (#18784)
---
.../services/desktop-autofill.service.ts | 35 -------------------
1 file changed, 35 deletions(-)
diff --git a/apps/desktop/src/autofill/services/desktop-autofill.service.ts b/apps/desktop/src/autofill/services/desktop-autofill.service.ts
index e5cd85aa7a3..ae3c75d6f01 100644
--- a/apps/desktop/src/autofill/services/desktop-autofill.service.ts
+++ b/apps/desktop/src/autofill/services/desktop-autofill.service.ts
@@ -16,7 +16,6 @@ import {
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
-import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service";
import { DeviceType } from "@bitwarden/common/enums";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service";
@@ -31,7 +30,6 @@ import {
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
-import { parseCredentialId } from "@bitwarden/common/platform/services/fido2/credential-id-utils";
import { getCredentialsForAutofill } from "@bitwarden/common/platform/services/fido2/fido2-autofill-utils";
import { Fido2Utils } from "@bitwarden/common/platform/services/fido2/fido2-utils";
import { UserId } from "@bitwarden/common/types/guid";
@@ -258,39 +256,6 @@ export class DesktopAutofillService implements OnDestroy {
const controller = new AbortController();
try {
- // For some reason the credentialId is passed as an empty array in the request, so we need to
- // get it from the cipher. For that we use the recordIdentifier, which is the cipherId.
- if (request.recordIdentifier && request.credentialId.length === 0) {
- const activeUserId = await firstValueFrom(
- this.accountService.activeAccount$.pipe(getOptionalUserId),
- );
- if (!activeUserId) {
- this.logService.error("listenPasskeyAssertion error", "Active user not found");
- callback(new Error("Active user not found"), null);
- return;
- }
-
- const cipher = await this.cipherService.get(request.recordIdentifier, activeUserId);
- if (!cipher) {
- this.logService.error("listenPasskeyAssertion error", "Cipher not found");
- callback(new Error("Cipher not found"), null);
- return;
- }
-
- const decrypted = await this.cipherService.decrypt(cipher, activeUserId);
-
- const fido2Credential = decrypted.login.fido2Credentials?.[0];
- if (!fido2Credential) {
- this.logService.error("listenPasskeyAssertion error", "Fido2Credential not found");
- callback(new Error("Fido2Credential not found"), null);
- return;
- }
-
- request.credentialId = Array.from(
- new Uint8Array(parseCredentialId(decrypted.login.fido2Credentials?.[0].credentialId)),
- );
- }
-
const response = await this.fido2AuthenticatorService.getAssertion(
this.convertAssertionRequest(request, true),
{ windowXy: normalizePosition(request.windowXy) },
From ab702e3a1aeac20d777eb131cc9953a0f89a9b24 Mon Sep 17 00:00:00 2001
From: Isaiah Inuwa
Date: Fri, 13 Feb 2026 11:01:42 -0600
Subject: [PATCH 033/134] Don't sync invalid password ciphers to autofill
(#18783)
---
.../desktop/src/autofill/services/desktop-autofill.service.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/apps/desktop/src/autofill/services/desktop-autofill.service.ts b/apps/desktop/src/autofill/services/desktop-autofill.service.ts
index ae3c75d6f01..cca0097d65e 100644
--- a/apps/desktop/src/autofill/services/desktop-autofill.service.ts
+++ b/apps/desktop/src/autofill/services/desktop-autofill.service.ts
@@ -150,11 +150,13 @@ export class DesktopAutofillService implements OnDestroy {
passwordCredentials = cipherViews
.filter(
(cipher) =>
+ !cipher.isDeleted &&
cipher.type === CipherType.Login &&
cipher.login.uris?.length > 0 &&
cipher.login.uris.some((uri) => uri.match !== UriMatchStrategy.Never) &&
cipher.login.uris.some((uri) => !Utils.isNullOrWhitespace(uri.uri)) &&
- !Utils.isNullOrWhitespace(cipher.login.username),
+ !Utils.isNullOrWhitespace(cipher.login.username) &&
+ !Utils.isNullOrWhitespace(cipher.login.password),
)
.map((cipher) => ({
type: "password",
From ab0739b693761e11979386c2d85ef0553ed15ff0 Mon Sep 17 00:00:00 2001
From: John Harrington <84741727+harr1424@users.noreply.github.com>
Date: Fri, 13 Feb 2026 10:23:25 -0700
Subject: [PATCH 034/134] rename flag to emails (#18955)
---
.../send/commands/create.command.spec.ts | 8 ++---
.../src/tools/send/commands/create.command.ts | 2 +-
.../tools/send/commands/edit.command.spec.ts | 8 ++---
.../src/tools/send/commands/edit.command.ts | 2 +-
apps/cli/src/tools/send/send.program.ts | 32 +++++++++++--------
5 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/apps/cli/src/tools/send/commands/create.command.spec.ts b/apps/cli/src/tools/send/commands/create.command.spec.ts
index d3702689812..20f4d3e722e 100644
--- a/apps/cli/src/tools/send/commands/create.command.spec.ts
+++ b/apps/cli/src/tools/send/commands/create.command.spec.ts
@@ -62,7 +62,7 @@ describe("SendCreateCommand", () => {
};
const cmdOptions = {
- email: ["test@example.com"],
+ emails: ["test@example.com"],
};
sendService.encrypt.mockResolvedValue([
@@ -155,7 +155,7 @@ describe("SendCreateCommand", () => {
};
const cmdOptions = {
- email: ["test@example.com"],
+ emails: ["test@example.com"],
password: "testPassword123",
};
@@ -246,7 +246,7 @@ describe("SendCreateCommand", () => {
};
const cmdOptions = {
- email: ["cli@example.com"],
+ emails: ["cli@example.com"],
};
const response = await command.run(requestJson, cmdOptions);
@@ -282,7 +282,7 @@ describe("SendCreateCommand", () => {
};
const cmdOptions = {
- email: ["cli@example.com"],
+ emails: ["cli@example.com"],
};
sendService.encrypt.mockResolvedValue([
diff --git a/apps/cli/src/tools/send/commands/create.command.ts b/apps/cli/src/tools/send/commands/create.command.ts
index ad4ff9c4e18..41cf5143acc 100644
--- a/apps/cli/src/tools/send/commands/create.command.ts
+++ b/apps/cli/src/tools/send/commands/create.command.ts
@@ -173,7 +173,7 @@ class Options {
this.file = passedOptions?.file;
this.text = passedOptions?.text;
this.password = passedOptions?.password;
- this.emails = passedOptions?.email;
+ this.emails = passedOptions?.emails;
this.hidden = CliUtils.convertBooleanOption(passedOptions?.hidden);
this.maxAccessCount =
passedOptions?.maxAccessCount != null ? parseInt(passedOptions.maxAccessCount, null) : null;
diff --git a/apps/cli/src/tools/send/commands/edit.command.spec.ts b/apps/cli/src/tools/send/commands/edit.command.spec.ts
index 5bac63d3821..b72e9fdd512 100644
--- a/apps/cli/src/tools/send/commands/edit.command.spec.ts
+++ b/apps/cli/src/tools/send/commands/edit.command.spec.ts
@@ -81,7 +81,7 @@ describe("SendEditCommand", () => {
const requestJson = encodeRequest(requestData);
const cmdOptions = {
- email: ["test@example.com"],
+ emails: ["test@example.com"],
};
sendService.encrypt.mockResolvedValue([
@@ -155,7 +155,7 @@ describe("SendEditCommand", () => {
const requestJson = encodeRequest(requestData);
const cmdOptions = {
- email: ["test@example.com"],
+ emails: ["test@example.com"],
password: "testPassword123",
};
@@ -239,7 +239,7 @@ describe("SendEditCommand", () => {
const requestJson = encodeRequest(requestData);
const cmdOptions = {
- email: ["cli@example.com"],
+ emails: ["cli@example.com"],
};
const response = await command.run(requestJson, cmdOptions);
@@ -277,7 +277,7 @@ describe("SendEditCommand", () => {
const requestJson = encodeRequest(requestData);
const cmdOptions = {
- email: ["cli@example.com"],
+ emails: ["cli@example.com"],
};
sendService.encrypt.mockResolvedValue([
diff --git a/apps/cli/src/tools/send/commands/edit.command.ts b/apps/cli/src/tools/send/commands/edit.command.ts
index 0709a33b88f..f3828784979 100644
--- a/apps/cli/src/tools/send/commands/edit.command.ts
+++ b/apps/cli/src/tools/send/commands/edit.command.ts
@@ -124,6 +124,6 @@ class Options {
constructor(passedOptions: Record) {
this.itemId = passedOptions?.itemId || passedOptions?.itemid;
this.password = passedOptions.password;
- this.emails = passedOptions.email;
+ this.emails = passedOptions.emails;
}
}
diff --git a/apps/cli/src/tools/send/send.program.ts b/apps/cli/src/tools/send/send.program.ts
index e40cea4daa9..a2f43bc2df8 100644
--- a/apps/cli/src/tools/send/send.program.ts
+++ b/apps/cli/src/tools/send/send.program.ts
@@ -57,11 +57,11 @@ export class SendProgram extends BaseProgram {
new Option(
"--password ",
"optional password to access this Send. Can also be specified in JSON.",
- ).conflicts("email"),
+ ).conflicts("emails"),
)
.addOption(
new Option(
- "--email ",
+ "--emails ",
"optional emails to access this Send. Can also be specified in JSON.",
).argParser(parseEmail),
)
@@ -85,9 +85,11 @@ export class SendProgram extends BaseProgram {
.addCommand(this.removePasswordCommand())
.addCommand(this.deleteCommand())
.action(async (data: string, options: OptionValues) => {
- if (options.email) {
+ if (options.emails) {
if (!emailAuthEnabled) {
- this.processResponse(Response.error("The --email feature is not currently available."));
+ this.processResponse(
+ Response.error("The --emails feature is not currently available."),
+ );
return;
}
}
@@ -225,11 +227,13 @@ export class SendProgram extends BaseProgram {
})
.action(async (encodedJson: string, options: OptionValues, args: { parent: Command }) => {
// subcommands inherit flags from their parent; they cannot override them
- const { fullObject = false, email = undefined, password = undefined } = args.parent.opts();
+ const { fullObject = false, emails = undefined, password = undefined } = args.parent.opts();
- if (email) {
+ if (emails) {
if (!emailAuthEnabled) {
- this.processResponse(Response.error("The --email feature is not currently available."));
+ this.processResponse(
+ Response.error("The --emails feature is not currently available."),
+ );
return;
}
}
@@ -237,7 +241,7 @@ export class SendProgram extends BaseProgram {
const mergedOptions = {
...options,
fullObject: fullObject,
- email,
+ emails,
password,
};
@@ -262,10 +266,12 @@ export class SendProgram extends BaseProgram {
})
.action(async (encodedJson: string, options: OptionValues, args: { parent: Command }) => {
await this.exitIfLocked();
- const { email = undefined, password = undefined } = args.parent.opts();
- if (email) {
+ const { emails = undefined, password = undefined } = args.parent.opts();
+ if (emails) {
if (!emailAuthEnabled) {
- this.processResponse(Response.error("The --email feature is not currently available."));
+ this.processResponse(
+ Response.error("The --emails feature is not currently available."),
+ );
return;
}
}
@@ -288,7 +294,7 @@ export class SendProgram extends BaseProgram {
const mergedOptions = {
...options,
- email,
+ emails,
password,
};
@@ -353,7 +359,7 @@ export class SendProgram extends BaseProgram {
file: sendFile,
text: sendText,
type: type,
- emails: options.email ?? undefined,
+ emails: options.emails ?? undefined,
});
return Buffer.from(JSON.stringify(template), "utf8").toString("base64");
From f46511b3e86b6d7c2ae4d995d464b00f52177c4b Mon Sep 17 00:00:00 2001
From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com>
Date: Fri, 13 Feb 2026 18:56:35 +0100
Subject: [PATCH 035/134] [PM-30908]Correct Premium subscription status
handling (#18475)
* Implement the required changes
* Fix the family plan creation for expired sub
* Resolve the pr comments
* resolve the resubscribe issue
* Removed redirectOnCompletion: true from the resubscribe
* Display the Change payment method dialog on the subscription page
* adjust the page reload time
* revert payment method open in subscription page
* Enable cancel premium see the subscription page
* Revert the removal of hasPremiumPersonally
* remove extra space
* Add can view subscription
* Use the canViewSubscription
* Resolve the tab default to premium
* use the subscription Instead of hasPremium
* Revert the changes on user-subscription
* Use the flag to redirect to subscription page
* revert the canViewSubscription change
* resolve the route issue with premium
* Change the path to
* Revert the previous iteration changes
* Fix the build error
---
.../billing/clients/account-billing.client.ts | 17 +++--
.../individual-billing-routing.module.ts | 2 +-
.../individual/subscription.component.ts | 23 ++++++-
.../account-subscription.component.ts | 32 +++++++++-
apps/web/src/locales/en/messages.json | 9 +++
.../subscription-card.component.mdx | 5 +-
.../subscription-card.component.spec.ts | 63 ++++++++++++++++---
.../subscription-card.component.stories.ts | 7 ++-
.../subscription-card.component.ts | 20 ++++--
9 files changed, 153 insertions(+), 25 deletions(-)
diff --git a/apps/web/src/app/billing/clients/account-billing.client.ts b/apps/web/src/app/billing/clients/account-billing.client.ts
index 1334ff643dd..6864e1de981 100644
--- a/apps/web/src/app/billing/clients/account-billing.client.ts
+++ b/apps/web/src/app/billing/clients/account-billing.client.ts
@@ -4,6 +4,8 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { ProductTierType } from "@bitwarden/common/billing/enums";
import { BitwardenSubscriptionResponse } from "@bitwarden/common/billing/models/response/bitwarden-subscription.response";
import { SubscriptionCadence } from "@bitwarden/common/billing/types/subscription-pricing-tier";
+import { ErrorResponse } from "@bitwarden/common/models/response/error.response";
+import { Maybe } from "@bitwarden/pricing";
import { BitwardenSubscription } from "@bitwarden/subscription";
import {
@@ -23,11 +25,18 @@ export class AccountBillingClient {
return this.apiService.send("GET", path, null, true, true);
};
- getSubscription = async (): Promise => {
+ getSubscription = async (): Promise> => {
const path = `${this.endpoint}/subscription`;
- const json = await this.apiService.send("GET", path, null, true, true);
- const response = new BitwardenSubscriptionResponse(json);
- return response.toDomain();
+ try {
+ const json = await this.apiService.send("GET", path, null, true, true);
+ const response = new BitwardenSubscriptionResponse(json);
+ return response.toDomain();
+ } catch (error: any) {
+ if (error instanceof ErrorResponse && error.statusCode === 404) {
+ return null;
+ }
+ throw error;
+ }
};
purchaseSubscription = async (
diff --git a/apps/web/src/app/billing/individual/individual-billing-routing.module.ts b/apps/web/src/app/billing/individual/individual-billing-routing.module.ts
index f85dab54fe7..8d9c999caec 100644
--- a/apps/web/src/app/billing/individual/individual-billing-routing.module.ts
+++ b/apps/web/src/app/billing/individual/individual-billing-routing.module.ts
@@ -19,7 +19,7 @@ const routes: Routes = [
component: SubscriptionComponent,
data: { titleId: "subscription" },
children: [
- { path: "", pathMatch: "full", redirectTo: "premium" },
+ { path: "", pathMatch: "full", redirectTo: "user-subscription" },
...featureFlaggedRoute({
defaultComponent: UserSubscriptionComponent,
flaggedComponent: AccountSubscriptionComponent,
diff --git a/apps/web/src/app/billing/individual/subscription.component.ts b/apps/web/src/app/billing/individual/subscription.component.ts
index 37fb2baf3a6..4f52f3c2ea2 100644
--- a/apps/web/src/app/billing/individual/subscription.component.ts
+++ b/apps/web/src/app/billing/individual/subscription.component.ts
@@ -1,17 +1,22 @@
// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
-import { Observable, switchMap } from "rxjs";
+import { combineLatest, from, map, Observable, switchMap } from "rxjs";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
+import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
+import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
+import { AccountBillingClient } from "../clients/account-billing.client";
+
// 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: "subscription.component.html",
standalone: false,
+ providers: [AccountBillingClient],
})
export class SubscriptionComponent implements OnInit {
hasPremium$: Observable;
@@ -21,9 +26,21 @@ export class SubscriptionComponent implements OnInit {
private platformUtilsService: PlatformUtilsService,
billingAccountProfileStateService: BillingAccountProfileStateService,
accountService: AccountService,
+ configService: ConfigService,
+ private accountBillingClient: AccountBillingClient,
) {
- this.hasPremium$ = accountService.activeAccount$.pipe(
- switchMap((account) => billingAccountProfileStateService.hasPremiumPersonally$(account.id)),
+ this.hasPremium$ = combineLatest([
+ configService.getFeatureFlag$(FeatureFlag.PM29594_UpdateIndividualSubscriptionPage),
+ accountService.activeAccount$,
+ ]).pipe(
+ switchMap(([isFeatureFlagEnabled, account]) => {
+ if (isFeatureFlagEnabled) {
+ return from(accountBillingClient.getSubscription()).pipe(
+ map((subscription) => !!subscription),
+ );
+ }
+ return billingAccountProfileStateService.hasPremiumPersonally$(account.id);
+ }),
);
}
diff --git a/apps/web/src/app/billing/individual/subscription/account-subscription.component.ts b/apps/web/src/app/billing/individual/subscription/account-subscription.component.ts
index d8e25de7965..7fdc830effd 100644
--- a/apps/web/src/app/billing/individual/subscription/account-subscription.component.ts
+++ b/apps/web/src/app/billing/individual/subscription/account-subscription.component.ts
@@ -34,6 +34,11 @@ import {
AdjustAccountSubscriptionStorageDialogComponent,
AdjustAccountSubscriptionStorageDialogParams,
} from "@bitwarden/web-vault/app/billing/individual/subscription/adjust-account-subscription-storage-dialog.component";
+import {
+ UnifiedUpgradeDialogComponent,
+ UnifiedUpgradeDialogStatus,
+ UnifiedUpgradeDialogStep,
+} from "@bitwarden/web-vault/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component";
import {
OffboardingSurveyDialogResultType,
openOffboardingSurvey,
@@ -93,10 +98,11 @@ export class AccountSubscriptionComponent {
if (!this.account()) {
return await redirectToPremiumPage();
}
- if (!this.hasPremiumPersonally()) {
+ const subscription = await this.accountBillingClient.getSubscription();
+ if (!subscription) {
return await redirectToPremiumPage();
}
- return await this.accountBillingClient.getSubscription();
+ return subscription;
},
});
@@ -106,6 +112,7 @@ export class AccountSubscriptionComponent {
const subscription = this.subscription.value();
if (subscription) {
return (
+ subscription.status === SubscriptionStatuses.Incomplete ||
subscription.status === SubscriptionStatuses.IncompleteExpired ||
subscription.status === SubscriptionStatuses.Canceled ||
subscription.status === SubscriptionStatuses.Unpaid
@@ -230,6 +237,27 @@ export class AccountSubscriptionComponent {
case SubscriptionCardActions.UpdatePayment:
await this.router.navigate(["../payment-details"], { relativeTo: this.activatedRoute });
break;
+ case SubscriptionCardActions.Resubscribe: {
+ const account = this.account();
+ if (!account) {
+ return;
+ }
+
+ const dialogRef = UnifiedUpgradeDialogComponent.open(this.dialogService, {
+ data: {
+ account,
+ initialStep: UnifiedUpgradeDialogStep.Payment,
+ selectedPlan: PersonalSubscriptionPricingTierIds.Premium,
+ },
+ });
+
+ const result = await lastValueFrom(dialogRef.closed);
+
+ if (result?.status === UnifiedUpgradeDialogStatus.UpgradedToPremium) {
+ this.subscription.reload();
+ }
+ break;
+ }
case SubscriptionCardActions.UpgradePlan:
await this.openUpgradeDialog();
break;
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 59f5bc88419..d70a2d88bae 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -3338,6 +3338,15 @@
"reinstated": {
"message": "The subscription has been reinstated."
},
+ "resubscribe": {
+ "message": "Resubscribe"
+ },
+ "yourSubscriptionIsExpired": {
+ "message": "Your subscription is expired"
+ },
+ "yourSubscriptionIsCanceled": {
+ "message": "Your subscription is canceled"
+ },
"cancelConfirmation": {
"message": "Are you sure you want to cancel? You will lose access to all of this subscription's features at the end of this billing cycle."
},
diff --git a/libs/subscription/src/components/subscription-card/subscription-card.component.mdx b/libs/subscription/src/components/subscription-card/subscription-card.component.mdx
index c9cc6df7263..d3bad6583f5 100644
--- a/libs/subscription/src/components/subscription-card/subscription-card.component.mdx
+++ b/libs/subscription/src/components/subscription-card/subscription-card.component.mdx
@@ -78,6 +78,7 @@ type SubscriptionCardAction =
| "contact-support"
| "manage-invoices"
| "reinstate-subscription"
+ | "resubscribe"
| "update-payment"
| "upgrade-plan";
```
@@ -279,7 +280,7 @@ Payment issue expired, subscription has been suspended:
```
-**Actions available:** Contact Support
+**Actions available:** Resubscribe
### Past Due
@@ -370,7 +371,7 @@ Subscription that has been canceled:
```
-**Note:** Canceled subscriptions display no callout or actions.
+**Actions available:** Resubscribe
### Enterprise
diff --git a/libs/subscription/src/components/subscription-card/subscription-card.component.spec.ts b/libs/subscription/src/components/subscription-card/subscription-card.component.spec.ts
index cdb85360c74..f524c4b5c26 100644
--- a/libs/subscription/src/components/subscription-card/subscription-card.component.spec.ts
+++ b/libs/subscription/src/components/subscription-card/subscription-card.component.spec.ts
@@ -44,9 +44,11 @@ describe("SubscriptionCardComponent", () => {
unpaid: "Unpaid",
weCouldNotProcessYourPayment: "We could not process your payment",
contactSupportShort: "Contact support",
- yourSubscriptionHasExpired: "Your subscription has expired",
+ yourSubscriptionIsExpired: "Your subscription is expired",
+ yourSubscriptionIsCanceled: "Your subscription is canceled",
yourSubscriptionIsScheduledToCancel: `Your subscription is scheduled to cancel on ${params[0]}`,
reinstateSubscription: "Reinstate subscription",
+ resubscribe: "Resubscribe",
upgradeYourPlan: "Upgrade your plan",
premiumShareEvenMore: "Premium share even more",
upgradeNow: "Upgrade now",
@@ -253,7 +255,7 @@ describe("SubscriptionCardComponent", () => {
expect(buttons[1].nativeElement.textContent.trim()).toBe("Contact support");
});
- it("should display incomplete_expired callout with contact support action", () => {
+ it("should display incomplete_expired callout with resubscribe action", () => {
setupComponent({
...baseSubscription,
status: "incomplete_expired",
@@ -265,18 +267,18 @@ describe("SubscriptionCardComponent", () => {
expect(calloutData).toBeTruthy();
expect(calloutData!.type).toBe("danger");
expect(calloutData!.title).toBe("Expired");
- expect(calloutData!.description).toContain("Your subscription has expired");
+ expect(calloutData!.description).toContain("Your subscription is expired");
expect(calloutData!.callsToAction?.length).toBe(1);
const callout = fixture.debugElement.query(By.css("bit-callout"));
expect(callout).toBeTruthy();
const description = callout.query(By.css("p"));
- expect(description.nativeElement.textContent).toContain("Your subscription has expired");
+ expect(description.nativeElement.textContent).toContain("Your subscription is expired");
const buttons = callout.queryAll(By.css("button"));
expect(buttons.length).toBe(1);
- expect(buttons[0].nativeElement.textContent.trim()).toBe("Contact support");
+ expect(buttons[0].nativeElement.textContent.trim()).toBe("Resubscribe");
});
it("should display pending cancellation callout for active status with cancelAt", () => {
@@ -364,15 +366,29 @@ describe("SubscriptionCardComponent", () => {
expect(buttons[0].nativeElement.textContent.trim()).toBe("Manage invoices");
});
- it("should not display callout for canceled status", () => {
+ it("should display canceled callout with resubscribe action", () => {
setupComponent({
...baseSubscription,
status: "canceled",
canceled: new Date("2025-01-15"),
});
+ const calloutData = component.callout();
+ expect(calloutData).toBeTruthy();
+ expect(calloutData!.type).toBe("danger");
+ expect(calloutData!.title).toBe("Canceled");
+ expect(calloutData!.description).toContain("Your subscription is canceled");
+ expect(calloutData!.callsToAction?.length).toBe(1);
+
const callout = fixture.debugElement.query(By.css("bit-callout"));
- expect(callout).toBeFalsy();
+ expect(callout).toBeTruthy();
+
+ const description = callout.query(By.css("p"));
+ expect(description.nativeElement.textContent).toContain("Your subscription is canceled");
+
+ const buttons = callout.queryAll(By.css("button"));
+ expect(buttons.length).toBe(1);
+ expect(buttons[0].nativeElement.textContent.trim()).toBe("Resubscribe");
});
it("should display unpaid callout with manage invoices action", () => {
@@ -489,6 +505,39 @@ describe("SubscriptionCardComponent", () => {
expect(emitSpy).toHaveBeenCalledWith("manage-invoices");
});
+
+ it("should emit resubscribe action when button is clicked for incomplete_expired status", () => {
+ setupComponent({
+ ...baseSubscription,
+ status: "incomplete_expired",
+ suspension: new Date("2025-01-15"),
+ gracePeriod: 7,
+ });
+
+ const emitSpy = jest.spyOn(component.callToActionClicked, "emit");
+
+ const button = fixture.debugElement.query(By.css("bit-callout button"));
+ button.triggerEventHandler("click", { button: 0 });
+ fixture.detectChanges();
+
+ expect(emitSpy).toHaveBeenCalledWith("resubscribe");
+ });
+
+ it("should emit resubscribe action when button is clicked for canceled status", () => {
+ setupComponent({
+ ...baseSubscription,
+ status: "canceled",
+ canceled: new Date("2025-01-15"),
+ });
+
+ const emitSpy = jest.spyOn(component.callToActionClicked, "emit");
+
+ const button = fixture.debugElement.query(By.css("bit-callout button"));
+ button.triggerEventHandler("click", { button: 0 });
+ fixture.detectChanges();
+
+ expect(emitSpy).toHaveBeenCalledWith("resubscribe");
+ });
});
describe("Cart summary header content", () => {
diff --git a/libs/subscription/src/components/subscription-card/subscription-card.component.stories.ts b/libs/subscription/src/components/subscription-card/subscription-card.component.stories.ts
index 32976c89cc2..3d99ded2e5c 100644
--- a/libs/subscription/src/components/subscription-card/subscription-card.component.stories.ts
+++ b/libs/subscription/src/components/subscription-card/subscription-card.component.stories.ts
@@ -51,10 +51,13 @@ export default {
weCouldNotProcessYourPayment:
"We could not process your payment. Please update your payment method or contact the support team for assistance.",
contactSupportShort: "Contact Support",
- yourSubscriptionHasExpired:
- "Your subscription has expired. Please contact the support team for assistance.",
+ yourSubscriptionIsExpired:
+ "Your subscription is expired. Please resubscribe to continue using premium features.",
+ yourSubscriptionIsCanceled:
+ "Your subscription is canceled. Please resubscribe to continue using premium features.",
yourSubscriptionIsScheduledToCancel: `Your subscription is scheduled to cancel on ${args[0]}. You can reinstate it anytime before then.`,
reinstateSubscription: "Reinstate subscription",
+ resubscribe: "Resubscribe",
upgradeYourPlan: "Upgrade your plan",
premiumShareEvenMore:
"Share even more with Families, or get powerful, trusted password security with Teams or Enterprise.",
diff --git a/libs/subscription/src/components/subscription-card/subscription-card.component.ts b/libs/subscription/src/components/subscription-card/subscription-card.component.ts
index ebfb41df6c2..78d2c40eb3e 100644
--- a/libs/subscription/src/components/subscription-card/subscription-card.component.ts
+++ b/libs/subscription/src/components/subscription-card/subscription-card.component.ts
@@ -20,6 +20,7 @@ export const SubscriptionCardActions = {
ContactSupport: "contact-support",
ManageInvoices: "manage-invoices",
ReinstateSubscription: "reinstate-subscription",
+ Resubscribe: "resubscribe",
UpdatePayment: "update-payment",
UpgradePlan: "upgrade-plan",
} as const;
@@ -154,12 +155,12 @@ export class SubscriptionCardComponent {
return {
title: this.i18nService.t("expired"),
type: "danger",
- description: this.i18nService.t("yourSubscriptionHasExpired"),
+ description: this.i18nService.t("yourSubscriptionIsExpired"),
callsToAction: [
{
- text: this.i18nService.t("contactSupportShort"),
+ text: this.i18nService.t("resubscribe"),
buttonType: "unstyled",
- action: SubscriptionCardActions.ContactSupport,
+ action: SubscriptionCardActions.Resubscribe,
},
],
};
@@ -218,7 +219,18 @@ export class SubscriptionCardComponent {
};
}
case SubscriptionStatuses.Canceled: {
- return null;
+ return {
+ title: this.i18nService.t("canceled"),
+ type: "danger",
+ description: this.i18nService.t("yourSubscriptionIsCanceled"),
+ callsToAction: [
+ {
+ text: this.i18nService.t("resubscribe"),
+ buttonType: "unstyled",
+ action: SubscriptionCardActions.Resubscribe,
+ },
+ ],
+ };
}
case SubscriptionStatuses.Unpaid: {
return {
From 10a20a43a36be6d76f3f1a3bf4d57fa2b56678b1 Mon Sep 17 00:00:00 2001
From: Jason Ng
Date: Fri, 13 Feb 2026 13:53:11 -0500
Subject: [PATCH 036/134] [PM-31738] update archive toasts (#18923)
* update archive toast for all clients and trash archive restore toast, update archive cipher utilities spec
---
apps/browser/src/_locales/en/messages.json | 11 ++++-------
.../item-more-options/item-more-options.component.ts | 2 +-
.../popup/components/vault/view/view.component.ts | 9 ++++++++-
.../src/vault/popup/settings/archive.component.ts | 2 +-
apps/desktop/src/locales/en/messages.json | 8 ++++----
.../vault-item-dialog/vault-item-dialog.component.ts | 4 ++--
.../src/app/vault/individual-vault/vault.component.ts | 4 ++--
apps/web/src/locales/en/messages.json | 11 ++++-------
.../services/archive-cipher-utilities.service.spec.ts | 4 ++--
.../src/services/archive-cipher-utilities.service.ts | 4 ++--
10 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json
index 7944904c44a..e77550b01dc 100644
--- a/apps/browser/src/_locales/en/messages.json
+++ b/apps/browser/src/_locales/en/messages.json
@@ -573,14 +573,11 @@
"noItemsInArchiveDesc": {
"message": "Archived items will appear here and will be excluded from general search results and autofill suggestions."
},
- "itemWasSentToArchive": {
- "message": "Item was sent to archive"
+ "itemArchiveToast": {
+ "message": "Item archived"
},
- "itemWasUnarchived": {
- "message": "Item was unarchived"
- },
- "itemUnarchived": {
- "message": "Item was unarchived"
+ "itemUnarchivedToast": {
+ "message": "Item unarchived"
},
"archiveItem": {
"message": "Archive item"
diff --git a/apps/browser/src/vault/popup/components/vault/item-more-options/item-more-options.component.ts b/apps/browser/src/vault/popup/components/vault/item-more-options/item-more-options.component.ts
index ef4c4a111b6..f7fe9ee1494 100644
--- a/apps/browser/src/vault/popup/components/vault/item-more-options/item-more-options.component.ts
+++ b/apps/browser/src/vault/popup/components/vault/item-more-options/item-more-options.component.ts
@@ -383,7 +383,7 @@ export class ItemMoreOptionsComponent {
await this.cipherArchiveService.archiveWithServer(this.cipher.id as CipherId, activeUserId);
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasSentToArchive"),
+ message: this.i18nService.t("itemArchiveToast"),
});
}
}
diff --git a/apps/browser/src/vault/popup/components/vault/view/view.component.ts b/apps/browser/src/vault/popup/components/vault/view/view.component.ts
index d63cd5920a1..48402a957d6 100644
--- a/apps/browser/src/vault/popup/components/vault/view/view.component.ts
+++ b/apps/browser/src/vault/popup/components/vault/view/view.component.ts
@@ -277,17 +277,24 @@ export class ViewComponent {
};
restore = async (): Promise => {
+ let toastMessage;
try {
await this.cipherService.restoreWithServer(this.cipher.id, this.activeUserId);
} catch (e) {
this.logService.error(e);
}
+ if (this.cipher.archivedDate) {
+ toastMessage = this.i18nService.t("archivedItemRestored");
+ } else {
+ toastMessage = this.i18nService.t("restoredItem");
+ }
+
await this.popupRouterCacheService.back();
this.toastService.showToast({
variant: "success",
title: null,
- message: this.i18nService.t("restoredItem"),
+ message: toastMessage,
});
};
diff --git a/apps/browser/src/vault/popup/settings/archive.component.ts b/apps/browser/src/vault/popup/settings/archive.component.ts
index 336d9be6d16..0d1baa56a21 100644
--- a/apps/browser/src/vault/popup/settings/archive.component.ts
+++ b/apps/browser/src/vault/popup/settings/archive.component.ts
@@ -213,7 +213,7 @@ export class ArchiveComponent {
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemUnarchived"),
+ message: this.i18nService.t("itemUnarchivedToast"),
});
}
diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json
index 85742db94ab..f444265877d 100644
--- a/apps/desktop/src/locales/en/messages.json
+++ b/apps/desktop/src/locales/en/messages.json
@@ -4387,11 +4387,11 @@
"noItemsInArchiveDesc": {
"message": "Archived items will appear here and will be excluded from general search results and autofill suggestions."
},
- "itemWasSentToArchive": {
- "message": "Item was sent to archive"
+ "itemArchiveToast": {
+ "message": "Item archived"
},
- "itemWasUnarchived": {
- "message": "Item was unarchived"
+ "itemUnarchivedToast": {
+ "message": "Item unarchived"
},
"archiveItem": {
"message": "Archive item"
diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
index 4da2d05f12b..2340f74c32d 100644
--- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
+++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
@@ -616,7 +616,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy {
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasSentToArchive"),
+ message: this.i18nService.t("itemArchiveToast"),
});
} catch {
this.toastService.showToast({
@@ -638,7 +638,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy {
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasUnarchived"),
+ message: this.i18nService.t("itemUnarchivedToast"),
});
} catch {
this.toastService.showToast({
diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts
index 4b9d2ed59ee..6fbe3f08912 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.component.ts
@@ -744,7 +744,7 @@ export class VaultComponent implements OnInit, OnDestr
await this.cipherArchiveService.archiveWithServer(cipher.id as CipherId, activeUserId);
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasSentToArchive"),
+ message: this.i18nService.t("itemArchiveToast"),
});
this.refresh();
} catch (e) {
@@ -801,7 +801,7 @@ export class VaultComponent implements OnInit, OnDestr
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemUnarchived"),
+ message: this.i18nService.t("itemUnarchivedToast"),
});
this.refresh();
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index d70a2d88bae..485f1fc07df 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -11905,14 +11905,11 @@
"noItemsInArchiveDesc": {
"message": "Archived items will appear here and will be excluded from general search results and autofill suggestions."
},
- "itemWasSentToArchive": {
- "message": "Item was sent to archive"
+ "itemArchiveToast": {
+ "message": "Item archived"
},
- "itemWasUnarchived": {
- "message": "Item was unarchived"
- },
- "itemUnarchived": {
- "message": "Item was unarchived"
+ "itemUnarchivedToast": {
+ "message": "Item unarchived"
},
"bulkArchiveItems": {
"message": "Items archived"
diff --git a/libs/vault/src/services/archive-cipher-utilities.service.spec.ts b/libs/vault/src/services/archive-cipher-utilities.service.spec.ts
index ea00f482987..3eff8997177 100644
--- a/libs/vault/src/services/archive-cipher-utilities.service.spec.ts
+++ b/libs/vault/src/services/archive-cipher-utilities.service.spec.ts
@@ -80,7 +80,7 @@ describe("ArchiveCipherUtilitiesService", () => {
);
expect(toastService.showToast).toHaveBeenCalledWith({
variant: "success",
- message: "itemWasSentToArchive",
+ message: "itemArchiveToast",
});
});
@@ -106,7 +106,7 @@ describe("ArchiveCipherUtilitiesService", () => {
);
expect(toastService.showToast).toHaveBeenCalledWith({
variant: "success",
- message: "itemWasUnarchived",
+ message: "itemUnarchivedToast",
});
});
diff --git a/libs/vault/src/services/archive-cipher-utilities.service.ts b/libs/vault/src/services/archive-cipher-utilities.service.ts
index b747961a701..751eba96e73 100644
--- a/libs/vault/src/services/archive-cipher-utilities.service.ts
+++ b/libs/vault/src/services/archive-cipher-utilities.service.ts
@@ -58,7 +58,7 @@ export class ArchiveCipherUtilitiesService {
);
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasSentToArchive"),
+ message: this.i18nService.t("itemArchiveToast"),
});
return cipherResponse;
} catch {
@@ -90,7 +90,7 @@ export class ArchiveCipherUtilitiesService {
);
this.toastService.showToast({
variant: "success",
- message: this.i18nService.t("itemWasUnarchived"),
+ message: this.i18nService.t("itemUnarchivedToast"),
});
return cipherResponse;
} catch {
From 2912bf05e148ef883f07b24d8f5fb357ff77ec8e Mon Sep 17 00:00:00 2001
From: Brandon Treston
Date: Fri, 13 Feb 2026 14:36:11 -0500
Subject: [PATCH 037/134] [PM-26901] Add notification handler for auto confirm
(#18886)
* add notification handler for auto confirm
* add missing state check
* fix test
* isolate angular specific code from shared lib code
* clean up
* use autoconfirm method
* fix test
---
.../browser/src/background/main.background.ts | 36 ++++++++++-
apps/browser/src/popup/app-routing.module.ts | 2 +-
.../components/vault/vault.component.spec.ts | 2 +-
.../popup/components/vault/vault.component.ts | 2 +-
.../settings/admin-settings.component.ts | 2 +-
.../src/services/jslib-services.module.ts | 2 +
.../auto-confirm.service.abstraction.ts | 10 +--
...auto-confirm-extension-dialog.component.ts | 0
...auto-confirm-warning-dialog.component.html | 0
.../auto-confirm-warning-dialog.component.ts | 0
.../src/{ => angular}/components/index.ts | 0
...c-user-confirmation-settings.guard.spec.ts | 3 +-
...omatic-user-confirmation-settings.guard.ts | 3 +-
.../src/{ => angular}/guards/index.ts | 0
libs/auto-confirm/src/angular/index.ts | 8 +++
libs/auto-confirm/src/index.ts | 2 -
.../default-auto-confirm.service.spec.ts | 58 +++++++++++------
.../services/default-auto-confirm.service.ts | 55 ++++++++++------
.../src/enums/notification-type.enum.ts | 1 +
.../response/notification.response.spec.ts | 63 +++++++++++++++++++
.../models/response/notification.response.ts | 16 +++++
...ult-server-notifications.multiuser.spec.ts | 5 ++
...fault-server-notifications.service.spec.ts | 28 +++++++++
.../default-server-notifications.service.ts | 10 +++
tsconfig.base.json | 1 +
25 files changed, 257 insertions(+), 52 deletions(-)
rename libs/auto-confirm/src/{ => angular}/components/auto-confirm-extension-dialog.component.ts (100%)
rename libs/auto-confirm/src/{ => angular}/components/auto-confirm-warning-dialog.component.html (100%)
rename libs/auto-confirm/src/{ => angular}/components/auto-confirm-warning-dialog.component.ts (100%)
rename libs/auto-confirm/src/{ => angular}/components/index.ts (100%)
rename libs/auto-confirm/src/{ => angular}/guards/automatic-user-confirmation-settings.guard.spec.ts (97%)
rename libs/auto-confirm/src/{ => angular}/guards/automatic-user-confirmation-settings.guard.ts (94%)
rename libs/auto-confirm/src/{ => angular}/guards/index.ts (100%)
create mode 100644 libs/auto-confirm/src/angular/index.ts
create mode 100644 libs/common/src/models/response/notification.response.spec.ts
diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts
index 585942d7537..25c7b344982 100644
--- a/apps/browser/src/background/main.background.ts
+++ b/apps/browser/src/background/main.background.ts
@@ -14,7 +14,14 @@ import {
timeout,
} from "rxjs";
-import { CollectionService, DefaultCollectionService } from "@bitwarden/admin-console/common";
+import {
+ CollectionService,
+ DefaultCollectionService,
+ DefaultOrganizationUserApiService,
+ DefaultOrganizationUserService,
+ OrganizationUserApiService,
+ OrganizationUserService,
+} from "@bitwarden/admin-console/common";
import {
AuthRequestApiServiceAbstraction,
AuthRequestService,
@@ -27,6 +34,10 @@ import {
LogoutReason,
UserDecryptionOptionsService,
} from "@bitwarden/auth/common";
+import {
+ AutomaticUserConfirmationService,
+ DefaultAutomaticUserConfirmationService,
+} from "@bitwarden/auto-confirm";
import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service";
import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service";
import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service";
@@ -487,6 +498,9 @@ export default class MainBackground {
onUpdatedRan: boolean;
onReplacedRan: boolean;
loginToAutoFill: CipherView = null;
+ organizationUserService: OrganizationUserService;
+ organizationUserApiService: OrganizationUserApiService;
+ autoConfirmService: AutomaticUserConfirmationService;
private commandsBackground: CommandsBackground;
private contextMenusBackground: ContextMenusBackground;
@@ -763,6 +777,15 @@ export default class MainBackground {
{ createRequest: (url, request) => new Request(url, request) },
);
+ this.organizationUserApiService = new DefaultOrganizationUserApiService(this.apiService);
+ this.organizationUserService = new DefaultOrganizationUserService(
+ this.keyService,
+ this.encryptService,
+ this.organizationUserApiService,
+ this.accountService,
+ this.i18nService,
+ );
+
this.hibpApiService = new HibpApiService(this.apiService);
this.fileUploadService = new FileUploadService(this.logService, this.apiService);
this.cipherFileUploadService = new CipherFileUploadService(
@@ -804,6 +827,16 @@ export default class MainBackground {
this.authService,
);
+ this.autoConfirmService = new DefaultAutomaticUserConfirmationService(
+ this.configService,
+ this.apiService,
+ this.organizationUserService,
+ this.stateProvider,
+ this.organizationService,
+ this.organizationUserApiService,
+ this.policyService,
+ );
+
const sdkClientFactory = flagEnabled("sdk")
? new DefaultSdkClientFactory()
: new NoopSdkClientFactory();
@@ -1219,6 +1252,7 @@ export default class MainBackground {
this.authRequestAnsweringService,
this.configService,
this.policyService,
+ this.autoConfirmService,
);
this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.authService);
diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts
index 4e14d1171fd..0d85743bba7 100644
--- a/apps/browser/src/popup/app-routing.module.ts
+++ b/apps/browser/src/popup/app-routing.module.ts
@@ -42,7 +42,7 @@ import {
TwoFactorAuthComponent,
TwoFactorAuthGuard,
} from "@bitwarden/auth/angular";
-import { canAccessAutoConfirmSettings } from "@bitwarden/auto-confirm";
+import { canAccessAutoConfirmSettings } from "@bitwarden/auto-confirm/angular";
import { AnonLayoutWrapperComponent, AnonLayoutWrapperData } from "@bitwarden/components";
import {
LockComponent,
diff --git a/apps/browser/src/vault/popup/components/vault/vault.component.spec.ts b/apps/browser/src/vault/popup/components/vault/vault.component.spec.ts
index 70affd73ef3..f48b08566a1 100644
--- a/apps/browser/src/vault/popup/components/vault/vault.component.spec.ts
+++ b/apps/browser/src/vault/popup/components/vault/vault.component.spec.ts
@@ -12,7 +12,7 @@ import { NudgeType, NudgesService } from "@bitwarden/angular/vault";
import {
AutoConfirmExtensionSetupDialogComponent,
AutomaticUserConfirmationService,
-} from "@bitwarden/auto-confirm";
+} from "@bitwarden/auto-confirm/angular";
import { CurrentAccountComponent } from "@bitwarden/browser/auth/popup/account-switching/current-account.component";
import AutofillService from "@bitwarden/browser/autofill/services/autofill.service";
import { PopOutComponent } from "@bitwarden/browser/platform/popup/components/pop-out.component";
diff --git a/apps/browser/src/vault/popup/components/vault/vault.component.ts b/apps/browser/src/vault/popup/components/vault/vault.component.ts
index 281abc5f180..cb3cb5f5eec 100644
--- a/apps/browser/src/vault/popup/components/vault/vault.component.ts
+++ b/apps/browser/src/vault/popup/components/vault/vault.component.ts
@@ -28,7 +28,7 @@ import {
AutoConfirmExtensionSetupDialogComponent,
AutoConfirmState,
AutomaticUserConfirmationService,
-} from "@bitwarden/auto-confirm";
+} from "@bitwarden/auto-confirm/angular";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions";
diff --git a/apps/browser/src/vault/popup/settings/admin-settings.component.ts b/apps/browser/src/vault/popup/settings/admin-settings.component.ts
index e4b676525ed..52da4318047 100644
--- a/apps/browser/src/vault/popup/settings/admin-settings.component.ts
+++ b/apps/browser/src/vault/popup/settings/admin-settings.component.ts
@@ -16,7 +16,7 @@ import { SpotlightComponent } from "@bitwarden/angular/vault/components/spotligh
import {
AutoConfirmWarningDialogComponent,
AutomaticUserConfirmationService,
-} from "@bitwarden/auto-confirm";
+} from "@bitwarden/auto-confirm/angular";
import { PopOutComponent } from "@bitwarden/browser/platform/popup/components/pop-out.component";
import { PopupHeaderComponent } from "@bitwarden/browser/platform/popup/layout/popup-header.component";
import { PopupPageComponent } from "@bitwarden/browser/platform/popup/layout/popup-page.component";
diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts
index 0f857e67247..2fbf55bf6c5 100644
--- a/libs/angular/src/services/jslib-services.module.ts
+++ b/libs/angular/src/services/jslib-services.module.ts
@@ -56,6 +56,7 @@ import {
UserDecryptionOptionsService,
UserDecryptionOptionsServiceAbstraction,
} from "@bitwarden/auth/common";
+import { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service";
import { AuditService as AuditServiceAbstraction } from "@bitwarden/common/abstractions/audit.service";
import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service";
@@ -1079,6 +1080,7 @@ const safeProviders: SafeProvider[] = [
AuthRequestAnsweringService,
ConfigService,
InternalPolicyService,
+ AutomaticUserConfirmationService,
],
}),
safeProvider({
diff --git a/libs/auto-confirm/src/abstractions/auto-confirm.service.abstraction.ts b/libs/auto-confirm/src/abstractions/auto-confirm.service.abstraction.ts
index 9ce6cb9c1a4..1ef3be4ff4e 100644
--- a/libs/auto-confirm/src/abstractions/auto-confirm.service.abstraction.ts
+++ b/libs/auto-confirm/src/abstractions/auto-confirm.service.abstraction.ts
@@ -1,6 +1,6 @@
import { Observable } from "rxjs";
-import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
+import { OrganizationId } from "@bitwarden/common/types/guid";
import { UserId } from "@bitwarden/user-core";
import { AutoConfirmState } from "../models/auto-confirm-state.model";
@@ -27,12 +27,12 @@ export abstract class AutomaticUserConfirmationService {
/**
* Calls the API endpoint to initiate automatic user confirmation.
* @param userId The userId of the logged in admin performing auto confirmation. This is neccesary to perform the key exchange and for permissions checks.
- * @param confirmingUserId The userId of the user being confirmed.
- * @param organization the organization the user is being auto confirmed to.
+ * @param confirmedUserId The userId of the member being confirmed.
+ * @param organization the organization the member is being auto confirmed to.
**/
abstract autoConfirmUser(
userId: UserId,
- confirmingUserId: UserId,
- organization: Organization,
+ confirmedUserId: UserId,
+ organization: OrganizationId,
): Promise;
}
diff --git a/libs/auto-confirm/src/components/auto-confirm-extension-dialog.component.ts b/libs/auto-confirm/src/angular/components/auto-confirm-extension-dialog.component.ts
similarity index 100%
rename from libs/auto-confirm/src/components/auto-confirm-extension-dialog.component.ts
rename to libs/auto-confirm/src/angular/components/auto-confirm-extension-dialog.component.ts
diff --git a/libs/auto-confirm/src/components/auto-confirm-warning-dialog.component.html b/libs/auto-confirm/src/angular/components/auto-confirm-warning-dialog.component.html
similarity index 100%
rename from libs/auto-confirm/src/components/auto-confirm-warning-dialog.component.html
rename to libs/auto-confirm/src/angular/components/auto-confirm-warning-dialog.component.html
diff --git a/libs/auto-confirm/src/components/auto-confirm-warning-dialog.component.ts b/libs/auto-confirm/src/angular/components/auto-confirm-warning-dialog.component.ts
similarity index 100%
rename from libs/auto-confirm/src/components/auto-confirm-warning-dialog.component.ts
rename to libs/auto-confirm/src/angular/components/auto-confirm-warning-dialog.component.ts
diff --git a/libs/auto-confirm/src/components/index.ts b/libs/auto-confirm/src/angular/components/index.ts
similarity index 100%
rename from libs/auto-confirm/src/components/index.ts
rename to libs/auto-confirm/src/angular/components/index.ts
diff --git a/libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.spec.ts b/libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.spec.ts
similarity index 97%
rename from libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.spec.ts
rename to libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.spec.ts
index aca51edb8dc..0261a1a86dc 100644
--- a/libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.spec.ts
+++ b/libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.spec.ts
@@ -3,14 +3,13 @@ import { Router, UrlTree } from "@angular/router";
import { mock, MockProxy } from "jest-mock-extended";
import { BehaviorSubject, firstValueFrom, Observable, of } from "rxjs";
+import { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { UserId } from "@bitwarden/common/types/guid";
import { ToastService } from "@bitwarden/components";
import { newGuid } from "@bitwarden/guid";
-import { AutomaticUserConfirmationService } from "../abstractions";
-
import { canAccessAutoConfirmSettings } from "./automatic-user-confirmation-settings.guard";
describe("canAccessAutoConfirmSettings", () => {
diff --git a/libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.ts b/libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.ts
similarity index 94%
rename from libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.ts
rename to libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.ts
index 77f01ba2801..3ae6b5b4c52 100644
--- a/libs/auto-confirm/src/guards/automatic-user-confirmation-settings.guard.ts
+++ b/libs/auto-confirm/src/angular/guards/automatic-user-confirmation-settings.guard.ts
@@ -2,13 +2,12 @@ import { inject } from "@angular/core";
import { CanActivateFn, Router } from "@angular/router";
import { map, switchMap } from "rxjs";
+import { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { filterOutNullish } from "@bitwarden/common/vault/utils/observable-utilities";
import { ToastService } from "@bitwarden/components";
-import { AutomaticUserConfirmationService } from "../abstractions";
-
export const canAccessAutoConfirmSettings: CanActivateFn = () => {
const accountService = inject(AccountService);
const autoConfirmService = inject(AutomaticUserConfirmationService);
diff --git a/libs/auto-confirm/src/guards/index.ts b/libs/auto-confirm/src/angular/guards/index.ts
similarity index 100%
rename from libs/auto-confirm/src/guards/index.ts
rename to libs/auto-confirm/src/angular/guards/index.ts
diff --git a/libs/auto-confirm/src/angular/index.ts b/libs/auto-confirm/src/angular/index.ts
new file mode 100644
index 00000000000..ff2d69248b4
--- /dev/null
+++ b/libs/auto-confirm/src/angular/index.ts
@@ -0,0 +1,8 @@
+// Re-export core auto-confirm functionality for convenience
+export * from "../abstractions";
+export * from "../models";
+export * from "../services";
+
+// Angular-specific exports
+export * from "./components";
+export * from "./guards";
diff --git a/libs/auto-confirm/src/index.ts b/libs/auto-confirm/src/index.ts
index 56b9d0b0285..9187ccd39cf 100644
--- a/libs/auto-confirm/src/index.ts
+++ b/libs/auto-confirm/src/index.ts
@@ -1,5 +1,3 @@
export * from "./abstractions";
-export * from "./components";
-export * from "./guards";
export * from "./models";
export * from "./services";
diff --git a/libs/auto-confirm/src/services/default-auto-confirm.service.spec.ts b/libs/auto-confirm/src/services/default-auto-confirm.service.spec.ts
index 1d37378b96c..0ea3ca9c23a 100644
--- a/libs/auto-confirm/src/services/default-auto-confirm.service.spec.ts
+++ b/libs/auto-confirm/src/services/default-auto-confirm.service.spec.ts
@@ -377,48 +377,70 @@ describe("DefaultAutomaticUserConfirmationService", () => {
defaultUserCollectionName: "encrypted-collection",
} as OrganizationUserConfirmRequest;
- beforeEach(() => {
+ beforeEach(async () => {
const organizations$ = new BehaviorSubject([mockOrganization]);
organizationService.organizations$.mockReturnValue(organizations$);
configService.getFeatureFlag$.mockReturnValue(of(true));
policyService.policyAppliesToUser$.mockReturnValue(of(true));
+ // Enable auto-confirm configuration for the user
+ const enabledConfig = new AutoConfirmState();
+ enabledConfig.enabled = true;
+ await stateProvider.setUserState(
+ AUTO_CONFIRM_STATE,
+ { [mockUserId]: enabledConfig },
+ mockUserId,
+ );
+
apiService.getUserPublicKey.mockResolvedValue({
publicKey: mockPublicKey,
} as UserKeyResponse);
jest.spyOn(Utils, "fromB64ToArray").mockReturnValue(mockPublicKeyArray);
organizationUserService.buildConfirmRequest.mockReturnValue(of(mockConfirmRequest));
- organizationUserApiService.postOrganizationUserConfirm.mockResolvedValue(undefined);
+ organizationUserApiService.postOrganizationUserAutoConfirm.mockResolvedValue(undefined);
});
- it("should successfully auto-confirm a user", async () => {
- await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization);
+ it("should successfully auto-confirm a user with organizationId", async () => {
+ await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId);
expect(apiService.getUserPublicKey).toHaveBeenCalledWith(mockUserId);
expect(organizationUserService.buildConfirmRequest).toHaveBeenCalledWith(
mockOrganization,
mockPublicKeyArray,
);
- expect(organizationUserApiService.postOrganizationUserConfirm).toHaveBeenCalledWith(
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).toHaveBeenCalledWith(
mockOrganizationId,
mockConfirmingUserId,
mockConfirmRequest,
);
});
- it("should not confirm user when canManageAutoConfirm returns false", async () => {
+ it("should return early when canManageAutoConfirm returns false", async () => {
configService.getFeatureFlag$.mockReturnValue(of(false));
- await expect(
- service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization),
- ).rejects.toThrow("Cannot automatically confirm user (insufficient permissions)");
+ await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId);
expect(apiService.getUserPublicKey).not.toHaveBeenCalled();
- expect(organizationUserApiService.postOrganizationUserConfirm).not.toHaveBeenCalled();
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).not.toHaveBeenCalled();
+ });
+
+ it("should return early when auto-confirm is disabled in configuration", async () => {
+ const disabledConfig = new AutoConfirmState();
+ disabledConfig.enabled = false;
+ await stateProvider.setUserState(
+ AUTO_CONFIRM_STATE,
+ { [mockUserId]: disabledConfig },
+ mockUserId,
+ );
+
+ await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId);
+
+ expect(apiService.getUserPublicKey).not.toHaveBeenCalled();
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).not.toHaveBeenCalled();
});
it("should build confirm request with organization and public key", async () => {
- await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization);
+ await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId);
expect(organizationUserService.buildConfirmRequest).toHaveBeenCalledWith(
mockOrganization,
@@ -427,10 +449,10 @@ describe("DefaultAutomaticUserConfirmationService", () => {
});
it("should call API with correct parameters", async () => {
- await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization);
+ await service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId);
- expect(organizationUserApiService.postOrganizationUserConfirm).toHaveBeenCalledWith(
- mockOrganization.id,
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).toHaveBeenCalledWith(
+ mockOrganizationId,
mockConfirmingUserId,
mockConfirmRequest,
);
@@ -441,10 +463,10 @@ describe("DefaultAutomaticUserConfirmationService", () => {
apiService.getUserPublicKey.mockRejectedValue(apiError);
await expect(
- service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization),
+ service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId),
).rejects.toThrow("API Error");
- expect(organizationUserApiService.postOrganizationUserConfirm).not.toHaveBeenCalled();
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).not.toHaveBeenCalled();
});
it("should handle buildConfirmRequest errors gracefully", async () => {
@@ -452,10 +474,10 @@ describe("DefaultAutomaticUserConfirmationService", () => {
organizationUserService.buildConfirmRequest.mockReturnValue(throwError(() => buildError));
await expect(
- service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganization),
+ service.autoConfirmUser(mockUserId, mockConfirmingUserId, mockOrganizationId),
).rejects.toThrow("Build Error");
- expect(organizationUserApiService.postOrganizationUserConfirm).not.toHaveBeenCalled();
+ expect(organizationUserApiService.postOrganizationUserAutoConfirm).not.toHaveBeenCalled();
});
});
});
diff --git a/libs/auto-confirm/src/services/default-auto-confirm.service.ts b/libs/auto-confirm/src/services/default-auto-confirm.service.ts
index 109ccb6c9db..821340a0a9c 100644
--- a/libs/auto-confirm/src/services/default-auto-confirm.service.ts
+++ b/libs/auto-confirm/src/services/default-auto-confirm.service.ts
@@ -8,10 +8,11 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
-import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
+import { getById } from "@bitwarden/common/platform/misc";
import { Utils } from "@bitwarden/common/platform/misc/utils";
+import { OrganizationId } from "@bitwarden/common/types/guid";
import { StateProvider } from "@bitwarden/state";
import { UserId } from "@bitwarden/user-core";
@@ -66,26 +67,44 @@ export class DefaultAutomaticUserConfirmationService implements AutomaticUserCon
async autoConfirmUser(
userId: UserId,
- confirmingUserId: UserId,
- organization: Organization,
+ confirmedUserId: UserId,
+ organizationId: OrganizationId,
): Promise {
+ const canManage = await firstValueFrom(this.canManageAutoConfirm$(userId));
+
+ if (!canManage) {
+ return;
+ }
+
+ // Only initiate auto confirmation if the local client setting has been turned on
+ const autoConfirmEnabled = await firstValueFrom(
+ this.configuration$(userId).pipe(map((state) => state.enabled)),
+ );
+
+ if (!autoConfirmEnabled) {
+ return;
+ }
+
+ const organization$ = this.organizationService.organizations$(userId).pipe(
+ getById(organizationId),
+ map((organization) => {
+ if (organization == null) {
+ throw new Error("Organization not found");
+ }
+ return organization;
+ }),
+ );
+
+ const publicKeyResponse = await this.apiService.getUserPublicKey(userId);
+ const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey);
+
await firstValueFrom(
- this.canManageAutoConfirm$(userId).pipe(
- map((canManage) => {
- if (!canManage) {
- throw new Error("Cannot automatically confirm user (insufficient permissions)");
- }
- return canManage;
- }),
- switchMap(() => this.apiService.getUserPublicKey(userId)),
- map((publicKeyResponse) => Utils.fromB64ToArray(publicKeyResponse.publicKey)),
- switchMap((publicKey) =>
- this.organizationUserService.buildConfirmRequest(organization, publicKey),
- ),
+ organization$.pipe(
+ switchMap((org) => this.organizationUserService.buildConfirmRequest(org, publicKey)),
switchMap((request) =>
- this.organizationUserApiService.postOrganizationUserConfirm(
- organization.id,
- confirmingUserId,
+ this.organizationUserApiService.postOrganizationUserAutoConfirm(
+ organizationId,
+ confirmedUserId,
request,
),
),
diff --git a/libs/common/src/enums/notification-type.enum.ts b/libs/common/src/enums/notification-type.enum.ts
index a10e6bf4448..d323dda4d74 100644
--- a/libs/common/src/enums/notification-type.enum.ts
+++ b/libs/common/src/enums/notification-type.enum.ts
@@ -35,4 +35,5 @@ export enum NotificationType {
ProviderBankAccountVerified = 24,
SyncPolicy = 25,
+ AutoConfirmMember = 26,
}
diff --git a/libs/common/src/models/response/notification.response.spec.ts b/libs/common/src/models/response/notification.response.spec.ts
new file mode 100644
index 00000000000..91a1390bfdb
--- /dev/null
+++ b/libs/common/src/models/response/notification.response.spec.ts
@@ -0,0 +1,63 @@
+import { NotificationType } from "../../enums";
+
+import { AutoConfirmMemberNotification, NotificationResponse } from "./notification.response";
+
+describe("NotificationResponse", () => {
+ describe("AutoConfirmMemberNotification", () => {
+ it("should parse AutoConfirmMemberNotification payload", () => {
+ const response = {
+ ContextId: "context-123",
+ Type: NotificationType.AutoConfirmMember,
+ Payload: {
+ TargetUserId: "target-user-id",
+ UserId: "user-id",
+ OrganizationId: "org-id",
+ },
+ };
+
+ const notification = new NotificationResponse(response);
+
+ expect(notification.type).toBe(NotificationType.AutoConfirmMember);
+ expect(notification.payload).toBeInstanceOf(AutoConfirmMemberNotification);
+ expect(notification.payload.targetUserId).toBe("target-user-id");
+ expect(notification.payload.userId).toBe("user-id");
+ expect(notification.payload.organizationId).toBe("org-id");
+ });
+
+ it("should handle stringified JSON payload", () => {
+ const response = {
+ ContextId: "context-123",
+ Type: NotificationType.AutoConfirmMember,
+ Payload: JSON.stringify({
+ TargetUserId: "target-user-id-2",
+ UserId: "user-id-2",
+ OrganizationId: "org-id-2",
+ }),
+ };
+
+ const notification = new NotificationResponse(response);
+
+ expect(notification.type).toBe(NotificationType.AutoConfirmMember);
+ expect(notification.payload).toBeInstanceOf(AutoConfirmMemberNotification);
+ expect(notification.payload.targetUserId).toBe("target-user-id-2");
+ expect(notification.payload.userId).toBe("user-id-2");
+ expect(notification.payload.organizationId).toBe("org-id-2");
+ });
+ });
+
+ describe("AutoConfirmMemberNotification constructor", () => {
+ it("should extract all properties from response", () => {
+ const response = {
+ TargetUserId: "target-user-id",
+ UserId: "user-id",
+ OrganizationId: "org-id",
+ };
+
+ const notification = new AutoConfirmMemberNotification(response);
+
+ expect(notification.targetUserId).toBe("target-user-id");
+ expect(notification.userId).toBe("user-id");
+ expect(notification.organizationId).toBe("org-id");
+ });
+ });
+});
diff --git a/libs/common/src/models/response/notification.response.ts b/libs/common/src/models/response/notification.response.ts
index 2c0c0aae3f1..27232696d2e 100644
--- a/libs/common/src/models/response/notification.response.ts
+++ b/libs/common/src/models/response/notification.response.ts
@@ -75,6 +75,9 @@ export class NotificationResponse extends BaseResponse {
case NotificationType.SyncPolicy:
this.payload = new SyncPolicyNotification(payload);
break;
+ case NotificationType.AutoConfirmMember:
+ this.payload = new AutoConfirmMemberNotification(payload);
+ break;
default:
break;
}
@@ -210,3 +213,16 @@ export class LogOutNotification extends BaseResponse {
this.reason = this.getResponseProperty("Reason");
}
}
+
+export class AutoConfirmMemberNotification extends BaseResponse {
+ userId: string;
+ targetUserId: string;
+ organizationId: string;
+
+ constructor(response: any) {
+ super(response);
+ this.targetUserId = this.getResponseProperty("TargetUserId");
+ this.userId = this.getResponseProperty("UserId");
+ this.organizationId = this.getResponseProperty("OrganizationId");
+ }
+}
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 2795e4c3003..70b93c77f1c 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 { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { AuthRequestAnsweringService } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction";
@@ -36,6 +37,7 @@ describe("DefaultServerNotificationsService (multi-user)", () => {
let authRequestAnsweringService: MockProxy;
let configService: MockProxy;
let policyService: MockProxy;
+ let autoConfirmService: MockProxy;
let activeUserAccount$: BehaviorSubject>;
let userAccounts$: BehaviorSubject>;
@@ -131,6 +133,8 @@ describe("DefaultServerNotificationsService (multi-user)", () => {
policyService = mock();
+ autoConfirmService = mock();
+
defaultServerNotificationsService = new DefaultServerNotificationsService(
mock(),
syncService,
@@ -145,6 +149,7 @@ describe("DefaultServerNotificationsService (multi-user)", () => {
authRequestAnsweringService,
configService,
policyService,
+ autoConfirmService,
);
});
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 f058e8794ac..a54509925ef 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,7 @@ 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 { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { AuthRequestAnsweringService } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction";
@@ -45,6 +46,7 @@ describe("NotificationsService", () => {
let authRequestAnsweringService: MockProxy;
let configService: MockProxy;
let policyService: MockProxy;
+ let autoConfirmService: MockProxy;
let activeAccount: BehaviorSubject>;
let accounts: BehaviorSubject>;
@@ -75,6 +77,7 @@ describe("NotificationsService", () => {
authRequestAnsweringService = mock();
configService = mock();
policyService = mock();
+ autoConfirmService = mock();
// For these tests, use the active-user implementation (feature flag disabled)
configService.getFeatureFlag$.mockImplementation(() => of(true));
@@ -128,6 +131,7 @@ describe("NotificationsService", () => {
authRequestAnsweringService,
configService,
policyService,
+ autoConfirmService,
);
});
@@ -507,5 +511,29 @@ describe("NotificationsService", () => {
});
});
});
+
+ describe("NotificationType.AutoConfirmMember", () => {
+ it("should call autoConfirmService.autoConfirmUser with correct parameters", async () => {
+ autoConfirmService.autoConfirmUser.mockResolvedValue();
+
+ const notification = new NotificationResponse({
+ type: NotificationType.AutoConfirmMember,
+ payload: {
+ UserId: mockUser1,
+ TargetUserId: "target-user-id",
+ OrganizationId: "org-id",
+ },
+ contextId: "different-app-id",
+ });
+
+ await sut["processNotification"](notification, mockUser1);
+
+ expect(autoConfirmService.autoConfirmUser).toHaveBeenCalledWith(
+ mockUser1,
+ "target-user-id",
+ "org-id",
+ );
+ });
+ });
});
});
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 83ea12bf154..1a43c0edb09 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,7 @@ 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 { AutomaticUserConfirmationService } from "@bitwarden/auto-confirm";
import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyData } from "@bitwarden/common/admin-console/models/data/policy.data";
import { AuthRequestAnsweringService } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction";
@@ -49,6 +50,7 @@ export const DISABLED_NOTIFICATIONS_URL = "http://-";
export const AllowedMultiUserNotificationTypes = new Set([
NotificationType.AuthRequest,
+ NotificationType.AutoConfirmMember,
]);
export class DefaultServerNotificationsService implements ServerNotificationsService {
@@ -70,6 +72,7 @@ export class DefaultServerNotificationsService implements ServerNotificationsSer
private readonly authRequestAnsweringService: AuthRequestAnsweringService,
private readonly configService: ConfigService,
private readonly policyService: InternalPolicyService,
+ private autoConfirmService: AutomaticUserConfirmationService,
) {
this.notifications$ = this.accountService.accounts$.pipe(
map((accounts: Record): Set => {
@@ -292,6 +295,13 @@ export class DefaultServerNotificationsService implements ServerNotificationsSer
case NotificationType.SyncPolicy:
await this.policyService.syncPolicy(PolicyData.fromPolicy(notification.payload.policy));
break;
+ case NotificationType.AutoConfirmMember:
+ await this.autoConfirmService.autoConfirmUser(
+ notification.payload.userId,
+ notification.payload.targetUserId,
+ notification.payload.organizationId,
+ );
+ break;
default:
break;
}
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 68498cfae01..17f8f6d44fc 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -25,6 +25,7 @@
"@bitwarden/auth/angular": ["./libs/auth/src/angular"],
"@bitwarden/auth/common": ["./libs/auth/src/common"],
"@bitwarden/auto-confirm": ["libs/auto-confirm/src/index.ts"],
+ "@bitwarden/auto-confirm/angular": ["libs/auto-confirm/src/angular"],
"@bitwarden/billing": ["./libs/billing/src"],
"@bitwarden/bit-common/*": ["./bitwarden_license/bit-common/src/*"],
"@bitwarden/browser/*": ["./apps/browser/src/*"],
From 323f30c8e941d3bfb72acb812e6a90e949771a5d Mon Sep 17 00:00:00 2001
From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com>
Date: Fri, 13 Feb 2026 11:36:39 -0800
Subject: [PATCH 038/134] [PM-29892] - fix bulk share in vault (#18601)
* fix bulk share in vault
* clean up types.
* remove unnecessary optional chain
* add back defensive programming. update restore
* fix searchableCollectionNodes
* add back optional chains
---
.../collections/vault.component.ts | 14 +-
.../vault-item-dialog.component.ts | 2 +-
.../vault/individual-vault/vault.component.ts | 145 +++++++++---------
3 files changed, 81 insertions(+), 80 deletions(-)
diff --git a/apps/web/src/app/admin-console/organizations/collections/vault.component.ts b/apps/web/src/app/admin-console/organizations/collections/vault.component.ts
index 073d73f6a50..a641116f4de 100644
--- a/apps/web/src/app/admin-console/organizations/collections/vault.component.ts
+++ b/apps/web/src/app/admin-console/organizations/collections/vault.component.ts
@@ -472,7 +472,7 @@ export class VaultComponent implements OnInit, OnDestroy {
collections,
filter.collectionId,
);
- searchableCollectionNodes = selectedCollection.children ?? [];
+ searchableCollectionNodes = selectedCollection?.children ?? [];
}
let collectionsToReturn: CollectionAdminView[] = [];
@@ -962,10 +962,10 @@ export class VaultComponent implements OnInit, OnDestroy {
await this.editCipher(cipher, true);
}
- restore = async (c: CipherViewLike): Promise => {
+ restore = async (c: CipherViewLike): Promise => {
const organization = await firstValueFrom(this.organization$);
if (!CipherViewLikeUtils.isDeleted(c)) {
- return false;
+ return;
}
if (
@@ -974,11 +974,11 @@ export class VaultComponent implements OnInit, OnDestroy {
!organization.allowAdminAccessToAllCollectionItems
) {
this.showMissingPermissionsError();
- return false;
+ return;
}
if (!(await this.repromptCipher([c]))) {
- return false;
+ return;
}
// Allow restore of an Unassigned Item
@@ -996,10 +996,10 @@ export class VaultComponent implements OnInit, OnDestroy {
message: this.i18nService.t("restoredItem"),
});
this.refresh();
- return true;
+ return;
} catch (e) {
this.logService.error(e);
- return false;
+ return;
}
};
diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
index 2340f74c32d..4c6efdee167 100644
--- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
+++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
@@ -100,7 +100,7 @@ export interface VaultItemDialogParams {
/**
* Function to restore a cipher from the trash.
*/
- restore?: (c: CipherViewLike) => Promise;
+ restore?: (c: CipherViewLike) => Promise;
}
export const VaultItemDialogResult = {
diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts
index 6fbe3f08912..5ff72b0d147 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.component.ts
@@ -1,15 +1,6 @@
-// FIXME: Update this file to be type safe and remove this and next line
-// @ts-strict-ignore
-import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core";
+import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, viewChild } from "@angular/core";
import { ActivatedRoute, Params, Router } from "@angular/router";
-import {
- BehaviorSubject,
- combineLatest,
- firstValueFrom,
- lastValueFrom,
- Observable,
- Subject,
-} from "rxjs";
+import { combineLatest, firstValueFrom, lastValueFrom, Observable, of, Subject } from "rxjs";
import {
concatMap,
debounceTime,
@@ -18,6 +9,7 @@ import {
first,
map,
shareReplay,
+ startWith,
switchMap,
take,
takeUntil,
@@ -89,7 +81,6 @@ import { CipherListView } from "@bitwarden/sdk-internal";
import {
AddEditFolderDialogComponent,
AddEditFolderDialogResult,
- AttachmentDialogCloseResult,
AttachmentDialogResult,
AttachmentsV2Component,
CipherFormConfig,
@@ -179,14 +170,10 @@ type EmptyStateMap = Record;
],
})
export class VaultComponent implements OnInit, OnDestroy {
- // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals
- // eslint-disable-next-line @angular-eslint/prefer-signals
- @ViewChild("vaultFilter", { static: true }) filterComponent: VaultFilterComponent;
- // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals
- // eslint-disable-next-line @angular-eslint/prefer-signals
- @ViewChild("vaultItems", { static: false }) vaultItemsComponent: VaultItemsComponent;
+ readonly filterComponent = viewChild(VaultFilterComponent);
+ readonly vaultItemsComponent = viewChild(VaultItemsComponent);
- trashCleanupWarning: string = null;
+ trashCleanupWarning: string = "";
activeFilter: VaultFilter = new VaultFilter();
protected deactivatedOrgIcon = DeactivatedOrg;
@@ -198,20 +185,20 @@ export class VaultComponent implements OnInit, OnDestr
protected refreshing = false;
protected processingEvent = false;
protected filter: RoutedVaultFilterModel = {};
- protected showBulkMove: boolean;
- protected canAccessPremium: boolean;
- protected allCollections: CollectionView[];
+ protected showBulkMove: boolean = false;
+ protected canAccessPremium: boolean = false;
+ protected allCollections: CollectionView[] = [];
protected allOrganizations: Organization[] = [];
- protected ciphers: C[];
- protected collections: CollectionView[];
- protected isEmpty: boolean;
+ protected ciphers: C[] = [];
+ protected collections: CollectionView[] = [];
+ protected isEmpty: boolean = false;
protected selectedCollection: TreeNode | undefined;
protected canCreateCollections = false;
protected currentSearchText$: Observable = this.route.queryParams.pipe(
map((queryParams) => queryParams.search),
);
private searchText$ = new Subject();
- private refresh$ = new BehaviorSubject(null);
+ private refresh$ = new Subject();
private destroy$ = new Subject();
private vaultItemDialogRef?: DialogRef | undefined;
@@ -220,7 +207,7 @@ export class VaultComponent implements OnInit, OnDestr
organizations$ = this.accountService.activeAccount$
.pipe(map((a) => a?.id))
- .pipe(switchMap((id) => this.organizationService.organizations$(id)));
+ .pipe(switchMap((id) => (id ? this.organizationService.organizations$(id) : of([]))));
emptyState$ = combineLatest([
this.currentSearchText$,
@@ -228,7 +215,7 @@ export class VaultComponent implements OnInit, OnDestr
this.organizations$,
]).pipe(
map(([searchText, filter, organizations]) => {
- const selectedOrg = organizations?.find((org) => org.id === filter.organizationId);
+ const selectedOrg = organizations.find((org) => org.id === filter.organizationId);
const isOrgDisabled = selectedOrg && !selectedOrg.enabled;
if (isOrgDisabled) {
@@ -586,7 +573,7 @@ export class VaultComponent implements OnInit, OnDestr
firstSetup$
.pipe(
- switchMap(() => this.refresh$),
+ switchMap(() => this.refresh$.pipe(startWith(undefined))),
tap(() => (this.refreshing = true)),
switchMap(() =>
combineLatest([
@@ -712,7 +699,6 @@ export class VaultComponent implements OnInit, OnDestr
async handleUnknownCipher() {
this.toastService.showToast({
variant: "error",
- title: null,
message: this.i18nService.t("unknownCipher"),
});
await this.router.navigate([], {
@@ -842,9 +828,13 @@ export class VaultComponent implements OnInit, OnDestr
if (orgId == null) {
orgId = "MyVault";
}
- const orgs = await firstValueFrom(this.filterComponent.filters.organizationFilter.data$);
+ const data = this.filterComponent()?.filters?.organizationFilter?.data$;
+ if (data == undefined) {
+ return;
+ }
+ const orgs = await firstValueFrom(data);
const orgNode = ServiceUtils.getTreeNodeObject(orgs, orgId) as TreeNode;
- await this.filterComponent.filters?.organizationFilter?.action(orgNode);
+ await this.filterComponent()?.filters?.organizationFilter?.action(orgNode);
}
addFolder = (): void => {
@@ -912,7 +902,10 @@ export class VaultComponent implements OnInit, OnDestr
canEditCipher: cipher.edit,
});
- const result: AttachmentDialogCloseResult = await lastValueFrom(dialogRef.closed);
+ const result = await lastValueFrom(dialogRef.closed);
+ if (result === undefined) {
+ return;
+ }
if (
result.action === AttachmentDialogResult.Uploaded ||
@@ -966,7 +959,7 @@ export class VaultComponent implements OnInit, OnDestr
*/
async addCipher(cipherType?: CipherType) {
const type = cipherType ?? this.activeFilter.cipherType;
- const cipherFormConfig = await this.cipherFormConfigService.buildConfig("add", null, type);
+ const cipherFormConfig = await this.cipherFormConfigService.buildConfig("add", undefined, type);
const collectionId =
this.activeFilter.collectionId !== "AllCollections" && this.activeFilter.collectionId != null
? this.activeFilter.collectionId
@@ -994,7 +987,7 @@ export class VaultComponent implements OnInit, OnDestr
}
async editCipher(cipher: CipherView | CipherListView, cloneMode?: boolean) {
- return this.editCipherId(uuidAsString(cipher?.id), cloneMode);
+ return this.editCipherId(uuidAsString(cipher.id), cloneMode);
}
/**
@@ -1088,6 +1081,9 @@ export class VaultComponent implements OnInit, OnDestr
},
});
const result = await lastValueFrom(dialog.closed);
+ if (result === undefined) {
+ return;
+ }
if (result.action === CollectionDialogAction.Saved) {
if (result.collection) {
// Update CollectionService with the new collection
@@ -1104,7 +1100,7 @@ export class VaultComponent implements OnInit, OnDestr
async editCollection(c: CollectionView, tab: CollectionDialogTabType): Promise {
const dialog = openCollectionDialog(this.dialogService, {
data: {
- collectionId: c?.id,
+ collectionId: c.id,
organizationId: c.organizationId,
initialTab: tab,
limitNestedCollections: true,
@@ -1112,6 +1108,9 @@ export class VaultComponent implements OnInit, OnDestr
});
const result = await lastValueFrom(dialog.closed);
+ if (result === undefined) {
+ return;
+ }
const activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId));
if (result.action === CollectionDialogAction.Saved) {
if (result.collection) {
@@ -1163,7 +1162,6 @@ export class VaultComponent implements OnInit, OnDestr
this.toastService.showToast({
variant: "success",
- title: null,
message: this.i18nService.t("deletedCollectionId", collection.name),
});
if (navigateAway) {
@@ -1196,12 +1194,12 @@ export class VaultComponent implements OnInit, OnDestr
let availableCollections: CollectionView[] = [];
const orgId =
this.activeFilter.organizationId ||
- ciphers.find((c) => c.organizationId !== null)?.organizationId;
+ ciphers.find((c) => c.organizationId !== undefined)?.organizationId;
if (orgId && orgId !== "MyVault") {
const organization = this.allOrganizations.find((o) => o.id === orgId);
availableCollections = this.allCollections.filter(
- (c) => c.organizationId === organization.id,
+ (c) => c.organizationId === organization?.id,
);
}
@@ -1229,7 +1227,7 @@ export class VaultComponent implements OnInit, OnDestr
ciphers: ciphersToAssign,
organizationId: orgId as OrganizationId,
availableCollections,
- activeCollection: this.activeFilter?.selectedCollectionNode?.node,
+ activeCollection: this.activeFilter.selectedCollectionNode?.node,
},
});
@@ -1255,7 +1253,7 @@ export class VaultComponent