From 1ffe8e433f5d1be38b4b3a8c7e94e37bb9c76074 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 7 Aug 2025 14:01:33 +0000 Subject: [PATCH 01/50] Bumped client version(s) --- apps/browser/package.json | 2 +- apps/browser/src/manifest.json | 2 +- apps/browser/src/manifest.v3.json | 2 +- package-lock.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/browser/package.json b/apps/browser/package.json index 70dd0d7a241..fe5f3099e14 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.7.0", + "version": "2025.7.1", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index d6cf535b6d2..9322d9167ff 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "Bitwarden", - "version": "2025.7.0", + "version": "2025.7.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 615ae9115b4..3a1537dc4aa 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "Bitwarden", - "version": "2025.7.0", + "version": "2025.7.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/package-lock.json b/package-lock.json index 3bf9db97ddb..524e551914d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -192,7 +192,7 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.7.0" + "version": "2025.7.1" }, "apps/cli": { "name": "@bitwarden/cli", From 46046ca1fa796f7d8a8a4bc2cced97c1b17b915c Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:19:35 -0700 Subject: [PATCH 02/50] fix(change-password-prompt) [Auth/PM-22356] Scope org invite email to submitted email (#15783) Adds a check to make sure that the email on the Org Invite matches the email submitted in the form. If it matches, only then do we apply the org invite to get the MP policies. But if the emails do not match, it means the user attempting to login is no longer the user who originally clicked the emailed org invite link. Therefore, we clear the Org Invite + Deep Link and allow the user to login as normal. --- .../login/web-login-component.service.spec.ts | 76 +++++++++++++------ .../login/web-login-component.service.ts | 19 ++++- .../angular/login/login-component.service.ts | 2 +- .../auth/src/angular/login/login.component.ts | 37 ++++----- 4 files changed, 88 insertions(+), 46 deletions(-) diff --git a/apps/web/src/app/auth/core/services/login/web-login-component.service.spec.ts b/apps/web/src/app/auth/core/services/login/web-login-component.service.spec.ts index 799e10bc15c..8edf98e569e 100644 --- a/apps/web/src/app/auth/core/services/login/web-login-component.service.spec.ts +++ b/apps/web/src/app/auth/core/services/login/web-login-component.service.spec.ts @@ -9,6 +9,7 @@ import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { ResetPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/reset-password-policy-options"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; +import { OrganizationInvite } from "@bitwarden/common/auth/services/organization-invite/organization-invite"; import { OrganizationInviteService } from "@bitwarden/common/auth/services/organization-invite/organization-invite.service"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -86,26 +87,29 @@ describe("WebLoginComponentService", () => { }); describe("getOrgPoliciesFromOrgInvite", () => { + const mockEmail = "test@example.com"; + const orgInvite: OrganizationInvite = { + organizationId: "org-id", + token: "token", + email: mockEmail, + organizationUserId: "org-user-id", + initOrganization: false, + orgSsoIdentifier: "sso-id", + orgUserHasExistingUser: false, + organizationName: "org-name", + }; + it("returns undefined if organization invite is null", async () => { organizationInviteService.getOrganizationInvite.mockResolvedValue(null); - const result = await service.getOrgPoliciesFromOrgInvite(); + const result = await service.getOrgPoliciesFromOrgInvite(mockEmail); expect(result).toBeUndefined(); }); it("logs an error if getPoliciesByToken throws an error", async () => { const error = new Error("Test error"); - organizationInviteService.getOrganizationInvite.mockResolvedValue({ - organizationId: "org-id", - token: "token", - email: "email", - organizationUserId: "org-user-id", - initOrganization: false, - orgSsoIdentifier: "sso-id", - orgUserHasExistingUser: false, - organizationName: "org-name", - }); + organizationInviteService.getOrganizationInvite.mockResolvedValue(orgInvite); policyApiService.getPoliciesByToken.mockRejectedValue(error); - await service.getOrgPoliciesFromOrgInvite(); + await service.getOrgPoliciesFromOrgInvite(mockEmail); expect(logService.error).toHaveBeenCalledWith(error); }); @@ -120,16 +124,7 @@ describe("WebLoginComponentService", () => { const resetPasswordPolicyOptions = new ResetPasswordPolicyOptions(); resetPasswordPolicyOptions.autoEnrollEnabled = autoEnrollEnabled; - organizationInviteService.getOrganizationInvite.mockResolvedValue({ - organizationId: "org-id", - token: "token", - email: "email", - organizationUserId: "org-user-id", - initOrganization: false, - orgSsoIdentifier: "sso-id", - orgUserHasExistingUser: false, - organizationName: "org-name", - }); + organizationInviteService.getOrganizationInvite.mockResolvedValue(orgInvite); policyApiService.getPoliciesByToken.mockResolvedValue(policies); internalPolicyService.getResetPasswordPolicyOptions.mockReturnValue([ @@ -141,7 +136,7 @@ describe("WebLoginComponentService", () => { masterPasswordPolicyOptions, ); - const result = await service.getOrgPoliciesFromOrgInvite(); + const result = await service.getOrgPoliciesFromOrgInvite(mockEmail); expect(result).toEqual({ policies: policies, @@ -151,5 +146,40 @@ describe("WebLoginComponentService", () => { }); }, ); + + describe("given the orgInvite email does not match the provided email", () => { + const mockMismatchedEmail = "mismatched@example.com"; + it("should clear the login redirect URL and organization invite", async () => { + // Arrange + organizationInviteService.getOrganizationInvite.mockResolvedValue({ + ...orgInvite, + email: mockMismatchedEmail, + }); + + // Act + await service.getOrgPoliciesFromOrgInvite(mockEmail); + + // Assert + expect(routerService.getAndClearLoginRedirectUrl).toHaveBeenCalledTimes(1); + expect(organizationInviteService.clearOrganizationInvitation).toHaveBeenCalledTimes(1); + }); + + it("should log an error and return undefined", async () => { + // Arrange + organizationInviteService.getOrganizationInvite.mockResolvedValue({ + ...orgInvite, + email: mockMismatchedEmail, + }); + + // Act + const result = await service.getOrgPoliciesFromOrgInvite(mockEmail); + + // Assert + expect(logService.error).toHaveBeenCalledWith( + `WebLoginComponentService.getOrgPoliciesFromOrgInvite: Email mismatch. Expected: ${mockMismatchedEmail}, Received: ${mockEmail}`, + ); + expect(result).toBeUndefined(); + }); + }); }); }); diff --git a/apps/web/src/app/auth/core/services/login/web-login-component.service.ts b/apps/web/src/app/auth/core/services/login/web-login-component.service.ts index 4ee84ecfde2..5bea0908b0a 100644 --- a/apps/web/src/app/auth/core/services/login/web-login-component.service.ts +++ b/apps/web/src/app/auth/core/services/login/web-login-component.service.ts @@ -66,10 +66,27 @@ export class WebLoginComponentService return; } - async getOrgPoliciesFromOrgInvite(): Promise { + async getOrgPoliciesFromOrgInvite(email: string): Promise { const orgInvite = await this.organizationInviteService.getOrganizationInvite(); if (orgInvite != null) { + /** + * Check if the email on the org invite matches the email submitted in the login form. This is + * important because say userA at "userA@mail.com" clicks an emailed org invite link, but then + * on the login page form they change the email to "userB@mail.com". We don't want to apply the org + * invite in state to userB. Therefore we clear the login redirect url as well as the org invite, + * allowing userB to login as normal. + */ + if (orgInvite.email !== email.toLowerCase()) { + await this.routerService.getAndClearLoginRedirectUrl(); + await this.organizationInviteService.clearOrganizationInvitation(); + + this.logService.error( + `WebLoginComponentService.getOrgPoliciesFromOrgInvite: Email mismatch. Expected: ${orgInvite.email}, Received: ${email}`, + ); + return undefined; + } + let policies: Policy[]; try { diff --git a/libs/auth/src/angular/login/login-component.service.ts b/libs/auth/src/angular/login/login-component.service.ts index 796a01c71c3..5ca83c97c5f 100644 --- a/libs/auth/src/angular/login/login-component.service.ts +++ b/libs/auth/src/angular/login/login-component.service.ts @@ -23,7 +23,7 @@ export abstract class LoginComponentService { * Gets the organization policies if there is an organization invite. * - Used by: Web */ - getOrgPoliciesFromOrgInvite?: () => Promise; + getOrgPoliciesFromOrgInvite?: (email: string) => Promise; /** * Indicates whether login with passkey is supported on the given client diff --git a/libs/auth/src/angular/login/login.component.ts b/libs/auth/src/angular/login/login.component.ts index 2a2be148a86..f2954933bc6 100644 --- a/libs/auth/src/angular/login/login.component.ts +++ b/libs/auth/src/angular/login/login.component.ts @@ -80,6 +80,7 @@ export class LoginComponent implements OnInit, OnDestroy { clientType: ClientType; ClientType = ClientType; + orgPoliciesFromInvite: PasswordPolicies | null = null; LoginUiState = LoginUiState; isKnownDevice = false; loginUiState: LoginUiState = LoginUiState.EMAIL_ENTRY; @@ -232,11 +233,12 @@ export class LoginComponent implements OnInit, OnDestroy { // Try to retrieve any org policies from an org invite now so we can send it to the // login strategies. Since it is optional and we only want to be doing this on the // web we will only send in content in the right context. - const orgPoliciesFromInvite = this.loginComponentService.getOrgPoliciesFromOrgInvite - ? await this.loginComponentService.getOrgPoliciesFromOrgInvite() + this.orgPoliciesFromInvite = this.loginComponentService.getOrgPoliciesFromOrgInvite + ? await this.loginComponentService.getOrgPoliciesFromOrgInvite(email) : null; - const orgMasterPasswordPolicyOptions = orgPoliciesFromInvite?.enforcedPasswordPolicyOptions; + const orgMasterPasswordPolicyOptions = + this.orgPoliciesFromInvite?.enforcedPasswordPolicyOptions; const credentials = new PasswordLoginCredentials( email, @@ -327,25 +329,18 @@ export class LoginComponent implements OnInit, OnDestroy { // TODO: PM-18269 - evaluate if we can combine this with the // password evaluation done in the password login strategy. - // If there's an existing org invite, use it to get the org's password policies - // so we can evaluate the MP against the org policies - if (this.loginComponentService.getOrgPoliciesFromOrgInvite) { - const orgPolicies: PasswordPolicies | null = - await this.loginComponentService.getOrgPoliciesFromOrgInvite(); + if (this.orgPoliciesFromInvite) { + // Since we have retrieved the policies, we can go ahead and set them into state for future use + // e.g., the change-password page currently only references state for policy data and + // doesn't fallback to pulling them from the server like it should if they are null. + await this.setPoliciesIntoState(authResult.userId, this.orgPoliciesFromInvite.policies); - if (orgPolicies) { - // Since we have retrieved the policies, we can go ahead and set them into state for future use - // e.g., the change-password page currently only references state for policy data and - // doesn't fallback to pulling them from the server like it should if they are null. - await this.setPoliciesIntoState(authResult.userId, orgPolicies.policies); - - const isPasswordChangeRequired = await this.isPasswordChangeRequiredByOrgPolicy( - orgPolicies.enforcedPasswordPolicyOptions, - ); - if (isPasswordChangeRequired) { - await this.router.navigate(["change-password"]); - return; - } + const isPasswordChangeRequired = await this.isPasswordChangeRequiredByOrgPolicy( + this.orgPoliciesFromInvite.enforcedPasswordPolicyOptions, + ); + if (isPasswordChangeRequired) { + await this.router.navigate(["change-password"]); + return; } } From f7169e909fec6cc72af101a9845c2206356b97d8 Mon Sep 17 00:00:00 2001 From: Miles Blackwood Date: Thu, 7 Aug 2025 13:12:05 -0400 Subject: [PATCH 03/50] Generate password triggers notifications (#15874) --- .../abstractions/notification.background.ts | 3 +- .../overlay-notifications.background.ts | 11 +---- .../overlay-notifications.background.spec.ts | 12 ------ .../overlay-notifications.background.ts | 16 +++----- .../background/overlay.background.spec.ts | 41 +++++++------------ .../autofill/background/overlay.background.ts | 22 ++++++---- .../autofill-overlay-content.service.ts | 10 +---- .../autofill-overlay-content.service.spec.ts | 24 +++++++++++ .../autofill-overlay-content.service.ts | 12 +++++- .../browser/src/background/main.background.ts | 3 -- 10 files changed, 75 insertions(+), 79 deletions(-) diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index f2152b44862..571d9fbaf5f 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -1,5 +1,6 @@ import { NeverDomains } from "@bitwarden/common/models/domain/domain-service"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { CollectionView } from "../../content/components/common-types"; @@ -17,7 +18,7 @@ interface NotificationQueueMessage { interface AddChangePasswordQueueMessage extends NotificationQueueMessage { type: "change"; - cipherId: string; + cipherId: CipherView["id"]; newPassword: string; } diff --git a/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts index d446e18b480..71452ec975a 100644 --- a/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts @@ -28,19 +28,12 @@ export type ModifyLoginCipherFormData = { newPassword: string; }; -export type ModifyLoginCipherFormDataForTab = Map< - chrome.tabs.Tab["id"], - { uri: string; username: string; password: string; newPassword: string } ->; +export type ModifyLoginCipherFormDataForTab = Map; export type OverlayNotificationsExtensionMessage = { command: string; - uri?: string; - username?: string; - password?: string; - newPassword?: string; details?: AutofillPageDetails; -}; +} & ModifyLoginCipherFormData; type OverlayNotificationsMessageParams = { message: OverlayNotificationsExtensionMessage }; type OverlayNotificationSenderParams = { sender: chrome.runtime.MessageSender }; diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts index 00114330bc4..cf317de4fd2 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts @@ -1,12 +1,9 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EnvironmentServerConfigData } from "@bitwarden/common/platform/models/data/server-config.data"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { TaskService } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; import AutofillField from "../models/autofill-field"; @@ -27,9 +24,6 @@ import { OverlayNotificationsBackground } from "./overlay-notifications.backgrou describe("OverlayNotificationsBackground", () => { let logService: MockProxy; let notificationBackground: NotificationBackground; - let taskService: TaskService; - let accountService: AccountService; - let cipherService: CipherService; let getEnableChangedPasswordPromptSpy: jest.SpyInstance; let getEnableAddedLoginPromptSpy: jest.SpyInstance; let overlayNotificationsBackground: OverlayNotificationsBackground; @@ -38,9 +32,6 @@ describe("OverlayNotificationsBackground", () => { jest.useFakeTimers(); logService = mock(); notificationBackground = mock(); - taskService = mock(); - accountService = mock(); - cipherService = mock(); getEnableChangedPasswordPromptSpy = jest .spyOn(notificationBackground, "getEnableChangedPasswordPrompt") .mockResolvedValue(true); @@ -50,9 +41,6 @@ describe("OverlayNotificationsBackground", () => { overlayNotificationsBackground = new OverlayNotificationsBackground( logService, notificationBackground, - taskService, - accountService, - cipherService, ); await overlayNotificationsBackground.init(); }); diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.ts b/apps/browser/src/autofill/background/overlay-notifications.background.ts index 1d7f2b1f9d8..e7126a57e9f 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.ts @@ -2,11 +2,8 @@ // @ts-strict-ignore import { Subject, switchMap, timer } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { TaskService } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; import { NotificationType, NotificationTypes } from "../notification/abstractions/notification-bar"; @@ -31,6 +28,8 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg private notificationFallbackTimeout: number | NodeJS.Timeout | null; private readonly formSubmissionRequestMethods: Set = new Set(["POST", "PUT", "PATCH"]); private readonly extensionMessageHandlers: OverlayNotificationsExtensionMessageHandlers = { + generatedPasswordFilled: ({ message, sender }) => + this.storeModifiedLoginFormData(message, sender), formFieldSubmitted: ({ message, sender }) => this.storeModifiedLoginFormData(message, sender), collectPageDetailsResponse: ({ message, sender }) => this.handleCollectPageDetailsResponse(message, sender), @@ -39,9 +38,6 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg constructor( private logService: LogService, private notificationBackground: NotificationBackground, - private taskService: TaskService, - private accountService: AccountService, - private cipherService: CipherService, ) {} /** @@ -442,7 +438,7 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg } } - this.clearCompletedWebRequest(requestId, tab); + this.clearCompletedWebRequest(requestId, tab.id); return results.join(" "); }; @@ -482,11 +478,11 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg */ private clearCompletedWebRequest = ( requestId: chrome.webRequest.ResourceRequest["requestId"], - tab: chrome.tabs.Tab, + tabId: chrome.tabs.Tab["id"], ) => { this.activeFormSubmissionRequests.delete(requestId); - this.modifyLoginCipherFormData.delete(tab.id); - this.websiteOriginsWithFields.delete(tab.id); + this.modifyLoginCipherFormData.delete(tabId); + this.websiteOriginsWithFields.delete(tabId); this.setupWebRequestsListeners(); }; diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 92b2135c973..8bee4a4675d 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -49,7 +49,6 @@ import { MAX_SUB_FRAME_DEPTH, RedirectFocusDirection, } from "../enums/autofill-overlay.enum"; -import { InlineMenuFormFieldData } from "../services/abstractions/autofill-overlay-content.service"; import { AutofillService } from "../services/abstractions/autofill.service"; import { InlineMenuFieldQualificationService } from "../services/inline-menu-field-qualification.service"; import { @@ -71,6 +70,7 @@ import { triggerWebRequestOnCompletedEvent, } from "../spec/testing-utils"; +import { ModifyLoginCipherFormData } from "./abstractions/overlay-notifications.background"; import { FocusedFieldData, InlineMenuPosition, @@ -2076,7 +2076,7 @@ describe("OverlayBackground", () => { const tab = createChromeTabMock({ id: 2 }); const sender = mock({ tab, frameId: 100 }); let focusedFieldData: FocusedFieldData; - let formData: InlineMenuFormFieldData; + let formData: ModifyLoginCipherFormData; beforeEach(async () => { await initOverlayElementPorts(); @@ -3651,6 +3651,18 @@ describe("OverlayBackground", () => { }); }); + it("sends a message to the tab to store modify login change when a password is generated", async () => { + jest.useFakeTimers(); + + sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); + + await flushPromises(); + jest.advanceTimersByTime(400); + await flushPromises(); + + expect(tabsSendMessageSpy.mock.lastCall[1].command).toBe("generatedPasswordModifyLogin"); + }); + it("filters the page details to only include the new password fields before filling", async () => { sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); await flushPromises(); @@ -3663,31 +3675,6 @@ describe("OverlayBackground", () => { allowTotpAutofill: false, }); }); - - it("opens the inline menu for fields that fill a generated password", async () => { - jest.useFakeTimers(); - const formData = { - uri: "https://example.com", - username: "username", - password: "password", - newPassword: "newPassword", - }; - tabsSendMessageSpy.mockImplementation((_tab, message) => { - if (message.command === "getInlineMenuFormFieldData") { - return Promise.resolve(formData); - } - - return Promise.resolve(); - }); - const openInlineMenuSpy = jest.spyOn(overlayBackground as any, "openInlineMenu"); - - sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); - await flushPromises(); - jest.advanceTimersByTime(400); - await flushPromises(); - - expect(openInlineMenuSpy).toHaveBeenCalled(); - }); }); }); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index f55b5c8cc3d..4027689f014 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -69,7 +69,6 @@ import { MAX_SUB_FRAME_DEPTH, } from "../enums/autofill-overlay.enum"; import AutofillField from "../models/autofill-field"; -import { InlineMenuFormFieldData } from "../services/abstractions/autofill-overlay-content.service"; import { AutofillService, PageDetail } from "../services/abstractions/autofill.service"; import { InlineMenuFieldQualificationService } from "../services/abstractions/inline-menu-field-qualifications.service"; import { @@ -82,6 +81,7 @@ import { } from "../utils"; import { LockedVaultPendingNotificationsData } from "./abstractions/notification.background"; +import { ModifyLoginCipherFormData } from "./abstractions/overlay-notifications.background"; import { BuildCipherDataParams, CloseInlineMenuMessage, @@ -1813,7 +1813,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { /** * Triggers a fill of the generated password into the current tab. Will trigger - * a focus of the last focused field after filling the password. + * a focus of the last focused field after filling the password. * * @param port - The port of the sender */ @@ -1857,10 +1857,16 @@ export class OverlayBackground implements OverlayBackgroundInterface { }); globalThis.setTimeout(async () => { - if (await this.shouldShowSaveLoginInlineMenuList(port.sender.tab)) { - await this.openInlineMenu(port.sender, true); - } - }, 300); + await BrowserApi.tabSendMessage( + port.sender.tab, + { + command: "generatedPasswordModifyLogin", + }, + { + frameId: this.focusedFieldData.frameId || 0, + }, + ); + }, 150); } /** @@ -1891,7 +1897,9 @@ export class OverlayBackground implements OverlayBackgroundInterface { * * @param tab - The tab to get the form field data from */ - private async getInlineMenuFormFieldData(tab: chrome.tabs.Tab): Promise { + private async getInlineMenuFormFieldData( + tab: chrome.tabs.Tab, + ): Promise { return await BrowserApi.tabSendMessage( tab, { diff --git a/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts index fac6221790f..ddacb547908 100644 --- a/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/abstractions/autofill-overlay-content.service.ts @@ -1,3 +1,4 @@ +import { ModifyLoginCipherFormData } from "../../background/abstractions/overlay-notifications.background"; import { SubFrameOffsetData } from "../../background/abstractions/overlay.background"; import { AutofillExtensionMessageParam } from "../../content/abstractions/autofill-init"; import AutofillField from "../../models/autofill-field"; @@ -8,13 +9,6 @@ export type SubFrameDataFromWindowMessage = SubFrameOffsetData & { subFrameDepth: number; }; -export type InlineMenuFormFieldData = { - uri: string; - username: string; - password: string; - newPassword: string; -}; - export type AutofillOverlayContentExtensionMessageHandlers = { [key: string]: CallableFunction; addNewVaultItemFromOverlay: ({ message }: AutofillExtensionMessageParam) => void; @@ -32,7 +26,7 @@ export type AutofillOverlayContentExtensionMessageHandlers = { destroyAutofillInlineMenuListeners: () => void; getInlineMenuFormFieldData: ({ message, - }: AutofillExtensionMessageParam) => Promise; + }: AutofillExtensionMessageParam) => Promise; }; export interface AutofillOverlayContentService { diff --git a/apps/browser/src/autofill/services/autofill-overlay-content.service.spec.ts b/apps/browser/src/autofill/services/autofill-overlay-content.service.spec.ts index 730b002953b..96b05b81c96 100644 --- a/apps/browser/src/autofill/services/autofill-overlay-content.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill-overlay-content.service.spec.ts @@ -3,6 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { EVENTS } from "@bitwarden/common/autofill/constants"; import { CipherType } from "@bitwarden/common/vault/enums"; +import { ModifyLoginCipherFormData } from "../background/abstractions/overlay-notifications.background"; import AutofillInit from "../content/autofill-init"; import { AutofillOverlayElement, @@ -1750,6 +1751,29 @@ describe("AutofillOverlayContentService", () => { }); describe("extension onMessage handlers", () => { + describe("generatedPasswordModifyLogin", () => { + it("relays a message regarding password generation to store modified login data", async () => { + const formFieldData: ModifyLoginCipherFormData = { + newPassword: "newPassword", + password: "password", + uri: "http://localhost/", + username: "username", + }; + + jest + .spyOn(autofillOverlayContentService as any, "getFormFieldData") + .mockResolvedValue(formFieldData); + + sendMockExtensionMessage({ + command: "generatedPasswordModifyLogin", + }); + await flushPromises(); + + const resolvedValue = await sendExtensionMessageSpy.mock.calls[0][1]; + expect(resolvedValue).toEqual(formFieldData); + }); + }); + describe("addNewVaultItemFromOverlay message handler", () => { it("skips sending the message if the overlay list is not visible", async () => { jest diff --git a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts index 1a972e0eaa0..4db00901759 100644 --- a/apps/browser/src/autofill/services/autofill-overlay-content.service.ts +++ b/apps/browser/src/autofill/services/autofill-overlay-content.service.ts @@ -12,6 +12,7 @@ import { } from "@bitwarden/common/autofill/constants"; import { CipherType } from "@bitwarden/common/vault/enums"; +import { ModifyLoginCipherFormData } from "../background/abstractions/overlay-notifications.background"; import { FocusedFieldData, NewCardCipherData, @@ -48,7 +49,6 @@ import { import { AutofillOverlayContentExtensionMessageHandlers, AutofillOverlayContentService as AutofillOverlayContentServiceInterface, - InlineMenuFormFieldData, SubFrameDataFromWindowMessage, } from "./abstractions/autofill-overlay-content.service"; import { DomElementVisibilityService } from "./abstractions/dom-element-visibility.service"; @@ -95,6 +95,7 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ destroyAutofillInlineMenuListeners: () => this.destroy(), getInlineMenuFormFieldData: ({ message }) => this.handleGetInlineMenuFormFieldDataMessage(message), + generatedPasswordModifyLogin: () => this.sendGeneratedPasswordModifyLogin(), }; private readonly loginFieldQualifiers: Record = { [AutofillFieldQualifier.username]: this.inlineMenuFieldQualificationService.isUsernameField, @@ -235,6 +236,13 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ }); } + /** + * On password generation, send form field data i.e. modified login data + */ + sendGeneratedPasswordModifyLogin = async () => { + await this.sendExtensionMessage("generatedPasswordFilled", this.getFormFieldData()); + }; + /** * Formats any found user filled fields for a login cipher and sends a message * to the background script to add a new cipher. @@ -637,7 +645,7 @@ export class AutofillOverlayContentService implements AutofillOverlayContentServ /** * Returns the form field data used for add login and change password notifications. */ - private getFormFieldData = (): InlineMenuFormFieldData => { + private getFormFieldData = (): ModifyLoginCipherFormData => { return { uri: globalThis.document.URL, username: this.userFilledFields["username"]?.value || "", diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index da5f0fbfc69..9df8ce4d4db 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1258,9 +1258,6 @@ export default class MainBackground { this.overlayNotificationsBackground = new OverlayNotificationsBackground( this.logService, this.notificationBackground, - this.taskService, - this.accountService, - this.cipherService, ); this.autoSubmitLoginBackground = new AutoSubmitLoginBackground( From c3f6892f9ee74fd1200b659878ed76cfde0ce6b9 Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Thu, 7 Aug 2025 19:19:14 +0200 Subject: [PATCH 04/50] [PM-24451] firefox extension crash due to huge memory usage when unlocking vault (#15938) * feat: only set badge state for the active tab * fix: tests * feat: avoid calculating states unecessarily * Revert BrowserApi.removeListener change * Add fatal log on observable failure * Use fromChromeEvent * Remove required-using tests * Only disable some * One of each --------- Co-authored-by: Justin Baur <19896123+justindbaur@users.noreply.github.com> --- .../browser/src/background/main.background.ts | 1 + .../src/platform/badge/badge-browser-api.ts | 9 ++ .../src/platform/badge/badge.service.spec.ts | 62 ++++--------- .../src/platform/badge/badge.service.ts | 66 +++++++------ .../badge/test/mock-badge-browser-api.ts | 12 +++ libs/eslint/platform/required-using.spec.mjs | 92 +++++++++---------- 6 files changed, 115 insertions(+), 127 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 9df8ce4d4db..7208c1bb008 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1372,6 +1372,7 @@ export default class MainBackground { this.badgeService = new BadgeService( this.stateProvider, new DefaultBadgeBrowserApi(this.platformUtilsService), + this.logService, ); this.authStatusBadgeUpdaterService = new AuthStatusBadgeUpdaterService( this.badgeService, diff --git a/apps/browser/src/platform/badge/badge-browser-api.ts b/apps/browser/src/platform/badge/badge-browser-api.ts index 9febaf8d39c..097c6109743 100644 --- a/apps/browser/src/platform/badge/badge-browser-api.ts +++ b/apps/browser/src/platform/badge/badge-browser-api.ts @@ -1,7 +1,10 @@ +import { map, Observable } from "rxjs"; + import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { BrowserApi } from "../browser/browser-api"; +import { fromChromeEvent } from "../browser/from-chrome-event"; import { BadgeIcon, IconPaths } from "./icon"; @@ -13,6 +16,8 @@ export interface RawBadgeState { } export interface BadgeBrowserApi { + activeTab$: Observable; + setState(state: RawBadgeState, tabId?: number): Promise; getTabs(): Promise; } @@ -21,6 +26,10 @@ export class DefaultBadgeBrowserApi implements BadgeBrowserApi { private badgeAction = BrowserApi.getBrowserAction(); private sidebarAction = BrowserApi.getSidebarAction(self); + activeTab$ = fromChromeEvent(chrome.tabs.onActivated).pipe( + map(([tabActiveInfo]) => tabActiveInfo), + ); + constructor(private platformUtilsService: PlatformUtilsService) {} async setState(state: RawBadgeState, tabId?: number): Promise { diff --git a/apps/browser/src/platform/badge/badge.service.spec.ts b/apps/browser/src/platform/badge/badge.service.spec.ts index 2a7ba2ce392..52be2afa71b 100644 --- a/apps/browser/src/platform/badge/badge.service.spec.ts +++ b/apps/browser/src/platform/badge/badge.service.spec.ts @@ -1,5 +1,7 @@ +import { mock, MockProxy } from "jest-mock-extended"; import { Subscription } from "rxjs"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { FakeAccountService, FakeStateProvider } from "@bitwarden/common/spec"; import { RawBadgeState } from "./badge-browser-api"; @@ -13,6 +15,7 @@ import { MockBadgeBrowserApi } from "./test/mock-badge-browser-api"; describe("BadgeService", () => { let badgeApi: MockBadgeBrowserApi; let stateProvider: FakeStateProvider; + let logService!: MockProxy; let badgeService!: BadgeService; let badgeServiceSubscription: Subscription; @@ -20,8 +23,9 @@ describe("BadgeService", () => { beforeEach(() => { badgeApi = new MockBadgeBrowserApi(); stateProvider = new FakeStateProvider(new FakeAccountService({})); + logService = mock(); - badgeService = new BadgeService(stateProvider, badgeApi); + badgeService = new BadgeService(stateProvider, badgeApi, logService); }); afterEach(() => { @@ -34,14 +38,10 @@ describe("BadgeService", () => { describe("given a single tab is open", () => { beforeEach(() => { badgeApi.tabs = [1]; + badgeApi.setActiveTab(tabId); badgeServiceSubscription = badgeService.startListening(); }); - // This relies on the state provider to auto-emit - it("sets default values on startup", async () => { - expect(badgeApi.generalState).toEqual(DefaultBadgeState); - }); - it("sets provided state when no other state has been set", async () => { const state: BadgeState = { text: "text", @@ -52,7 +52,6 @@ describe("BadgeService", () => { await badgeService.setState("state-name", BadgeStatePriority.Default, state); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(state); expect(badgeApi.specificStates[tabId]).toEqual(state); }); @@ -63,7 +62,6 @@ describe("BadgeService", () => { await badgeService.setState("state-name", BadgeStatePriority.Default, state); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(DefaultBadgeState); }); @@ -82,7 +80,6 @@ describe("BadgeService", () => { backgroundColor: "#fff", icon: BadgeIcon.Locked, }; - expect(badgeApi.generalState).toEqual(expectedState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -105,7 +102,6 @@ describe("BadgeService", () => { backgroundColor: "#aaa", icon: BadgeIcon.Locked, }; - expect(badgeApi.generalState).toEqual(expectedState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -126,7 +122,6 @@ describe("BadgeService", () => { backgroundColor: "#fff", icon: BadgeIcon.Locked, }; - expect(badgeApi.generalState).toEqual(expectedState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -147,7 +142,6 @@ describe("BadgeService", () => { await badgeService.clearState("state-3"); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(DefaultBadgeState); }); @@ -167,7 +161,6 @@ describe("BadgeService", () => { backgroundColor: "#fff", icon: DefaultBadgeState.icon, }; - expect(badgeApi.generalState).toEqual(expectedState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -190,26 +183,20 @@ describe("BadgeService", () => { backgroundColor: "#fff", icon: BadgeIcon.Unlocked, }; - expect(badgeApi.generalState).toEqual(expectedState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); }); describe("given multiple tabs are open", () => { + const tabId = 1; const tabIds = [1, 2, 3]; beforeEach(() => { badgeApi.tabs = tabIds; + badgeApi.setActiveTab(tabId); badgeServiceSubscription = badgeService.startListening(); }); - it("sets default values for each tab on startup", async () => { - expect(badgeApi.generalState).toEqual(DefaultBadgeState); - for (const tabId of tabIds) { - expect(badgeApi.specificStates[tabId]).toEqual(DefaultBadgeState); - } - }); - it("sets state for each tab when no other state has been set", async () => { const state: BadgeState = { text: "text", @@ -220,11 +207,10 @@ describe("BadgeService", () => { await badgeService.setState("state-name", BadgeStatePriority.Default, state); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(state); expect(badgeApi.specificStates).toEqual({ 1: state, - 2: state, - 3: state, + 2: undefined, + 3: undefined, }); }); }); @@ -236,6 +222,7 @@ describe("BadgeService", () => { beforeEach(() => { badgeApi.tabs = [tabId]; + badgeApi.setActiveTab(tabId); badgeServiceSubscription = badgeService.startListening(); }); @@ -249,7 +236,6 @@ describe("BadgeService", () => { await badgeService.setState("state-name", BadgeStatePriority.Default, state, tabId); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(state); }); @@ -260,7 +246,6 @@ describe("BadgeService", () => { await badgeService.setState("state-name", BadgeStatePriority.Default, state, tabId); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(DefaultBadgeState); }); @@ -279,11 +264,6 @@ describe("BadgeService", () => { }); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual({ - ...DefaultBadgeState, - text: "text", - icon: BadgeIcon.Locked, - }); expect(badgeApi.specificStates[tabId]).toEqual({ text: "text", backgroundColor: "#fff", @@ -316,7 +296,6 @@ describe("BadgeService", () => { backgroundColor: "#fff", icon: BadgeIcon.Locked, }; - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -354,7 +333,6 @@ describe("BadgeService", () => { backgroundColor: "#aaa", icon: BadgeIcon.Locked, }; - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(expectedState); }); @@ -377,11 +355,6 @@ describe("BadgeService", () => { }); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual({ - text: "override", - backgroundColor: "#aaa", - icon: DefaultBadgeState.icon, - }); expect(badgeApi.specificStates[tabId]).toEqual({ text: "override", backgroundColor: "#aaa", @@ -411,7 +384,6 @@ describe("BadgeService", () => { await badgeService.clearState("state-2"); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual({ text: "text", backgroundColor: "#fff", @@ -451,7 +423,6 @@ describe("BadgeService", () => { await badgeService.clearState("state-3"); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual(DefaultBadgeState); }); @@ -476,7 +447,6 @@ describe("BadgeService", () => { ); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual({ text: "text", backgroundColor: "#fff", @@ -513,7 +483,6 @@ describe("BadgeService", () => { ); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(DefaultBadgeState); expect(badgeApi.specificStates[tabId]).toEqual({ text: "text", backgroundColor: "#fff", @@ -523,14 +492,16 @@ describe("BadgeService", () => { }); describe("given multiple tabs are open", () => { + const tabId = 1; const tabIds = [1, 2, 3]; beforeEach(() => { badgeApi.tabs = tabIds; + badgeApi.setActiveTab(tabId); badgeServiceSubscription = badgeService.startListening(); }); - it("sets tab-specific state for provided tab and general state for the others", async () => { + it("sets tab-specific state for provided tab", async () => { const generalState: BadgeState = { text: "general-text", backgroundColor: "general-color", @@ -550,11 +521,10 @@ describe("BadgeService", () => { ); await new Promise((resolve) => setTimeout(resolve, 0)); - expect(badgeApi.generalState).toEqual(generalState); expect(badgeApi.specificStates).toEqual({ [tabIds[0]]: { ...specificState, backgroundColor: "general-color" }, - [tabIds[1]]: generalState, - [tabIds[2]]: generalState, + [tabIds[1]]: undefined, + [tabIds[2]]: undefined, }); }); }); diff --git a/apps/browser/src/platform/badge/badge.service.ts b/apps/browser/src/platform/badge/badge.service.ts index d48150ac516..b3831530e8d 100644 --- a/apps/browser/src/platform/badge/badge.service.ts +++ b/apps/browser/src/platform/badge/badge.service.ts @@ -1,15 +1,15 @@ import { - defer, + combineLatest, + concatMap, distinctUntilChanged, filter, map, - mergeMap, pairwise, startWith, Subscription, - switchMap, } from "rxjs"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { BADGE_MEMORY, GlobalState, @@ -39,6 +39,7 @@ export class BadgeService { constructor( private stateProvider: StateProvider, private badgeApi: BadgeBrowserApi, + private logService: LogService, ) { this.states = this.stateProvider.getGlobal(BADGE_STATES); } @@ -48,52 +49,47 @@ export class BadgeService { * Without this the service will not be able to update the badge state. */ startListening(): Subscription { - const initialSetup$ = defer(async () => { - const openTabs = await this.badgeApi.getTabs(); - await this.badgeApi.setState(DefaultBadgeState); - for (const tabId of openTabs) { - await this.badgeApi.setState(DefaultBadgeState, tabId); - } - }); - - return initialSetup$ - .pipe( - switchMap(() => this.states.state$), + return combineLatest({ + states: this.states.state$.pipe( startWith({}), distinctUntilChanged(), map((states) => new Set(states ? Object.values(states) : [])), pairwise(), map(([previous, current]) => { const [removed, added] = difference(previous, current); - return { states: current, removed, added }; + return { all: current, removed, added }; }), filter(({ removed, added }) => removed.size > 0 || added.size > 0), - mergeMap(async ({ states, removed, added }) => { - const changed = [...removed, ...added]; - const changedTabIds = new Set( - changed.map((s) => s.tabId).filter((tabId) => tabId !== undefined), - ); - const onlyTabSpecificStatesChanged = changed.every((s) => s.tabId != undefined); - if (onlyTabSpecificStatesChanged) { - // If only tab-specific states changed then we only need to update those specific tabs. - for (const tabId of changedTabIds) { - const newState = this.calculateState(states, tabId); - await this.badgeApi.setState(newState, tabId); - } + ), + activeTab: this.badgeApi.activeTab$.pipe(startWith(undefined)), + }) + .pipe( + concatMap(async ({ states, activeTab }) => { + const changed = [...states.removed, ...states.added]; + + // If the active tab wasn't changed, we don't need to update the badge. + if (!changed.some((s) => s.tabId === activeTab?.tabId || s.tabId === undefined)) { return; } - // If there are any general states that changed then we need to update all tabs. - const openTabs = await this.badgeApi.getTabs(); - const generalState = this.calculateState(states); - await this.badgeApi.setState(generalState); - for (const tabId of openTabs) { - const newState = this.calculateState(states, tabId); - await this.badgeApi.setState(newState, tabId); + try { + const state = this.calculateState(states.all, activeTab?.tabId); + await this.badgeApi.setState(state, activeTab?.tabId); + } catch (error) { + // This usually happens when the user opens a popout because of how the browser treats it + // as a tab in the same window but then won't let you set the badge state for it. + this.logService.warning("Failed to set badge state", error); } }), ) - .subscribe(); + .subscribe({ + error: (err: unknown) => { + this.logService.error( + "Fatal error in badge service observable, badge will fail to update", + err, + ); + }, + }); } /** diff --git a/apps/browser/src/platform/badge/test/mock-badge-browser-api.ts b/apps/browser/src/platform/badge/test/mock-badge-browser-api.ts index 19bde1e1fd8..4f91420b273 100644 --- a/apps/browser/src/platform/badge/test/mock-badge-browser-api.ts +++ b/apps/browser/src/platform/badge/test/mock-badge-browser-api.ts @@ -1,10 +1,22 @@ +import { BehaviorSubject } from "rxjs"; + import { BadgeBrowserApi, RawBadgeState } from "../badge-browser-api"; export class MockBadgeBrowserApi implements BadgeBrowserApi { + private _activeTab$ = new BehaviorSubject(undefined); + activeTab$ = this._activeTab$.asObservable(); + specificStates: Record = {}; generalState?: RawBadgeState; tabs: number[] = []; + setActiveTab(tabId: number) { + this._activeTab$.next({ + tabId, + windowId: 1, + }); + } + setState(state: RawBadgeState, tabId?: number): Promise { if (tabId !== undefined) { this.specificStates[tabId] = state; diff --git a/libs/eslint/platform/required-using.spec.mjs b/libs/eslint/platform/required-using.spec.mjs index d91a0e615e1..7b60060cf51 100644 --- a/libs/eslint/platform/required-using.spec.mjs +++ b/libs/eslint/platform/required-using.spec.mjs @@ -34,14 +34,14 @@ ruleTester.run("required-using", rule.default, { using client = rc.take(); `, }, - { - name: "Function reference with `using`", - code: ` - ${setup} - const t = rc.take; - using client = t(); - `, - }, + // { + // name: "Function reference with `using`", + // code: ` + // ${setup} + // const t = rc.take; + // using client = t(); + // `, + // }, ], invalid: [ { @@ -56,43 +56,43 @@ ruleTester.run("required-using", rule.default, { }, ], }, - { - name: "Assignment without `using`", - code: ` - ${setup} - let client; - client = rc.take(); - `, - errors: [ - { - message: errorMessage, - }, - ], - }, - { - name: "Function reference without `using`", - code: ` - ${setup} - const t = rc.take; - const client = t(); - `, - errors: [ - { - message: errorMessage, - }, - ], - }, - { - name: "Destructuring without `using`", - code: ` - ${setup} - const { value } = rc.take(); - `, - errors: [ - { - message: errorMessage, - }, - ], - }, + // { + // name: "Assignment without `using`", + // code: ` + // ${setup} + // let client; + // client = rc.take(); + // `, + // errors: [ + // { + // message: errorMessage, + // }, + // ], + // }, + // { + // name: "Function reference without `using`", + // code: ` + // ${setup} + // const t = rc.take; + // const client = t(); + // `, + // errors: [ + // { + // message: errorMessage, + // }, + // ], + // }, + // { + // name: "Destructuring without `using`", + // code: ` + // ${setup} + // const { value } = rc.take(); + // `, + // errors: [ + // { + // message: errorMessage, + // }, + // ], + // }, ], }); From 2ef8b1a6bfe2a6676b4f87781d532707a7024afd Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Thu, 7 Aug 2025 13:21:24 -0400 Subject: [PATCH 05/50] [PM-18066] new item details view (#15311) * update item details v2 in libs for new view design. targets web, browser, and desktop --- apps/browser/src/_locales/en/messages.json | 6 + apps/desktop/src/locales/en/messages.json | 8 +- .../emergency-view-dialog.component.spec.ts | 8 + apps/web/src/locales/en/messages.json | 8 +- .../src/vault/components/icon.component.html | 57 +++++-- .../src/vault/components/icon.component.ts | 5 + .../item-details-v2.component.html | 151 +++++++++--------- .../item-details-v2.component.spec.ts | 48 ++++-- .../item-details/item-details-v2.component.ts | 101 ++++++++++-- 9 files changed, 273 insertions(+), 119 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index ad933c24875..f8dde376b35 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -5573,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 8b30bd85ec9..72d40ed750f 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -3620,7 +3620,7 @@ }, "uriMatchDefaultStrategyHint": { "message": "URI match detection is how Bitwarden identifies autofill suggestions.", - "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", @@ -4066,6 +4066,12 @@ } } }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" + }, "enableAutotype": { "message": "Enable Autotype" }, diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.spec.ts b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.spec.ts index b341fc4f8e4..f0ecca1686d 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.spec.ts +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.spec.ts @@ -2,11 +2,14 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { mock } from "jest-mock-extended"; +import { of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -60,6 +63,11 @@ describe("EmergencyViewDialogComponent", () => { { provide: AccountService, useValue: accountService }, { provide: TaskService, useValue: mock() }, { provide: LogService, useValue: mock() }, + { + provide: EnvironmentService, + useValue: { environment$: of({ getIconsUrl: () => "https://icons.example.com" }) }, + }, + { provide: DomainSettingsService, useValue: { showFavicons$: of(true) } }, ], }) .overrideComponent(EmergencyViewDialogComponent, { diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 587dcd84e0c..4eaf141abc2 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -11002,5 +11002,11 @@ }, "providersubCanceledmessage": { "message" : "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/libs/angular/src/vault/components/icon.component.html b/libs/angular/src/vault/components/icon.component.html index 2dae3b26cc5..0f14de64e21 100644 --- a/libs/angular/src/vault/components/icon.component.html +++ b/libs/angular/src/vault/components/icon.component.html @@ -1,19 +1,44 @@ - + +
+ @for (item of showItems(); track item.id; let last = $last) { + - + @if (isOrgIcon(item)) { + + } @else { + + } - - - -
  • - - -
  • - +
    + } + @if (allItems().length === 0) { + + + + + } + @if (hasSmallScreen() && allItems().length > 2 && cipher().collectionIds.length > 1) { + + + } +
    +
    diff --git a/libs/vault/src/cipher-view/item-details/item-details-v2.component.spec.ts b/libs/vault/src/cipher-view/item-details/item-details-v2.component.spec.ts index f093cd020b5..ead2979fac7 100644 --- a/libs/vault/src/cipher-view/item-details/item-details-v2.component.spec.ts +++ b/libs/vault/src/cipher-view/item-details/item-details-v2.component.spec.ts @@ -1,11 +1,17 @@ +import { ComponentRef } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; +import { of } from "rxjs"; // 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 { CollectionView } from "@bitwarden/admin-console/common"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { ClientType } from "@bitwarden/common/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; @@ -14,6 +20,7 @@ import { ItemDetailsV2Component } from "./item-details-v2.component"; describe("ItemDetailsV2Component", () => { let component: ItemDetailsV2Component; let fixture: ComponentFixture; + let componentRef: ComponentRef; const cipher = { id: "cipher1", @@ -46,37 +53,46 @@ describe("ItemDetailsV2Component", () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ItemDetailsV2Component], - providers: [{ provide: I18nService, useValue: { t: (key: string) => key } }], + providers: [ + { provide: I18nService, useValue: { t: (key: string) => key } }, + { provide: PlatformUtilsService, useValue: { getClientType: () => ClientType.Web } }, + { + provide: EnvironmentService, + useValue: { environment$: of({ getIconsUrl: () => "https://icons.example.com" }) }, + }, + { provide: DomainSettingsService, useValue: { showFavicons$: of(true) } }, + ], }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(ItemDetailsV2Component); component = fixture.componentInstance; - component.cipher = cipher; - component.organization = organization; - component.collections = [collection, collection2]; - component.folder = folder; + componentRef = fixture.componentRef; + componentRef.setInput("cipher", cipher); + componentRef.setInput("organization", organization); + componentRef.setInput("collections", [collection, collection2]); + componentRef.setInput("folder", folder); + jest.spyOn(component, "hasSmallScreen").mockReturnValue(false); // Mocking small screen check fixture.detectChanges(); }); it("displays all available fields", () => { const itemName = fixture.debugElement.query(By.css('[data-testid="item-name"]')); - const owner = fixture.debugElement.query(By.css('[data-testid="owner"]')); - const collections = fixture.debugElement.queryAll(By.css('[data-testid="collections"] li')); - const folderElement = fixture.debugElement.query(By.css('[data-testid="folder"]')); + const itemDetailsList = fixture.debugElement.queryAll( + By.css('[data-testid="item-details-list"]'), + ); - expect(itemName.nativeElement.value).toBe(cipher.name); - expect(owner.nativeElement.textContent.trim()).toBe(organization.name); - expect(collections.map((c) => c.nativeElement.textContent.trim())).toEqual([ - collection.name, - collection2.name, - ]); - expect(folderElement.nativeElement.textContent.trim()).toBe(folder.name); + expect(itemName.nativeElement.textContent.trim()).toEqual(cipher.name); + expect(itemDetailsList.length).toBe(4); // Organization, Collection, Collection2, Folder + expect(itemDetailsList[0].nativeElement.textContent.trim()).toContain(organization.name); + expect(itemDetailsList[1].nativeElement.textContent.trim()).toContain(collection.name); + expect(itemDetailsList[2].nativeElement.textContent.trim()).toContain(collection2.name); + expect(itemDetailsList[3].nativeElement.textContent.trim()).toContain(folder.name); }); it("does not render owner when `hideOwner` is true", () => { - component.hideOwner = true; + componentRef.setInput("hideOwner", true); fixture.detectChanges(); const owner = fixture.debugElement.query(By.css('[data-testid="owner"]')); diff --git a/libs/vault/src/cipher-view/item-details/item-details-v2.component.ts b/libs/vault/src/cipher-view/item-details/item-details-v2.component.ts index 8f0fedbe599..6ccd0b7ee61 100644 --- a/libs/vault/src/cipher-view/item-details/item-details-v2.component.ts +++ b/libs/vault/src/cipher-view/item-details/item-details-v2.component.ts @@ -1,19 +1,22 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { CommonModule } from "@angular/common"; -import { Component, Input } from "@angular/core"; - +import { Component, computed, input, signal } from "@angular/core"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. +import { toSignal } from "@angular/core/rxjs-interop"; +import { fromEvent, map, startWith } from "rxjs"; + // eslint-disable-next-line no-restricted-imports import { CollectionView } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { + ButtonLinkDirective, CardComponent, FormFieldModule, - SectionHeaderComponent, TypographyModule, } from "@bitwarden/components"; @@ -26,20 +29,96 @@ import { OrgIconDirective } from "../../components/org-icon.directive"; CommonModule, JslibModule, CardComponent, - SectionHeaderComponent, TypographyModule, OrgIconDirective, FormFieldModule, + ButtonLinkDirective, ], }) export class ItemDetailsV2Component { - @Input() cipher: CipherView; - @Input() organization?: Organization; - @Input() collections?: CollectionView[]; - @Input() folder?: FolderView; - @Input() hideOwner?: boolean = false; + hideOwner = input(false); + cipher = input.required(); + organization = input(); + folder = input(); + collections = input(); + showAllDetails = signal(false); - get showOwnership() { - return this.cipher.organizationId && this.organization && !this.hideOwner; + showOwnership = computed(() => { + return this.cipher().organizationId && this.organization() && !this.hideOwner(); + }); + + hasSmallScreen = toSignal( + fromEvent(window, "resize").pipe( + map(() => window.innerWidth), + startWith(window.innerWidth), + map((width) => width < 681), + ), + ); + + // Array to hold all details of item. Organization, Collections, and Folder + allItems = computed(() => { + let items: any[] = []; + if (this.showOwnership() && this.organization()) { + items.push(this.organization()); + } + if (this.cipher().collectionIds?.length > 0 && this.collections()) { + items = [...items, ...this.collections()]; + } + if (this.cipher().folderId && this.folder()) { + items.push(this.folder()); + } + return items; + }); + + showItems = computed(() => { + if ( + this.hasSmallScreen() && + this.allItems().length > 2 && + !this.showAllDetails() && + this.cipher().collectionIds?.length > 1 + ) { + return this.allItems().slice(0, 2); + } else { + return this.allItems(); + } + }); + + constructor(private i18nService: I18nService) {} + + toggleShowMore() { + this.showAllDetails.update((value) => !value); + } + + getAriaLabel(item: Organization | CollectionView | FolderView): string { + if (item instanceof Organization) { + return this.i18nService.t("owner") + item.name; + } else if (item instanceof CollectionView) { + return this.i18nService.t("collection") + item.name; + } else if (item instanceof FolderView) { + return this.i18nService.t("folder") + item.name; + } + return ""; + } + + getIconClass(item: Organization | CollectionView | FolderView): string { + if (item instanceof CollectionView) { + return "bwi-collection-shared"; + } else if (item instanceof FolderView) { + return "bwi-folder"; + } + return ""; + } + + getItemTitle(item: Organization | CollectionView | FolderView): string { + if (item instanceof CollectionView) { + return this.i18nService.t("collection"); + } else if (item instanceof FolderView) { + return this.i18nService.t("folder"); + } + return ""; + } + + isOrgIcon(item: Organization | CollectionView | FolderView): boolean { + return item instanceof Organization; } } From b57238ca991b0629d7ec7d3d41bc3328394c2bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Thu, 7 Aug 2025 20:34:03 +0200 Subject: [PATCH 06/50] [PM-23663] Update yao-pkg and migrate CLI to Node 22 (#15622) --- .github/workflows/build-cli.yml | 5 +- apps/cli/.nvmrc | 1 - apps/cli/package.json | 4 - package-lock.json | 127 ++++++++++++++++++++++++++++---- package.json | 2 +- 5 files changed, 117 insertions(+), 22 deletions(-) delete mode 100644 apps/cli/.nvmrc diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index b31b22b926e..73b765f207a 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -71,6 +71,7 @@ jobs: - name: Get Node Version id: retrieve-node-version + working-directory: ./ run: | NODE_NVMRC=$(cat .nvmrc) NODE_VERSION=${NODE_NVMRC/v/''} @@ -104,7 +105,7 @@ jobs: env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_FETCH_VERSION: 22.15.1 _WIN_PKG_VERSION: 3.5 permissions: contents: read @@ -283,7 +284,7 @@ jobs: env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_FETCH_VERSION: 22.15.1 _WIN_PKG_VERSION: 3.5 steps: - name: Check out repo diff --git a/apps/cli/.nvmrc b/apps/cli/.nvmrc deleted file mode 100644 index 9a2a0e219c9..00000000000 --- a/apps/cli/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v20 diff --git a/apps/cli/package.json b/apps/cli/package.json index 0d3c151f012..a4ff56206e4 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -90,9 +90,5 @@ "semver": "7.7.2", "tldts": "7.0.1", "zxcvbn": "4.4.2" - }, - "engines": { - "node": "~20", - "npm": "~10" } } diff --git a/package-lock.json b/package-lock.json index 524e551914d..715ccd8bff1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,7 +120,7 @@ "@typescript-eslint/rule-tester": "8.31.0", "@typescript-eslint/utils": "8.31.0", "@webcomponents/custom-elements": "1.6.0", - "@yao-pkg/pkg": "5.16.1", + "@yao-pkg/pkg": "6.5.1", "angular-eslint": "19.6.0", "autoprefixer": "10.4.21", "axe-playwright": "2.1.0", @@ -229,10 +229,6 @@ }, "bin": { "bw": "build/bw.js" - }, - "engines": { - "node": "~20", - "npm": "~10" } }, "apps/cli/node_modules/define-lazy-prop": { @@ -14132,34 +14128,39 @@ "license": "Apache-2.0" }, "node_modules/@yao-pkg/pkg": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-5.16.1.tgz", - "integrity": "sha512-crUlnNFSReFNFuXDc4f3X2ignkFlc9kmEG7Bp/mJMA1jYyqR0lqjZGLgrSDYTYiNsYud8AzgA3RY1DrMdcUZWg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.5.1.tgz", + "integrity": "sha512-z6XlySYfnqfm1AfVlBN8A3yeAQniIwL7TKQfDCGsswYSVYLt2snbRefQYsfQQ3pw5lVXrZdLqgTjzaqID9IkWA==", "dev": true, "license": "MIT", "dependencies": { "@babel/generator": "^7.23.0", "@babel/parser": "^7.23.0", "@babel/types": "^7.23.0", - "@yao-pkg/pkg-fetch": "3.5.16", + "@yao-pkg/pkg-fetch": "3.5.23", "into-stream": "^6.0.0", "minimist": "^1.2.6", "multistream": "^4.1.0", "picocolors": "^1.1.0", "picomatch": "^4.0.2", "prebuild-install": "^7.1.1", - "resolve": "^1.22.0", + "resolve": "^1.22.10", "stream-meter": "^1.0.4", - "tinyglobby": "^0.2.9" + "tar": "^7.4.3", + "tinyglobby": "^0.2.11", + "unzipper": "^0.12.3" }, "bin": { "pkg": "lib-es5/bin.js" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@yao-pkg/pkg-fetch": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.16.tgz", - "integrity": "sha512-mCnZvZz0/Ylpk4TGyt34pqWJyBGYJM8c3dPoMRV8Knodv2QhcYS4iXb5kB/JNWkrRtCKukGZIKkMLXZ3TQlzPg==", + "version": "3.5.23", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.23.tgz", + "integrity": "sha512-rn45sqVQSkcJNSBdTnYze3n+kyub4CN8aiWYlPgA9yp9FZeEF+BlpL68kSIm3HaVuANniF+7RBMH5DkC4zlHZA==", "dev": true, "license": "MIT", "dependencies": { @@ -14261,6 +14262,73 @@ "node": ">=10" } }, + "node_modules/@yao-pkg/pkg/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@yao-pkg/pkg/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@yao-pkg/pkg/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@yao-pkg/pkg/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@yao-pkg/pkg/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -15769,6 +15837,13 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -18881,6 +18956,16 @@ "dev": true, "license": "MIT" }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -37611,6 +37696,20 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.9.1" } }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", diff --git a/package.json b/package.json index 6f79985c9df..0d8ba9989b4 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@typescript-eslint/rule-tester": "8.31.0", "@typescript-eslint/utils": "8.31.0", "@webcomponents/custom-elements": "1.6.0", - "@yao-pkg/pkg": "5.16.1", + "@yao-pkg/pkg": "6.5.1", "angular-eslint": "19.6.0", "autoprefixer": "10.4.21", "axe-playwright": "2.1.0", From c5e5417abf468e84502b6073545abed90daa974e Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Thu, 7 Aug 2025 13:46:02 -0700 Subject: [PATCH 07/50] fix(device-management-sorting): [Auth/PM-24046] Device Management Sorting (#15889) This PR makes it so the devices are always sorted in this order (by default): 1. Has Pending Auth Request (if any) comes first 2. Current Device comes second (or first if there are no pending auth requests) 3. First Login Date - the rest of the devices are sorted by first login date (newest to oldest) This sort order is preserved even after a user approves/denies and auth request - that is, the approved/denied device will re-sort to its correct position according to it's first login date. Feature Flag: `PM14938_BrowserExtensionLoginApproval` --- ...evice-management-item-group.component.html | 5 ++- .../device-management-item-group.component.ts | 26 +++------------ .../device-management-table.component.html | 16 +++------ .../device-management-table.component.ts | 32 ++++-------------- .../device-management.component.html | 2 ++ .../device-management.component.ts | 33 ++++++++++++++++--- .../resort-devices.helper.ts | 8 ++--- 7 files changed, 51 insertions(+), 71 deletions(-) diff --git a/libs/angular/src/auth/device-management/device-management-item-group.component.html b/libs/angular/src/auth/device-management/device-management-item-group.component.html index b47408059a2..b6a3ea2d8f8 100644 --- a/libs/angular/src/auth/device-management/device-management-item-group.component.html +++ b/libs/angular/src/auth/device-management/device-management-item-group.component.html @@ -6,8 +6,7 @@ bit-item-content type="button" [attr.tabindex]="device.pendingAuthRequest != null ? 0 : null" - (click)="approveOrDenyAuthRequest(device.pendingAuthRequest)" - (keydown.enter)="approveOrDenyAuthRequest(device.pendingAuthRequest)" + (click)="answerAuthRequest(device.pendingAuthRequest)" > {{ device.displayName }} @@ -21,7 +20,7 @@ - {{ "needsApproval" | i18n }} +
    {{ "firstLogin" | i18n }}: {{ device.firstLogin | date: "medium" }} diff --git a/libs/angular/src/auth/device-management/device-management-item-group.component.ts b/libs/angular/src/auth/device-management/device-management-item-group.component.ts index 864712ceb78..71e343e734f 100644 --- a/libs/angular/src/auth/device-management/device-management-item-group.component.ts +++ b/libs/angular/src/auth/device-management/device-management-item-group.component.ts @@ -1,15 +1,11 @@ import { CommonModule } from "@angular/common"; -import { Component, Input } from "@angular/core"; -import { firstValueFrom } from "rxjs"; +import { Component, EventEmitter, Input, Output } from "@angular/core"; import { DevicePendingAuthRequest } from "@bitwarden/common/auth/abstractions/devices/responses/device.response"; -import { BadgeModule, DialogService, ItemModule } from "@bitwarden/components"; +import { BadgeModule, ItemModule } from "@bitwarden/components"; import { I18nPipe } from "@bitwarden/ui-common"; -import { LoginApprovalDialogComponent } from "../login-approval/login-approval-dialog.component"; - import { DeviceDisplayData } from "./device-management.component"; -import { clearAuthRequestAndResortDevices } from "./resort-devices.helper"; /** Displays user devices in an item list view */ @Component({ @@ -20,24 +16,12 @@ import { clearAuthRequestAndResortDevices } from "./resort-devices.helper"; }) export class DeviceManagementItemGroupComponent { @Input() devices: DeviceDisplayData[] = []; + @Output() onAuthRequestAnswered = new EventEmitter(); - constructor(private dialogService: DialogService) {} - - protected async approveOrDenyAuthRequest(pendingAuthRequest: DevicePendingAuthRequest | null) { + protected answerAuthRequest(pendingAuthRequest: DevicePendingAuthRequest | null) { if (pendingAuthRequest == null) { return; } - - const loginApprovalDialog = LoginApprovalDialogComponent.open(this.dialogService, { - notificationId: pendingAuthRequest.id, - }); - - const result = await firstValueFrom(loginApprovalDialog.closed); - - if (result !== undefined && typeof result === "boolean") { - // Auth request was approved or denied, so clear the - // pending auth request and re-sort the device array - this.devices = clearAuthRequestAndResortDevices(this.devices, pendingAuthRequest); - } + this.onAuthRequestAnswered.emit(pendingAuthRequest); } } diff --git a/libs/angular/src/auth/device-management/device-management-table.component.html b/libs/angular/src/auth/device-management/device-management-table.component.html index febb0a96a4e..72187b2a2fc 100644 --- a/libs/angular/src/auth/device-management/device-management-table.component.html +++ b/libs/angular/src/auth/device-management/device-management-table.component.html @@ -1,4 +1,4 @@ - + @@ -17,24 +16,17 @@ - +
    @if (device.pendingAuthRequest) { - + {{ device.displayName }} -
    - {{ "needsApproval" | i18n }} -
    +
    } @else { {{ device.displayName }}
    diff --git a/libs/angular/src/auth/device-management/device-management-table.component.ts b/libs/angular/src/auth/device-management/device-management-table.component.ts index c3c835f05ed..d663e28b9e4 100644 --- a/libs/angular/src/auth/device-management/device-management-table.component.ts +++ b/libs/angular/src/auth/device-management/device-management-table.component.ts @@ -1,6 +1,5 @@ import { CommonModule } from "@angular/common"; -import { Component, Input, OnChanges, SimpleChanges } from "@angular/core"; -import { firstValueFrom } from "rxjs"; +import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from "@angular/core"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { DevicePendingAuthRequest } from "@bitwarden/common/auth/abstractions/devices/responses/device.response"; @@ -8,16 +7,12 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { BadgeModule, ButtonModule, - DialogService, LinkModule, TableDataSource, TableModule, } from "@bitwarden/components"; -import { LoginApprovalDialogComponent } from "../login-approval/login-approval-dialog.component"; - import { DeviceDisplayData } from "./device-management.component"; -import { clearAuthRequestAndResortDevices } from "./resort-devices.helper"; /** Displays user devices in a sortable table view */ @Component({ @@ -28,6 +23,8 @@ import { clearAuthRequestAndResortDevices } from "./resort-devices.helper"; }) export class DeviceManagementTableComponent implements OnChanges { @Input() devices: DeviceDisplayData[] = []; + @Output() onAuthRequestAnswered = new EventEmitter(); + protected tableDataSource = new TableDataSource(); protected readonly columnConfig = [ @@ -51,10 +48,7 @@ export class DeviceManagementTableComponent implements OnChanges { }, ]; - constructor( - private i18nService: I18nService, - private dialogService: DialogService, - ) {} + constructor(private i18nService: I18nService) {} ngOnChanges(changes: SimpleChanges): void { if (changes.devices) { @@ -62,24 +56,10 @@ export class DeviceManagementTableComponent implements OnChanges { } } - protected async approveOrDenyAuthRequest(pendingAuthRequest: DevicePendingAuthRequest | null) { + protected answerAuthRequest(pendingAuthRequest: DevicePendingAuthRequest | null) { if (pendingAuthRequest == null) { return; } - - const loginApprovalDialog = LoginApprovalDialogComponent.open(this.dialogService, { - notificationId: pendingAuthRequest.id, - }); - - const result = await firstValueFrom(loginApprovalDialog.closed); - - if (result !== undefined && typeof result === "boolean") { - // Auth request was approved or denied, so clear the - // pending auth request and re-sort the device array - this.tableDataSource.data = clearAuthRequestAndResortDevices( - this.devices, - pendingAuthRequest, - ); - } + this.onAuthRequestAnswered.emit(pendingAuthRequest); } } diff --git a/libs/angular/src/auth/device-management/device-management.component.html b/libs/angular/src/auth/device-management/device-management.component.html index 6ee50a32e8e..2a91c2daae2 100644 --- a/libs/angular/src/auth/device-management/device-management.component.html +++ b/libs/angular/src/auth/device-management/device-management.component.html @@ -30,11 +30,13 @@ } diff --git a/libs/angular/src/auth/device-management/device-management.component.ts b/libs/angular/src/auth/device-management/device-management.component.ts index dc7700a9410..3ab9b2146c5 100644 --- a/libs/angular/src/auth/device-management/device-management.component.ts +++ b/libs/angular/src/auth/device-management/device-management.component.ts @@ -16,14 +16,18 @@ import { DeviceType, DeviceTypeMetadata } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { MessageListener } from "@bitwarden/common/platform/messaging"; -import { ButtonModule, PopoverModule } from "@bitwarden/components"; +import { ButtonModule, DialogService, PopoverModule } from "@bitwarden/components"; import { I18nPipe } from "@bitwarden/ui-common"; +import { LoginApprovalDialogComponent } from "../login-approval"; + import { DeviceManagementComponentServiceAbstraction } from "./device-management-component.service.abstraction"; import { DeviceManagementItemGroupComponent } from "./device-management-item-group.component"; import { DeviceManagementTableComponent } from "./device-management-table.component"; +import { clearAuthRequestAndResortDevices, resortDevices } from "./resort-devices.helper"; export interface DeviceDisplayData { + creationDate: string; displayName: string; firstLogin: Date; icon: string; @@ -66,6 +70,7 @@ export class DeviceManagementComponent implements OnInit { private destroyRef: DestroyRef, private deviceManagementComponentService: DeviceManagementComponentServiceAbstraction, private devicesService: DevicesServiceAbstraction, + private dialogService: DialogService, private i18nService: I18nService, private messageListener: MessageListener, private validationService: ValidationService, @@ -130,6 +135,7 @@ export class DeviceManagementComponent implements OnInit { } return { + creationDate: device.creationDate, displayName: this.devicesService.getReadableDeviceTypeName(device.type), firstLogin: device.creationDate ? new Date(device.creationDate) : new Date(), icon: this.getDeviceIcon(device.type), @@ -141,7 +147,8 @@ export class DeviceManagementComponent implements OnInit { pendingAuthRequest: device.response?.devicePendingAuthRequest ?? null, }; }) - .filter((device) => device !== null); + .filter((device) => device !== null) + .sort(resortDevices); } private async upsertDeviceWithPendingAuthRequest(authRequestId: string) { @@ -151,6 +158,7 @@ export class DeviceManagementComponent implements OnInit { } const upsertDevice: DeviceDisplayData = { + creationDate: "", displayName: this.devicesService.getReadableDeviceTypeName( authRequestResponse.requestDeviceTypeValue, ), @@ -174,8 +182,9 @@ export class DeviceManagementComponent implements OnInit { ); if (existingDevice?.id && existingDevice.creationDate) { - upsertDevice.id = existingDevice.id; + upsertDevice.creationDate = existingDevice.creationDate; upsertDevice.firstLogin = new Date(existingDevice.creationDate); + upsertDevice.id = existingDevice.id; } } @@ -186,10 +195,10 @@ export class DeviceManagementComponent implements OnInit { if (existingDeviceIndex >= 0) { // Update existing device in device list this.devices[existingDeviceIndex] = upsertDevice; - this.devices = [...this.devices]; + this.devices = [...this.devices].sort(resortDevices); } else { // Add new device to device list - this.devices = [upsertDevice, ...this.devices]; + this.devices = [upsertDevice, ...this.devices].sort(resortDevices); } } @@ -227,4 +236,18 @@ export class DeviceManagementComponent implements OnInit { const metadata = DeviceTypeMetadata[type]; return metadata ? (categoryIconMap[metadata.category] ?? defaultIcon) : defaultIcon; } + + protected async handleAuthRequestAnswered(pendingAuthRequest: DevicePendingAuthRequest) { + const loginApprovalDialog = LoginApprovalDialogComponent.open(this.dialogService, { + notificationId: pendingAuthRequest.id, + }); + + const result = await firstValueFrom(loginApprovalDialog.closed); + + if (result !== undefined && typeof result === "boolean") { + // Auth request was approved or denied, so clear the + // pending auth request and re-sort the device array + this.devices = clearAuthRequestAndResortDevices(this.devices, pendingAuthRequest); + } + } } diff --git a/libs/angular/src/auth/device-management/resort-devices.helper.ts b/libs/angular/src/auth/device-management/resort-devices.helper.ts index e739e943ee8..01661c18ef3 100644 --- a/libs/angular/src/auth/device-management/resort-devices.helper.ts +++ b/libs/angular/src/auth/device-management/resort-devices.helper.ts @@ -23,7 +23,7 @@ export function clearAuthRequestAndResortDevices( * * This is a helper function that gets passed to the `Array.sort()` method */ -function resortDevices(deviceA: DeviceDisplayData, deviceB: DeviceDisplayData) { +export function resortDevices(deviceA: DeviceDisplayData, deviceB: DeviceDisplayData) { // Devices with a pending auth request should be first if (deviceA.pendingAuthRequest) { return -1; @@ -40,11 +40,11 @@ function resortDevices(deviceA: DeviceDisplayData, deviceB: DeviceDisplayData) { return 1; } - // Then sort the rest by display name (alphabetically) - if (deviceA.displayName < deviceB.displayName) { + // Then sort the rest by creation date (newest to oldest) + if (deviceA.creationDate > deviceB.creationDate) { return -1; } - if (deviceA.displayName > deviceB.displayName) { + if (deviceA.creationDate < deviceB.creationDate) { return 1; } From a139fb5def8caabeb38c8518e5c1ec7b2b8e8ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Tom=C3=A9?= <108268980+r-tome@users.noreply.github.com> Date: Fri, 8 Aug 2025 13:53:27 +0100 Subject: [PATCH 08/50] [PM-24433] Update the CLI confirm org-member command to create a default collection (#15917) * Update the CLI ConfirmCommand to send the DefaultUserCollectionName for default collection creation * Add "My Items" message to CLI * Refactor ConfirmCommand to encapsulate default user collection name encryption in a separate method --- .../admin-console/commands/confirm.command.ts | 20 +++++++++++++++++++ apps/cli/src/locales/en/messages.json | 3 +++ apps/cli/src/oss-serve-configurator.ts | 2 ++ apps/cli/src/vault.program.ts | 2 ++ 4 files changed, 27 insertions(+) diff --git a/apps/cli/src/admin-console/commands/confirm.command.ts b/apps/cli/src/admin-console/commands/confirm.command.ts index 1c900511499..f2965a23402 100644 --- a/apps/cli/src/admin-console/commands/confirm.command.ts +++ b/apps/cli/src/admin-console/commands/confirm.command.ts @@ -1,13 +1,20 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { firstValueFrom } from "rxjs"; + import { OrganizationUserApiService, OrganizationUserConfirmRequest, } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { OrgKey } from "@bitwarden/common/types/key"; import { KeyService } from "@bitwarden/key-management"; +import { EncString } from "@bitwarden/sdk-internal"; import { Response } from "../../models/response"; @@ -17,6 +24,8 @@ export class ConfirmCommand { private keyService: KeyService, private encryptService: EncryptService, private organizationUserApiService: OrganizationUserApiService, + private configService: ConfigService, + private i18nService: I18nService, ) {} async run(object: string, id: string, cmdOptions: Record): Promise { @@ -60,6 +69,11 @@ export class ConfirmCommand { const key = await this.encryptService.encapsulateKeyUnsigned(orgKey, publicKey); const req = new OrganizationUserConfirmRequest(); req.key = key.encryptedString; + if ( + await firstValueFrom(this.configService.getFeatureFlag$(FeatureFlag.CreateDefaultLocation)) + ) { + req.defaultUserCollectionName = await this.getEncryptedDefaultUserCollectionName(orgKey); + } await this.organizationUserApiService.postOrganizationUserConfirm( options.organizationId, id, @@ -70,6 +84,12 @@ export class ConfirmCommand { return Response.error(e); } } + + private async getEncryptedDefaultUserCollectionName(orgKey: OrgKey): Promise { + const defaultCollectionName = this.i18nService.t("myItems"); + const encrypted = await this.encryptService.encryptString(defaultCollectionName, orgKey); + return encrypted.encryptedString; + } } class Options { diff --git a/apps/cli/src/locales/en/messages.json b/apps/cli/src/locales/en/messages.json index 815939c0c95..cb7f89781dd 100644 --- a/apps/cli/src/locales/en/messages.json +++ b/apps/cli/src/locales/en/messages.json @@ -215,5 +215,8 @@ }, "youHaveBeenLoggedOut": { "message": "You have been logged out." + }, + "myItems": { + "message": "My Items" } } diff --git a/apps/cli/src/oss-serve-configurator.ts b/apps/cli/src/oss-serve-configurator.ts index a460fa270a8..760fa8935b6 100644 --- a/apps/cli/src/oss-serve-configurator.ts +++ b/apps/cli/src/oss-serve-configurator.ts @@ -131,6 +131,8 @@ export class OssServeConfigurator { this.serviceContainer.keyService, this.serviceContainer.encryptService, this.serviceContainer.organizationUserApiService, + this.serviceContainer.configService, + this.serviceContainer.i18nService, ); this.restoreCommand = new RestoreCommand( this.serviceContainer.cipherService, diff --git a/apps/cli/src/vault.program.ts b/apps/cli/src/vault.program.ts index bdcc52393ca..dfd18570e42 100644 --- a/apps/cli/src/vault.program.ts +++ b/apps/cli/src/vault.program.ts @@ -432,6 +432,8 @@ export class VaultProgram extends BaseProgram { this.serviceContainer.keyService, this.serviceContainer.encryptService, this.serviceContainer.organizationUserApiService, + this.serviceContainer.configService, + this.serviceContainer.i18nService, ); const response = await command.run(object, id, cmd); this.processResponse(response); From 7835d014564c282898da13e13762c143e6e15a36 Mon Sep 17 00:00:00 2001 From: bitwarden-charlie Date: Fri, 8 Aug 2025 09:26:03 -0500 Subject: [PATCH 09/50] chore/SRE-583 Deprecate usage of Auth-Email Header (#14418) * chore/SRE-583 Deprecate usage of Auth-Email Header * SRE-583 additional cleanup * SRE-583 removed Utils * SRE-583 formatting --------- Co-authored-by: sneakernuts <671942+sneakernuts@users.noreply.github.com> --- .../models/request/identity-token/password-token.request.ts | 5 ----- .../src/auth/models/request/identity-token/token.request.ts | 4 ---- libs/common/src/services/api.service.ts | 1 - 3 files changed, 10 deletions(-) diff --git a/libs/common/src/auth/models/request/identity-token/password-token.request.ts b/libs/common/src/auth/models/request/identity-token/password-token.request.ts index 4f2313473da..6cbfa1ec654 100644 --- a/libs/common/src/auth/models/request/identity-token/password-token.request.ts +++ b/libs/common/src/auth/models/request/identity-token/password-token.request.ts @@ -1,5 +1,4 @@ import { ClientType } from "../../../../enums"; -import { Utils } from "../../../../platform/misc/utils"; import { DeviceRequest } from "./device.request"; import { TokenTwoFactorRequest } from "./token-two-factor.request"; @@ -30,10 +29,6 @@ export class PasswordTokenRequest extends TokenRequest { return obj; } - alterIdentityTokenHeaders(headers: Headers) { - headers.set("Auth-Email", Utils.fromUtf8ToUrlB64(this.email)); - } - static fromJSON(json: any) { return Object.assign(Object.create(PasswordTokenRequest.prototype), json, { device: json.device ? DeviceRequest.fromJSON(json.device) : undefined, diff --git a/libs/common/src/auth/models/request/identity-token/token.request.ts b/libs/common/src/auth/models/request/identity-token/token.request.ts index 497038878d0..9eb41aca6d7 100644 --- a/libs/common/src/auth/models/request/identity-token/token.request.ts +++ b/libs/common/src/auth/models/request/identity-token/token.request.ts @@ -14,10 +14,6 @@ export abstract class TokenRequest { this.device = device != null ? device : null; } - alterIdentityTokenHeaders(headers: Headers) { - // Implemented in subclass if required - } - setTwoFactor(twoFactor: TokenTwoFactorRequest | undefined) { this.twoFactor = twoFactor; } diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 62d300fc029..9168f43b360 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -197,7 +197,6 @@ export class ApiService implements ApiServiceAbstraction { if (this.customUserAgent != null) { headers.set("User-Agent", this.customUserAgent); } - request.alterIdentityTokenHeaders(headers); const identityToken = request instanceof UserApiTokenRequest From a75f9dc9f0da9bcd8b27675ec164d41c494c2e7f Mon Sep 17 00:00:00 2001 From: Stephon Brown Date: Fri, 8 Aug 2025 11:33:34 -0400 Subject: [PATCH 10/50] Billing/pm 22625/tax id should not be saved when hidden (#15905) * fix: add logic for ngOnUpdate * fix: use markAsTouched function * tests: add component tests --- .../manage-tax-information.component.spec.ts | 262 ++++++++++++++++++ .../manage-tax-information.component.ts | 24 +- 2 files changed, 282 insertions(+), 4 deletions(-) create mode 100644 libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.spec.ts diff --git a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.spec.ts b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.spec.ts new file mode 100644 index 00000000000..c662e20b275 --- /dev/null +++ b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.spec.ts @@ -0,0 +1,262 @@ +import { CommonModule } from "@angular/common"; +import { SimpleChange } from "@angular/core"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { ReactiveFormsModule } from "@angular/forms"; +import { mock, MockProxy } from "jest-mock-extended"; + +import { TaxServiceAbstraction } from "@bitwarden/common/billing/abstractions/tax.service.abstraction"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SelectModule, FormFieldModule, BitSubmitDirective } from "@bitwarden/components"; +import { I18nPipe } from "@bitwarden/ui-common"; + +import { ManageTaxInformationComponent } from "./manage-tax-information.component"; + +describe("ManageTaxInformationComponent", () => { + let sut: ManageTaxInformationComponent; + let fixture: ComponentFixture; + let mockTaxService: MockProxy; + + beforeEach(async () => { + mockTaxService = mock(); + await TestBed.configureTestingModule({ + declarations: [ManageTaxInformationComponent], + providers: [ + { provide: TaxServiceAbstraction, useValue: mockTaxService }, + { provide: I18nService, useValue: { t: (key: string) => key } }, + ], + imports: [ + CommonModule, + ReactiveFormsModule, + SelectModule, + FormFieldModule, + BitSubmitDirective, + I18nPipe, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(ManageTaxInformationComponent); + sut = fixture.componentInstance; + fixture.autoDetectChanges(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("creates successfully", () => { + expect(sut).toBeTruthy(); + }); + + it("should initialize with all values empty in startWith", async () => { + // Arrange + sut.startWith = { + country: "", + postalCode: "", + taxId: "", + line1: "", + line2: "", + city: "", + state: "", + }; + + // Act + fixture.detectChanges(); + + // Assert + const startWithValue = sut.startWith; + expect(startWithValue.line1).toHaveLength(0); + expect(startWithValue.line2).toHaveLength(0); + expect(startWithValue.city).toHaveLength(0); + expect(startWithValue.state).toHaveLength(0); + expect(startWithValue.postalCode).toHaveLength(0); + expect(startWithValue.country).toHaveLength(0); + expect(startWithValue.taxId).toHaveLength(0); + }); + + it("should update the tax information protected state when form is updated", async () => { + // Arrange + const line1Value = "123 Street"; + const line2Value = "Apt. 5"; + const cityValue = "New York"; + const stateValue = "NY"; + const countryValue = "USA"; + const postalCodeValue = "123 Street"; + + sut.startWith = { + country: countryValue, + postalCode: "", + taxId: "", + line1: "", + line2: "", + city: "", + state: "", + }; + sut.showTaxIdField = false; + mockTaxService.isCountrySupported.mockResolvedValue(true); + + // Act + await sut.ngOnInit(); + fixture.detectChanges(); + + const line1: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='line1']", + ); + const line2: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='line2']", + ); + const city: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='city']", + ); + const state: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='state']", + ); + const postalCode: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='postalCode']", + ); + + line1.value = line1Value; + line2.value = line2Value; + city.value = cityValue; + state.value = stateValue; + postalCode.value = postalCodeValue; + + line1.dispatchEvent(new Event("input")); + line2.dispatchEvent(new Event("input")); + city.dispatchEvent(new Event("input")); + state.dispatchEvent(new Event("input")); + postalCode.dispatchEvent(new Event("input")); + await fixture.whenStable(); + + // Assert + + // Assert that the internal tax information reflects the form + const taxInformation = sut.getTaxInformation(); + expect(taxInformation.line1).toBe(line1Value); + expect(taxInformation.line2).toBe(line2Value); + expect(taxInformation.city).toBe(cityValue); + expect(taxInformation.state).toBe(stateValue); + expect(taxInformation.postalCode).toBe(postalCodeValue); + expect(taxInformation.country).toBe(countryValue); + expect(taxInformation.taxId).toHaveLength(0); + + expect(mockTaxService.isCountrySupported).toHaveBeenCalledWith(countryValue); + expect(mockTaxService.isCountrySupported).toHaveBeenCalledTimes(2); + }); + + it("should not show address fields except postal code if country is not supported for taxes", async () => { + // Arrange + const countryValue = "UNKNOWN"; + sut.startWith = { + country: countryValue, + postalCode: "", + taxId: "", + line1: "", + line2: "", + city: "", + state: "", + }; + sut.showTaxIdField = false; + mockTaxService.isCountrySupported.mockResolvedValue(false); + + // Act + await sut.ngOnInit(); + fixture.detectChanges(); + + const line1: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='line1']", + ); + const line2: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='line2']", + ); + const city: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='city']", + ); + const state: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='state']", + ); + const postalCode: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='postalCode']", + ); + + // Assert + expect(line1).toBeNull(); + expect(line2).toBeNull(); + expect(city).toBeNull(); + expect(state).toBeNull(); + //Should be visible + expect(postalCode).toBeTruthy(); + + expect(mockTaxService.isCountrySupported).toHaveBeenCalledWith(countryValue); + expect(mockTaxService.isCountrySupported).toHaveBeenCalledTimes(1); + }); + + it("should not show the tax id field if showTaxIdField is set to false", async () => { + // Arrange + const countryValue = "USA"; + sut.startWith = { + country: countryValue, + postalCode: "", + taxId: "", + line1: "", + line2: "", + city: "", + state: "", + }; + + sut.showTaxIdField = false; + mockTaxService.isCountrySupported.mockResolvedValue(true); + + // Act + await sut.ngOnInit(); + fixture.detectChanges(); + + // Assert + const taxId: HTMLInputElement = fixture.nativeElement.querySelector( + "input[formControlName='taxId']", + ); + expect(taxId).toBeNull(); + + expect(mockTaxService.isCountrySupported).toHaveBeenCalledWith(countryValue); + expect(mockTaxService.isCountrySupported).toHaveBeenCalledTimes(1); + }); + + it("should clear the tax id field if showTaxIdField is set to false after being true", async () => { + // Arrange + const countryValue = "USA"; + const taxIdValue = "A12345678"; + + sut.startWith = { + country: countryValue, + postalCode: "", + taxId: taxIdValue, + line1: "", + line2: "", + city: "", + state: "", + }; + sut.showTaxIdField = true; + + mockTaxService.isCountrySupported.mockResolvedValue(true); + await sut.ngOnInit(); + fixture.detectChanges(); + const initialTaxIdValue = fixture.nativeElement.querySelector( + "input[formControlName='taxId']", + ).value; + + // Act + sut.showTaxIdField = false; + sut.ngOnChanges({ showTaxIdField: new SimpleChange(true, false, false) }); + fixture.detectChanges(); + + // Assert + const taxId = fixture.nativeElement.querySelector("input[formControlName='taxId']"); + expect(taxId).toBeNull(); + + const taxInformation = sut.getTaxInformation(); + expect(taxInformation.taxId).toBeNull(); + expect(initialTaxIdValue).toEqual(taxIdValue); + + expect(mockTaxService.isCountrySupported).toHaveBeenCalledWith(countryValue); + expect(mockTaxService.isCountrySupported).toHaveBeenCalledTimes(1); + }); +}); diff --git a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.ts b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.ts index 57306d66b4b..04dbf3dee8d 100644 --- a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.ts +++ b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.ts @@ -1,6 +1,15 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { + Component, + EventEmitter, + Input, + OnChanges, + OnDestroy, + OnInit, + Output, + SimpleChanges, +} from "@angular/core"; import { FormBuilder, Validators } from "@angular/forms"; import { Subject, takeUntil } from "rxjs"; import { debounceTime } from "rxjs/operators"; @@ -13,7 +22,7 @@ import { CountryListItem, TaxInformation } from "@bitwarden/common/billing/model templateUrl: "./manage-tax-information.component.html", standalone: false, }) -export class ManageTaxInformationComponent implements OnInit, OnDestroy { +export class ManageTaxInformationComponent implements OnInit, OnDestroy, OnChanges { @Input() startWith: TaxInformation; @Input() onSubmit?: (taxInformation: TaxInformation) => Promise; @Input() showTaxIdField: boolean = true; @@ -56,7 +65,7 @@ export class ManageTaxInformationComponent implements OnInit, OnDestroy { } submit = async () => { - this.formGroup.markAllAsTouched(); + this.markAllAsTouched(); if (this.formGroup.invalid) { return; } @@ -65,7 +74,7 @@ export class ManageTaxInformationComponent implements OnInit, OnDestroy { }; validate(): boolean { - this.formGroup.markAllAsTouched(); + this.markAllAsTouched(); return this.formGroup.valid; } @@ -142,6 +151,13 @@ export class ManageTaxInformationComponent implements OnInit, OnDestroy { }); } + ngOnChanges(changes: SimpleChanges): void { + // Clear the value of the tax-id if states have been changed in the parent component + if (!changes.showTaxIdField.currentValue) { + this.formGroup.controls.taxId.setValue(null); + } + } + ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); From 6ab67e9a8f5f53bdd3fbc79606c20c8564110574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?= Date: Fri, 8 Aug 2025 14:28:03 -0400 Subject: [PATCH 11/50] [PM-23532] introduce send access guard (#15529) * document expected auth flows * implement send access trampoline --- .../send/send-access/authentication-flow.md | 75 +++ .../default-send-access-service.spec.ts | 175 +++++++ .../default-send-access-service.ts | 96 ++++ .../src/app/tools/send/send-access/index.ts | 2 + .../src/app/tools/send/send-access/routes.ts | 60 +++ .../send-access/send-access-memory.spec.ts | 50 ++ .../send/send-access/send-access-memory.ts | 25 + .../send-access-service.abstraction.ts | 10 + .../send-access/try-send-access.guard.spec.ts | 426 ++++++++++++++++++ .../send/send-access/try-send-access.guard.ts | 38 ++ .../src/app/tools/send/send-access/types.ts | 8 + .../app/tools/send/send-access/util.spec.ts | 69 +++ .../src/app/tools/send/send-access/util.ts | 13 + apps/web/src/locales/en/messages.json | 8 + .../src/generator-services.module.ts | 7 +- libs/tools/generator/components/src/index.ts | 2 +- 16 files changed, 1062 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/app/tools/send/send-access/authentication-flow.md create mode 100644 apps/web/src/app/tools/send/send-access/default-send-access-service.spec.ts create mode 100644 apps/web/src/app/tools/send/send-access/default-send-access-service.ts create mode 100644 apps/web/src/app/tools/send/send-access/routes.ts create mode 100644 apps/web/src/app/tools/send/send-access/send-access-memory.spec.ts create mode 100644 apps/web/src/app/tools/send/send-access/send-access-memory.ts create mode 100644 apps/web/src/app/tools/send/send-access/send-access-service.abstraction.ts create mode 100644 apps/web/src/app/tools/send/send-access/try-send-access.guard.spec.ts create mode 100644 apps/web/src/app/tools/send/send-access/try-send-access.guard.ts create mode 100644 apps/web/src/app/tools/send/send-access/types.ts create mode 100644 apps/web/src/app/tools/send/send-access/util.spec.ts create mode 100644 apps/web/src/app/tools/send/send-access/util.ts diff --git a/apps/web/src/app/tools/send/send-access/authentication-flow.md b/apps/web/src/app/tools/send/send-access/authentication-flow.md new file mode 100644 index 00000000000..f39b43fcd41 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/authentication-flow.md @@ -0,0 +1,75 @@ +# Send Authentication Flows + +In the below diagrams, activations represent client control flow. + +## Public Sends + +Anyone can access a public send. The token endpoint automatically issues a token. It never issues a challenge. + +```mermaid +sequenceDiagram + participant Visitor + participant TryAccess as try-send-access.guard + participant SendToken as send-token API + participant ViewContent as view-content.component + participant SendAccess as send-access API + + Visitor->>TryAccess: Navigate to send URL + activate TryAccess + TryAccess->>SendToken: Request anonymous access token + SendToken-->>TryAccess: OK + Security token + TryAccess->>ViewContent: Redirect with token + deactivate TryAccess + activate ViewContent + ViewContent->>SendAccess: Request send content (with token and key) + SendAccess-->>ViewContent: Return send content + ViewContent->>Visitor: Display send content + deactivate ViewContent +``` + +## Password Protected Sends + +Password protected sends redirect to a password challenge prompt. + +```mermaid +sequenceDiagram + participant Visitor + participant TryAccess as try-send-access.guard + participant PasswordAuth as password-authentication.component + participant SendToken as send-token API + participant ViewContent as view-content.component + participant SendAccess as send-access API + + Visitor->>TryAccess: Navigate to send URL + activate TryAccess + TryAccess->>SendToken: Request anonymous access token + SendToken-->>TryAccess: Unauthorized + Password challenge + TryAccess->>PasswordAuth: Redirect with send ID and key + deactivate TryAccess + activate PasswordAuth + PasswordAuth->>Visitor: Request password + Visitor-->>PasswordAuth: Enter password + PasswordAuth->>SendToken: Request access token (with password) + SendToken-->>PasswordAuth: OK + Security token + deactivate PasswordAuth + activate ViewContent + PasswordAuth->>ViewContent: Redirect with token and send key + ViewContent->>SendAccess: Request send content (with token) + SendAccess-->>ViewContent: Return send content + ViewContent->>Visitor: Display send content + deactivate ViewContent +``` + +## Send Access without token + +Visiting the view page without a token redirects to a try-access flow, above. + +```mermaid +sequenceDiagram + participant Visitor + participant ViewContent as view-content.component + participant TryAccess as try-send-access.guard + + Visitor->>ViewContent: Navigate to send URL (with id and key) + ViewContent->>TryAccess: Redirect to try-access (with id and key) +``` diff --git a/apps/web/src/app/tools/send/send-access/default-send-access-service.spec.ts b/apps/web/src/app/tools/send/send-access/default-send-access-service.spec.ts new file mode 100644 index 00000000000..cd07d3684fb --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/default-send-access-service.spec.ts @@ -0,0 +1,175 @@ +import { TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { Router, UrlTree } from "@angular/router"; +import { mock, MockProxy } from "jest-mock-extended"; +import { firstValueFrom, NEVER } from "rxjs"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { mockAccountServiceWith, FakeStateProvider } from "@bitwarden/common/spec"; +import { SemanticLogger } from "@bitwarden/common/tools/log"; +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { UserId } from "@bitwarden/common/types/guid"; +import { SYSTEM_SERVICE_PROVIDER } from "@bitwarden/generator-components"; + +import { DefaultSendAccessService } from "./default-send-access-service"; +import { SEND_RESPONSE_KEY, SEND_CONTEXT_KEY } from "./send-access-memory"; + +describe("DefaultSendAccessService", () => { + let service: DefaultSendAccessService; + let stateProvider: FakeStateProvider; + let sendApiService: MockProxy; + let router: MockProxy; + let logger: MockProxy; + let systemServiceProvider: MockProxy; + + beforeEach(() => { + const accountService = mockAccountServiceWith("user-id" as UserId); + stateProvider = new FakeStateProvider(accountService); + sendApiService = mock(); + router = mock(); + logger = mock(); + systemServiceProvider = mock(); + + systemServiceProvider.log.mockReturnValue(logger); + + TestBed.configureTestingModule({ + providers: [ + DefaultSendAccessService, + { provide: StateProvider, useValue: stateProvider }, + { provide: SendApiService, useValue: sendApiService }, + { provide: Router, useValue: router }, + { provide: SYSTEM_SERVICE_PROVIDER, useValue: systemServiceProvider }, + ], + }); + + service = TestBed.inject(DefaultSendAccessService); + }); + + describe("constructor", () => { + it("creates logger with type 'SendAccessAuthenticationService' when initialized", () => { + expect(systemServiceProvider.log).toHaveBeenCalledWith({ + type: "SendAccessAuthenticationService", + }); + }); + }); + + describe("redirect$", () => { + const sendId = "test-send-id"; + + it("returns content page UrlTree and logs info when API returns success", async () => { + const expectedUrlTree = { toString: () => "/send/content/test-send-id" } as UrlTree; + sendApiService.postSendAccess.mockResolvedValue({} as any); + router.createUrlTree.mockReturnValue(expectedUrlTree); + + const result = await firstValueFrom(service.redirect$(sendId)); + + expect(result).toBe(expectedUrlTree); + expect(logger.info).toHaveBeenCalledWith( + "public send detected; redirecting to send access with token.", + ); + }); + + describe("given error responses", () => { + it("returns password flow UrlTree and logs debug when 401 received", async () => { + const expectedUrlTree = { toString: () => "/send/test-send-id" } as UrlTree; + const errorResponse = new ErrorResponse([], 401); + sendApiService.postSendAccess.mockRejectedValue(errorResponse); + router.createUrlTree.mockReturnValue(expectedUrlTree); + + const result = await firstValueFrom(service.redirect$(sendId)); + + expect(result).toBe(expectedUrlTree); + expect(logger.debug).toHaveBeenCalledWith(errorResponse, "redirecting to password flow"); + }); + + it("returns 404 page UrlTree and logs debug when 404 received", async () => { + const expectedUrlTree = { toString: () => "/404.html" } as UrlTree; + const errorResponse = new ErrorResponse([], 404); + sendApiService.postSendAccess.mockRejectedValue(errorResponse); + router.parseUrl.mockReturnValue(expectedUrlTree); + + const result = await firstValueFrom(service.redirect$(sendId)); + + expect(result).toBe(expectedUrlTree); + expect(logger.debug).toHaveBeenCalledWith(errorResponse, "redirecting to unavailable page"); + }); + + it("logs warning and throws error when 500 received", async () => { + const errorResponse = new ErrorResponse([], 500); + sendApiService.postSendAccess.mockRejectedValue(errorResponse); + + await expect(firstValueFrom(service.redirect$(sendId))).rejects.toBe(errorResponse); + expect(logger.warn).toHaveBeenCalledWith( + errorResponse, + "received unexpected error response", + ); + }); + + it("throws error when unexpected error code received", async () => { + const errorResponse = new ErrorResponse([], 403); + sendApiService.postSendAccess.mockRejectedValue(errorResponse); + + await expect(firstValueFrom(service.redirect$(sendId))).rejects.toBe(errorResponse); + expect(logger.warn).toHaveBeenCalledWith( + errorResponse, + "received unexpected error response", + ); + }); + }); + + it("throws error when non-ErrorResponse error occurs", async () => { + const regularError = new Error("Network error"); + sendApiService.postSendAccess.mockRejectedValue(regularError); + + await expect(firstValueFrom(service.redirect$(sendId))).rejects.toThrow("Network error"); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it("emits timeout error when API response exceeds 10 seconds", fakeAsync(() => { + // Mock API to never resolve (simulating a hung request) + sendApiService.postSendAccess.mockReturnValue(firstValueFrom(NEVER)); + + const result$ = service.redirect$(sendId); + let error: any; + + result$.subscribe({ + error: (err: unknown) => (error = err), + }); + + // Advance time past 10 seconds + tick(10001); + + expect(error).toBeDefined(); + expect(error.name).toBe("TimeoutError"); + })); + }); + + describe("setContext", () => { + it("updates global state with send context when called with sendId and key", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + + await service.setContext(sendId, key); + + const context = await firstValueFrom(stateProvider.getGlobal(SEND_CONTEXT_KEY).state$); + expect(context).toEqual({ id: sendId, key }); + }); + }); + + describe("clear", () => { + it("sets both SEND_RESPONSE_KEY and SEND_CONTEXT_KEY to null when called", async () => { + // Set initial values + await stateProvider.getGlobal(SEND_RESPONSE_KEY).update(() => ({ some: "response" }) as any); + await stateProvider.getGlobal(SEND_CONTEXT_KEY).update(() => ({ id: "test", key: "test" })); + + await service.clear(); + + const response = await firstValueFrom(stateProvider.getGlobal(SEND_RESPONSE_KEY).state$); + const context = await firstValueFrom(stateProvider.getGlobal(SEND_CONTEXT_KEY).state$); + + expect(response).toBeNull(); + expect(context).toBeNull(); + }); + }); +}); diff --git a/apps/web/src/app/tools/send/send-access/default-send-access-service.ts b/apps/web/src/app/tools/send/send-access/default-send-access-service.ts new file mode 100644 index 00000000000..732303ce25a --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/default-send-access-service.ts @@ -0,0 +1,96 @@ +import { Injectable, Inject } from "@angular/core"; +import { Router, UrlTree } from "@angular/router"; +import { map, of, from, catchError, timeout } from "rxjs"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { SemanticLogger } from "@bitwarden/common/tools/log"; +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; +import { SendAccessRequest } from "@bitwarden/common/tools/send/models/request/send-access.request"; +import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; +import { SYSTEM_SERVICE_PROVIDER } from "@bitwarden/generator-components"; + +import { SEND_RESPONSE_KEY, SEND_CONTEXT_KEY } from "./send-access-memory"; +import { SendAccessService } from "./send-access-service.abstraction"; +import { isErrorResponse } from "./util"; + +const TEN_SECONDS = 10_000; + +@Injectable({ providedIn: "root" }) +export class DefaultSendAccessService implements SendAccessService { + private readonly logger: SemanticLogger; + + constructor( + private readonly state: StateProvider, + private readonly api: SendApiService, + private readonly router: Router, + @Inject(SYSTEM_SERVICE_PROVIDER) system: SystemServiceProvider, + ) { + this.logger = system.log({ type: "SendAccessAuthenticationService" }); + } + + redirect$(sendId: string) { + // FIXME: when the send authentication APIs become available, this method + // should delegate to the API + const response$ = from(this.api.postSendAccess(sendId, new SendAccessRequest())); + + const redirect$ = response$.pipe( + timeout({ first: TEN_SECONDS }), + map((_response) => { + this.logger.info("public send detected; redirecting to send access with token."); + const url = this.toViewRedirect(sendId); + + return url; + }), + catchError((error: unknown) => { + let processed: UrlTree | undefined = undefined; + + if (isErrorResponse(error)) { + processed = this.toErrorRedirect(sendId, error); + } + + if (processed) { + return of(processed); + } + + throw error; + }), + ); + + return redirect$; + } + + private toViewRedirect(sendId: string) { + return this.router.createUrlTree(["send", "content", sendId]); + } + + private toErrorRedirect(sendId: string, response: ErrorResponse) { + let url: UrlTree | undefined = undefined; + + switch (response.statusCode) { + case 401: + this.logger.debug(response, "redirecting to password flow"); + url = this.router.createUrlTree(["send/password", sendId]); + break; + + case 404: + this.logger.debug(response, "redirecting to unavailable page"); + url = this.router.parseUrl("/404.html"); + break; + + default: + this.logger.warn(response, "received unexpected error response"); + } + + return url; + } + + async setContext(sendId: string, key: string) { + await this.state.getGlobal(SEND_CONTEXT_KEY).update(() => ({ id: sendId, key })); + } + + async clear(): Promise { + await this.state.getGlobal(SEND_RESPONSE_KEY).update(() => null); + await this.state.getGlobal(SEND_CONTEXT_KEY).update(() => null); + } +} diff --git a/apps/web/src/app/tools/send/send-access/index.ts b/apps/web/src/app/tools/send/send-access/index.ts index c9df5ce5193..4bef65f468b 100644 --- a/apps/web/src/app/tools/send/send-access/index.ts +++ b/apps/web/src/app/tools/send/send-access/index.ts @@ -1,2 +1,4 @@ export { AccessComponent } from "./access.component"; export { SendAccessExplainerComponent } from "./send-access-explainer.component"; + +export { SendAccessRoutes } from "./routes"; diff --git a/apps/web/src/app/tools/send/send-access/routes.ts b/apps/web/src/app/tools/send/send-access/routes.ts new file mode 100644 index 00000000000..4f794aecd23 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/routes.ts @@ -0,0 +1,60 @@ +import { Routes } from "@angular/router"; + +import { AnonLayoutWrapperData } from "@bitwarden/components"; +import { ActiveSendIcon } from "@bitwarden/send-ui"; + +import { RouteDataProperties } from "../../../core"; + +import { SendAccessExplainerComponent } from "./send-access-explainer.component"; +import { SendAccessPasswordComponent } from "./send-access-password.component"; +import { trySendAccess } from "./try-send-access.guard"; + +/** Routes to reach send access screens */ +export const SendAccessRoutes: Routes = [ + { + path: "send/:sendId", + // there are no child pages because `trySendAccess` always performs a redirect + canActivate: [trySendAccess], + }, + { + path: "send/password/:sendId", + data: { + pageTitle: { + key: "sendAccessPasswordTitle", + }, + pageIcon: ActiveSendIcon, + showReadonlyHostname: true, + } satisfies RouteDataProperties & AnonLayoutWrapperData, + children: [ + { + path: "", + component: SendAccessPasswordComponent, + }, + { + path: "", + outlet: "secondary", + component: SendAccessExplainerComponent, + }, + ], + }, + { + path: "send/content/:sendId", + data: { + pageTitle: { + key: "sendAccessContentTitle", + }, + pageIcon: ActiveSendIcon, + showReadonlyHostname: true, + } satisfies RouteDataProperties & AnonLayoutWrapperData, + children: [ + { + path: "send/password/:sendId", + }, + { + path: "", + outlet: "secondary", + component: SendAccessExplainerComponent, + }, + ], + }, +]; diff --git a/apps/web/src/app/tools/send/send-access/send-access-memory.spec.ts b/apps/web/src/app/tools/send/send-access/send-access-memory.spec.ts new file mode 100644 index 00000000000..8d7fe9cd380 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/send-access-memory.spec.ts @@ -0,0 +1,50 @@ +import { KeyDefinition, SEND_ACCESS_AUTH_MEMORY } from "@bitwarden/common/platform/state"; +import { SendAccessResponse } from "@bitwarden/common/tools/send/models/response/send-access.response"; + +import { SEND_CONTEXT_KEY, SEND_RESPONSE_KEY } from "./send-access-memory"; +import { SendContext } from "./types"; + +describe("send-access-memory", () => { + describe("SEND_CONTEXT_KEY", () => { + it("has correct state definition properties", () => { + expect(SEND_CONTEXT_KEY).toBeInstanceOf(KeyDefinition); + expect(SEND_CONTEXT_KEY.stateDefinition).toBe(SEND_ACCESS_AUTH_MEMORY); + expect(SEND_CONTEXT_KEY.key).toBe("sendContext"); + }); + + it("deserializes data as-is", () => { + const testContext: SendContext = { id: "test-id", key: "test-key" }; + const deserializer = SEND_CONTEXT_KEY.deserializer; + expect(deserializer(testContext)).toBe(testContext); + }); + + it("deserializes null as null", () => { + const deserializer = SEND_CONTEXT_KEY.deserializer; + expect(deserializer(null)).toBe(null); + }); + }); + + describe("SEND_RESPONSE_KEY", () => { + it("has correct state definition properties", () => { + expect(SEND_RESPONSE_KEY).toBeInstanceOf(KeyDefinition); + expect(SEND_RESPONSE_KEY.stateDefinition).toBe(SEND_ACCESS_AUTH_MEMORY); + expect(SEND_RESPONSE_KEY.key).toBe("sendResponse"); + }); + + it("deserializes data into SendAccessResponse instance", () => { + const mockData = { id: "test-id", name: "test-send" } as any; + const deserializer = SEND_RESPONSE_KEY.deserializer; + const result = deserializer(mockData); + + expect(result).toBeInstanceOf(SendAccessResponse); + }); + + it.each([ + [null, "null"], + [undefined, "undefined"], + ])("deserializes %s as null", (value, _) => { + const deserializer = SEND_RESPONSE_KEY.deserializer; + expect(deserializer(value!)).toBe(null); + }); + }); +}); diff --git a/apps/web/src/app/tools/send/send-access/send-access-memory.ts b/apps/web/src/app/tools/send/send-access/send-access-memory.ts new file mode 100644 index 00000000000..4f67cf43b37 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/send-access-memory.ts @@ -0,0 +1,25 @@ +import { KeyDefinition, SEND_ACCESS_AUTH_MEMORY } from "@bitwarden/common/platform/state"; +import { SendAccessResponse } from "@bitwarden/common/tools/send/models/response/send-access.response"; + +import { SendContext } from "./types"; + +export const SEND_CONTEXT_KEY = new KeyDefinition( + SEND_ACCESS_AUTH_MEMORY, + "sendContext", + { + deserializer: (data) => data, + }, +); + +/** When send authentication succeeds, this stores the result so that + * multiple access attempts don't accrue due to the send workflow. + */ +// FIXME: replace this with the send authentication token once it's +// available +export const SEND_RESPONSE_KEY = new KeyDefinition( + SEND_ACCESS_AUTH_MEMORY, + "sendResponse", + { + deserializer: (data) => (data ? new SendAccessResponse(data) : null), + }, +); diff --git a/apps/web/src/app/tools/send/send-access/send-access-service.abstraction.ts b/apps/web/src/app/tools/send/send-access/send-access-service.abstraction.ts new file mode 100644 index 00000000000..66fc87fe802 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/send-access-service.abstraction.ts @@ -0,0 +1,10 @@ +import { UrlTree } from "@angular/router"; +import { Observable } from "rxjs"; + +export abstract class SendAccessService { + abstract redirect$: (sendId: string) => Observable; + + abstract setContext: (sendId: string, key: string) => Promise; + + abstract clear: () => Promise; +} diff --git a/apps/web/src/app/tools/send/send-access/try-send-access.guard.spec.ts b/apps/web/src/app/tools/send/send-access/try-send-access.guard.spec.ts new file mode 100644 index 00000000000..267de83db9f --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/try-send-access.guard.spec.ts @@ -0,0 +1,426 @@ +import { TestBed } from "@angular/core/testing"; +import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from "@angular/router"; +import { firstValueFrom, Observable, of } from "rxjs"; + +import { SemanticLogger } from "@bitwarden/common/tools/log"; +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; +import { SYSTEM_SERVICE_PROVIDER } from "@bitwarden/generator-components"; + +import { SendAccessService } from "./send-access-service.abstraction"; +import { trySendAccess } from "./try-send-access.guard"; + +function createMockRoute(params: Record): ActivatedRouteSnapshot { + return { params } as ActivatedRouteSnapshot; +} + +function createMockLogger(): SemanticLogger { + return { + warn: jest.fn(), + panic: jest.fn().mockImplementation(() => { + throw new Error("Logger panic called"); + }), + } as any as SemanticLogger; +} + +function createMockSystemServiceProvider(): SystemServiceProvider { + return { + log: jest.fn().mockReturnValue(createMockLogger()), + } as any as SystemServiceProvider; +} + +function createMockSendAccessService() { + return { + setContext: jest.fn().mockResolvedValue(undefined), + redirect$: jest.fn().mockReturnValue(of({} as UrlTree)), + clear: jest.fn().mockResolvedValue(undefined), + }; +} + +describe("trySendAccess", () => { + let mockSendAccessService: ReturnType; + let mockSystemServiceProvider: SystemServiceProvider; + let mockRouterState: RouterStateSnapshot; + + beforeEach(() => { + mockSendAccessService = createMockSendAccessService(); + mockSystemServiceProvider = createMockSystemServiceProvider(); + mockRouterState = {} as RouterStateSnapshot; + + TestBed.configureTestingModule({ + providers: [ + { provide: SendAccessService, useValue: mockSendAccessService }, + { provide: SYSTEM_SERVICE_PROVIDER, useValue: mockSystemServiceProvider }, + ], + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("canActivate", () => { + describe("given valid route parameters", () => { + it("extracts sendId and key from route params when both are valid strings", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + // need to cast the result because `CanActivateFn` performs type erasure + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + expect(mockSendAccessService.setContext).toHaveBeenCalledWith(sendId, key); + expect(mockSendAccessService.setContext).toHaveBeenCalledTimes(1); + await expect(firstValueFrom(result$)).resolves.toEqual(expectedUrlTree); + }); + + it("does not throw validation errors when sendId and key are valid strings", async () => { + const sendId = "valid-send-id"; + const key = "valid-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + // Should not throw any errors during guard execution + let guardResult: Observable | undefined; + expect(() => { + guardResult = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + }).not.toThrow(); + + // Verify the observable can be subscribed to without errors + expect(guardResult).toBeDefined(); + await expect(firstValueFrom(guardResult!)).resolves.toEqual(expectedUrlTree); + + // Logger methods should not be called for warnings or panics + const mockLogger = (mockSystemServiceProvider.log as jest.Mock).mock.results[0].value; + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.panic).not.toHaveBeenCalled(); + }); + }); + + describe("given invalid route parameters", () => { + describe("given invalid sendId", () => { + it.each([ + ["undefined", undefined], + ["null", null], + ])( + "logs warning with correct message when sendId is %s", + async (description, sendIdValue) => { + const key = "valid-key"; + const mockRoute = createMockRoute( + sendIdValue === undefined ? { key } : { sendId: sendIdValue, key }, + ); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + + expect(mockSystemServiceProvider.log).toHaveBeenCalledWith({ + function: "trySendAccess", + }); + expect(mockLogger.warn).toHaveBeenCalledWith( + "sendId missing from the route parameters; redirecting to 404", + ); + }, + ); + + it.each([ + ["number", 123], + ["object", {}], + ["boolean", true], + ])("logs panic with expected/actual type info when sendId is %s", async (type, value) => { + const key = "valid-key"; + const mockRoute = createMockRoute({ sendId: value, key }); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + + expect(mockSystemServiceProvider.log).toHaveBeenCalledWith({ function: "trySendAccess" }); + expect(mockLogger.panic).toHaveBeenCalledWith( + { expected: "string", actual: type }, + "sendId has invalid type", + ); + }); + + it("throws when sendId is not a string", async () => { + const key = "valid-key"; + const invalidSendIdValues = [123, {}, true, null, undefined]; + + for (const invalidSendId of invalidSendIdValues) { + const mockRoute = createMockRoute( + invalidSendId === undefined ? { key } : { sendId: invalidSendId, key }, + ); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + } + }); + }); + + describe("given invalid key", () => { + it.each([ + ["undefined", undefined], + ["null", null], + ])("logs panic with correct message when key is %s", async (description, keyValue) => { + const sendId = "valid-send-id"; + const mockRoute = createMockRoute( + keyValue === undefined ? { sendId } : { sendId, key: keyValue }, + ); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + + expect(mockSystemServiceProvider.log).toHaveBeenCalledWith({ function: "trySendAccess" }); + expect(mockLogger.panic).toHaveBeenCalledWith("key missing from the route parameters"); + }); + + it.each([ + ["number", 123], + ["object", {}], + ["boolean", true], + ])("logs panic with expected/actual type info when key is %s", async (type, value) => { + const sendId = "valid-send-id"; + const mockRoute = createMockRoute({ sendId, key: value }); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + + expect(mockSystemServiceProvider.log).toHaveBeenCalledWith({ function: "trySendAccess" }); + expect(mockLogger.panic).toHaveBeenCalledWith( + { expected: "string", actual: type }, + "key has invalid type", + ); + }); + + it("throws when key is not a string", async () => { + const sendId = "valid-send-id"; + const invalidKeyValues = [123, {}, true, null, undefined]; + + for (const invalidKey of invalidKeyValues) { + const mockRoute = createMockRoute( + invalidKey === undefined ? { sendId } : { sendId, key: invalidKey }, + ); + const mockLogger = createMockLogger(); + (mockSystemServiceProvider.log as jest.Mock).mockReturnValue(mockLogger); + + await expect(async () => { + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + await firstValueFrom(result$); + }).rejects.toThrow("Logger panic called"); + } + }); + }); + }); + + describe("given service interactions", () => { + it("calls setContext with extracted sendId and key when parameters are valid", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + await firstValueFrom(result$); + + expect(mockSendAccessService.setContext).toHaveBeenCalledWith(sendId, key); + expect(mockSendAccessService.setContext).toHaveBeenCalledTimes(1); + }); + + it("calls redirect$ with extracted sendId when setContext completes", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + await firstValueFrom(result$); + + expect(mockSendAccessService.redirect$).toHaveBeenCalledWith(sendId); + expect(mockSendAccessService.redirect$).toHaveBeenCalledTimes(1); + }); + }); + + describe("given observable behavior", () => { + it("returns redirect$ emissions when setContext completes successfully", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + const actualResult = await firstValueFrom(result$); + + expect(actualResult).toEqual(expectedUrlTree); + expect(mockSendAccessService.redirect$).toHaveBeenCalledWith(sendId); + }); + + it("does not emit setContext values when using ignoreElements", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + const setContextValue = "should-not-be-emitted"; + + // Mock setContext to return a value + mockSendAccessService.setContext.mockResolvedValue(setContextValue); + mockSendAccessService.redirect$.mockReturnValue(of(expectedUrlTree)); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + const actualResult = await firstValueFrom(result$); + + // Should only emit the redirect$ value, not the setContext value + expect(actualResult).toEqual(expectedUrlTree); + expect(actualResult).not.toEqual(setContextValue); + }); + + it("ensures setContext completes before redirect$ executes (sequencing)", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const expectedUrlTree = { toString: () => "/test-url" } as UrlTree; + + let setContextResolved = false; + + // Mock setContext to track when it resolves + mockSendAccessService.setContext.mockImplementation(async () => { + await new Promise((resolve) => setTimeout(resolve, 10)); // Small delay + setContextResolved = true; + }); + + // Mock redirect$ to return a delayed observable and check if setContext resolved + mockSendAccessService.redirect$.mockImplementation((id) => { + return new Observable((subscriber) => { + // Check if setContext has resolved when redirect$ subscription starts + setTimeout(() => { + expect(setContextResolved).toBe(true); + subscriber.next(expectedUrlTree); + subscriber.complete(); + }, 0); + }); + }); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + await firstValueFrom(result$); + }); + }); + + describe("given error scenarios", () => { + it("does not call redirect$ when setContext rejects", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const setContextError = new Error("setContext failed"); + + // Reset mocks to ensure clean state + jest.clearAllMocks(); + + // Mock setContext to reject + mockSendAccessService.setContext.mockRejectedValue(setContextError); + + // Create a mock observable that we can spy on subscription + const mockRedirectObservable = of({} as UrlTree); + const subscribeSpy = jest.spyOn(mockRedirectObservable, "subscribe"); + mockSendAccessService.redirect$.mockReturnValue(mockRedirectObservable); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + // Expect the observable to reject when setContext fails + await expect(firstValueFrom(result$)).rejects.toThrow("setContext failed"); + + // The redirect$ method will be called (since it's called synchronously) + expect(mockSendAccessService.redirect$).toHaveBeenCalledWith(sendId); + + // But the returned observable should not be subscribed to due to the error + // Note: This test verifies the error propagation behavior + expect(subscribeSpy).not.toHaveBeenCalled(); + }); + + it("propagates error to guard return value when redirect$ throws", async () => { + const sendId = "test-send-id"; + const key = "test-key"; + const mockRoute = createMockRoute({ sendId, key }); + const redirectError = new Error("redirect$ failed"); + + // Reset mocks to ensure clean state + jest.clearAllMocks(); + + // Mock setContext to succeed and redirect$ to throw + mockSendAccessService.setContext.mockResolvedValue(undefined); + mockSendAccessService.redirect$.mockReturnValue( + new Observable((subscriber) => { + subscriber.error(redirectError); + }), + ); + + const result$ = TestBed.runInInjectionContext(() => + trySendAccess(mockRoute, mockRouterState), + ) as unknown as Observable; + + // Expect the observable to propagate the redirect$ error + await expect(firstValueFrom(result$)).rejects.toThrow("redirect$ failed"); + + // Verify that setContext was called (should succeed) + expect(mockSendAccessService.setContext).toHaveBeenCalledWith(sendId, key); + + // Verify that redirect$ was called (but it throws) + expect(mockSendAccessService.redirect$).toHaveBeenCalledWith(sendId); + }); + }); + }); +}); diff --git a/apps/web/src/app/tools/send/send-access/try-send-access.guard.ts b/apps/web/src/app/tools/send/send-access/try-send-access.guard.ts new file mode 100644 index 00000000000..51941bf8e74 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/try-send-access.guard.ts @@ -0,0 +1,38 @@ +import { inject } from "@angular/core"; +import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from "@angular/router"; +import { from, ignoreElements, concat } from "rxjs"; + +import { SystemServiceProvider } from "@bitwarden/common/tools/providers"; +import { SYSTEM_SERVICE_PROVIDER } from "@bitwarden/generator-components"; + +import { SendAccessService } from "./send-access-service.abstraction"; + +export const trySendAccess: CanActivateFn = ( + route: ActivatedRouteSnapshot, + _state: RouterStateSnapshot, +) => { + const sendAccess = inject(SendAccessService); + const system = inject(SYSTEM_SERVICE_PROVIDER); + const logger = system.log({ function: "trySendAccess" }); + + const { sendId, key } = route.params; + if (!sendId) { + logger.warn("sendId missing from the route parameters; redirecting to 404"); + } + if (typeof sendId !== "string") { + logger.panic({ expected: "string", actual: typeof sendId }, "sendId has invalid type"); + } + + if (!key) { + logger.panic("key missing from the route parameters"); + } + if (typeof key !== "string") { + logger.panic({ expected: "string", actual: typeof key }, "key has invalid type"); + } + + const contextUpdated$ = from(sendAccess.setContext(sendId, key)).pipe(ignoreElements()); + const redirect$ = sendAccess.redirect$(sendId); + + // ensure the key has loaded before redirecting + return concat(contextUpdated$, redirect$); +}; diff --git a/apps/web/src/app/tools/send/send-access/types.ts b/apps/web/src/app/tools/send/send-access/types.ts new file mode 100644 index 00000000000..03e058ca681 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/types.ts @@ -0,0 +1,8 @@ +/** global contextual information for the current send access page. */ +export type SendContext = { + /** identifies the send */ + id: string; + + /** decrypts the send content */ + key: string; +}; diff --git a/apps/web/src/app/tools/send/send-access/util.spec.ts b/apps/web/src/app/tools/send/send-access/util.spec.ts new file mode 100644 index 00000000000..45502ee2509 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/util.spec.ts @@ -0,0 +1,69 @@ +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; + +import { isErrorResponse, isSendContext } from "./util"; + +describe("util", () => { + describe("isErrorResponse", () => { + it("returns true when value is an ErrorResponse instance", () => { + const error = new ErrorResponse(["Error message"], 400); + expect(isErrorResponse(error)).toBe(true); + }); + + it.each([ + [null, "null"], + [undefined, "undefined"], + ])("returns false when value is %s", (value, description) => { + expect(isErrorResponse(value)).toBe(false); + }); + + it.each([ + ["string", "string"], + [123, "number"], + [true, "boolean"], + [{}, "plain object"], + [[], "array"], + ])("returns false when value is not an ErrorResponse (%s)", (value, description) => { + expect(isErrorResponse(value)).toBe(false); + }); + + it("returns false when value is a different Error type", () => { + const error = new Error("test"); + expect(isErrorResponse(error)).toBe(false); + }); + }); + + describe("isSendContext", () => { + it("returns true when value has id and key properties", () => { + const validContext = { id: "test-id", key: "test-key" }; + expect(isSendContext(validContext)).toBe(true); + }); + + it("returns true even with additional properties", () => { + const contextWithExtras = { id: "test-id", key: "test-key", extra: "data" }; + expect(isSendContext(contextWithExtras)).toBe(true); + }); + + it.each([ + [null, "null"], + [undefined, "undefined"], + ])("returns false when value is %s", (value, _) => { + expect(isSendContext(value)).toBe(false); + }); + + it.each([ + ["string", "string"], + [123, "number"], + [true, "boolean"], + ])("returns false when value is not an object (%s)", (value, _) => { + expect(isSendContext(value)).toBe(false); + }); + + it.each([ + [{ key: "test-key" }, "missing id"], + [{ id: "test-id" }, "missing key"], + [{}, "empty object"], + ])("returns false when value is %s", (value, _) => { + expect(isSendContext(value)).toBe(false); + }); + }); +}); diff --git a/apps/web/src/app/tools/send/send-access/util.ts b/apps/web/src/app/tools/send/send-access/util.ts new file mode 100644 index 00000000000..d9cbef0d337 --- /dev/null +++ b/apps/web/src/app/tools/send/send-access/util.ts @@ -0,0 +1,13 @@ +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; + +import { SendContext } from "./types"; + +/** narrows a type to an `ErrorResponse` */ +export function isErrorResponse(value: unknown): value is ErrorResponse { + return value instanceof ErrorResponse; +} + +/** narrows a type to a `SendContext` */ +export function isSendContext(value: unknown): value is SendContext { + return !!value && typeof value === "object" && "id" in value && "key" in value; +} diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 4eaf141abc2..fb85d4e3dd9 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -5269,6 +5269,14 @@ "downloadAttachments": { "message": "Download attachments" }, + "sendAccessPasswordTitle": { + "message": "Enter the password to view this Send", + "description": "Title of the Send password authentication screen." + }, + "sendAccessContentTitle": { + "message": "View Send", + "description": "Title of the Send view content screen." + }, "sendAccessUnavailable": { "message": "The Send you are trying to access does not exist or is no longer available.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." diff --git a/libs/tools/generator/components/src/generator-services.module.ts b/libs/tools/generator/components/src/generator-services.module.ts index 1088e97e80f..935f7dc2d60 100644 --- a/libs/tools/generator/components/src/generator-services.module.ts +++ b/libs/tools/generator/components/src/generator-services.module.ts @@ -43,7 +43,12 @@ export const RANDOMIZER = new SafeInjectionToken("Randomizer"); const GENERATOR_SERVICE_PROVIDER = new SafeInjectionToken( "CredentialGeneratorProviders", ); -const SYSTEM_SERVICE_PROVIDER = new SafeInjectionToken("SystemServices"); + +// FIXME: relocate the system service provider to a more general module once +// NX migration is complete. +export const SYSTEM_SERVICE_PROVIDER = new SafeInjectionToken( + "SystemServices", +); /** Shared module containing generator component dependencies */ @NgModule({ diff --git a/libs/tools/generator/components/src/index.ts b/libs/tools/generator/components/src/index.ts index 56eb912f367..4ec32032de0 100644 --- a/libs/tools/generator/components/src/index.ts +++ b/libs/tools/generator/components/src/index.ts @@ -2,4 +2,4 @@ export { CredentialGeneratorHistoryComponent } from "./credential-generator-hist export { CredentialGeneratorHistoryDialogComponent } from "./credential-generator-history-dialog.component"; export { EmptyCredentialHistoryComponent } from "./empty-credential-history.component"; export { GeneratorModule } from "./generator.module"; -export { GeneratorServicesModule } from "./generator-services.module"; +export { GeneratorServicesModule, SYSTEM_SERVICE_PROVIDER } from "./generator-services.module"; From 01d95f325fd0c76eb04332e9ca62487018d3cb61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?= Date: Fri, 8 Aug 2025 15:12:48 -0400 Subject: [PATCH 12/50] hide experimental `bw send --email` flag (#15955) --- apps/cli/src/tools/send/send.program.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/cli/src/tools/send/send.program.ts b/apps/cli/src/tools/send/send.program.ts index 82699e273c3..2ea73f8c5c8 100644 --- a/apps/cli/src/tools/send/send.program.ts +++ b/apps/cli/src/tools/send/send.program.ts @@ -55,10 +55,13 @@ export class SendProgram extends BaseProgram { "optional password to access this Send. Can also be specified in JSON.", ).conflicts("email"), ) - .option( - "--email ", - "optional emails to access this Send. Can also be specified in JSON.", - parseEmail, + .addOption( + new Option( + "--email ", + "optional emails to access this Send. Can also be specified in JSON.", + ) + .argParser(parseEmail) + .hideHelp(), ) .option("-a, --maxAccessCount ", "The amount of max possible accesses.") .option("--hidden", "Hide in web by default. Valid only if --file is not set.") From 9f6757dadcb2e2c84ef5b7a910625c08b80425ee Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 14:11:11 +0200 Subject: [PATCH 13/50] Autosync the updated translations (#15946) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/browser/src/_locales/ar/messages.json | 25 +-- apps/browser/src/_locales/az/messages.json | 145 ++++++++---------- apps/browser/src/_locales/be/messages.json | 25 +-- apps/browser/src/_locales/bg/messages.json | 25 +-- apps/browser/src/_locales/bn/messages.json | 25 +-- apps/browser/src/_locales/bs/messages.json | 25 +-- apps/browser/src/_locales/ca/messages.json | 25 +-- apps/browser/src/_locales/cs/messages.json | 25 +-- apps/browser/src/_locales/cy/messages.json | 25 +-- apps/browser/src/_locales/da/messages.json | 25 +-- apps/browser/src/_locales/de/messages.json | 25 +-- apps/browser/src/_locales/el/messages.json | 25 +-- apps/browser/src/_locales/en_GB/messages.json | 25 +-- apps/browser/src/_locales/en_IN/messages.json | 25 +-- apps/browser/src/_locales/es/messages.json | 97 +++++------- apps/browser/src/_locales/et/messages.json | 25 +-- apps/browser/src/_locales/eu/messages.json | 25 +-- apps/browser/src/_locales/fa/messages.json | 25 +-- apps/browser/src/_locales/fi/messages.json | 25 +-- apps/browser/src/_locales/fil/messages.json | 25 +-- apps/browser/src/_locales/fr/messages.json | 27 +--- apps/browser/src/_locales/gl/messages.json | 25 +-- apps/browser/src/_locales/he/messages.json | 25 +-- apps/browser/src/_locales/hi/messages.json | 25 +-- apps/browser/src/_locales/hr/messages.json | 25 +-- apps/browser/src/_locales/hu/messages.json | 25 +-- apps/browser/src/_locales/id/messages.json | 113 ++++++-------- apps/browser/src/_locales/it/messages.json | 25 +-- apps/browser/src/_locales/ja/messages.json | 25 +-- apps/browser/src/_locales/ka/messages.json | 25 +-- apps/browser/src/_locales/km/messages.json | 25 +-- apps/browser/src/_locales/kn/messages.json | 25 +-- apps/browser/src/_locales/ko/messages.json | 55 +++---- apps/browser/src/_locales/lt/messages.json | 25 +-- apps/browser/src/_locales/lv/messages.json | 25 +-- apps/browser/src/_locales/ml/messages.json | 25 +-- apps/browser/src/_locales/mr/messages.json | 25 +-- apps/browser/src/_locales/my/messages.json | 25 +-- apps/browser/src/_locales/nb/messages.json | 25 +-- apps/browser/src/_locales/ne/messages.json | 25 +-- apps/browser/src/_locales/nl/messages.json | 25 +-- apps/browser/src/_locales/nn/messages.json | 25 +-- apps/browser/src/_locales/or/messages.json | 25 +-- apps/browser/src/_locales/pl/messages.json | 65 ++++---- apps/browser/src/_locales/pt_BR/messages.json | 45 ++---- apps/browser/src/_locales/pt_PT/messages.json | 25 +-- apps/browser/src/_locales/ro/messages.json | 25 +-- apps/browser/src/_locales/ru/messages.json | 25 +-- apps/browser/src/_locales/si/messages.json | 25 +-- apps/browser/src/_locales/sk/messages.json | 29 +--- apps/browser/src/_locales/sl/messages.json | 25 +-- apps/browser/src/_locales/sr/messages.json | 25 +-- apps/browser/src/_locales/sv/messages.json | 25 +-- apps/browser/src/_locales/te/messages.json | 25 +-- apps/browser/src/_locales/th/messages.json | 25 +-- apps/browser/src/_locales/tr/messages.json | 69 ++++----- apps/browser/src/_locales/uk/messages.json | 25 +-- apps/browser/src/_locales/vi/messages.json | 25 +-- apps/browser/src/_locales/zh_CN/messages.json | 25 +-- apps/browser/src/_locales/zh_TW/messages.json | 25 +-- apps/browser/store/locales/az/copy.resx | 18 +-- apps/browser/store/locales/id/copy.resx | 26 ++-- 62 files changed, 592 insertions(+), 1372 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 65ee9cab458..ee723217f2a 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 16b74ffe175..72cdb22852b 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -14,7 +14,7 @@ "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Güvənli seyfinizə müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli seyfinizə erişmək üçün giriş edin və ya yeni bir hesab yaradın." }, "inviteAccepted": { "message": "Dəvət qəbul edildi" @@ -59,7 +59,7 @@ "message": "Ana parol" }, "masterPassDesc": { - "message": "Ana parol, seyfinizə müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." + "message": "Ana parol, seyfinizə erişmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." }, "masterPassHintDesc": { "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatırlamağınıza kömək edir." @@ -350,7 +350,7 @@ "message": "Bitwarden Sirr Meneceri" }, "continueToSecretsManagerPageDesc": { - "message": "Bitwarden Sirr Meneceri ilə developer sirlərini güvənli bir şəkildə saxlayın, idarə edin və paylaşın. Daha ətraflı bitwarden.com veb saytında öyrənə bilərsiniz." + "message": "Bitwarden Sirr Meneceri ilə gəlişdirici sirlərini güvənli bir şəkildə saxlayın, idarə edin və paylaşın. Daha ətraflı bitwarden.com veb saytında öyrənə bilərsiniz." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -548,7 +548,7 @@ "message": "Seyfdə axtar" }, "resetSearch": { - "message": "Reset search" + "message": "Axtarışı sıfırla" }, "edit": { "message": "Düzəliş et" @@ -1216,10 +1216,10 @@ "message": "Konteks menyu seçimlərini göstər" }, "contextMenuItemDesc": { - "message": "Veb sayt üçün parol yaratmaq və uyuşan giriş məlumatlarına müraciət etmək üçün sağ klikləməni istifadə edin." + "message": "Veb sayt üçün parol yaradılmasına və uyuşan giriş məlumatlarına erişmək üçün sağ klikləməni istifadə edin." }, "contextMenuItemDescAlt": { - "message": "Veb sayt üçün parol yaratmaq və uyuşan giriş məlumatlarına müraciət etmək üçün sağ klikləməni istifadə edin. Giriş etmiş bütün hesablara aiddir." + "message": "Veb sayt üçün parol yaradılmasına və uyuşan giriş məlumatlarına erişmək üçün sağ klikləməni istifadə edin. Giriş etmiş bütün hesablara aiddir." }, "defaultUriMatchDetection": { "message": "İlkin URI uyuşma aşkarlaması", @@ -1290,16 +1290,16 @@ "message": "Seyfi xaricə köçürməyi təsdiqlə" }, "exportWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı datanız şifrələnməmiş formatdadır. Bu faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." + "message": "Bu xaricə köçürmədəki seyf veriləriniz şifrələnməmiş formatdadır. Bu xaricə köçürülmüş faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." }, "encExportKeyWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı data, hesabınızın şifrələmə açarı istifadə edilərək şifrələnir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." + "message": "Bu xaricə köçürmə, verilərinizi hesabınızın şifrələmə açarını istifadə edərək şifrələyir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." }, "encExportAccountWarningDesc": { "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir xaricə köçürməni, fərqli bir hesaba köçürə bilməzsiniz." }, "exportMasterPassword": { - "message": "Seyf datanızı xaricə köçürmək üçün ana parolunuzu daxil edin." + "message": "Seyf verilərinizi xaricə köçürmək üçün ana parolunuzu daxil edin." }, "shared": { "message": "Paylaşılan" @@ -1399,13 +1399,13 @@ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş anbar sahəsi" }, "premiumSignUpEmergency": { - "message": "Fövqəladə hal müraciəti" + "message": "Fövqəladə hal erişimi." }, "premiumSignUpTwoStepOptions": { "message": "YubiKey və Duo kimi mülkiyyətçi iki addımlı giriş seçimləri." }, "ppremiumSignUpReports": { - "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və data pozuntusu hesabatları." + "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və veri pozuntusu hesabatları." }, "ppremiumSignUpTotp": { "message": "Seyfinizdəki girişlər üçün TOTP doğrulama kodu (2FA) yaradıcısı." @@ -1523,7 +1523,7 @@ "message": "İki addımlı giriş üsulunu seçin" }, "recoveryCodeDesc": { - "message": "İki faktorlu provayderlərinə müraciəti itirmisiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki faktorlu provayderləri sıradan çıxarda bilərsiniz." + "message": "İki faktorlu provayderlərinizə erişə bilmirsiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki faktorlu provayderləri söndürün." }, "recoveryCodeTitle": { "message": "Geri qaytarma kodu" @@ -1539,7 +1539,7 @@ "message": "Yubico OTP Güvənlik Açarı" }, "yubiKeyDesc": { - "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." + "message": "Hesabınıza erişmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." }, "duoDescV2": { "message": "Duo Security tərəfindən yaradılan kodu daxil edin.", @@ -1553,7 +1553,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün WebAuthn özəllikli istənilən bir güvənlik açarı istifadə edin." + "message": "Hesabınıza erişmək üçün istənilən WebAuthn uyumlu güvənlik açarını istifadə edin." }, "emailTitle": { "message": "E-poçt" @@ -2023,7 +2023,7 @@ "message": "Parolun ifşalanıb ifşalanmadığını yoxlayın." }, "passwordExposed": { - "message": "Bu parol, məlumat pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", + "message": "Bu parol, veri pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", "placeholders": { "value": { "content": "$1", @@ -2032,7 +2032,7 @@ } }, "passwordSafe": { - "message": "Bu parol, məlumat pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." + "message": "Bu parol, veri pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." }, "baseDomain": { "message": "Baza domeni", @@ -2275,7 +2275,7 @@ "message": "Artıq hesabınız var?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Çıxış etdikdə, seyfinizə bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" + "message": "Çıxış etdikdə, seyfinizə erişiminiz tamamilə dayanacaq və vaxt bitdikdən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Vaxt bitmə əməliyyat təsdiqi" @@ -2401,7 +2401,7 @@ "message": "Oldu" }, "errorRefreshingAccessToken": { - "message": "Müraciət tokeni təzələmə xətası" + "message": "Erişim tokeni təzələmə xətası" }, "errorRefreshingAccessTokenDesc": { "message": "Təzələmə tokeni və ya API açarlar tapılmadı. Lütfən çıxış edib yenidən giriş etməyə çalışın." @@ -2726,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Maksimal müraciət sayına çatıldı", + "message": "Maksimum erişim sayına çatıldı", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2810,7 +2810,7 @@ "message": "Özəl" }, "sendPasswordDescV3": { - "message": "Alıcıların bu \"Send\"ə müraciət etməsi üçün ixtiyari bir parol əlavə edin.", + "message": "Alıcıların bu \"Send\"ə erişməsi üçün ixtiyari bir parol əlavə edin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2941,13 +2941,13 @@ "message": "Ana parolu güncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Seyfə müraciət etmək üçün onu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış edəcəksiniz və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir inzibatçı tərəfindən dəyişdirildi. Seyfə erişmək üçün onu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış edəcəksiniz və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "updateWeakMasterPasswordWarning": { - "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə erişmək üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "tdeDisabledMasterPasswordRequired": { - "message": "Təşkilatınız, güvənli cihaz şifrələməsini sıradan çıxartdı. Seyfinizə müraciət etmək üçün lütfən ana parol təyin edin." + "message": "Təşkilatınız, güvənli cihaz şifrələməsini sıradan çıxartdı. Seyfinizə erişmək üçün lütfən ana parol təyin edin." }, "resetPasswordPolicyAutoEnroll": { "message": "Avtomatik yazılma" @@ -3145,7 +3145,7 @@ "message": "Bitwarden, aşağıda sadalanan seyf element(lər)inin şifrəsini aça bilmədi." }, "contactCSToAvoidDataLossPart1": { - "message": "Əlavə data itkisini önləmək üçün", + "message": "Əlavə veri itkisini önləmək üçün", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -3362,7 +3362,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API müraciət tokeni" + "message": "API erişim tokeni" }, "apiKey": { "message": "API açar" @@ -3377,7 +3377,7 @@ "message": "Təşkilat dayandırıldı." }, "disabledOrganizationFilterError": { - "message": "Dayandırılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Fəaliyyəti dayandırılmış Təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." }, "loggingInTo": { "message": "$DOMAIN$ domeninə giriş edilir", @@ -3495,16 +3495,16 @@ "message": "İfşa olunmuş ana parol" }, "exposedMasterPasswordDesc": { - "message": "Parol, məlumat pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" + "message": "Parol, veri pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" }, "weakAndExposedMasterPassword": { "message": "Zəif və ifşa olunmuş ana parol" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" + "message": "Zəif parol, veri pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" }, "checkForBreaches": { - "message": "Bu parol üçün bilinən məlumat pozuntularını yoxlayın" + "message": "Bu parol üçün bilinən veri pozuntularını yoxlayın" }, "important": { "message": "Vacib:" @@ -3631,7 +3631,7 @@ "message": "Cihazlar" }, "accessAttemptBy": { - "message": "$EMAIL$ ilə müraciət cəhdi", + "message": "$EMAIL$ ilə erişim cəhdi", "placeholders": { "email": { "content": "$1", @@ -3640,10 +3640,10 @@ } }, "confirmAccess": { - "message": "Müraciəti təsdiqlə" + "message": "Erişimi təsdiqlə" }, "denyAccess": { - "message": "Müraciətə rədd cavabı ver" + "message": "Erişimə rədd cavabı ver" }, "time": { "message": "Vaxt" @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Bu tələb artıq yararsızdır." }, - "areYouTryingToAccessYourAccount": { - "message": "Hesabınıza müraciət etməyə çalışırsınız?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş təsdiqləndi", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Başqa bir cihazdan giriş cəhdinə rədd cavabı verdiniz. Bu həqiqətən siz idinizsə, cihazla yenidən giriş etməyə çalışın." - }, "loginRequestHasAlreadyExpired": { "message": "Giriş tələbinin müddəti artıq bitib." }, @@ -3747,7 +3728,7 @@ "description": "European Union" }, "accessDenied": { - "message": "Müraciət rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." + "message": "Erişim rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." }, "general": { "message": "Ümumi" @@ -3792,7 +3773,7 @@ "message": "Təşkilata güvənilmir" }, "emergencyAccessTrustWarning": { - "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal müraciəti icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" + "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal erişim icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" }, "orgTrustWarning": { "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu təşkilatın üzvüsünüzsə, hesab geri qaytarma fəaldırsa və aşağıda görünən barmaq izi təşkilatın barmaq izi ilə uyuşursa davam edin." @@ -3808,7 +3789,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "İstənilən platformada faylları və dataları hər kəslə paylaşın. İfşa olunmağı məhdudlaşdıraraq məlumatlarınız ucdan-uca şifrələnmiş qalacaq.", + "message": "İstənilən platformada faylları və veriləri hər kəslə güvənli şəkildə paylaşın. Məlumatlarınız, ifşa olunmamaq üçün ucdan-uca şifrələnmiş qalacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4039,14 +4020,14 @@ "message": "Yox say" }, "importData": { - "message": "Datanı daxilə köçür", + "message": "Veriləri daxilə köçür", "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" }, "importError": { "message": "Daxilə köçürmə xətası" }, "importErrorDesc": { - "message": "Daxilə köçürməyə çalışdığınız data ilə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." + "message": "Daxilə köçürməyə çalışdığınız verilərlə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Aşağıdakı xətaları həll edin və yenidən sınayın." @@ -4055,7 +4036,7 @@ "message": "Açıqlama" }, "importSuccess": { - "message": "Data uğurla daxilə köçürüldü" + "message": "Verilər uğurla daxilə köçürüldü" }, "importSuccessNumberOfItems": { "message": "Cəmi $AMOUNT$ element daxilə köçürüldü.", @@ -4106,7 +4087,7 @@ "message": "Cəmi" }, "importWarning": { - "message": "Datanı $ORGANIZATION$ təşkilatına köçürürsünüz. Datanızı bu təşkilatın üzvləri ilə paylaşa bilərsiniz. Davam etmək istəyirsiniz?", + "message": "Veriləri $ORGANIZATION$ təşkilatına köçürürsünüz. Veriləriniz, bu təşkilatın üzvləri ilə paylaşıla bilər. Davam etmək istəyirsiniz?", "placeholders": { "organization": { "content": "$1", @@ -4127,13 +4108,13 @@ "message": "Duo-nu başlat" }, "importFormatError": { - "message": "Data doğru format edilməyib. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." + "message": "Verilər düzgün format olunmayıb. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." }, "importNothingError": { "message": "Heç nə daxilə köçürülmədi." }, "importEncKeyError": { - "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, datanı xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." + "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, veriləri xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." }, "invalidFilePassword": { "message": "Yararsız fayl parolu, lütfən xaricə köçürmə faylını yaradarkən daxil etdiyiniz parolu istifadə edin." @@ -4192,19 +4173,19 @@ "message": "Seyfi daxilə köçürməyi təsdiqlə" }, "confirmVaultImportDesc": { - "message": "Bu fayl parolla qorunur. Məlumatları daxilə köçürmək üçün fayl parolunu daxil edin." + "message": "Bu fayl parolla qorunur. Veriləri daxilə köçürmək üçün fayl parolunu daxil edin." }, "confirmFilePassword": { "message": "Fayl parolunu təsdiqlə" }, "exportSuccess": { - "message": "Seyf datası xaricə köçürüldü" + "message": "Seyf veriləri xaricə köçürüldü" }, "typePasskey": { "message": "Keçid açarı" }, "accessing": { - "message": "Müraciət edilir" + "message": "Erişilir" }, "loggedInExclamation": { "message": "Giriş edildi!" @@ -4270,7 +4251,7 @@ "message": "Çox faktorlu kimlik doğrulama ləğv edildi" }, "noLastPassDataFound": { - "message": "LastPass datası tapılmadı" + "message": "LastPass veriləri tapılmadı" }, "incorrectUsernameOrPassword": { "message": "Yanlış istifadəçi adı və ya parol" @@ -4376,7 +4357,7 @@ "message": "sahiblik edən" }, "useDeviceOrHardwareKey": { - "message": "Cihazınızı və ya avadanlıq açarınızı istifadə edin" + "message": "Cihazınızı və ya donanım açarınızı istifadə edin" }, "justOnce": { "message": "Yalnız bir dəfə" @@ -4700,7 +4681,7 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { - "message": "Deaktiv edilmiş təşkilatlardakı elementlərə müraciət edilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Deaktiv edilmiş təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "additionalInformation": { "message": "Əlavə məlumat" @@ -4757,13 +4738,13 @@ "message": "Mobil tətbiqi əldə et" }, "getTheMobileAppDesc": { - "message": "Bitwarden mobil tətbiqi ilə parollarınıza hər yerdən müraciət edin." + "message": "Bitwarden mobil tətbiqi ilə parollarınıza hər yerdən erişin." }, "getTheDesktopApp": { "message": "Masaüstü tətbiqi əldə et" }, "getTheDesktopAppDesc": { - "message": "Seyfinizə brauzer olmadan müraciət edin, sonra həm masaüstü tətbiqində, həm də brauzer uzantısında kilid açma prosesini sürətləndirmək üçün biometrik ilə kilid açma prosesini qurun." + "message": "Seyfinizə brauzer olmadan erişin, sonra həm masaüstü tətbiqində, həm də brauzer uzantısında kilid açma prosesini sürətləndirmək üçün biometrik ilə kilid açma prosesini qurun." }, "downloadFromBitwardenNow": { "message": "İndi bitwarden.com saytından endir" @@ -4916,7 +4897,7 @@ "message": "Yüklənir" }, "data": { - "message": "Data" + "message": "Veri" }, "passkeys": { "message": "Keçid açarı", @@ -4934,10 +4915,10 @@ "message": "Təyin et" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementi görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementi görə biləcək." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementləri görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementləri görə biləcək." }, "bulkCollectionAssignmentWarning": { "message": "$TOTAL_COUNT$ element seçmisiniz. Düzəliş icazəniz olmadığı üçün $READONLY_COUNT$ elementi güncəlləyə bilməzsiniz.", @@ -4964,10 +4945,10 @@ "message": "Xana etiketi" }, "textHelpText": { - "message": "Təhlükəsizlik sualları kimi datalar üçün mətn xanalarını istifadə edin" + "message": "Təhlükəsizlik sualları kimi verilər üçün mətn xanalarını istifadə edin" }, "hiddenHelpText": { - "message": "Parol kimi həssas datalar üçün gizli xanaları istifadə edin" + "message": "Parol kimi həssas verilər üçün gizli xanaları istifadə edin" }, "checkBoxHelpText": { "message": "\"E-poçtu xatırla\" kimi formun təsdiq qutusunu avto-doldurmaq istəyirsinizsə təsdiq qutularını istifadə edin" @@ -5239,7 +5220,7 @@ "message": "Seyfinizin kilidini saniyələr ərzində açın" }, "unlockVaultDesc": { - "message": "Seyfinizə daha cəld müraciət etmək üçün kilid açma və bitmə vaxtı ayarlarını özəlləşdirə bilərsiniz." + "message": "Seyfinizə daha cəld erişmək üçün kilid açma və bitmə vaxtı ayarlarını özəlləşdirə bilərsiniz." }, "unlockPinSet": { "message": "PIN ilə kilid açma təyini" @@ -5491,7 +5472,7 @@ "message": "Bütün hesablarınız üçün güclü, unikal parollar yaratmaq və saxlamaq üçün yaradıcını istifadə edin." }, "secureDevices": { - "message": "Datanız, ehtiyacınız olan vaxt yanınızdadır" + "message": "Veriləriniz, ehtiyacınız olan vaxt yanınızdadır" }, "secureDevicesBody": { "message": "Bitwarden mobil, brauzer və masaüstü tətbiqləri ilə limitsiz cihaz arasında limitsiz parol saxlayın." @@ -5515,7 +5496,7 @@ "message": "Hazırkı səhifə üçün elementləri avto-doldur" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Asan müraciət üçün elementləri sevimlilərə əlavə et" + "message": "Asan erişmək üçün elementləri sevimlilərə əlavə et" }, "hasItemsVaultNudgeBodyThree": { "message": "Seyfinizdə başqa bir şey axtarın" @@ -5551,13 +5532,13 @@ "message": "Kimliklərinizlə, uzun qeydiyyat və ya əlaqə xanalarını daha tez avtomatik doldurun." }, "newNoteNudgeTitle": { - "message": "Həssas datalarınızı güvənli şəkildə saxlayın" + "message": "Həssas verilərinizi güvənli şəkildə saxlayın" }, "newNoteNudgeBody": { - "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas dataları təhlükəsiz saxlayın." + "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas veriləri təhlükəsiz saxlayın." }, "newSshNudgeTitle": { - "message": "Gəlişdirici dostu SSH müraciəti" + "message": "Gəlişdirici dostu SSH erişimi" }, "newSshNudgeBodyOne": { "message": "Açarlarınızı saxlayın və sürətli, şifrələnmiş kimlik doğrulama üçün SSH agentinə bağlayın.", @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly brauzerinizdə dəstəklənmir və ya fəal deyil. WebAssembly, Bitwarden tətbiqini istifadə etmək üçün tələb olunur.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index d7a1db3adc8..d6090123878 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 79e13cdb677..3b411cd088c 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Тази заявка вече не е активна." }, - "areYouTryingToAccessYourAccount": { - "message": "Опитвате ли се да получите достъп до акаунта си?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Вписването за $EMAIL$ на $DEVICE$ е одобрено", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Вие отказахте опит за вписване от друго устройство. Ако това наистина сте били Вие, опитайте да се впишете от устройството отново." - }, "loginRequestHasAlreadyExpired": { "message": "Заявката за вписване вече е изтекла." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly не е включено или не се поддържа от Вашия браузър. За ползването на приложението на Битуорден е необходимо WebAssembly да работи.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Показване на повече" + }, + "showLess": { + "message": "Показване на по-малко" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index a3c029fb963..55baca0dad2 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 8a94ba3e9e9..7ad375dabf0 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 42fb9c24003..3edfb98eba2 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 3f8dd2e2b48..0c117fded02 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Tento požadavek již není platný." }, - "areYouTryingToAccessYourAccount": { - "message": "Pokoušíte se získat přístup k Vašemu účtu?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Přihlášení bylo potvrzeno z $EMAIL$ pro $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Pokus o přihlášení byl zamítnut z jiného zařízení. Pokud jste to opravdu Vy, zkuste se znovu přihlásit do zařízení." - }, "loginRequestHasAlreadyExpired": { "message": "Požadavek na přihlášení již vypršel." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly není ve Vašem prohlížeči podporováno nebo není povoleno. WebAssembly je vyžadováno pro použití aplikace Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Zobrazit více" + }, + "showLess": { + "message": "Zobrazit méně" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 307373da9aa..8307b994fe0 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 4b6da81a994..0ff87e6e14f 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 9ef82a6d5ae..8aeea9bc6e9 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Diese Anfrage ist nicht mehr gültig." }, - "areYouTryingToAccessYourAccount": { - "message": "Versuchst du auf dein Konto zuzugreifen?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Anmeldung von $EMAIL$ auf $DEVICE$ bestätigt", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Du hast einen Anmeldeversuch von einem anderen Gerät abgelehnt. Wenn du das wirklich warst, versuche dich erneut mit dem Gerät anzumelden." - }, "loginRequestHasAlreadyExpired": { "message": "Anmeldeanfrage ist bereits abgelaufen." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly wird von deinem Browser nicht unterstützt oder ist nicht aktiviert. WebAssembly wird benötigt, um die Bitwarden-App nutzen zu können.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index fa4f3ac0f3c..4ce77543a45 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index a70fbd85123..8acf75e2ee5 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 39de06249fc..281caeac0d5 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 3b681054abc..0e1185148df 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -197,7 +197,7 @@ "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { - "message": "Autorrellenar" + "message": "Autocompletar" }, "autoFillLogin": { "message": "Autocompletar inicio de sesión" @@ -548,7 +548,7 @@ "message": "Buscar en caja fuerte" }, "resetSearch": { - "message": "Reset search" + "message": "Restablecer búsqueda" }, "edit": { "message": "Editar" @@ -1456,7 +1456,7 @@ "message": "Copiar TOTP automáticamente" }, "disableAutoTotpCopyDesc": { - "message": "Si tu entrada tiene una clave de autenticación adjunta, el código de verificación TOTP es copiado automáticamente al portapapeles cuando autorellenas una entrada." + "message": "Si tu entrada tiene una clave de autenticación, copiar el código de verificación TOTP a tu portapapeles cuando autocompletes el inicio de sesión." }, "enableAutoBiometricsPrompt": { "message": "Pedir datos biométricos al ejecutar" @@ -1663,25 +1663,25 @@ "message": "Autocompletar al cargar la página" }, "enableAutoFillOnPageLoad": { - "message": "Habilitar autorrellenar al cargar la página" + "message": "Autocompletar al cargar la página" }, "enableAutoFillOnPageLoadDesc": { - "message": "Si se detecta un formulario, realizar automáticamente un autorellenado cuando la web cargue." + "message": "Si se detecta un formulario de inicio de sesión, autocompletar cuando cargue la página web." }, "experimentalFeature": { - "message": "Los sitios web vulnerados o no confiables pueden explotar el autorelleno al cargar la página." + "message": "Los sitios web vulnerados o no confiables pueden explotar el autocompletado al cargar la página." }, "learnMoreAboutAutofillOnPageLoadLinkText": { "message": "Más información sobre riesgos" }, "learnMoreAboutAutofill": { - "message": "Más información sobre el relleno automático" + "message": "Más información sobre el autocompletado" }, "defaultAutoFillOnPageLoad": { "message": "Configuración de autorrelleno por defecto para elementos de inicio de sesión" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Después de activar el autorelleno en Carga de página, puede activar o desactivar la función para entradas individuales. Esta es la configuración predeterminada para elementos de inicio de sesión que no están configurados por separado." + "message": "Puedes desactivar el autocompletado al cargar la página para elementos individuales de inicio de sesión desde la vista de Edición del elemento." }, "itemAutoFillOnPageLoad": { "message": "Auto-relleno en carga de página (si está habilitado en opciones)" @@ -2281,16 +2281,16 @@ "message": "Confirmación de la acción del tiempo de espera" }, "autoFillAndSave": { - "message": "Autorellenar y guardar" + "message": "Autocompletar y guardar" }, "fillAndSave": { "message": "Rellenar y guardar" }, "autoFillSuccessAndSavedUri": { - "message": "Objeto autorellenado y URI guardada" + "message": "Elemento autocompletado y URI guardada" }, "autoFillSuccess": { - "message": "Objeto autorellenado" + "message": "Elemento autocompletado " }, "insecurePageWarning": { "message": "Atención: Esta es una página HTTP no segura, y cualquier información que envíes puede ser vista y cambiada por otros. Este inicio de sesión fue guardado originalmente en una página segura (HTTPS)." @@ -2528,7 +2528,7 @@ "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." }, "autofillBlockedNoticeV2": { - "message": "Autorelleno está desactivado para este sitio web." + "message": "Autocompletado está bloqueado para este sitio web." }, "autofillBlockedNoticeGuidance": { "message": "Cambia esto en los ajustes" @@ -2709,7 +2709,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "Detalles del Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2932,7 +2932,7 @@ "message": "Debes verificar tu correo electrónico para usar esta función. Puedes verificar tu correo electrónico en la caja fuerte web." }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "Contraseña maestra establecida correctamente" }, "updatedMasterPassword": { "message": "Contraseña maestra actualizada" @@ -3106,7 +3106,7 @@ "message": "Exportando caja fuerte personal" }, "exportingIndividualVaultDescription": { - "message": "Solo se exportarán los elementos individuales de la caja fuerte asociados con $EMAIL$. Los elementos de la bóveda de la organización no se incluirán. Solo se exportará la información de los elementos individuales y no incluirá adjuntos asociados.", + "message": "Solo se exportarán los elementos individuales de la caja fuerte asociados a $EMAIL$. Los elementos de la caja fuerte de la organización no se incluirán. Solo se exportará la información de los elementos de la caja fuerte y no se incluirá adjuntos asociados.", "placeholders": { "email": { "content": "$1", @@ -3483,13 +3483,13 @@ "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." }, "device": { - "message": "Device" + "message": "Dispositivo" }, "loginStatus": { "message": "Login status" }, "masterPasswordChanged": { - "message": "Master password saved" + "message": "Contraseña maestra guardada" }, "exposedMasterPassword": { "message": "Contraseña maestra comprometida" @@ -3525,7 +3525,7 @@ "message": "Las políticas de su organización han activado autocompletar al cargar la página." }, "howToAutofill": { - "message": "Cómo autorellenar" + "message": "Cómo autocompletar" }, "autofillSelectInfoWithCommand": { "message": "Selecciona un elemento de esta pantalla, usa el acceso directo $COMMAND$ o explora otras opciones en ajustes.", @@ -3585,28 +3585,28 @@ "message": "Remember this device to make future logins seamless" }, "manageDevices": { - "message": "Manage devices" + "message": "Gestionar dispositivos" }, "currentSession": { - "message": "Current session" + "message": "Sesión actual" }, "mobile": { - "message": "Mobile", + "message": "Móvil", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "Extensión", "description": "Browser extension/addon" }, "desktop": { - "message": "Desktop", + "message": "Escritorio", "description": "Desktop app" }, "webVault": { - "message": "Web vault" + "message": "Caja fuerte Web" }, "webApp": { - "message": "Web app" + "message": "Aplicación Web" }, "cli": { "message": "CLI" @@ -3616,22 +3616,22 @@ "description": "Software Development Kit" }, "requestPending": { - "message": "Request pending" + "message": "Solicitud pendiente" }, "firstLogin": { - "message": "First login" + "message": "Primer inicio de sesión" }, "trusted": { - "message": "Trusted" + "message": "De confianza" }, "needsApproval": { - "message": "Needs approval" + "message": "Necesita aprobación" }, "devices": { - "message": "Devices" + "message": "Dispositivos" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Intento de acceso de $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3640,16 +3640,16 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "Confirmar acceso" }, "denyAccess": { - "message": "Deny access" + "message": "Denegar acceso" }, "time": { "message": "Time" }, "deviceType": { - "message": "Device Type" + "message": "Tipo de Dispositivo" }, "loginRequest": { "message": "Login request" @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5583,14 +5564,20 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Crea fácilmente contraseñas seguras y únicas haciendo clic en el botón Generar contraseña para ayudarte a mantener tus inicios de sesión seguros.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { "message": "No tienes permisos para ver esta página. Intenta iniciar sesión con otra cuenta." }, "wasmNotSupported": { - "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "message": "WebAssembly no está soportado por tu navegador o no está habilitado. WebAssembly es necesario para usar la aplicación de Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 8b61aa70a60..09e77bd361f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 73bd992dacb..1cd1439e972 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 18afcb775f9..cfae87fd1a5 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly در مرورگر شما پشتیبانی نمی‌شود یا فعال نیست. برای استفاده از برنامه Bitwarden، فعال بودن WebAssembly الزامی است.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 894b50b5273..ffd5caea1d3 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Tämä pyyntö ei ole enää voimassa." }, - "areYouTryingToAccessYourAccount": { - "message": "Yritätkö kirjautua tilillesi?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Kirjautuminen vahvistettu tunnuksella $EMAIL$ laitteella $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Estit toisen laitteen lähettämän kirjautumispyynnön. Jos kuitenkin tunnistit kirjautumisyrityksen, suorita kirjautuminen uudelleen." - }, "loginRequestHasAlreadyExpired": { "message": "Kirjautumispyyntö on jo vanhentunut." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly ei ole tuettu selaimessasi tai se ei ole käytössä. WebAssembly vaaditaan, jotta voi käyttää Bitwardenia.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index dfc8d65cfd9..1682d21aa7f 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index c35f4ca4bb9..1a4f466a41c 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Cette demande n'est plus valide." }, - "areYouTryingToAccessYourAccount": { - "message": "Essayez-vous d'accéder à votre compte ?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Connexion confirmée pour $EMAIL$ sur $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Vous avez refusé une tentative de connexion depuis un autre appareil. Si c'était vraiment vous, essayez de vous reconnecter avec l'appareil." - }, "loginRequestHasAlreadyExpired": { "message": "La demande de connexion a déjà expiré." }, @@ -4601,7 +4582,7 @@ } }, "copyFieldCipherName": { - "message": "Copiez $FIELD$, $CIPHERNAME$", + "message": "Copier $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly n'est pas pris en charge sur votre navigateur ou n'est pas activé. WebAssembly est requis pour utiliser l'application Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index c7d47b61209..0698191f53e 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index c13bcad10c6..96dc5215051 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index cc89f9cc2dd..35d7e8b2911 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 97bd79f2950..1a304a94d48 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Ovaj zahtjev više nije valjan." }, - "areYouTryingToAccessYourAccount": { - "message": "Pokušavaš li pristupiti svom računu?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odbijena je prijava na drugom uređaju. Ako si ovo stvarno ti, pokušaj se ponovno prijaviti uređajem." - }, "loginRequestHasAlreadyExpired": { "message": "Zahtjev za prijavu je već istekao." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly ili nije podržan ili nije omogućen u tvom pregledniku. WebAssembly je potreban za korištenje Bitwarden aplikacije.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index cfe79ea4b20..bef0ef64170 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "A kérés a továbbiakban már nem érvényes." }, - "areYouTryingToAccessYourAccount": { - "message": "A fiókhoz próbálunk hozzáférni?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "A bejelelentketés $EMAIL$ email címmel megerősítésre került $DEVICE$ eszközön.", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Megtagadásra került egy bejelentkezési kísérletet egy másik eszközről. Ha valóban mi voltunk, próbáljunk meg újra bejelentkezni az eszközzel." - }, "loginRequestHasAlreadyExpired": { "message": "A bejelentkezési kérés már lejárt." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "A WebAssembly nem támogatott a böngészőben vagy nincs engedélyezve. A WebAssembly szükséges a Bitwarden alkalmazás használatához.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 4ce58ee7618..297b2d458e1 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -20,7 +20,7 @@ "message": "Undangan diterima" }, "createAccount": { - "message": "Buat Akun" + "message": "Buat akun" }, "newToBitwarden": { "message": "Baru menggunakan Bitwarden?" @@ -548,7 +548,7 @@ "message": "Cari brankas" }, "resetSearch": { - "message": "Reset search" + "message": "Atur ulang pencarian" }, "edit": { "message": "Edit" @@ -1177,10 +1177,10 @@ "description": "Detailed error message shown when saving login details fails." }, "changePasswordWarning": { - "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + "message": "Setelah mengubah kata sandi, Anda perlu masuk lagi dengan kata sandi baru. Sesi aktif di perangkat lain akan keluar dalam satu jam." }, "accountRecoveryUpdateMasterPasswordSubtitle": { - "message": "Change your master password to complete account recovery." + "message": "Ubah kata sandi utama Anda untuk menyelesaikan pemulihan akun." }, "enableChangedPasswordNotification": { "message": "Tanyakan untuk memperbarui masuk yang sudah ada" @@ -1833,7 +1833,7 @@ "message": "Kode Keamanan" }, "cardNumber": { - "message": "card number" + "message": "nomor kartu" }, "ex": { "message": "mis." @@ -2500,10 +2500,10 @@ "message": "Sebuah kebijakan organisasi telah menghalangi mengimpor benda-benda ke brankas pribadi Anda." }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "Tidak dapat meingpor jenis item kartu" }, "restrictCardTypeImportDesc": { - "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + "message": "Kebijakan yang diatur 1 atau lebih organisasi tidak mengizinkan Anda mengimpor kartu ke brankas." }, "domainsTitle": { "message": "Domain", @@ -2932,7 +2932,7 @@ "message": "Anda harus memverifikasi email Anda untuk menggunakan fitur ini. Anda dapat memverifikasi email Anda di brankas web." }, "masterPasswordSuccessfullySet": { - "message": "Master password successfully set" + "message": "Kata sandi utama berhasil diatur" }, "updatedMasterPassword": { "message": "Kata Sandi Utama Telah Diperbarui" @@ -3467,7 +3467,7 @@ "message": "Permintaan terkirim" }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "Permintaan masuk untuk $EMAIL$ di $DEVICE$ diizinkan", "placeholders": { "email": { "content": "$1", @@ -3480,16 +3480,16 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + "message": "Anda menolak percobaan masuk dari perangkat lain. Jika itu adalah Anda, mohon coba masuk kembali di perangkat tersebut." }, "device": { - "message": "Device" + "message": "Perangkat" }, "loginStatus": { - "message": "Login status" + "message": "Status masuk" }, "masterPasswordChanged": { - "message": "Master password saved" + "message": "Sandi utama disimpan" }, "exposedMasterPassword": { "message": "Kata Sandi Utama yang Terpapar" @@ -3585,17 +3585,17 @@ "message": "Ingat perangkat ini untuk membuat login berikutnya lebih lancar" }, "manageDevices": { - "message": "Manage devices" + "message": "Kelola perangkat" }, "currentSession": { - "message": "Current session" + "message": "Sesi saat ini" }, "mobile": { - "message": "Mobile", + "message": "Seluler", "description": "Mobile app" }, "extension": { - "message": "Extension", + "message": "Pengaya", "description": "Browser extension/addon" }, "desktop": { @@ -3603,35 +3603,35 @@ "description": "Desktop app" }, "webVault": { - "message": "Web vault" + "message": "Brankas web" }, "webApp": { - "message": "Web app" + "message": "Aplikasi web" }, "cli": { - "message": "CLI" + "message": "Antarmuka Baris Perintah" }, "sdk": { "message": "SDK", "description": "Software Development Kit" }, "requestPending": { - "message": "Request pending" + "message": "Permintaan tertunda" }, "firstLogin": { - "message": "First login" + "message": "Masuk pertama" }, "trusted": { - "message": "Trusted" + "message": "Terpercaya" }, "needsApproval": { - "message": "Needs approval" + "message": "Perlu persetujuan" }, "devices": { - "message": "Devices" + "message": "Perangkat" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Percobaan akses oleh $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3640,50 +3640,31 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "Izinkan akses" }, "denyAccess": { - "message": "Deny access" + "message": "Tolak akses" }, "time": { - "message": "Time" + "message": "Waktu" }, "deviceType": { - "message": "Device Type" + "message": "Jenis Perangkat" }, "loginRequest": { - "message": "Login request" + "message": "Permintaan masuk" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." - }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "Permintaan ini tidak lagi valid." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Permintaan masuk kedaluwarsa." }, "justNow": { - "message": "Just now" + "message": "Baru saja" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "Diminta $MINUTES$ menit yang lalu", "placeholders": { "minutes": { "content": "$1", @@ -3713,10 +3694,10 @@ "message": "Minta persetujuan admin" }, "unableToCompleteLogin": { - "message": "Unable to complete login" + "message": "Gagal menyelesaikan proses masuk" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { - "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + "message": "Anda harus masuk di perangkat terpercaya atau meminta administrator untuk membuat kata sandi Anda." }, "ssoIdentifierRequired": { "message": "Pengenal SSO organisasi diperlukan." @@ -4398,23 +4379,23 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "Bitwarden mengenali saran isi otomatis menggunakan deteksi kecocokan URI.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { - "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Ekspresi regular\" adalah opsi lanjutan dengan risiko lebih besar untuk menyingkapkan identitas anda.", "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" }, "startsWithAdvancedOptionWarning": { - "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "message": "\"Bermula dengan\" adalah opsi lanjutan dengan risiko lebih besar untuk menyingkapkan identitas anda.", "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "Ketahui lebih tentang deteksi kecocokan", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { - "message": "Advanced options", + "message": "Opsi lanjutan", "description": "Advanced option placeholder for uri option component" }, "confirmContinueToBrowserSettingsTitle": { @@ -4601,7 +4582,7 @@ } }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "Salin $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -5245,7 +5226,7 @@ "message": "PIN untuk membuka telah diatur" }, "unlockWithBiometricSet": { - "message": "Unlock with biometrics set" + "message": "Biometrik untuk membuka telah diatur" }, "authenticating": { "message": "Sedang memeriksa keaslian" @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly tidak didukung atau tidak dinyalakan oleh peramban Anda. Web Assembly diperlukan untuk menggunakan aplikasi Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 164d46bcec5..a91b3d45125 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly non è supportato dal browser o non è abilitato. WebAssembly è richiesto per utilizzare l'app Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 977d04ca28a..9370a3ae6b1 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index da70c255803..6bbdb6f67f3 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 31b285f6780..f4ab488884a 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 89d59488aaf..50725e73064 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -747,7 +747,7 @@ "message": "시스템 잠금 시" }, "onRestart": { - "message": "브라우저 다시 시작 시" + "message": "브라우저 재시작 시" }, "never": { "message": "안함" @@ -1016,7 +1016,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "로그인을 추가할 건지 물어보기" + "message": "로그인 추가 확인" }, "vaultSaveOptionsTitle": { "message": "보관함 옵션들을 저장하기" @@ -1028,7 +1028,7 @@ "message": "보관함에 항목이 없을 경우 추가하라는 메시지를 표시합니다. 모든 로그인된 계정에 적용됩니다." }, "showCardsInVaultViewV2": { - "message": "보관함 보기에서 언제나 카드 자동 완성 제안을 표시" + "message": "보관함 보기에서 자동 완성 제안으로 카드를 항상 표시" }, "showCardsCurrentTab": { "message": "탭 페이지에 카드 표시" @@ -1037,7 +1037,7 @@ "message": "간편한 자동완성을 위해 탭에 카드 항목들을 나열" }, "showIdentitiesInVaultViewV2": { - "message": "보관함 보기에서 언제나 신원의 자동 완성 제안을 표시" + "message": "보관함 보기에서 자동 채우기 제안으로 신원을 항상 표시" }, "showIdentitiesCurrentTab": { "message": "탭 페이지에 신원들을 표시" @@ -1049,7 +1049,7 @@ "message": "보관함 보기에서 항목을 클릭하여 자동 완성" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "자동 완성 제안에서 항목 클릭으로 채우기" }, "clearClipboard": { "message": "클립보드 비우기", @@ -1183,7 +1183,7 @@ "message": "Change your master password to complete account recovery." }, "enableChangedPasswordNotification": { - "message": "현재 로그인으로 업데이트할 건지 묻기" + "message": "기존 로그인 정보 업데이트 확인" }, "changedPasswordNotificationDesc": { "message": "웹사이트에서 변경 사항이 감지되면 로그인 비밀번호를 업데이트하라는 메시지를 표시합니다." @@ -1213,7 +1213,7 @@ "message": "추가 옵션" }, "enableContextMenuItem": { - "message": "문맥 매뉴 옵션 표시" + "message": "컨텍스트 메뉴 옵션 표시" }, "contextMenuItemDesc": { "message": "우클릭을 사용하여, 비밀번호 생성과 웹사이트 로그인 매칭에 접근하세요" @@ -1264,10 +1264,10 @@ "message": "이 비밀번호는 이 파일을 파일 내보내거나, 가져오는데 사용됩니다." }, "accountRestrictedOptionDescription": { - "message": "내보내기를 당신의 계정의 사용자이름과 마스터비밀번호로부터 파생된 계정 암호화 키를 사용하여 암호화하고, 현재의 Bitwarden 계정으로만 가져오도록 제한합니다." + "message": "당신 계정의 사용자 이름과 마스터 비밀번호를 통한 암호화 키로 내보내기 파일을 암호화 하고, 현재의 Bitwarden 계정으로만 가져올 수 있도록 제한합니다." }, "passwordProtectedOptionDescription": { - "message": "파일에 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 그 비밀번호로 해독하여 가져오기 합니다." + "message": "파일에 비밀번호를 설정하여 내보내기 파일을 암호화하며, 그 비밀번호만 입력하면 어느 Bitwarden 계정으로든 가져올 수 있습니다." }, "exportTypeHeading": { "message": "내보내기 유형" @@ -1630,13 +1630,13 @@ "message": "양식 필드에 자동 완성 제안 표시" }, "showInlineMenuIdentitiesLabel": { - "message": "신원를 제안으로 표시" + "message": "신원을 제안으로 표시" }, "showInlineMenuCardsLabel": { "message": "카드를 제안으로 표시" }, "showInlineMenuOnIconSelectionLabel": { - "message": "아이콘을 선택할 때 제안을 표시" + "message": "아이콘 선택 시 제안 표시" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "로그인한 모든 계정에 적용" @@ -2196,7 +2196,7 @@ "message": "브라우저 다시 시작 시 마스터 비밀번호로 잠금" }, "lockWithMasterPassOnRestart1": { - "message": "브라우저 다시 시작 시 마스터 비밀번호가 필요합니다" + "message": "브라우저 재시작 시 마스터 비밀번호 요구" }, "selectOneCollection": { "message": "반드시 하나 이상의 컬렉션을 선택해야 합니다." @@ -3115,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "$EMAIL$ 계정과 관련된 개인 보관함 항목과 첨부 파일만 내보내집니다. 조직 보관함 항목은 포함되지 않습니다.", "placeholders": { "email": { "content": "$1", @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -3808,7 +3789,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "플랫폼에 구애받지 않고 누구에게나 파일과 데이터를 안전하게 공유하세요. 전송하는 정보는 종단 간 암호화로 보호되어 외부 노출이 최소화됩니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4398,7 +4379,7 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "Bitwarden에서 자동 채우기 제안을 식별하는 방법은 URI 일치 감지입니다.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 5a4f0d8c419..fa53a42a4b7 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 81447182f26..3b2ca17770a 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Šis pieprasījums vairs nav derīgs." }, - "areYouTryingToAccessYourAccount": { - "message": "Vai mēģini piekļūt savam kontam?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "$EMAIL$ pieteikšanās apstiprināta ierīcē $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Tu noraidīji pieteikšanās mēģinājumu no citas ierīces. Ja tas tiešām biji Tu, mēģini pieteikties no ierīces vēlreiz!" - }, "loginRequestHasAlreadyExpired": { "message": "Pieteikšanās pieprasījuma derīgums jau ir beidzies." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly šajā pārlūkā netiek atbalstīts vai nav iespējots. WebAssebly ir nepieciešams, lai izmantotu Bitwarden lietotni.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 11709a4611b..ca1bbc69297 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index e7d06e4d5f9..70059b1552e 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 7cbe8747d3b..9e617957dc8 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Denne forespørselen er ikke lenger gyldig." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Innloggingsforespørselen har allerede utløpt." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 0c2bd31935f..c6e24277054 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Dit verzoek is niet langer geldig." }, - "areYouTryingToAccessYourAccount": { - "message": "Probeer je toegang te krijgen tot je account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Inloggen voor $EMAIL$ bevestigd op $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Je hebt een inlogpoging vanaf een ander apparaat geweigerd. Als je dit toch echt zelf was, probeer dan opnieuw in te loggen met het apparaat." - }, "loginRequestHasAlreadyExpired": { "message": "Inlogverzoek is al verlopen." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly wordt niet ondersteund in je browser of is niet ingeschakeld. WebAssembly is vereist om de Bitwarden-app te gebruiken.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Meer weergeven" + }, + "showLess": { + "message": "Minder weergeven" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 04112b08219..eeda1f9b9b9 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -1468,7 +1468,7 @@ "message": "Konto premium jest wymagane, aby skorzystać z tej funkcji." }, "authenticationTimeout": { - "message": "Limit czasu uwierzytelniania" + "message": "Przekroczono limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { "message": "Upłynął limit czasu uwierzytelniania. Zaloguj się ponownie." @@ -1523,7 +1523,7 @@ "message": "Wybierz metodę logowania dwustopniowego" }, "recoveryCodeDesc": { - "message": "Utraciłeś dostęp do wszystkich swoich mechanizmów dwustopniowego logowania? Użyj kodów odzyskiwania, aby wyłączyć dwustopniowe logowanie na Twoim koncie." + "message": "Nie masz dostępu do logowania dwustopniowego? Użyj kodu odzyskiwania, aby je wyłączyć." }, "recoveryCodeTitle": { "message": "Kod odzyskiwania" @@ -1681,7 +1681,7 @@ "message": "Domyślne ustawienie autouzupełniania" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Po włączeniu autouzupełnianiu po załadowaniu strony możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów." + "message": "Możesz wyłączyć autouzupełnianie po załadowaniu strony dla poszczególnych elementów w opcjach konkretnych elementów." }, "itemAutoFillOnPageLoad": { "message": "Automatycznie uzupełniaj po załadowaniu strony (jeśli włączono w opcjach)" @@ -2178,7 +2178,7 @@ "message": "Kod PIN jest nieprawidłowy." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Zbyt wiele nieprawidłowych prób wpisywania PIN. Wylogowywanie." + "message": "Zbyt wiele nieprawidłowych prób wpisywania kodu PIN. Trwa wylogowanie" }, "unlockWithBiometrics": { "message": "Odblokuj biometrią" @@ -2476,7 +2476,7 @@ "message": "Logowanie biometrią nie powiodło się" }, "biometricsFailedDesc": { - "message": "Dane biometryczne nie mogę być użyte, rozważ użycie hasła głównego lub wylogowanie. Jeśli się to powtarza, skontaktuj się z pomocą techniczną Bitwarden." + "message": "Weryfikacja biometryczna nie powiodła się. Zaloguj się za pomocą hasła głównego. Jeśli problem się powtarza, skontaktuj się z pomocą techniczną Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Uprawnienie nie zostało przyznane" @@ -2503,7 +2503,7 @@ "message": "Nie można zaimportować karty" }, "restrictCardTypeImportDesc": { - "message": "Polityka ustawiona przez 1 lub więcej organizacji uniemożliwia importowanie kart do sejfów." + "message": "Zasada ustawiona przez co najmniej 1 organizację uniemożliwia importowanie kart do sejfów." }, "domainsTitle": { "message": "Domeny", @@ -2631,14 +2631,14 @@ "message": "Sprawdź zagrożone hasła" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Twoje hasła organizacji są zagrożone, ponieważ są słabe, ponownie używane i/lub narażone.", + "message": "Hasła w Twojej organizacji są zagrożone, ponieważ są słabe, identyczne lub ujawnione.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { "message": "Ilustracja listy danych logowania, które są zagrożone." }, "generatePasswordSlideDesc": { - "message": "Szybko wygeneruj silne, unikalne hasło z menu autouzupełniania Bitwarden na stronie narażonej na ryzyko.", + "message": "Wygeneruj silne i unikalne hasło dla zagrożonej strony internetowej za pomocą autouzupełniania Bitwarden.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { @@ -3115,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Tylko poszczególne elementy sejfu łącznie z załącznikami powiązanymi z $EMAIL$ zostaną wyeksportowane. Elementy sejfu organizacji nie będą dołączone", + "message": "Tylko osobisty sejf $EMAIL$ zostanie wyeksportowany. Elementy organizacji nie zostaną uwzględnione.", "placeholders": { "email": { "content": "$1", @@ -3127,7 +3127,7 @@ "message": "Eksportowanie sejfu organizacji" }, "exportingOrganizationVaultDesc": { - "message": "Tylko sejf organizacji powiązany z $ORGANIZATION$ zostanie wyeksportowany. Pozycje w poszczególnych sejfach lub innych organizacji nie będą uwzględnione.", + "message": "Tylko sejf organizacji $ORGANIZATION$ zostanie wyeksportowany. Elementy innych sejfów nie zostaną uwzględnione.", "placeholders": { "organization": { "content": "$1", @@ -3522,7 +3522,7 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Twoja organizacja włączyła autouzupełnianie podczas wczytywania strony." + "message": "Twoja organizacja włączyła autouzupełnianie po załadowaniu strony." }, "howToAutofill": { "message": "Jak autouzupełniać" @@ -3616,7 +3616,7 @@ "description": "Software Development Kit" }, "requestPending": { - "message": "Zapytanie oczekuje" + "message": "Oczekująca prośba" }, "firstLogin": { "message": "Pierwsze logowanie" @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Prośba nie jest już ważna." }, - "areYouTryingToAccessYourAccount": { - "message": "Czy próbujesz uzyskać dostęp do swojego konta?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odrzucono próby logowania z innego urządzenia. Jeśli to naprawdę Ty, spróbuj ponownie zalogować się za pomocą urządzenia." - }, "loginRequestHasAlreadyExpired": { "message": "Prośba logowania wygasła." }, @@ -3713,7 +3694,7 @@ "message": "Poproś administratora o potwierdzenie" }, "unableToCompleteLogin": { - "message": "Nie można ukończyć logowania" + "message": "Logowanie nie powiodło się" }, "loginOnTrustedDeviceOrAskAdminToAssignPassword": { "message": "Musisz zalogować się na zaufanym urządzeniu lub poprosić administratora o przypisanie hasła." @@ -3747,7 +3728,7 @@ "description": "European Union" }, "accessDenied": { - "message": "Odmowa dostępu. Nie masz uprawnień do przeglądania tej strony." + "message": "Odmowa dostępu. Nie masz uprawnień do wyświetlenia tej strony." }, "general": { "message": "Ogólne" @@ -3777,7 +3758,7 @@ "message": "Nie znaleziono aktywnego adresu e-mail. Trwa wylogowanie." }, "deviceTrusted": { - "message": "Zaufano urządzeniu" + "message": "Urządzenie zostało zaufane" }, "trustOrganization": { "message": "Zaufaj organizacji" @@ -3935,7 +3916,7 @@ "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "Automatyczne wypełnianie przy wczytywaniu strony zostało ustawione, aby używać ustawień domyślnych.", + "message": "Autouzupełnianie po załadowaniu strony zostało ustawione do domyślnych ustawień.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -4046,7 +4027,7 @@ "message": "Błąd importowania" }, "importErrorDesc": { - "message": "Wystąpił problem z danymi, które chcesz zaimportować. Rozwiąż poniższe problemy w Twoim pliku i spróbuj ponownie." + "message": "Wystąpił problem podczas importowania danych. Usuń poniższe błędy w pliku źródłowym i spróbuj ponownie." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Rozwiąż poniższe błędy i spróbuj ponownie." @@ -4082,7 +4063,7 @@ "message": "Oczekiwanie na potwierdzenie" }, "couldNotCompleteBiometrics": { - "message": "Nie można ukończyć z użyciem biometrii." + "message": "Logowanie biometrią nie powiodło się" }, "needADifferentMethod": { "message": "Potrzebujesz innej metody?" @@ -4303,7 +4284,7 @@ "message": "Wpisz jednorazowy kod z aplikacji uwierzytelniającej" }, "lastPassOOBDesc": { - "message": "Zatwierdź żądanie logowania w aplikacji uwierzytelniającej lub wprowadź jednorazowe hasło." + "message": "Potwierdź logowanie w aplikacji uwierzytelniającej lub wpisz jednorazowy kod." }, "passcode": { "message": "Kod" @@ -4398,7 +4379,7 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "Wykrywanie URI polega na tym, jak Bitwarden identyfikuje sugestie autouzupełniania.", + "message": "Wykrywanie dopasowania to sposób, w jaki Bitwarden identyfikuje sugestie autouzupełniania.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly nie jest obsługiwany w przeglądarce lub jest wyłączony. WebAssembly jest wymagany do korzystania z aplikacji Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Pokaż więcej" + }, + "showLess": { + "message": "Pokaż mniej" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 46fbb9beca3..ac5afdc9fce 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -1935,7 +1935,7 @@ "message": "Chave SSH" }, "typeNote": { - "message": "Note" + "message": "Nota" }, "newItemHeader": { "message": "Nova $TYPE$", @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -3804,11 +3785,11 @@ "message": "Trust user" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Envie informações sensíveis com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Compartilhe arquivos e dados com segurança, com qualquer pessoa e em qualquer plataforma. Suas informações ficarão sempre criptografadas de ponta a ponta, garantindo exposição mínima.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4748,25 +4729,25 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Baixar o Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Baixar o Bitwarden em todos os dispositivos" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Baixar o aplicativo para dispositivos móveis" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Acesse as suas senhas em qualquer lugar com o aplicativo móvel Bitwarden." }, "getTheDesktopApp": { "message": "Get the desktop app" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Acesse o seu cofre sem um navegador e, em seguida, configure o desbloqueio com dados biométricos para facilitar o desbloqueio tanto no aplicativo desktop quanto na extensão do navegador." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Baixar em bitwarden.com agora" }, "getItOnGooglePlay": { "message": "Get it on Google Play" @@ -5464,7 +5445,7 @@ "message": "Alterar senhas vulneráveis" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Opções do cofre" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 3cd813847d1..c2de13b9004 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido já não é válido." }, - "areYouTryingToAccessYourAccount": { - "message": "Está a tentar aceder à sua conta?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Início de sessão confirmado para $EMAIL$ no $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Recusou uma tentativa de início de sessão de outro dispositivo. Se foi realmente o caso, tente iniciar sessão com o dispositivo novamente." - }, "loginRequestHasAlreadyExpired": { "message": "O pedido de início de sessão já expirou." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "O WebAssembly não é suportado no seu navegador ou não está ativado. O WebAssembly é necessário para utilizar a app Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Mostrar mais" + }, + "showLess": { + "message": "Mostrar menos" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 13fe8aa9482..741b491da13 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index a5a6809a059..88fa89ac73e 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Этот запрос больше не действителен." }, - "areYouTryingToAccessYourAccount": { - "message": "Вы пытаетесь получить доступ к своему аккаунту?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Вход подтвержден для $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Вы отклонили попытку авторизации с другого устройства. Если это действительно были вы, попробуйте авторизоваться с этого устройства еще раз." - }, "loginRequestHasAlreadyExpired": { "message": "Запрос на вход истек." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly не поддерживается вашим браузером или не включен. WebAssembly необходим для использования приложения Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Больше" + }, + "showLess": { + "message": "Меньше" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 7bc0ba2694a..dd2df6f309c 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 28a687be339..e12a0c97ac4 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -216,7 +216,7 @@ "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { - "message": "Vygenerovať heslo (skopírované)" + "message": "Vygenerovať heslo (+skopírovať)" }, "copyElementIdentifier": { "message": "Kopírovať názov vlastného poľa" @@ -979,7 +979,7 @@ "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." }, "addedItem": { - "message": "Pridaná položka" + "message": "Položka bola pridaná" }, "editedItem": { "message": "Položka upravená" @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Táto žiadosť už nie je platná." }, - "areYouTryingToAccessYourAccount": { - "message": "Snažíte sa získať prístup k svojmu účtu?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Potvrdené prihlásenie pre $EMAIL$ na $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odmietli ste pokus o prihlásenie z iného zariadenia. Ak ste to boli naozaj vy, skúste sa prihlásiť pomocou zariadenia znova." - }, "loginRequestHasAlreadyExpired": { "message": "Platnosť žiadosti o prihlásenie už vypršala." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly nie je vo vašom prehliadači podporovaný alebo nie je povolený. Na používanie Bitwardenu sa vyžaduje WebAssembly.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Zobraziť viac" + }, + "showLess": { + "message": "Zobraziť menej" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 2db40266cd7..3af24b85889 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 3ee18612553..12d0c5b015e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Овај захтев више није важећи." }, - "areYouTryingToAccessYourAccount": { - "message": "Да ли покушавате да приступите вашем налогу?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Пријава потврђена за $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Одбили сте покушај пријаве са другог уређаја. Ако сте то заиста били ви, покушајте поново да се пријавите помоћу уређаја." - }, "loginRequestHasAlreadyExpired": { "message": "Захтев за пријаву је већ истекао." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly није подржано или није уапљено на вашем прегледачу. WebAssembly је потребно да би се користила апликација Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 49d2765bf6e..65eb7442bf7 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Denna begäran är inte längre giltig." }, - "areYouTryingToAccessYourAccount": { - "message": "Försöker du komma åt ditt konto?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Inloggning bekräftad för $EMAIL$ på $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Du har avvisat ett inloggningsförsök från en annan enhet. Om det verkligen var du, försök logga in med enheten igen." - }, "loginRequestHasAlreadyExpired": { "message": "Inloggningsbegäran har redan gått ut." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly stöds inte av din webbläsare eller är inte aktiverat. WebAssembly krävs för att använda Bitwarden-appen.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index f4c58318bc1..d076ef01ef2 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index fd92c71c200..2cea91a424e 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 83265497ddf..22a083959a9 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -84,7 +84,7 @@ "message": "Ana parola ipucu (isteğe bağlı)" }, "passwordStrengthScore": { - "message": "Parola Güvenlik Puanı $SCORE$", + "message": "Parola gücü puanı: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -982,7 +982,7 @@ "message": "Kayıt eklendi" }, "editedItem": { - "message": "Kayıt kaydedildi" + "message": "Hesap kaydedildi" }, "deleteItemConfirmation": { "message": "Çöp kutusuna göndermek istediğinizden emin misiniz?" @@ -2500,7 +2500,7 @@ "message": "Bir kuruluş ilkesi, kayıtları kişisel kasanıza içe aktarmayı engelledi." }, "restrictCardTypeImport": { - "message": "Cannot import card item types" + "message": "Kart öge türleri içe aktarılamıyor" }, "restrictCardTypeImportDesc": { "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." @@ -2625,7 +2625,7 @@ "message": "Ayarlarınızı güncelleyin, böylece parolalarınızı hızlıca otomatik doldurabilir ve yeni parolalar oluşturabilirsiniz" }, "reviewAtRiskLogins": { - "message": "Risk altındaki girişleri inceleyin" + "message": "Risk altındaki hesapları inceleyin" }, "reviewAtRiskPasswords": { "message": "Risk altındaki parolaları inceleyin" @@ -3392,7 +3392,7 @@ "message": "Sunucu sürümü" }, "selfHostedServer": { - "message": "şirket içinde barındırılan" + "message": "şirket içi" }, "thirdParty": { "message": "Üçüncü taraf" @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Bu istek artık geçerli değil." }, - "areYouTryingToAccessYourAccount": { - "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Başka bir cihazdan giriş isteğini reddettiniz. Yanlışlıkla yaptıysanız aynı cihazdan yeniden giriş yapmayı deneyin." - }, "loginRequestHasAlreadyExpired": { "message": "Giriş isteğinin süresi doldu." }, @@ -4009,7 +3990,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Yeni kasa giriş ögesini yeni bir açılır pencerede ekleyin", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -4017,7 +3998,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Yeni kasa kartı ögesini yeni bir açılır pencerede ekleyin", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -4204,7 +4185,7 @@ "message": "Geçiş anahtarı" }, "accessing": { - "message": "Erişilen konum:" + "message": "Erişilen konum" }, "loggedInExclamation": { "message": "Giriş yapıldı!" @@ -4398,7 +4379,7 @@ "description": "Label indicating the most common import formats" }, "uriMatchDefaultStrategyHint": { - "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "message": "URl eşleştirme tespiti, Bitwarden'ın otomatik doldurma önerilerini nasıl tanımladığıdır.", "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." }, "regExAdvancedOptionWarning": { @@ -4410,7 +4391,7 @@ "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" }, "uriMatchWarningDialogLink": { - "message": "More about match detection", + "message": "Eşleşme tespiti hakkında daha fazla bilgi", "description": "Link to match detection docs on warning dialog for advance match strategy" }, "uriAdvancedOption": { @@ -5209,22 +5190,22 @@ "message": "Bu kaydı düzenleme yetkisine sahip değilsiniz" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Önce PIN veya parola gerektiğinden biyometrik kilit açılamıyor." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biyometrik kilit açma şu anda kullanılamıyor." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biyometrik kilit açma, yanlış yapılandırılmış sistem dosyaları nedeniyle kullanılamıyor." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biyometrik kilit açma, yanlış yapılandırılmış sistem dosyaları nedeniyle kullanılamıyor." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Bitwarden masaüstü uygulaması kapalı olduğu için biyometrik kilit açılamıyor." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biyometrik kilit açma, Bitwarden masaüstü uygulamasında $EMAIL$ etkin olmadığı için kullanılamıyor.", "placeholders": { "email": { "content": "$1", @@ -5233,7 +5214,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biyometrik kilit açma şu anda bilinmeyen bir nedenden dolayı kullanılamıyor." }, "unlockVault": { "message": "Kasanızın kilidini saniyeler içinde açın" @@ -5560,20 +5541,20 @@ "message": "Developer-friendly SSH access" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Anahtarlarınızı saklayın ve hızlı, şifreli kimlik doğrulama için SSH aracısıyla bağlantı kurun.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "SSH agent hakkında daha fazla bilgi edinin", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Hızlı bir şekilde parolalar oluşturun" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Tıklayarak güçlü ve benzersiz parolaları kolayca oluşturun", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, @@ -5583,7 +5564,7 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Güvenli oturumlar açmaya yardımcı olmak için Parola Oluştur düğmesine tıklayarak güçlü ve benzersiz parolalar oluşturun.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "Tarayıcınızda WebAssembly desteklenmiyor veya etkinleştirilmemişt. Bitwarden uygulamasını kullanmak için WebAssembly gereklidir.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Daha fazla göster" + }, + "showLess": { + "message": "Daha az göster" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index a03440efe02..537a9bfd5cf 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Цей запит більше недійсний." }, - "areYouTryingToAccessYourAccount": { - "message": "Ви намагаєтесь отримати доступ до свого облікового запису?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Підтверджено вхід для $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Ви відхилили спробу входу з іншого пристрою. Якщо це були дійсно ви, спробуйте ввійти з пристроєм знову." - }, "loginRequestHasAlreadyExpired": { "message": "Термін дії запиту на вхід завершився." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly не підтримується або не ввімкнено у вашому браузері. WebAssembly є обов'язковою вимогою для програми Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Розгорнути" + }, + "showLess": { + "message": "Згорнути" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index f25cc9c51dc..be807f83f07 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "Yêu cầu này không còn hiệu lực." }, - "areYouTryingToAccessYourAccount": { - "message": "Bạn đang cố gắng truy cập tài khoản của mình?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Đã xác nhận đăng nhập cho $EMAIL$ trên $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Bạn đã từ chối một lần đăng nhập từ thiết bị khác. Nếu thực sự là bạn, hãy thử đăng nhập lại bằng thiết bị đó." - }, "loginRequestHasAlreadyExpired": { "message": "Yêu cầu đăng nhập đã hết hạn." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly không được hỗ trợ trên trình duyệt của bạn hoặc chưa được kích hoạt. WebAssembly là yêu cầu bắt buộc để sử dụng ứng dụng Bitwarden.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 2382e6fc971..244d5d7963c 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "此请求已失效。" }, - "areYouTryingToAccessYourAccount": { - "message": "您正在尝试访问您的账户吗?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "已确认 $EMAIL$ 在 $DEVICE$ 上的登录", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "您拒绝了一个来自其他设备的登录尝试。若确实是您本人,请尝试再次发起设备登录。" - }, "loginRequestHasAlreadyExpired": { "message": "登录请求已过期。" }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "您的浏览器不支持 WebAssembly 或 WebAssembly 未启用。使用 Bitwarden App 需要 WebAssembly。", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index d2776cb227d..e8873d74e92 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -3657,25 +3657,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestHasAlreadyExpired": { "message": "Login request has already expired." }, @@ -5592,5 +5573,11 @@ "wasmNotSupported": { "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/store/locales/az/copy.resx b/apps/browser/store/locales/az/copy.resx index b8686ad8ffa..65c416c00d3 100644 --- a/apps/browser/store/locales/az/copy.resx +++ b/apps/browser/store/locales/az/copy.resx @@ -127,22 +127,22 @@ PCMag, WIRED, The Verge, CNET, G2 və daha çoxu tərəfindən ən yaxşı parol meneceri olaraq tanındı! RƏQƏMSAL HƏYATINIZI GÜVƏNDƏ SAXLAYIN -Hər hesab üçün unikal, güclü parollar yaradıb saxlayaraq rəqəmsal həyatınızı güvəndə saxlatyın və məlumat pozuntularına qarşı qorunun. Hər şeyi yalnız sizin müraciət edə biləcəyiniz ucdan uca şifrələnmiş parol seyfində saxlayın. +Hər hesab üçün unikal, güclü parollar yaradıb saxlayaraq rəqəmsal həyatınızı güvəndə saxlatyın və məlumat pozuntularına qarşı qorunun. Hər şeyi yalnız sizin erişə biləcəyiniz ucdan uca şifrələnmiş parol seyfində saxlayın. -DATANIZA HƏR YERDƏN, HƏR CİHAZDAN, İSTƏNİLƏN VAXT MÜRACİƏT EDİN +VERİLƏRİNİZƏ HƏR YERDƏN, HƏR CİHAZDAN, İSTƏNİLƏN VAXT ERİŞİN Limitsiz parolları limitsiz cihazlarda məhdudiyyət olmadan asanlıqla idarə edin, saxlayın, güvənlə qoruyun və paylaşın. HƏR KƏS İNTERNETDƏ GÜVƏNDƏ QALMAQ ÜÇÜN ALƏTLƏRƏ SAHİB OLMALIDIR -Bitwarden-i heç bir reklam və ya satış datası olmadan ödənişsiz istifadə edin. Bitwarden hesab edir ki, hər kəs internetdə güvəndə qalmaq bacarığına sahib olmalıdır. Premium planlar qabaqcıl özəlliklərə müraciət təklif edir. +Bitwarden-i heç bir reklam və ya satış veriləri olmadan ödənişsiz istifadə edin. Bitwarden hesab edir ki, hər kəs internetdə güvəndə qalmaq bacarığına sahib olmalıdır. Premium planlar qabaqcıl özəlliklərə erişim təklif edir. BITWARDEN İLƏ KOMANDALARINIZI GÜCLƏNDİRİN -Komanda və Müəssisələr üçün planlar, professional biznes özəllikləri ilə birgə gəlir. Bəzi nümunələrə SSO inteqrasiyası, öz-özünə sahiblik, kataloq inteqrasiyası və SCIM təqdim etmə, qlobal siyasətlər, API müraciəti, olay jurnalları və daha çoxu daxildir. +Komanda və Müəssisələr üçün planlar, professional biznes özəllikləri ilə birgə gəlir. Bəzi nümunələrə SSO inteqrasiyası, öz-özünə sahiblik, kataloq inteqrasiyası və SCIM təqdim etmə, qlobal siyasətlər, API erişimi, event qeydləri və daha çoxu daxildir. İş gücünüzün güvənliyini qorumaq və həssas məlumatları həmkarlarınızla paylaşmaq üçün Bitwarden-i istifadə edin. Bitwarden-i seçmək üçün daha çox səbəb: Dünya səviyyəli şifrələmə -Parollar, qabaqcıl ucdan uca şifrələmə (AES-256 bit, salted hashtag və PBKDF2 SHA-256) ilə qorunur, beləliklə datanız güvəndə və məxfi qalır. +Parollar, qabaqcıl ucdan uca şifrələmə (AES-256 bit, salted hashtag və PBKDF2 SHA-256) ilə qorunur, beləliklə veriləriniz güvəndə və məxfi qalır. 3-cü tərəf auditləri Bitwarden, müntəzəm olaraq tanınmış təhlükəsizlik firmaları ilə hərtərəfli üçüncü tərəf təhlükəsizlik auditləri keçirir. Bu illik auditlərə Bitwarden IP-ləri, serverləri və veb tətbiqləri arasında mənbə kodu qiymətləndirmələri və nüfuz testi daxildir. @@ -151,7 +151,7 @@ Qabaqcıl 2FA Giriş məlumatlarınızı üçüncü tərəf autentifikatoru, e-poçtla göndərilən kodlar və ya avadanlıq güvənlik açarı və ya keçid açarı kimi FIDO2 WebAuthn kimlik məlumatları ilə güvəndə saxlayın. Bitwarden Send -Ucdan-uca şifrələmə güvənliyini qoruyarkən və pozuntunu məhdudlaşdırarkən dataları birbaşa başqalarına göndərin. +Ucdan-uca şifrələmə güvənliyini qoruyarkən və pozuntunu məhdudlaşdırarkən veriləri birbaşa başqalarına göndərin. Daxili Generator Ziyarət etdiyiniz hər sayt üçün uzun, mürəkkəb və fərqli parollar və unikal istifadəçi adları yaradın. Əlavə məxfilik üçün e-poçt ləqəb provayderləri ilə inteqrasiya edin. @@ -160,7 +160,7 @@ Qlobal Tərcümələr Bitwarden tərcümələri 60-dan çox dildə mövcuddur, Crowdin vasitəsilə qlobal icma tərəfindən tərcümə edilmişdir. Çarpaz Platforma Tətbiqləri -İstənilən brauzerdən, mobil cihazdan və ya masaüstü əməliyyat sistemindən və daha çoxundan Bitwarden Seyfinizdəki həssas dataları güvəndə saxlayın və paylaşın. +İstənilən brauzerdən, mobil cihazdan və ya masaüstü əməliyyat sistemindən və daha çoxundan Bitwarden Seyfinizdəki həssas veriləri güvəndə saxlayın və paylaşın. Bitwarden parollardan daha çox qoruyur Bitwarden-nin ucdan-uca şifrələnmiş kimlik məlumatlarını idarəetmə həlləri, təşkilatlara hər şeyi, o cümlədən tərtibatçı sirrlərini və keçid açarı təcrübələrini qorumaq gücü verir. Bitwarden Sirr Meneceri və Bitwarden Passwordless.dev haqqında daha ətraflı öyrənmək üçün Bitwarden.com saytını ziyarət edin! @@ -169,7 +169,7 @@ Bitwarden-nin ucdan-uca şifrələnmiş kimlik məlumatlarını idarəetmə həl Bitwarden evdə və ya işdə olarkən bütün parol, keçid açarı və həssas məlumatlarınızı asanlıqla qoruyur. - Bir neçə cihaz arasında sinxronlaşdıraraq seyfinizə müraciəti genişləndirin + Sinxronlaşdırın və seyfinizə bir neçə cihazdan erişin Bütün girişlərinizi və parollarınızı güvənli bir seyfdən idarə edin @@ -178,7 +178,7 @@ Bitwarden-nin ucdan-uca şifrələnmiş kimlik məlumatlarını idarəetmə həl Giriş kimlik məlumatlarınızı ziyarət etdiyiniz istənilən veb sayta dərhal avtomatik doldurun - Həmçinin sağ klikləmə menyusu ilə seyfinizə asanlıqla müraciət edə bilərsiniz + Həmçinin sağ klikləmə menyusu ilə seyfinizə asanlıqla erişə bilərsiniz Güclü, təsadüfi və güvənli parolların avtomatik yaradılması diff --git a/apps/browser/store/locales/id/copy.resx b/apps/browser/store/locales/id/copy.resx index 2d64b4ca542..2cd61460ccd 100644 --- a/apps/browser/store/locales/id/copy.resx +++ b/apps/browser/store/locales/id/copy.resx @@ -127,45 +127,45 @@ Dikenal sebagai pengelola sandi terbaik oleh PCMag, WIRED, The Verge, CNET, G2, dan lainnya! AMANKAN KEHIDUPAN DIGITAL ANDA -Amankan kehidupan digital Anda dan dapatkan perlindungan dari peretasan data dengan membuat dan menyimpan kata sandi yang unik dan kuat untuk setiap akun. Rawat semuanya dalam brankas kata sandi terenkripsi dari ujung-ke-ujung yang hanya Anda saja yang dapat mengakses. +Amankan kehidupan digital Anda dan dapatkan perlindungan dari peretasan data dengan membuat dan menyimpan kata sandi yang unik dan kuat untuk setiap akun. Rawat semuanya dalam brankas kata sandi terenkripsi dari ujung-ke-ujung yang hanya bisa diakses oleh Anda. -AKSES DATA ANDA, DI MANA SAJA, KAPAN SAJA, DI PERANGKAT APAPUN +AKSES DATA ANDA, DI MANA SAJA, KAPAN SAJA, DI PERANGKAT APA PUN Kelola, simpan, amankan, dan bagikan tanpa batas dengan mudah kata sandi antar perangkat tak terbatas dan tanpa batasan. -SETIAP ORANG SEBAIKNYA MEMILIKI PERALATAN UNTUK TETAP AMAN KETIKA DARING -Gunakan Bitwarden secara gratis tanpa iklan atau menjual data. Bitwarden percaya setiap orang sebaiknya memiliki kemampuan untuk tetap aman ketika daring. Rencana premium menawarkan akses ke fitur-fitur yang lebih lanjut. +SETIAP ORANG HARUS MEMILIKI PERALATAN UNTUK TETAP AMAN KETIKA DARING +Gunakan Bitwarden secara gratis tanpa iklan atau menjual data. Bitwarden percaya setiap orang harus memiliki kemampuan untuk tetap aman ketika daring. Paket premium menawarkan akses ke fitur-fitur yang lebih lanjut. BERDAYAKAN TIM ANDA DENGAN BITWARDEN -Rencana untuk Teams dan Enterprise datang dengan kemampuan bisnis profesional. Beberapa contoh termasuk pemaduan SSO, hosting mandiri, pemaduan direktori dan pembekalan SCIM, kebijakan global, akses API, log kejadian, dan banyak lagi. +Paket untuk Teams dan Enterprise memiliki kemampuan bisnis profesional, termasuk pemaduan SSO, hosting mandiri, pemaduan direktori dan pembekalan SCIM, kebijakan global, akses API, log kejadian, dan banyak lagi. -Gunakan Bitwarden untuk mengamankan tenaga kerja Anda dan membagikan informasi sensitif kepada rekan kerja. +Gunakan Bitwarden untuk mengamankan kerja Anda dan membagikan informasi sensitif kepada rekan kerja. Alasan lebih lanjut untuk memilih Bitwarden: Enkripsi Kelas Dunia -Kata sandi dilindungi dengan enkripsi ujung-ke-ujung yang lebih lanjut (AES-256 bit, tanda pagar bergaram, dan PBKDF2 SHA-256) sehingga data Anda tetap aman dan privat. +Semua kata sandi dilindungi dengan enkripsi ujung-ke-ujung yang lebih lanjut (AES-256 bit, tanda pagar bergaram, dan PBKDF2 SHA-256) sehingga data Anda tetap aman dan privat. Audit Pihak Ketiga Bitwarden secara rutin melakukan audit keamanan yang dilakukan pihak ketiga secara menyeluruh dengan perusahaan keamanan terkemuka. Audit tahunan ini termasuk penilaian sumber kode dan pengujian penembusan antar IP, server, dan aplikasi web Bitwarden. 2FA Terdepan -Amankan login Anda dengan pengotentikasi pihak ketiga, kode yang dikirim ke surel, atau pengenal WebAuthn FIDO2 seperti kunci keamanan perangkat keras atau kunci sandi. +Amankan proses masuk Anda dengan pengotentikasi pihak ketiga, kode yang dikirim ke surel, atau pengenal WebAuthn FIDO2 seperti kunci keamanan perangkat keras atau kunci sandi. Bitwarden Send -Salurkan data ke orang lain secara langsung sembari menjaga keamanan dari ujung-ke-ujung dan membatasi paparan. +Kirim data ke orang lain secara langsung sembari menjaga keamanan dari ujung-ke-ujung dan membatasi singkapan. -Pembuat Bawaan -Buat kata sandi yang panjang, rumit, dan beda serta nama pengguna unik untuk setiap situs yang Anda kunjungi. Padukan dengan nama lain surel untuk privasi lebih lanjut. +Pembuat Sandi Bawaan +Buat kata sandi yang panjang, rumit, dan berbeda serta nama pengguna unik untuk setiap situs yang Anda kunjungi. Campurkan dengan nama lain surel untuk privasi lebih lanjut. Terjemahan Global Terjemahan Bitwarden hadir dalam lebih dari 60 bahasa, diterjemahkan oleh komunitas global melalui Crowdin. Aplikasi Lintas Platform -Amankan dan bagikan data sensitif dalam Brankas Bitwarden Anda dari sebarang peramban, ponsel, atau sistem operasi desktop, dan lebih banyak lagi. +Amankan dan bagikan data sensitif dalam Brankas Bitwarden Anda dari peramban apa pun, ponsel, atau sistem operasi desktop, dan lebih banyak lagi. Bitwarden mengamankan lebih dari sekedar kata sandi -Solusi pengelolaan pengenal terenkripsi ujung-ke-ujung dari Bitwarden memberdayakan organisasi untuk mengamankan segalanya, termasuk rahasia pengembang dan pengalaman kunci sandi. Kunjungi bitwarden.com untuk mempelajari lebih lanjut tentang Pengelola Rahasia Bitwarden dan passwordless.dev Bitwarden! +Solusi pengelolaan identitas terenkripsi ujung-ke-ujung dari Bitwarden memberdayakan organisasi untuk mengamankan segalanya, termasuk rahasia pengembang dan kunci sandi. Kunjungi bitwarden.com untuk mempelajari lebih lanjut tentang Pengelola Rahasia Bitwarden dan passwordless.dev Bitwarden! From f2d42138b621e5b863d83c87d2d7f1f95ee9bf40 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 11 Aug 2025 14:30:29 +0000 Subject: [PATCH 14/50] Bumped client version(s) --- apps/browser/package.json | 2 +- apps/browser/src/manifest.json | 2 +- apps/browser/src/manifest.v3.json | 2 +- apps/cli/package.json | 2 +- apps/web/package.json | 2 +- package-lock.json | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/browser/package.json b/apps/browser/package.json index fe5f3099e14..e75d2b235db 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.7.1", + "version": "2025.8.0", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 9322d9167ff..2820be6dfe6 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "Bitwarden", - "version": "2025.7.1", + "version": "2025.8.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 3a1537dc4aa..5af56a1ad96 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "Bitwarden", - "version": "2025.7.1", + "version": "2025.8.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/cli/package.json b/apps/cli/package.json index a4ff56206e4..4964cd4e403 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2025.7.0", + "version": "2025.8.0", "keywords": [ "bitwarden", "password", diff --git a/apps/web/package.json b/apps/web/package.json index e4f27fc2ad6..73e79d4f513 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.7.2", + "version": "2025.8.0", "scripts": { "build:oss": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:bit": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/package-lock.json b/package-lock.json index 715ccd8bff1..15f6b1a8518 100644 --- a/package-lock.json +++ b/package-lock.json @@ -192,11 +192,11 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.7.1" + "version": "2025.8.0" }, "apps/cli": { "name": "@bitwarden/cli", - "version": "2025.7.0", + "version": "2025.8.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@koa/multer": "4.0.0", @@ -292,7 +292,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2025.7.2" + "version": "2025.8.0" }, "libs/admin-console": { "name": "@bitwarden/admin-console", From a9b934a7acae40e0e5685a69791fcc73d470a081 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Mon, 11 Aug 2025 16:38:50 +0200 Subject: [PATCH 15/50] Remove legacy encryption support in key service (#15898) --- .../src/abstractions/key.service.ts | 31 -------- libs/key-management/src/key.service.spec.ts | 35 --------- libs/key-management/src/key.service.ts | 74 ++----------------- 3 files changed, 6 insertions(+), 134 deletions(-) diff --git a/libs/key-management/src/abstractions/key.service.ts b/libs/key-management/src/abstractions/key.service.ts index 72a0ba2a038..4f14f5523b9 100644 --- a/libs/key-management/src/abstractions/key.service.ts +++ b/libs/key-management/src/abstractions/key.service.ts @@ -107,28 +107,6 @@ export abstract class KeyService { */ abstract getUserKey(userId?: string): Promise; - /** - * Checks if the user is using an old encryption scheme that used the master key - * for encryption of data instead of the user key. - */ - abstract isLegacyUser(masterKey?: MasterKey, userId?: string): Promise; - - /** - * Use for encryption/decryption of data in order to support legacy - * encryption models. It will return the user key if available, - * if not it will return the master key. - * - * @deprecated Please provide the userId of the user you want the user key for. - */ - abstract getUserKeyWithLegacySupport(): Promise; - - /** - * Use for encryption/decryption of data in order to support legacy - * encryption models. It will return the user key if available, - * if not it will return the master key. - * @param userId The desired user - */ - abstract getUserKeyWithLegacySupport(userId: UserId): Promise; /** * Retrieves the user key from storage * @param keySuffix The desired version of the user's key to retrieve @@ -317,15 +295,6 @@ export abstract class KeyService { */ abstract userEncryptedPrivateKey$(userId: UserId): Observable; - /** - * Gets an observable stream of the given users decrypted private key with legacy support, - * will emit null if the user doesn't have a UserKey to decrypt the encrypted private key - * or null if the user doesn't have an encrypted private key at all. - * - * @param userId The user id of the user to get the data for. - */ - abstract userPrivateKeyWithLegacySupport$(userId: UserId): Observable; - /** * Gets an observable stream of the given users decrypted private key and public key, guaranteed to be consistent. * Will emit null if the user doesn't have a userkey to decrypt the encrypted private key, or null if the user doesn't have a private key diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 13cd1a1cde4..a7d804be21b 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -171,41 +171,6 @@ describe("keyService", () => { }); }); - describe("getUserKeyWithLegacySupport", () => { - let mockUserKey: UserKey; - let mockMasterKey: MasterKey; - let getMasterKey: jest.SpyInstance; - - beforeEach(() => { - const mockRandomBytes = new Uint8Array(64) as CsprngArray; - mockUserKey = new SymmetricCryptoKey(mockRandomBytes) as UserKey; - mockMasterKey = new SymmetricCryptoKey(new Uint8Array(64) as CsprngArray) as MasterKey; - - getMasterKey = jest.spyOn(masterPasswordService, "masterKey$"); - }); - - it("returns the User Key if available", async () => { - stateProvider.singleUser.getFake(mockUserId, USER_KEY).nextState(mockUserKey); - const getKeySpy = jest.spyOn(keyService, "getUserKey"); - - const userKey = await keyService.getUserKeyWithLegacySupport(mockUserId); - - expect(getKeySpy).toHaveBeenCalledWith(mockUserId); - expect(getMasterKey).not.toHaveBeenCalled(); - - expect(userKey).toEqual(mockUserKey); - }); - - it("returns the user's master key when User Key is not available", async () => { - masterPasswordService.masterKeySubject.next(mockMasterKey); - - const userKey = await keyService.getUserKeyWithLegacySupport(mockUserId); - - expect(getMasterKey).toHaveBeenCalledWith(mockUserId); - expect(userKey).toEqual(mockMasterKey); - }); - }); - describe("everHadUserKey$", () => { let everHadUserKeyState: FakeSingleUserState; diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index 042fa70d9c0..f55a8211dbe 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -157,34 +157,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { return userKey; } - async isLegacyUser(masterKey?: MasterKey, userId?: UserId): Promise { - userId ??= await firstValueFrom(this.stateProvider.activeUserId$); - if (userId == null) { - throw new Error("No active user id found."); - } - masterKey ??= await firstValueFrom(this.masterPasswordService.masterKey$(userId)); - - return await this.validateUserKey(masterKey, userId); - } - - // TODO: legacy support for user key is no longer needed since we require users to migrate on login - async getUserKeyWithLegacySupport(userId?: UserId): Promise { - userId ??= await firstValueFrom(this.stateProvider.activeUserId$); - if (userId == null) { - throw new Error("No active user id found."); - } - - const userKey = await this.getUserKey(userId); - if (userKey) { - return userKey; - } - - // Legacy support: encryption used to be done with the master key (derived from master password). - // Users who have not migrated will have a null user key and must use the master key instead. - const masterKey = await firstValueFrom(this.masterPasswordService.masterKey$(userId)); - return masterKey as unknown as UserKey; - } - async getUserKeyFromStorage( keySuffix: KeySuffixOptions, userId: UserId, @@ -819,29 +791,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { return this.stateProvider.getUser(userId, USER_KEY).state$; } - private userKeyWithLegacySupport$(userId: UserId) { - return this.userKey$(userId).pipe( - switchMap((userKey) => { - if (userKey != null) { - return of(userKey); - } - - // Legacy path - return this.masterPasswordService.masterKey$(userId).pipe( - switchMap(async (masterKey) => { - if (!(await this.validateUserKey(masterKey, userId))) { - // We don't have a UserKey or a valid MasterKey - return null; - } - - // The master key is valid meaning, the org keys and such are encrypted with this key - return masterKey as unknown as UserKey; - }), - ); - }), - ); - } - userPublicKey$(userId: UserId) { return this.userPrivateKey$(userId).pipe( switchMap(async (pk) => await this.derivePublicKey(pk)), @@ -857,9 +806,7 @@ export class DefaultKeyService implements KeyServiceAbstraction { } userPrivateKey$(userId: UserId): Observable { - return this.userPrivateKeyHelper$(userId, false).pipe( - map((keys) => keys?.userPrivateKey ?? null), - ); + return this.userPrivateKeyHelper$(userId).pipe(map((keys) => keys?.userPrivateKey ?? null)); } userEncryptionKeyPair$( @@ -881,14 +828,8 @@ export class DefaultKeyService implements KeyServiceAbstraction { return this.stateProvider.getUser(userId, USER_ENCRYPTED_PRIVATE_KEY).state$; } - userPrivateKeyWithLegacySupport$(userId: UserId): Observable { - return this.userPrivateKeyHelper$(userId, true).pipe( - map((keys) => keys?.userPrivateKey ?? null), - ); - } - - private userPrivateKeyHelper$(userId: UserId, legacySupport: boolean) { - const userKey$ = legacySupport ? this.userKeyWithLegacySupport$(userId) : this.userKey$(userId); + private userPrivateKeyHelper$(userId: UserId) { + const userKey$ = this.userKey$(userId); return userKey$.pipe( switchMap((userKey) => { if (userKey == null) { @@ -971,7 +912,7 @@ export class DefaultKeyService implements KeyServiceAbstraction { } orgKeys$(userId: UserId): Observable | null> { - return this.cipherDecryptionKeys$(userId, true).pipe(map((keys) => keys?.orgKeys ?? null)); + return this.cipherDecryptionKeys$(userId).pipe(map((keys) => keys?.orgKeys ?? null)); } encryptedOrgKeys$( @@ -980,11 +921,8 @@ export class DefaultKeyService implements KeyServiceAbstraction { return this.stateProvider.getUser(userId, USER_ENCRYPTED_ORGANIZATION_KEYS).state$; } - cipherDecryptionKeys$( - userId: UserId, - legacySupport: boolean = false, - ): Observable { - return this.userPrivateKeyHelper$(userId, legacySupport)?.pipe( + cipherDecryptionKeys$(userId: UserId): Observable { + return this.userPrivateKeyHelper$(userId)?.pipe( switchMap((userKeys) => { if (userKeys == null) { return of(null); From 3c5fcfc7ef5f16a88259c8169992987ae017510d Mon Sep 17 00:00:00 2001 From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:44:51 -0500 Subject: [PATCH 16/50] Navigate the user from the autofill nudge to the proper destination based on their browser (#15876) --- .../autofill/popup/settings/autofill.component.html | 2 +- .../autofill/popup/settings/autofill.component.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.html b/apps/browser/src/autofill/popup/settings/autofill.component.html index 543c7482bf7..985a0962c95 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.html +++ b/apps/browser/src/autofill/popup/settings/autofill.component.html @@ -12,7 +12,7 @@ [subtitle]="'autofillSpotlightDesc' | i18n" [buttonText]="spotlightButtonText" (onDismiss)="dismissSpotlight()" - (onButtonClick)="openURI($event, disablePasswordManagerURI)" + (onButtonClick)="disableBrowserAutofillSettingsFromNudge($event)" [buttonIcon]="spotlightButtonIcon" >
    diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index 19afb903cb8..dcce3f37368 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -585,4 +585,16 @@ export class AutofillComponent implements OnInit { } return hints; } + + /** Navigates the user from the Autofill Nudge to the proper destination based on their browser. */ + async disableBrowserAutofillSettingsFromNudge(event: Event) { + // When we can programmatically disable the autofill setting, do that first + // otherwise open the appropriate URI for the browser + if (this.canOverrideBrowserAutofillSetting) { + this.defaultBrowserAutofillDisabled = true; + await this.updateDefaultBrowserAutofillDisabled(); + } else { + await this.openURI(event, this.disablePasswordManagerURI); + } + } } From ecbbd932a0bed756266d3a05ffff20f3ecaae09e Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 16:58:34 +0200 Subject: [PATCH 17/50] Autosync the updated translations (#15947) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 64 ++- apps/web/src/locales/ar/messages.json | 64 ++- apps/web/src/locales/az/messages.json | 598 ++++++++++++----------- apps/web/src/locales/be/messages.json | 64 ++- apps/web/src/locales/bg/messages.json | 64 ++- apps/web/src/locales/bn/messages.json | 64 ++- apps/web/src/locales/bs/messages.json | 64 ++- apps/web/src/locales/ca/messages.json | 64 ++- apps/web/src/locales/cs/messages.json | 80 +-- apps/web/src/locales/cy/messages.json | 64 ++- apps/web/src/locales/da/messages.json | 64 ++- apps/web/src/locales/de/messages.json | 64 ++- apps/web/src/locales/el/messages.json | 64 ++- apps/web/src/locales/en_GB/messages.json | 64 ++- apps/web/src/locales/en_IN/messages.json | 64 ++- apps/web/src/locales/eo/messages.json | 64 ++- apps/web/src/locales/es/messages.json | 74 ++- apps/web/src/locales/et/messages.json | 64 ++- apps/web/src/locales/eu/messages.json | 64 ++- apps/web/src/locales/fa/messages.json | 64 ++- apps/web/src/locales/fi/messages.json | 64 ++- apps/web/src/locales/fil/messages.json | 64 ++- apps/web/src/locales/fr/messages.json | 64 ++- apps/web/src/locales/gl/messages.json | 64 ++- apps/web/src/locales/he/messages.json | 64 ++- apps/web/src/locales/hi/messages.json | 64 ++- apps/web/src/locales/hr/messages.json | 64 ++- apps/web/src/locales/hu/messages.json | 64 ++- apps/web/src/locales/id/messages.json | 64 ++- apps/web/src/locales/it/messages.json | 64 ++- apps/web/src/locales/ja/messages.json | 64 ++- apps/web/src/locales/ka/messages.json | 64 ++- apps/web/src/locales/km/messages.json | 64 ++- apps/web/src/locales/kn/messages.json | 64 ++- apps/web/src/locales/ko/messages.json | 64 ++- apps/web/src/locales/lv/messages.json | 70 ++- apps/web/src/locales/ml/messages.json | 64 ++- apps/web/src/locales/mr/messages.json | 64 ++- apps/web/src/locales/my/messages.json | 64 ++- apps/web/src/locales/nb/messages.json | 64 ++- apps/web/src/locales/ne/messages.json | 64 ++- apps/web/src/locales/nl/messages.json | 64 ++- apps/web/src/locales/nn/messages.json | 64 ++- apps/web/src/locales/or/messages.json | 64 ++- apps/web/src/locales/pl/messages.json | 64 ++- apps/web/src/locales/pt_BR/messages.json | 64 ++- apps/web/src/locales/pt_PT/messages.json | 66 ++- apps/web/src/locales/ro/messages.json | 64 ++- apps/web/src/locales/ru/messages.json | 64 ++- apps/web/src/locales/si/messages.json | 64 ++- apps/web/src/locales/sk/messages.json | 68 ++- apps/web/src/locales/sl/messages.json | 64 ++- apps/web/src/locales/sr_CS/messages.json | 64 ++- apps/web/src/locales/sr_CY/messages.json | 64 ++- apps/web/src/locales/sv/messages.json | 64 ++- apps/web/src/locales/te/messages.json | 64 ++- apps/web/src/locales/th/messages.json | 64 ++- apps/web/src/locales/tr/messages.json | 68 ++- apps/web/src/locales/uk/messages.json | 82 ++-- apps/web/src/locales/vi/messages.json | 64 ++- apps/web/src/locales/zh_CN/messages.json | 64 ++- apps/web/src/locales/zh_TW/messages.json | 64 ++- 62 files changed, 3025 insertions(+), 1537 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index a27cff6212f..6883e38a4d9 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Persoonlike eienaarskap" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 8b544671386..47277b73b8a 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "افتح بيتواردن على جهازك أو على الـ " }, - "areYouTryingToAccessYourAccount": { - "message": "هل تحاول الوصول إلى حسابك؟" - }, "accessAttemptBy": { "message": "محاولة تسجيل الدخول بواسطة $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 930e46f410b..2f9ce0db2e5 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -12,7 +12,7 @@ "message": "Risk altında heç bir kritik tətbiq yoxdur" }, "accessIntelligence": { - "message": "Müraciət Kəşfiyyatı" + "message": "Access Intelligence" }, "riskInsights": { "message": "Risk Məlumatları" @@ -24,7 +24,7 @@ "message": "Tətbiqlər arasında riskli (zəif, ifşa olunmuş və ya təkrar istifadə olunmuş) parolları incələyin. İstifadəçilərinizin riskli parollara yönəlmiş təhlükəsizlik tədbirlərinə əhəmiyyət vermələri üçün kritik tətbiqlərinizi seçin." }, "dataLastUpdated": { - "message": "Datanın son güncəlləmə tarixi: $DATE$", + "message": "Verilərin son güncəlləmə tarixi: $DATE$", "placeholders": { "date": { "content": "$1", @@ -42,7 +42,7 @@ "message": "Üzvləri bərpa et" }, "cannotRestoreAccessError": { - "message": "Təşkilat müraciəti bərpa edilə bilmir" + "message": "Təşkilat erişimi bərpa edilə bilmir" }, "allApplicationsWithCount": { "message": "Bütün tətbiqlər ($COUNT$)", @@ -551,7 +551,7 @@ "message": "Parolun ifşalanıb ifşalanmadığını yoxlayın." }, "passwordExposed": { - "message": "Bu parol, məlumat pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", + "message": "Bu parol, veri pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", "placeholders": { "value": { "content": "$1", @@ -560,7 +560,7 @@ } }, "passwordSafe": { - "message": "Bu parol, məlumat pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." + "message": "Bu parol, veri pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." }, "save": { "message": "Saxla" @@ -569,7 +569,7 @@ "message": "İmtina" }, "later": { - "message": "Later" + "message": "Sonra" }, "canceled": { "message": "Ləğv edildi" @@ -630,7 +630,7 @@ "message": "Qrupları axtar" }, "resetSearch": { - "message": "Reset search" + "message": "Axtarışı sıfırla" }, "allItems": { "message": "Bütün elementlər" @@ -1024,13 +1024,13 @@ "message": "Məlumata düzəliş et" }, "access": { - "message": "Müraciət" + "message": "Erişim" }, "accessLevel": { - "message": "Müraciət səviyyəsi" + "message": "Erişim səviyyəsi" }, "accessing": { - "message": "Müraciət edilir" + "message": "Erişilir" }, "loggedOut": { "message": "Çıxış edildi" @@ -1072,7 +1072,7 @@ "message": "Yerləşmə" }, "loginOrCreateNewAccount": { - "message": "Güvənli seyfinizə müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli seyfinizə erişmək üçün giriş edin və ya yeni bir hesab yaradın." }, "loginWithDevice": { "message": "Cihazla giriş et" @@ -1234,7 +1234,7 @@ "message": "Cihaz nədir?" }, "aDeviceIs": { - "message": "Cihaz, giriş etdiyiniz Bitwarden tətbiqinin unikal quraşdırmasıdır. Yenidən quraşdırılması, tətbiq datasının təmizlənməsi və ya çərəzlərin təmizlənməsi, cihazın bir neçə dəfə görünməsinə səbəb ola bilər." + "message": "Cihaz, giriş etdiyiniz Bitwarden tətbiqinin unikal quraşdırmasıdır. Yenidən quraşdırılması, tətbiq verilərinin təmizlənməsi və ya çərəzlərin təmizlənməsi, cihazın bir neçə dəfə görünməsinə səbəb ola bilər." }, "logInInitiated": { "message": "Giriş etmə başladıldı" @@ -1258,7 +1258,7 @@ "message": "Ana parol" }, "masterPassDesc": { - "message": "Ana parol, seyfinizə müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." + "message": "Ana parol, seyfinizə erişmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." }, "masterPassImportant": { "message": "Unutsanız, ana parolunuz geri qaytarıla bilməz!" @@ -1428,11 +1428,8 @@ "notificationSentDevicePart1": { "message": "Cihazınızda Bitwarden kilidini açın, ya da " }, - "areYouTryingToAccessYourAccount": { - "message": "Hesabınıza müraciət etməyə çalışırsınız?" - }, "accessAttemptBy": { - "message": "$EMAIL$ ilə müraciət cəhdi", + "message": "$EMAIL$ ilə erişim cəhdi", "placeholders": { "email": { "content": "$1", @@ -1441,10 +1438,10 @@ } }, "confirmAccess": { - "message": "Müraciəti təsdiqlə" + "message": "Erişimi təsdiqlə" }, "denyAccess": { - "message": "Müraciətə rədd cavabı ver" + "message": "Erişimə rədd cavabı ver" }, "notificationSentDeviceAnchor": { "message": "veb tətbiqinizdə" @@ -1505,7 +1502,7 @@ "message": "İki addımlı giriş üsulunu seçin" }, "recoveryCodeDesc": { - "message": "İki addımlı giriş provayderlərinə müraciəti itirmisiniz? Hesabınızdakı bütün iki addımlı giriş provayderlərini söndürmək üçün geri qaytarma kodunuzu istifadə edin." + "message": "İki addımlı giriş provayderlərinizə erişə bilmirsiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki addımlı giriş provayderlərini söndürə bilərsiniz." }, "recoveryCodeTitle": { "message": "Geri qaytarma kodu" @@ -1521,7 +1518,7 @@ "message": "Yubico OTP güvənlik açarı" }, "yubiKeyDesc": { - "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4 seriyası, 5 seriyası və NEO cihazları ilə işləyir." + "message": "YubiKey 4, 5 və ya NEO cihazı istifadə edin." }, "duoDescV2": { "message": "Duo Security tərəfindən yaradılan kodu daxil edin.", @@ -1532,7 +1529,7 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir FIDO U2F fəallaşdırılan güvənlik açarı istifadə edin." + "message": "Hesabınıza erişmək üçün hər hansısa bir FIDO U2F uyumlu güvənlik açarı istifadə edin." }, "u2fTitle": { "message": "FIDO U2F Güvənlik açarı" @@ -1541,7 +1538,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan güvənlik açarı istifadə edin." + "message": "Cihazınızın biometriklərini və ya FIDO2 uyumlu güvənlik açarını istifadə edin." }, "webAuthnMigrated": { "message": "(FIDO-dan köçürüldü)" @@ -1568,7 +1565,7 @@ "message": "Bu elementi daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementə birbaşa sahibliyiniz olmayacaq." }, "collectionsDesc": { - "message": "Bu elementin paylaşıldığı kolleksiyalara düzəliş edin. Yalnız bu kolleksiyalara müraciəti olan təşkilat istifadəçiləri bu elementi görə bilər." + "message": "Bu elementin paylaşıldığı kolleksiyalara düzəliş edin. Yalnız bu kolleksiyalara erişə bilən təşkilat istifadəçiləri bu elementi görə bilər." }, "deleteSelectedItemsDesc": { "message": "Silmək üçün $COUNT$ element seçdiniz. Onların hamısını silmək istədiyinizə əminsiniz?", @@ -1610,7 +1607,7 @@ "message": "UUID-ni kopyala" }, "errorRefreshingAccessToken": { - "message": "Müraciət tokeni təzələmə xətası" + "message": "Erişim tokeni təzələmə xətası" }, "errorRefreshingAccessTokenDesc": { "message": "Təzələmə tokeni və ya API açarlar tapılmadı. Lütfən çıxış edib yenidən giriş etməyə çalışın." @@ -1625,13 +1622,13 @@ "message": "Sirlərin xaricə köçürülməsini təsdiqlə" }, "exportWarningDesc": { - "message": "Bu xaricə köçürmə, seyf datanızı şifrələnməmiş formatda ehtiva edir. Xaricə köçürülən faylı, güvənli olmayan kanallar üzərində saxlamamalı və ya göndərməməlisiniz (e-poçt kimi). Bu faylı işiniz bitdikdən sonra dərhal silin." + "message": "Bu xaricə köçürmədəki seyf veriləriniz şifrələnməmiş formatdadır. Bu xaricə köçürülmüş faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." }, "exportSecretsWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı sirr datalarınız şifrələnməmiş formatdadır. Bu faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." + "message": "Bu xaricə köçürmədəki sirr veriləriniz şifrələnməmiş formatdadır. Bu xaricə köçürülmüş faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." }, "encExportKeyWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı data, hesabınızın şifrələmə açarı istifadə edilərək şifrələnir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." + "message": "Bu xaricə köçürmə, verilərinizi hesabınızın şifrələmə açarını istifadə edərək şifrələyir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." }, "encExportAccountWarningDesc": { "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir ixracı, fərqli bir hesaba idxal edə bilməzsiniz." @@ -1691,10 +1688,10 @@ "message": "Seyfi daxilə köçürməyi təsdiqlə" }, "confirmVaultImportDesc": { - "message": "Bu fayl parolla qorunur. Məlumatları daxilə köçürmək üçün fayl parolunu daxil edin." + "message": "Bu fayl parolla qorunur. Veriləri daxilə köçürmək üçün fayl parolunu daxil edin." }, "exportSuccess": { - "message": "Seyf datası xaricə köçürüldü" + "message": "Seyf veriləri xaricə köçürüldü" }, "passwordGenerator": { "message": "Parol yaradıcı" @@ -1917,7 +1914,7 @@ "message": "Yeni bir cihazdan giriş etdiyiniz zaman Bitwarden-in sizə doğrulama e-poçtlarını göndərməsi üçün aşağıdakı addımları izləyin." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "Yeni cihaz girişi qorumasını söndürsəniz, ana parolunuzu bilən hər kəs, istənilən cihazdan hesabınıza müraciət edə bilər. Hesabınızı doğrulama e-poçtları olmadan qorumaq üçün iki addımlı girişi qurun." + "message": "Yeni cihaz girişi qorumasını söndürsəniz, ana parolunuzu bilən hər kəs, istənilən cihazdan hesabınıza erişə bilər. Hesabınızı doğrulama e-poçtları olmadan qorumaq üçün iki addımlı girişi qurun." }, "accountNewDeviceLoginProtectionSaved": { "message": "Yeni cihaz girişi qoruması dəyişiklikləri saxlanıldı" @@ -1941,7 +1938,7 @@ "message": "Təşkilat seyfi boşaldıldı." }, "vaultAccessedByProvider": { - "message": "Provayder tərəfindən müraciət edilən seyf." + "message": "Provayder tərəfindən erişilən seyf." }, "purgeVaultDesc": { "message": "Seyfinizdəki bütün elementləri və qovluqları silmək üçün aşağıdakı addımları izləyin. Paylaşdığınız bir təşkilata aid elementlər silinməyəcək." @@ -1959,7 +1956,7 @@ "message": "Hesabı sil" }, "deleteAccountDesc": { - "message": "Hesabınızı və bütün seyf datasını silmək üçün aşağıdakı addımları izləyin." + "message": "Hesabınızı və bütün seyf verilərini silmək üçün aşağıdakı addımları izləyin." }, "deleteAccountWarning": { "message": "Hesabınızı silmək birdəfəlik prosesdir. Bu əməliyyatın geri dönüşü yoxdur." @@ -1968,7 +1965,7 @@ "message": "Hesab silindi" }, "accountDeletedDesc": { - "message": "Hesabınız bağlandı və bütün əlaqələndirilmiş datalar silindi." + "message": "Hesabınız bağlanıb və bütün əlaqələndirilmiş verilər silinib." }, "deleteOrganizationWarning": { "message": "Təşkilatınızı silmək birdəfəlik prosesdir. Bu əməliyyatın geri dönüşü yoxdur." @@ -1980,10 +1977,10 @@ "message": "Alətlər" }, "importData": { - "message": "Datanı daxilə köçür" + "message": "Veriləri daxilə köçür" }, "onboardingImportDataDetailsPartOne": { - "message": "Daxilə köçürüləcək datanız yoxdursa, əvəzində yeni element yarada bilərsiniz.", + "message": "Daxilə köçürüləcək veriniz yoxdursa, əvəzində yeni element yarada bilərsiniz.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLink": { @@ -2006,10 +2003,10 @@ "message": "İdxal xətası" }, "importErrorDesc": { - "message": "Daxilə köçürməyə çalışdığınız data ilə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." + "message": "Daxilə köçürməyə çalışdığınız verilərlə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." }, "importSuccess": { - "message": "Data uğurla daxilə köçürüldü" + "message": "Verilər uğurla daxilə köçürüldü" }, "importSuccessNumberOfItems": { "message": "Cəmi $AMOUNT$ element daxilə köçürüldü.", @@ -2021,10 +2018,10 @@ } }, "dataExportSuccess": { - "message": "Məlumat uğurla xaricə köçürüldü" + "message": "Verilər uğurla xaricə köçürüldü" }, "importWarning": { - "message": "Datanı $ORGANIZATION$ təşkilatına köçürürsünüz. Datanızı bu təşkilatın üzvləri ilə paylaşa bilərsiniz. Davam etmək istəyirsiniz?", + "message": "Veriləri $ORGANIZATION$ təşkilatına köçürürsünüz. Veriləriniz, bu təşkilatın üzvləri ilə paylaşıla bilər. Davam etmək istəyirsiniz?", "placeholders": { "organization": { "content": "$1", @@ -2033,13 +2030,13 @@ } }, "importFormatError": { - "message": "Data doğru format edilməyib. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." + "message": "Verilər düzgün format olunmayıb. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." }, "importNothingError": { "message": "Heç nə idxal edilmədi." }, "importEncKeyError": { - "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, datanı xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." + "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, veriləri xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." }, "destination": { "message": "Hədəf" @@ -2183,7 +2180,7 @@ "message": "SSO quraşdırması etmisinizsə və ya etmək planınız varsa, İki addımlı giriş, artıq Kimlik Provayderiniz vasitəsilə tətbiq edilmiş ola bilər." }, "twoStepLoginRecoveryWarning": { - "message": "İki addımlı girişi qurmaq, Bitwarden hesabınızı birdəfəlik kilidləyə bilər. Geri qaytarma kodu, normal iki addımlı giriş provayderinizi artıq istifadə edə bilmədiyiniz hallarda (məs. cihazınızı itirəndə) hesabınıza müraciət etməyinizə imkan verir. Hesabınıza müraciəti itirsəniz, Bitwarden dəstəyi sizə kömək edə bilməyəcək. Geri qaytarma kodunuzu bir yerə yazmağınızı və ya çap etməyinizi və onu etibarlı bir yerdə saxlamağınızı məsləhət görürük." + "message": "İki addımlı girişi qurmaq, Bitwarden hesabınızı birdəfəlik kilidləyə bilər. Geri qaytarma kodu, normal iki addımlı giriş provayderinizi artıq istifadə edə bilmədiyiniz hallarda (məs. cihazınızı itirəndə) hesabınıza erişməyinizə imkan verir. Hesabınıza erişimi itirsəniz, Bitwarden dəstəyi sizə kömək edə bilməyəcək. Geri qaytarma kodunuzu bir yerə yazmağınızı və ya çap etməyinizi və onu etibarlı bir yerdə saxlamağınızı məsləhət görürük." }, "restrictedItemTypePolicy": { "message": "Kart element növünü sil" @@ -2198,7 +2195,7 @@ "message": "1 və ya daha çox təşkilat tərəfindən təyin edilən bir siyasət, kartların seyfinizə köçürülməsini əngəlləyir." }, "yourSingleUseRecoveryCode": { - "message": "İki addımlı giriş provayderinizə müraciəti itirdiyiniz halda, iki addımlı girişi söndürmək üçün təkistifadəlik geri qaytarma kodunu istifadə edə bilərsiniz. Bitwarden tövsiyə edir ki, geri qaytarma kodunuzu bir yerə yazıb güvənli bir yerdə saxlayın." + "message": "İki addımlı giriş provayderinizə erişə bilmədiyiniz halda, iki addımlı girişi söndürmək üçün təkistifadəlik geri qaytarma kodunu istifadə edə bilərsiniz. Bitwarden tövsiyə edir ki, geri qaytarma kodunuzu bir yerə yazıb güvənli bir yerdə saxlayın." }, "viewRecoveryCode": { "message": "Geri qaytarma koduna bax" @@ -2214,7 +2211,7 @@ "message": "Fəallaşdırıldı" }, "restoreAccess": { - "message": "Müraciəti bərpa et" + "message": "Erişimi bərpa et" }, "premium": { "message": "Premium", @@ -2230,10 +2227,10 @@ "message": "Bu özəlliyi istifadə etmək üçün premium üzvlük lazımdır." }, "youHavePremiumAccess": { - "message": "Premium müraciətiniz var" + "message": "Premium erişiminiz var" }, "alreadyPremiumFromOrg": { - "message": "Üzvü olduğunuz bir təşkilatın sayəsində premium özəlliklərə müraciətiniz var." + "message": "Üzvü olduğunuz bir təşkilatın sayəsində premium özəlliklərə erişiminiz var." }, "manage": { "message": "İdarə et" @@ -2260,7 +2257,7 @@ "message": "Üzv təfsilatları tapılmadı." }, "revokeAccess": { - "message": "Müraciəti ləğv et" + "message": "Erişimi ləğv et" }, "revoke": { "message": "Geri al" @@ -2338,13 +2335,13 @@ "message": "Formu saxla." }, "twoFactorYubikeyWarning": { - "message": "Platforma məhdudiyyətlərinə görə, YubiKeys bütün Bitwarden tətbiqlərində istifadə edilə bilmir. YubiKeys istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" + "message": "Platforma məhdudiyyətlərinə görə, YubiKeys bütün Bitwarden tətbiqlərində istifadə edilə bilmir. YubiKeys istifadə edilə bilmədiyi zaman, hesabınıza erişə bilməyiniz üçün başqa bir iki addımlı giriş provayderini qurmalısınız. Dəstəklənən platformalar:" }, "twoFactorYubikeySupportUsb": { "message": "YubiKey-nizi qəbul edə biləcək bir USB portuna sahib cihazdakı veb seyf, masaüstü tətbiqi, CLI və bütün brauzer uzantıları." }, "twoFactorYubikeySupportMobile": { - "message": "Bir cihazda NFC özəlliyi olan mobil tətbiqlər və ya \"YubiKey\"inizi qəbul edə bilən data portu." + "message": "NFC özəlliyi və ya \"YubiKey\"inizi qəbul edə bilən bir veri portuna sahib cihazdakı mobil tətbiqlər." }, "yubikeyX": { "message": "YubiKey $INDEX$", @@ -2380,7 +2377,7 @@ "message": "Açarlarımdan biri NFC dəstəkləyir." }, "twoFactorYubikeySupportsNfcDesc": { - "message": "\"YubiKey\"lərinizdən biri (YubiKey NEO kimi) NFC dəstəkləyirsə, mobil cihazlarda NFC əlçatımlılığı aşkarlananda bildiriş göndəriləcək." + "message": "\"YubiKey\"lərinizdən biri (YubiKey NEO kimi) NFC dəstəkləyirsə, mobil cihazlarda NFC mövcudluğu aşkarlandıqda sizə bir bildiriş göndəriləcək." }, "yubikeysUpdated": { "message": "\"YubiKey\"lər güncəlləndi" @@ -2440,7 +2437,7 @@ "message": "Formu saxla." }, "twoFactorU2fWarning": { - "message": "Platforma məhdudiyyətlərinə görə, FIDO U2F bütün Bitwarden tətbiqlərində istifadə edilə bilmir. FIDO U2F istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" + "message": "Platforma məhdudiyyətlərinə görə, FIDO U2F bütün Bitwarden tətbiqlərində istifadə edilə bilmir. FIDO U2F istifadə edilə bilmədiyi zaman, hesabınıza erişə bilməyiniz üçün başqa bir iki addımlı giriş provayderini qurmalısınız. Dəstəklənən platformalar:" }, "twoFactorU2fSupportWeb": { "message": "U2F dəstəkli brauzerə sahib masaüstü/dizüstü kompüterdə veb seyf və brauzer uzantıları (FIDO U2F açıq olan Chrome, Opera, Vivaldi və ya Firefox)." @@ -2455,7 +2452,7 @@ "message": "Güvənlik açarı oxunarkən problem yarandı. Yenidən sınayın." }, "twoFactorWebAuthnWarning1": { - "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki addımlı giriş provayderini fəallaşdırmalısınız." + "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilmədiyi zaman, hesabınıza erişə bilməyiniz üçün başqa bir iki addımlı giriş provayderini qurmalısınız." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki addımlı giriş üçün geri qaytarma kodunuz" @@ -2535,13 +2532,13 @@ "message": "İfşa olunmuş parollar" }, "exposedPasswordsReportDesc": { - "message": "Məlumatların pozuntusu zamanı ifşa olunmuş parollar, təcavüzkarlar üçün asan hədəfdir. Potensial müdaxilələrin qarşısını almaq üçün bu parolları dəyişdirin." + "message": "Veri pozuntusu zamanı ifşa olunmuş parollar, təcavüzkarlar üçün asan hədəfdir. Potensial müdaxilələrin qarşısını almaq üçün bu parolları dəyişdirin." }, "exposedPasswordsFound": { "message": "İfşa olunmuş parollar tapıldı" }, "exposedPasswordsFoundReportDesc": { - "message": "$VAULT$ daxilində, bilinən məlumat pozuntusunda parolları ifşa olunmuş $COUNT$ element tapdıq. Yeni bir parol istifadə etməzdən əvvəl onları dəyişdirməlisiniz.", + "message": "$VAULT$ daxilində, bilinən veri pozuntusunda parolları ifşa olunmuş $COUNT$ element tapdıq. Yeni bir parol istifadə etməzdən əvvəl onları dəyişdirməlisiniz.", "placeholders": { "count": { "content": "$1", @@ -2554,7 +2551,7 @@ } }, "noExposedPasswords": { - "message": "Seyfinizdəki heç bir element, bilinən məlumat pozuntusunda ifşa olunmuş parola sahib deyil." + "message": "Seyfinizdəki heç bir element, bilinən veri pozuntusunda ifşa olunmuş parola sahib deyil." }, "checkExposedPasswords": { "message": "İfşa olunmuş parolları yoxla" @@ -2637,7 +2634,7 @@ } }, "dataBreachReport": { - "message": "Məlumatların pozuntusu" + "message": "Veri pozuntusu" }, "breachDesc": { "message": "Hesabların pozuntusu zamanı, şəxsi məlumatlar ifşa oluna bilər. 2FA-nı fəallaşdıraraq və ya daha güclü bir parol yaradaraq pozuntuya daxil olmuş hesabların güvənliyini artırın." @@ -2649,7 +2646,7 @@ "message": "Pozuntuları yoxla" }, "breachUsernameNotFound": { - "message": "$USERNAME$ bilinən heç bir məlumat pozuntusunda tapılmadı.", + "message": "$USERNAME$ bilinən heç bir veri pozuntusunda tapılmadı.", "placeholders": { "username": { "content": "$1", @@ -2662,7 +2659,7 @@ "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { - "message": "$USERNAME$ $COUNT$ fərqli onlayn məlumat pozuntusunda tapıldı.", + "message": "$USERNAME$ $COUNT$ fərqli onlayn veri pozuntusunda tapıldı.", "placeholders": { "username": { "content": "$1", @@ -2678,7 +2675,7 @@ "message": "Pozulan hesablar tapıldı" }, "compromisedData": { - "message": "Ələ keçirilmiş data" + "message": "Ələ keçirilmiş verilər" }, "website": { "message": "Veb sayt" @@ -2746,10 +2743,10 @@ "message": "YubiKey və Duo kimi mülkiyyətçi iki addımlı giriş seçimləri." }, "premiumSignUpEmergency": { - "message": "Fövqəladə hal müraciəti" + "message": "Fövqəladə hal erişimi" }, "premiumSignUpReports": { - "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və data pozuntusu hesabatları." + "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və veri pozuntusu hesabatları." }, "premiumSignUpTotp": { "message": "Seyfinizdəki girişlər üçün TOTP doğrulama kodu (2FA) yaradıcısı." @@ -2789,10 +2786,10 @@ "message": "Əlavələr" }, "premiumAccess": { - "message": "Premium müraciət" + "message": "Premium erişim" }, "premiumAccessDesc": { - "message": "Təşkilatınızın bütün üzvlərinə premium müraciət əlavə edə bilərsiniz: $PRICE$/$INTERVAL$.", + "message": "Təşkilatınızın bütün üzvlərinə premium erişim əlavə edə bilərsiniz: $PRICE$/$INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -2904,7 +2901,7 @@ "message": "Abunəliyiniz əvvəlki halına qaytarıldı." }, "cancelConfirmation": { - "message": "İmtina etmək istədiyinizə əminsiniz? Bu faktura dövrünün sonunda bu abunəliyin bütün özəlliklərinə müraciəti itirəcəksiniz." + "message": "İmtina etmək istədiyinizə əminsiniz? Bu faktura dövrünün sonunda bu abunəliyin bütün özəlliklərinə erişimi itirəcəksiniz." }, "canceledSubscription": { "message": "Abunəliyiniz ləğv edildi." @@ -3218,10 +3215,10 @@ "message": "Öz-özünə sahiblik etmə (ixtiyari)" }, "usersGetPremium": { - "message": "İstifadəçilər, premium özəlliklərə müraciət edə bilər" + "message": "İstifadəçilər, premium özəlliklərə erişə bilər" }, "controlAccessWithGroups": { - "message": "Qruplar ilə istifadəçi müraciətinə nəzarət et" + "message": "Qruplar ilə istifadəçi erişiminə nəzarət et" }, "syncUsersFromDirectory": { "message": "İstifadəçiləri və qrupları bir kataloqdan sinxronlaşdır" @@ -3359,10 +3356,10 @@ "message": "Bu istifadəçini çıxartmaq istədiyinizə əminsiniz?" }, "removeOrgUserConfirmation": { - "message": "Bir üzv silindikdə, artıq həmin üzv təşkilat datasına müraciət edə bilmir və bu əməliyyatın geri dönüşü yoxdur. Həmin üzvü təşkilata yenidən əlavə etmək üçün, onu dəvət edib üzv olmasını təmin etmək lazımdır." + "message": "Bir üzv silindikdə, artıq həmin üzv təşkilat verilərinə erişə bilmir və bu əməliyyatın geri dönüşü yoxdur. Həmin üzvü təşkilata yenidən əlavə etmək üçün, onu dəvət edib üzv olmasını təmin etmək lazımdır." }, "revokeUserConfirmation": { - "message": "Bir üzv ləğv edildikdə, artıq həmin üzv təşkilat datasına müraciət edə bilmir. Üzv müraciətini daha tez bərpa etmək üçün, Ləğv edilənlər vərəqinə gedin." + "message": "Bir üzv ləğv edildikdə, artıq həmin üzv təşkilat verilərinə erişə bilmir. Üzv erişimini daha tez bərpa etmək üçün, Ləğv edilənlər vərəqinə gedin." }, "removeUserConfirmationKeyConnector": { "message": "Xəbərdarlıq! Bu istifadəçi, şifrələmələrini idarə etmək üçün Key Connector tələb edir. Bu istifadəçini təşkilatınızdan silsəniz, hesabı birdəfəlik sıradan çıxarılacaq. Bu əməliyyatın geri dönüşü yoxdur. Davam etmək istəyirsiniz?" @@ -3383,7 +3380,7 @@ "message": "Kolleksiyanı bunun altında yerləşdir" }, "accessControl": { - "message": "Müraciət nəzarəti" + "message": "Erişim nəzarəti" }, "readOnly": { "message": "Yalnız-oxunan" @@ -3452,7 +3449,7 @@ "message": "Sahiblik" }, "ownerDesc": { - "message": "Təşkilatınızın bütün aspektlərini idarə edə bilər yüksək müraciətə malik istifadəçi." + "message": "Faktura və abunəliklər də daxil olmaqla təşkilatınızın bütün aspektlərini idarə edə bilər" }, "clientOwnerDesc": { "message": "Bu istifadəçi, provayderdən müstəqil olmalıdır. Provayderin təşkilatla əlaqəsi kəsilsə, bu istifadəçi, təşkilata sahibliyi davam etdirəcək." @@ -3461,22 +3458,22 @@ "message": "Admin" }, "adminDesc": { - "message": "Adminlər təşkilatınızdakı bütün elementlərə, kolleksiyalara və istifadəçilərə müraciət edə və onları idarə edə bilər." + "message": "Təşkilat erişimini, bütün kolleksiyaları, üzvləri, hesabatları və təhlükəsizlik ayarlarını idarə edə bilər" }, "user": { "message": "İstifadəçi" }, "userDesc": { - "message": "Təşkilatınızda təyin edilmiş kolleksiyalara müraciəti olan müntəzəm bir istifadəçi." + "message": "Təyin edilmiş kolleksiyalara erişə və element əlavə edə bilər" }, "all": { "message": "Hamısı" }, "addAccess": { - "message": "Müraciət əlavə et" + "message": "Erişim əlavə et" }, "addAccessFilter": { - "message": "Müraciət filtri əlavə et" + "message": "Erişim filtri əlavə et" }, "refresh": { "message": "Təzələ" @@ -3789,7 +3786,7 @@ } }, "removeUserIdAccess": { - "message": "$ID$ müraciətini sil", + "message": "$ID$ erişimini sil", "placeholders": { "id": { "content": "$1", @@ -3798,7 +3795,7 @@ } }, "revokedUserId": { - "message": "$ID$ üçün təşkilat müraciəti ləğv edildi.", + "message": "$ID$ üçün təşkilat erişimi ləğv edildi.", "placeholders": { "id": { "content": "$1", @@ -3807,7 +3804,7 @@ } }, "restoredUserId": { - "message": "$ID$ üçün təşkilat müraciəti bərpa edildi.", + "message": "$ID$ üçün təşkilat erişimi bərpa edildi.", "placeholders": { "id": { "content": "$1", @@ -3816,7 +3813,7 @@ } }, "revokeUserId": { - "message": "$ID$ müraciətini ləğv et", + "message": "$ID$ erişimini ləğv et", "placeholders": { "id": { "content": "$1", @@ -3927,7 +3924,7 @@ } }, "accessedClientVault": { - "message": "$ID$ təşkilatının seyfinə müraciət edildi.", + "message": "$ID$ təşkilatının seyfinə erişildi.", "placeholders": { "id": { "content": "$1", @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Bu tələb artıq yararsızdır." }, - "logInConfirmedForEmailOnDevice": { - "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş təsdiqləndi", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Başqa bir cihazdan giriş cəhdinə rədd cavabı verdiniz. Bu həqiqətən siz idinizsə, cihazla yenidən giriş etməyə çalışın." - }, "loginRequestApprovedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş tələbi təsdiqləndi", "placeholders": { @@ -4055,13 +4036,13 @@ "message": "Bir xəta baş verdi." }, "userAccess": { - "message": "İstifadəçi müraciəti" + "message": "İstifadəçi erişimi" }, "userType": { "message": "İstifadəçi növü" }, "groupAccess": { - "message": "Qrup müraciəti" + "message": "Qrup erişimi" }, "groupAccessUserDesc": { "message": "Bu istifadəçinin aid olduğu üçün qruplara düzəliş et." @@ -4103,7 +4084,7 @@ "message": "İstifadəçiləri təsdiqlə" }, "usersNeedConfirmed": { - "message": "Onların dəvətini qəbul edən istifadəçiləriniz var, ancaq hələ də təsdiqlənməlidir. İstifadəçilər, təsdiqlənənə qədər təşkilata müraciət edə bilməz." + "message": "Dəvəti qəbul etmiş, ancaq təsdiqlənməsini gözləyən üzvləriniz var. Üzvlər, təsdiqlənənə qədər təşkilata erişə bilməz." }, "startDate": { "message": "Başlanğıc tarixi" @@ -4115,7 +4096,7 @@ "message": "E-poçtu doğrula" }, "verifyEmailDesc": { - "message": "Bütün özəlliklərə müraciətin kilidini açmaq üçün hesabınızın e-poçt ünvanını doğrulayın." + "message": "Bütün özəlliklərə erişimin kilidini açmaq üçün hesabınızın e-poçt ünvanını doğrulayın." }, "verifyEmailFirst": { "message": "Əvvəlcə hesabınızın e-poçt ünvanı doğrulanmalıdır." @@ -4227,10 +4208,10 @@ "message": "Dəvət qəbul edildi" }, "inviteAcceptedDesc": { - "message": "Administrator üzvlüyünüzü təsdiqlədikdən sonra bu təşkilata müraciət edə bilərsiniz. Bu baş verəndə sizə bir e-poçt göndərəcəyik." + "message": "Bir inzibatçı üzvlüyünüzü təsdiqlədikdən sonra bu təşkilata erişə bilərsiniz. Üzvlüyünüz təsdiqləndikdə sizə bir e-poçt göndərəcəyik." }, "inviteInitAcceptedDesc": { - "message": "Artıq bu təşkilata müraciət edə bilərsiniz." + "message": "Artıq bu təşkilata erişə bilərsiniz." }, "inviteAcceptFailed": { "message": "Dəvət qəbul edilə bilmədi. Təşkilat adminindən yeni bir dəvət göndərməsini xahiş edin." @@ -4248,7 +4229,7 @@ "message": "E-poçtu xatırla" }, "recoverAccountTwoStepDesc": { - "message": "Hesabınıza normal iki addımlı giriş üsulları ilə müraciət edə bilmirsinizsə, hesabınızdakı bütün iki addımlı provayderləri söndürmək üçün iki addımlı giriş üzrə geri qaytarma kodunuzu istifadə edə bilərsiniz." + "message": "Hesabınıza normal iki addımlı giriş üsulları ilə erişə bilmirsinizsə, hesabınızdakı bütün iki addımlı provayderləri söndürmək üçün iki addımlı giriş üzrə geri qaytarma kodunuzu istifadə edə bilərsiniz." }, "logInBelowUsingYourSingleUseRecoveryCode": { "message": "Təkistifadəlik geri qaytarma kodunuzu istifadə edərək aşağıda giriş edin. Bu, hesabınızdakı bütün iki addımlı provayderləri söndürəcək." @@ -4284,7 +4265,7 @@ "message": "Təşkilatı sil" }, "deletingOrganizationContentWarning": { - "message": "$ORGANIZATION$ təşkilatının və bütün əlaqələndirilmiş datalarının silinməsini təsdiqləmək üçün ana parolu daxil edin. $ORGANIZATION$ təşkilatındakı seyf datasına daxildir:", + "message": "$ORGANIZATION$ təşkilatının və bütün əlaqələndirilmiş verilərinin silinməsini təsdiqləmək üçün ana parolu daxil edin. $ORGANIZATION$ təşkilatındakı seyf verilərinə daxildir:", "placeholders": { "organization": { "content": "$1", @@ -4308,7 +4289,7 @@ "message": "Təşkilat silindi" }, "organizationDeletedDesc": { - "message": "Təşkilat və əlaqələndirilmiş bütün datalar silindi." + "message": "Təşkilat və əlaqələndirilmiş bütün verilər silindi." }, "organizationUpdated": { "message": "Təşkilat saxlanıldı" @@ -4440,7 +4421,7 @@ "message": "Abunəlik güncəlləndi" }, "subscribedToSecretsManager": { - "message": "Abunəlik güncəlləndi. Artıq \"Sirr Meneceri\"nə müraciətiniz var." + "message": "Abunəlik güncəlləndi. Artıq \"Sirr Meneceri\"nə erişiminiz var." }, "additionalOptions": { "message": "Əlavə seçimlər" @@ -4594,7 +4575,7 @@ } }, "updateEncryptionKeyWarning": { - "message": "Şifrələmə açarını güncəllədikdən sonra, hazırda istifadə etdiyiniz (mobil tətbiq və ya brauzer uzantıları kimi) bütün Bitwarden tətbiqlərində çıxış edib yenidən giriş etməlisiniz. Çıxış edib təkrar giriş etməmək (yeni şifrələmə açarının endirilməsi prosesi) dataların zədələnməsi ilə nəticələnə bilər. Avtomatik olaraq çıxış etməyə çalışacağıq, bu gecikə bilər." + "message": "Şifrələmə açarını güncəllədikdən sonra, hazırda istifadə etdiyiniz (mobil tətbiq və ya brauzer uzantıları kimi) bütün Bitwarden tətbiqlərində çıxış edib yenidən giriş etməlisiniz. Çıxış edib təkrar giriş etməmək (yeni şifrələmə açarının endirilməsi prosesi) verilərin zədələnməsi ilə nəticələnə bilər. Avtomatik olaraq çıxış etməyə çalışacağıq, bu gecikə bilər." }, "updateEncryptionKeyAccountExportWarning": { "message": "Məhdudiyyətli hesablara aid saxladığınız xaricə köçürmələr yararsız olacaq." @@ -4633,7 +4614,7 @@ "message": "Bitwarden-in tövsiyə, elan və araşdırma imkanlarını gələn qutunuzda əldə edin." }, "subscribe": { - "message": "Subscribe" + "message": "Abunə ol" }, "unsubscribe": { "message": "Abunəlikdən çıx" @@ -4711,7 +4692,7 @@ "message": "Təşkilat sıradan çıxarıldı." }, "secretsAccessSuspended": { - "message": "Dayandırılmış təşkilatlara müraciət edilə bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Fəaliyyəti dayandırılmış təşkilatlara erişilə bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "secretsCannotCreate": { "message": "Dayandırılmış təşkilatlarda sirlər yaradıla bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." @@ -4723,7 +4704,7 @@ "message": "Xidmət hesabları dayandırılmış təşkilatlarda yaradıla bilməz. Lütfən kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "disabledOrganizationFilterError": { - "message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Fəaliyyəti dayandırılmış təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "licenseIsExpired": { "message": "Lisenziyanın vaxtı bitib." @@ -4822,7 +4803,7 @@ "message": "API açarı döndərmək, əvvəlki açarı yararsız edəcək. Hazırkı açarın artıq təhlükəsiz olmadığına inanırsınızsa, API açarınızı döndərə bilərsiniz." }, "apiKeyWarning": { - "message": "API açarınızın təşkilata tam müraciəti var. Gizli saxlanılmalıdır." + "message": "API açarınızın təşkilata tam erişimi var. Gizli saxlanılmalıdır." }, "userApiKeyDesc": { "message": "API açarınız Bitwarden CLI-də kimlik doğrulaması üçün istifadə edilə bilər." @@ -4938,10 +4919,10 @@ "message": "Seyf vaxtının bitmə əməliyyatı" }, "vaultTimeoutActionLockDesc": { - "message": "Seyfinizə təkrar müraciət etmək üçün ana parol və ya digər kilid açma üsulu tələb olunur." + "message": "Seyfinizə təkrar erişmək üçün ana parol və ya digər kilid açma üsulu tələb olunur." }, "vaultTimeoutActionLogOutDesc": { - "message": "Seyfinizə təkrar müraciət etmək üçün təkrar kimlik doğrulama tələb olunur." + "message": "Seyfinizə təkrar erişmək üçün təkrar kimlik doğrulama tələb olunur." }, "lock": { "message": "Kilidlə", @@ -5012,7 +4993,7 @@ } }, "vaultTimeoutLogOutConfirmation": { - "message": "Çıxış etdikdə, seyfinizə bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" + "message": "Çıxış etdikdə, seyfinizə erişiminiz tamamilə dayanacaq və vaxt bitdikdən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Vaxt bitmə əməliyyat təsdiqi" @@ -5175,7 +5156,7 @@ "message": "Mətn" }, "sendPasswordDescV3": { - "message": "Alıcıların bu \"Send\"ə müraciət etməsi üçün ixtiyari bir parol əlavə edin.", + "message": "Alıcıların bu \"Send\"ə erişməsi üçün ixtiyari bir parol əlavə edin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -5217,11 +5198,11 @@ "message": "Bitmə tarixi" }, "expirationDateDesc": { - "message": "Əgər ayarlanıbsa, göstərilən tarix və vaxtda \"Send\"ə müraciət başa çatacaq.", + "message": "Əgər ayarlanıbsa, göstərilən tarix və vaxtda \"Send\"ə erişim başa çatacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "Maksimal müraciət sayı" + "message": "Maksimum erişim sayı" }, "disabled": { "message": "Sıradan çıxarıldı" @@ -5253,7 +5234,7 @@ "message": "Bütün \"Send\"lər" }, "maxAccessCountReached": { - "message": "Maksimal müraciət sayına çatıldı", + "message": "Maksimum erişim sayına çatıldı", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "pendingDeletion": { @@ -5274,7 +5255,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { - "message": "Parolu bilmirsiniz? Bu \"Send\"ə müraciət etmək üçün parolu göndərən şəxsdən istəyin.", + "message": "Parolu bilmirsiniz? Bu \"Send\"ə erişmək üçün parolu göndərən şəxsdən istəyin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendHiddenByDefault": { @@ -5285,7 +5266,7 @@ "message": "Qoşmaları endir" }, "sendAccessUnavailable": { - "message": "Müraciət etməyə çalışdığınız Send yoxdur və ya artıq əlçatmazdır.", + "message": "Erişməyə çalışdığınız Send yoxdur və ya artıq mövcud deyil.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "missingSendFile": { @@ -5297,13 +5278,13 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "emergencyAccess": { - "message": "Fövqəladə hal müraciəti" + "message": "Fövqəladə hal erişimi" }, "emergencyAccessDesc": { - "message": "Güvənilən kontaktlara fövqəladə hal müraciəti verin və ya icazələri idarə edin. Güvənilən kontaktlar, fövqəladə halda hesabınızı Görmək və ya Təhvil almaq üçün müraciət tələb edə bilər. Sıfır məlumat paylaşımının necə işlədiyi ilə bağlı daha ətraflı və detallı məlumat üçün kömək səhifəmizi ziyarət edin." + "message": "Güvənilən kontaktlara fövqəladə hal erişim icazəsi verin və ya icazələri idarə edin. Güvənilən kontaktlar, fövqəladə halda hesabınızı Görmək və ya Təhvil almaq üçün erişim tələb edə bilər. Sıfır məlumat paylaşımının necə işlədiyi ilə bağlı daha ətraflı və detallı məlumat üçün kömək səhifəmizi ziyarət edin." }, "emergencyAccessOwnerWarning": { - "message": "Bir və ya daha çox təşkilata sahiblik edirsiniz. Fövqəladə hal üçün təyin olunmuş şəxsə təhvil alma müraciəti versəniz, təhvil aldıqdan sonra sahib olduğunuz bütün hüquqları istifadə edə bilər." + "message": "Bir və ya daha çox təşkilata sahiblik edirsiniz. Fövqəladə hal üçün təyin olunmuş şəxsə təhvil alma erişimi versəniz, təhvil aldıqdan sonra sahib olduğunuz bütün hüquqları istifadə edə bilər." }, "trustedEmergencyContacts": { "message": "Güvənilən fövqəladə hal kontaktları" @@ -5330,10 +5311,10 @@ "message": "Aşağıda Bitwarden hesabının e-poçt ünvanını daxil edərək yeni bir fövqəladə hal kontaktını dəvət edə bilərsiniz. Əgər Bitwarden hesabı yoxdursa, yeni bir hesab yaratmaları üçün istək göndəriləcək." }, "emergencyAccessRecoveryInitiated": { - "message": "Fövqəladə hal müraciəti başladıldı" + "message": "Fövqəladə hal erişimi başladıldı" }, "emergencyAccessRecoveryApproved": { - "message": "Fövqəladə hal müraciəti təsdiqləndi" + "message": "Fövqəladə hal erişimi təsdiqləndi" }, "viewDesc": { "message": "Öz seyfinizdəki bütün elementlərə baxa bilər." @@ -5348,7 +5329,7 @@ "message": "Gözləmə vaxtı" }, "waitTimeDesc": { - "message": "Müraciətə avtomatik icazə verilməzdən əvvəlki tələb olunan vaxt." + "message": "Erişimə avtomatik icazə verilməzdən əvvəl tələb olunan vaxt." }, "oneDay": { "message": "1 gün" @@ -5381,13 +5362,13 @@ } }, "emergencyInviteAcceptedDesc": { - "message": "Kimliyiniz təsdiqləndikdən sonra bu istifadəçiyə aid fövqəladə hal seçimlərinə müraciət edə bilərsiniz. Bu baş verəndə sizə bir e-poçt göndərəcəyik." + "message": "Kimliyiniz təsdiqləndikdən sonra bu istifadəçiyə aid fövqəladə hal seçimlərinə erişə bilərsiniz. Bu baş verdikdə, sizə bir e-poçt göndərəcəyik." }, "requestAccess": { - "message": "Müraciət tələb et" + "message": "Erişim tələb et" }, "requestAccessConfirmation": { - "message": "Fövqəladə hal müraciəti üçün tələb göndərmək istədiyinizə əminsiniz? İstifadəçi tələbi əllə qəbul etdikdən və ya $WAITTIME$ gün keçdikdən sonra müraciət təmin ediləcək.", + "message": "Fövqəladə hal erişimi üçün tələb göndərmək istədiyinizə əminsiniz? İstifadəçi tələbi manual qəbul etdikdən və ya $WAITTIME$ gün keçdikdən sonra erişim təmin ediləcək.", "placeholders": { "waittime": { "content": "$1", @@ -5396,7 +5377,7 @@ } }, "requestSent": { - "message": "$USER$ istifadəçisinə fövqəladə hal müraciəti göndərildi. Davam etmək mümkün olanda, sizi e-poçtla məlumatlandıracağıq.", + "message": "$USER$ istifadəçisinə fövqəladə hal erişimi üçün tələb göndərildi. Davam etmək mümkün olduqda, sizi e-poçtla məlumatlandıracağıq.", "placeholders": { "user": { "content": "$1", @@ -5411,7 +5392,7 @@ "message": "Rədd et" }, "approveAccessConfirmation": { - "message": "Fövqəladə hal müraciətini təsdiqləmək istədiyinizə əminsiniz? Bu, $USER$ istifadəçisinə hesabınızda $ACTION$ əməliyyatlarını icra etmə icazəsi verəcək.", + "message": "Fövqəladə hal erişimini təsdiqləmək istədiyinizə əminsiniz? Bu, $USER$ istifadəçisinə hesabınızda $ACTION$ əməliyyatlarını icra etmə icazəsi verəcək.", "placeholders": { "user": { "content": "$1", @@ -5424,10 +5405,10 @@ } }, "emergencyApproved": { - "message": "Fövqəladə hal müraciəti təsdiqləndi" + "message": "Fövqəladə hal erişimi təsdiqləndi" }, "emergencyRejected": { - "message": "Fövqəladə hal müraciəti rədd edildi" + "message": "Fövqəladə hal erişimi rədd edildi" }, "grantorDetailsNotFound": { "message": "Qrant verən təfsilatları tapılmadı" @@ -5442,7 +5423,38 @@ } }, "organizationDataOwnership": { - "message": "Təşkilata data üzərində məcburi sahiblik ver" + "message": "Təşkilata veri üzərində məcburi sahiblik ver" + }, + "organizationDataOwnershipDesc": { + "message": "Bütün elementlərin bir təşkilata məxsus olmasını tələb et və elementlərin hesab səviyyəsində saxlanılma seçimini ləğv et.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Bütün elementlər bir təşkilata məxsus olacaq və orada saxlanılacaq, bu da təşkilat üzrə kontrollar, görünürlük və hesabatları mümkün edəcək. İşə salındığı zaman, hər üzv üçün elementləri saxlaya biləcəyi ilkin bir kolleksiya mövcud olacaq. Daha ətraflı ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "daha ətraflı öyrənin", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Davam etmək istədiyinizə əminsiniz?" + }, + "organizationDataOwnershipWarning1": { + "message": "üzvlərin erişiminə açıq qalacaq" + }, + "organizationDataOwnershipWarning2": { + "message": "yeni element yaradıldığı zaman avtomatik olaraq seçilməyəcək" + }, + "organizationDataOwnershipWarning3": { + "message": "istifadəçi sistemdən çıxarılana qədər Admin Konsolu üzərindən idarə edilə bilməz" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Bu siyasəti bağlayana qədər: ilkin kolleksiya: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Kimlik məlumatlarının dövriyyəsi barədə ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "personalOwnership": { "message": "Fərdi sahiblik" @@ -5532,13 +5544,13 @@ "message": "İcazə" }, "accessEventLogs": { - "message": "Tədbir jurnalına müraciət" + "message": "Event qeydlərinə erişim" }, "accessImportExport": { - "message": "İdxal/ixrac müraciəti" + "message": "Daxilə/xaricə köçürmə erişimi" }, "accessReports": { - "message": "Hesabatlara müraciət" + "message": "Hesabatlara erişim" }, "missingPermissions": { "message": "Bu əməliyyatı icra etmək üçün lazımi icazələri əldə etməmisiniz." @@ -5644,7 +5656,7 @@ "message": "Biznes təhlükəsizliyini gücləndirin." }, "strengthenBusinessSecurityDescription": { - "message": "SSO inteqrasiyaları, \"event\" jurnalları və \"access rotation\" ilə maşın və insanların sirlərə müraciətinə ciddi nəzarət edin." + "message": "SSO inteqrasiyaları, event qeydləri və access rotation ilə maşın və insanların sirlərə erişməsinə ciddi nəzarət edin." }, "tryItNow": { "message": "İndi sına" @@ -5662,22 +5674,22 @@ "message": "Bitwarden-dən daha çox məhsul" }, "requestAccessToSecretsManager": { - "message": "\"Sirr Meneceri\"nə müraciət tələb et" + "message": "\"Sirr Meneceri\"nə erişim tələb et" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { "message": "\"Sirr Meneceri\"ni sınamaq üçün administratorunuzun təsdiqi lazımdır." }, "smAccessRequestEmailSent": { - "message": "Sirr menecerinə müraciət tələbi üçün e-poçt adminlərə göndərildi." + "message": "Sirr menecerinə erişim tələbi üçün e-poçt adminlərə göndərildi." }, "requestAccessSMDefaultEmailContent": { - "message": "Salam,\n\nBu, komandamız üçün \"Bitwarden Sirr Meneceri\"nə abunə olmaq istəyidir. Dəstəyiniz, bizim üçün böyük məna kəsb edir!\n\nBitwarden Sirr Meneceri, API açarları, databaza parolları və autentifikasiya sertifikatları kimi maşın kimlik məlumatlarını güvənli şəkildə saxlamaq, paylaşmaq və yerləşdirmək üçün ucdan-uca şifrələnmiş sirlərin idarə edilməsi həllidir.\n\nSirr Meneceri, bizə belə kömək edəcək:\n\n- Güvənliyi artırmaq\n- Əməliyyatları asanlaşdırmaq\n- Dəyərli sirr sızıntılarını önləmək\n\nKomandamız üçün ödənişsiz sınağı tələb etmək üçün lütfən Bitwarden ilə əlaqə saxlayın.\n\nKöməyiniz üçün təşəkkürlər!" + "message": "Salam,\n\nBu, komandamız üçün \"Bitwarden Sirr Meneceri\"nə abunə olmaq istəyidir. Dəstəyiniz, bizim üçün böyük məna kəsb edir!\n\nBitwarden Sirr Meneceri, API açarları, veri bazası parolları və autentifikasiya sertifikatları kimi maşın kimlik məlumatlarını güvənli şəkildə saxlamaq, paylaşmaq və yerləşdirmək üçün ucdan-uca şifrələnmiş sirlərin idarə edilməsi həllidir.\n\nSirr Meneceri, bizə belə kömək edəcək:\n\n- Güvənliyi artırmaq\n- Əməliyyatları asanlaşdırmaq\n- Dəyərli sirr sızıntılarını önləmək\n\nKomandamız üçün ödənişsiz sınağı tələb etmək üçün lütfən Bitwarden ilə əlaqə saxlayın.\n\nKöməyiniz üçün təşəkkürlər!" }, "giveMembersAccess": { - "message": "Üzvlərə müraciət icazəsi vermə:" + "message": "Üzvlərə erişim icazəsi ver:" }, "viewAndSelectTheMembers": { - "message": "Sirr Menecerinə müraciət icazəsi vermək üçün üzvləri görün və seçin." + "message": "Sirr Menecerinə erişim icazəsi vermək üçün üzvləri görün və seçin." }, "openYourOrganizations": { "message": "Təşkilatınızın" @@ -5686,7 +5698,7 @@ "message": "Menyunu istifadə edin və seçin" }, "toGrantAccessToSelectedMembers": { - "message": "seçilmiş üzvlərə müraciət verin." + "message": "seçilmiş üzvlərə erişim icazəsi verin." }, "sendVaultCardTryItNow": { "message": "indi sınayın", @@ -5914,10 +5926,10 @@ "message": "Aşağıdakı istifadəçiləri çıxartmaq istədiyinizə əminsiniz? Bu prosesin tamamlanması bir neçə saniyə çəkir, ləğv edilə və ya dayandırıla bilməz." }, "removeOrgUsersConfirmation": { - "message": "Üzv(lər) silindikdə, artıq həmin üzv(lər) təşkilat datasına müraciət edə bilmir və bu əməliyyatın geri dönüşü yoxdur. Üzvü təşkilata yenidən əlavə etmək üçün, onu dəvət edib üzv olmasını təmin etmək lazımdır. Prosesin tamamlanması bir neçə saniyə çəkə bilər, bu proses dayandırıla və ya ləğv edilə bilməz." + "message": "Üzv(lər) silindikdə, artıq həmin üzv(lər) təşkilat verilərinə erişə bilmir və bu əməliyyatın geri dönüşü yoxdur. Üzvü təşkilata yenidən əlavə etmək üçün, onu dəvət edib üzv olmasını təmin etmək lazımdır. Prosesin tamamlanması bir neçə saniyə çəkə bilər, bu proses dayandırıla və ya ləğv edilə bilməz." }, "revokeUsersWarning": { - "message": "Üzv(lər) ləğv edildikə, artıq həmin üzv(lər) təşkilat datasına müraciət edə bilmir. Üzv müraciətini daha tez bərpa etmək üçün, Ləğv edilənlər vərəqinə gedin. Prosesin tamamlanması bir neçə saniyə çəkə bilər, bu proses dayandırıla və ya ləğv edilə bilməz." + "message": "Üzv(lər) ləğv edildikə, artıq həmin üzv(lər) təşkilat verilərinə erişə bilmir. Üzv erişimini daha tez bərpa etmək üçün, Ləğv edilənlər vərəqinə gedin. Prosesin tamamlanması bir neçə saniyə çəkə bilər, bu proses dayandırıla və ya ləğv edilə bilməz." }, "theme": { "message": "Tema" @@ -5950,10 +5962,10 @@ "message": "Uğurla çıxarıldı" }, "bulkRevokedMessage": { - "message": "Təşkilat müraciəti uğurla ləğv edildi" + "message": "Təşkilat erişimi uğurla ləğv edildi" }, "bulkRestoredMessage": { - "message": "Təşkilat müraciəti uğurla bərpa edildi" + "message": "Təşkilat erişimi uğurla bərpa edildi" }, "bulkFilteredMessage": { "message": "İstisna edildi, bu əməliyyat üçün etibarlı deyil." @@ -6016,13 +6028,13 @@ "message": "Provayder admini" }, "providerAdminDesc": { - "message": "Provayderinizin bütün aspektlərini idarə edə bilən, həmçinin müştəri təşkilatlarına müraciət edə və onları idarə edə bilən ən yüksək müraciətə sahib istifadəçi." + "message": "Provayderinizin bütün aspektlərini idarə edə bilən, həmçinin müştəri təşkilatlarına erişə və onları idarə edə bilən ən yüksək erişimə sahib istifadəçi." }, "serviceUser": { "message": "Xidmət istifadəçisi" }, "serviceUserDesc": { - "message": "Xidmət istifadəçisi, bütün müştəri təşkilatlarına müraciət edə və onları idarə edə bilər." + "message": "Xidmət istifadəçisi, bütün müştəri təşkilatlarına erişə və onları idarə edə bilər." }, "providerInviteUserDesc": { "message": "Aşağıda Bitwarden hesabının e-poçt ünvanını daxil edərək provayderinizə yeni bir istifadəçi dəvət edə bilərsiniz. Əgər Bitwarden hesabı yoxdursa, yeni bir hesab yaratmaları üçün istək göndəriləcək." @@ -6037,10 +6049,10 @@ "message": "Dəvət qəbul edilə bilmədi. Provayder adminindən yeni bir dəvət göndərməsini xahiş edin." }, "providerInviteAcceptedDesc": { - "message": "Administrator üzvlüyünüzü təsdiqlədikdən sonra bu provayderə müraciət edə bilərsiniz. Bu baş verəndə sizə bir e-poçt göndərəcəyik." + "message": "Bir inzibatçı üzvlüyünüzü təsdiqlədikdən sonra bu Provayderə erişə bilərsiniz. Üzvlüyünüz təsdiqləndikdə sizə bir e-poçt göndərəcəyik." }, "providerUsersNeedConfirmed": { - "message": "Onların dəvətini qəbul edən istifadəçiləriniz var, ancaq hələ də təsdiqlənməlidir. İstifadəçilər, təsdiqlənənə qədər provayderə müraciət edə bilməz." + "message": "Dəvəti qəbul etmiş, ancaq təsdiqlənməsini gözləyən istifadəçiləriniz var. İstifadəçilər, təsdiqlənənə qədər Provayderə erişə bilməz." }, "provider": { "message": "Provayder" @@ -6049,7 +6061,7 @@ "message": "Yeni müştəri təşkilatı" }, "newClientOrganizationDesc": { - "message": "Provayder kimi sizinlə əlaqə yaradılacaq yeni bir müştəri təşkilatı yaradın. Bu təşkilata müraciət edə və onu idarə edə biləcəksiniz." + "message": "Provayder kimi sizinlə əlaqə yaradılacaq yeni bir müştəri təşkilatı yaradın. Bu təşkilata erişə və onu idarə edə biləcəksiniz." }, "newClient": { "message": "Yeni müştəri" @@ -6080,7 +6092,7 @@ "message": "Təşkilat, uğurla provayderə əlavə edildi" }, "accessingUsingProvider": { - "message": "$PROVIDER$ provayderini istifadə edən təşkilata müraciət edilir", + "message": "$PROVIDER$ Provayderini istifadə edən təşkilata erişilir", "placeholders": { "provider": { "content": "$1", @@ -6134,13 +6146,13 @@ "message": "Ana parolunuz bu təşkilatın tələblərinə cavab vermir. Davam etmək üçün ana parolunuzu dəyişdirin." }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Seyfə müraciət üçün Ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir inzibatçı tərəfindən dəyişdirildi. Seyfə erişmək üçün Ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "masterPasswordInvalidWarning": { "message": "Ana parolunuz bu təşkilatın siyasət tələblərinə cavab vermir. Təşkilata qoşulmaq üçün Ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "updateWeakMasterPasswordWarning": { - "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə erişmək üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "automaticAppLogin": { "message": "İcazə verilən tətbiqlər üçün istifadəçilərin avtomatik giriş etməsi" @@ -6155,7 +6167,7 @@ "message": "Provayder host kimliyinin URL-sini daxil edin. Çoxlu URL-ləri vergüllə ayırın." }, "tdeDisabledMasterPasswordRequired": { - "message": "Təşkilatınız, şifrə açma seçimlərinizi güncəllədi. Seyfinizə müraciət etmək üçün lütfən bir ana parol təyin edin." + "message": "Təşkilatınız, şifrə açma seçimlərinizi güncəllədi. Seyfinizə erişmək üçün lütfən bir ana parol təyin edin." }, "maximumVaultTimeout": { "message": "Seyf vaxtının bitməsi" @@ -6240,7 +6252,7 @@ "message": "Fərdi seyfi xaricə köçürməni ləğv et" }, "disablePersonalVaultExportDescription": { - "message": "Üzvlərin fərdi seyflərindən datanı xaricə köçürməsinə icazə verilməsin." + "message": "Üzvlərin fərdi seyflərindən veriləri xaricə köçürməsinə icazə verilməsin." }, "vaultExportDisabled": { "message": "Seyf xaricə köçürmə silindi" @@ -6291,7 +6303,7 @@ "message": "Müştəri sirri" }, "metadataAddress": { - "message": "Metadata ünvanı" + "message": "Meta veri ünvanı" }, "oidcRedirectBehavior": { "message": "OIDC yönləndirmə davranışı" @@ -6399,16 +6411,16 @@ "message": "Aktiv bir sponsorluğu ləğv etdiyiniz zaman, sponsorlu təşkilatınızın yenilənmə tarixindən sonra təşkilatınızda bir yer mövcud olacaq." }, "sponsoredFamiliesEligible": { - "message": "Siz və ailəniz Ödənişsiz Bitwarden Ailələri üçün uyğunsunuz. İşdə olmadığınız vaxtlarda belə datanızı güvənli saxlamaq üçün özəl e-poçtunuzu istifadə edin." + "message": "Siz və ailəniz Ödənişsiz Bitwarden Ailələri üçün uyğunsunuz. İşdə olmadığınız vaxtlarda belə verilərinizi güvənli saxlamaq üçün özəl e-poçtunuzu istifadə edin." }, "sponsoredFamiliesEligibleCard": { - "message": "İşdə olmadığınız vaxtlarda belə datanızı güvənli saxlamaq üçün Ailələr üçün nəzərdə tutulan Ödənişsiz Bitwarden planını bu gün istifadə edin." + "message": "İşdə olmadığınız vaxtlarda belə verilərinizi güvənli saxlamaq üçün Ailələr üçün nəzərdə tutulan Ödənişsiz Bitwarden planını bu gün istifadə edin." }, "sponsoredFamiliesIncludeMessage": { "message": "Ailələr üçün Bitwarden planı bunları ehtiva edir" }, "sponsoredFamiliesPremiumAccess": { - "message": "6 istifadəçiyə qədər Premium müraciət" + "message": "6 istifadəçiyə qədər Premium erişim" }, "sponsoredFamiliesSharedCollectionsForFamilyMembers": { "message": "Ailə üzvləri üçün paylaşılan kolleksiyalar" @@ -6594,13 +6606,13 @@ "message": "Üzv şifrə açma seçimləri" }, "memberDecryptionPassDesc": { - "message": "Kimlik doğrulandıqdan sonra üzvlər, ana parollarını istifadə edərək seyf datalarının şifrəsini aça biləcək." + "message": "Kimlik doğrulandıqdan sonra üzvlər, ana parollarını istifadə edərək seyf verilərinin şifrəsini aça biləcək." }, "keyConnector": { "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "SSO ilə Girişi, self-hosted şifrə açma açar serverinizə bağlayın. Bu seçimi istifadə edərək, üzvlərin seyf datasının şifrəsini açmaq üçün ana parollarını istifadə etməsinə ehtiyac qalmayacaq.", + "message": "SSO ilə Girişi, self-hosted şifrə açma açar serverinizə bağlayın. Bu seçimi istifadə edərək, üzvlərin seyf verilərinin şifrəsini açmaq üçün ana parollarını istifadə etməsinə ehtiyac qalmayacaq.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { @@ -6654,7 +6666,7 @@ "message": "Uğurlu! Key Connector əlçatandır." }, "keyConnectorTestFail": { - "message": "\"Key Connector\"a müraciət edilə bilmir. URL-ni yoxlayın." + "message": "\"Key Connector\"a erişilə bilmir. URL-ni yoxlayın." }, "sponsorshipTokenHasExpired": { "message": "Sponsorluq təklifinin müddəti bitdi." @@ -6672,7 +6684,7 @@ "message": "Bu tokeni kopyalayın və self-hosted təşkilatınızın faktura sinxronlaşdırma ayarlarında yapışdırın." }, "billingSyncCanAccess": { - "message": "Faktura sinxr tokeniniz, bu təşkilatın abunəlik ayarlarına müraciət edə və düzəliş edə bilər." + "message": "Faktura sinxr tokeniniz, bu təşkilatın abunəlik ayarlarına erişə və düzəliş edə bilər." }, "manageBillingTokenSync": { "message": "Faktura tokenini idarə et" @@ -6859,7 +6871,7 @@ } }, "accessDenied": { - "message": "Müraciət rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." + "message": "Erişim rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." }, "masterPassword": { "message": "Ana parol" @@ -7007,7 +7019,7 @@ "message": "Xidmət" }, "unknownCipher": { - "message": "Bilinməyən element, bu elementə müraciət etmək üçün başqa bir hesabla giriş etməlisiniz." + "message": "Bilinməyən element, bu elementə erişmək üçün başqa bir hesabla giriş etməlisiniz." }, "cannotSponsorSelf": { "message": "Aktiv hesab üçün istifadə edə bilməzsiniz. Fərqli bir e-poçt daxil edin." @@ -7248,7 +7260,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { - "message": "Bu API açarı, təşkilatınızdakı istifadəçiləri idarə etmə müraciətinə sahibdir. Gizli saxlanılmalıdır." + "message": "Bu API açarı, təşkilatınızdakı istifadəçiləri idarə etmə erişiminə sahibdir. Gizli saxlanılmalıdır." }, "copyScimKey": { "message": "SCIM API açarını lövhəyə kopyala", @@ -7509,7 +7521,7 @@ "message": "Sirləri birdəfəlik sil" }, "secretProjectAssociationDescription": { - "message": "Sirrin əlaqələndiriləcəyi layihələri seçin. Yalnız bu layihələrə müraciəti olan təşkilat istifadəçiləri sirri görə biləcək.", + "message": "Sirrin əlaqələndiriləcəyi layihələri seçin. Yalnız bu layihələrə erişə bilən təşkilat istifadəçiləri sirri görə biləcək.", "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { @@ -7588,7 +7600,7 @@ "message": "Tullantı qutusunda heç bir sirr yoxdur." }, "serviceAccountsNoItemsMessage": { - "message": "\"Sirr\" müraciətini avtomatlaşdırmağa başlamaq üçün yeni bir Servis hesabı yaradın.", + "message": "\"Sirr\" erişimini avtomatlaşdırmağa başlamaq üçün yeni bir Servis hesabı yaradın.", "description": "Message to encourage the user to start creating service accounts." }, "serviceAccountsNoItemsTitle": { @@ -7688,7 +7700,7 @@ "message": "Sirlər birdəfəlik silindi" }, "smAccess": { - "message": "Müraciət", + "message": "Erişim", "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { @@ -7791,11 +7803,11 @@ "message": "Sirr birdəfəlik silindi" }, "accessTokens": { - "message": "Müraciət tokenləri", + "message": "Erişim tokenləri", "description": "Title for the section displaying access tokens." }, "createAccessToken": { - "message": "Müraciət tokeni yarat", + "message": "Erişim tokeni yarat", "description": "Button label for creating a new access token." }, "expires": { @@ -7807,11 +7819,11 @@ "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "Göstəriləcək heç bir müraciət tokeni yoxdur", + "message": "Göstəriləcək heç bir erişim tokeni yoxdur", "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "Başlamaq üçün bir müraciət tokeni yarat", + "message": "Başlamaq üçün bir erişim tokeni yarat", "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { @@ -7823,7 +7835,7 @@ "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Müraciət tokenləri saxlanılmadı və alına bilmir", + "message": "Erişim tokenləri saxlanılmadı və alına bilmir", "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { @@ -7831,7 +7843,7 @@ "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Müraciət tokeni", + "message": "Erişim tokeni", "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { @@ -7839,25 +7851,25 @@ "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Müraciət tokeni yaradıldı və lövhəyə kopyalandı", + "message": "Erişim tokeni yaradıldı və lövhəyə kopyalandı", "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "revokeAccessToken": { - "message": "Müraciət tokenini ləğv et", + "message": "Erişim tokenini ləğv et", "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { - "message": "Müraciət tokenlərini ləğv et" + "message": "Erişim tokenlərini ləğv et" }, "revokeAccessTokenDesc": { - "message": "Müraciət tokenlərinin ləğv edilməsi daimi və geri qaytarıla bilməyən prosesdir." + "message": "Erişim tokenlərinin ləğv edilməsi daimi və geri qaytarıla bilməyən prosesdir." }, "accessTokenRevoked": { - "message": "Müraciət tokenləri ləğv edildi", + "message": "Erişim tokenləri ləğv edildi", "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "Ləğv ediləcək müraciət tokeni seçilmədi", + "message": "Ləğv ediləcək erişim tokeni seçilmədi", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { @@ -7888,10 +7900,10 @@ "message": "Qrup məlumatı" }, "editGroupMembersDesc": { - "message": "Üzvlərə qrupun təyin edilmiş kolleksiyalarına müraciət icazəsi verin." + "message": "Üzvlərə qrupun təyin edilmiş kolleksiyalarına erişim icazəsi verin." }, "editGroupCollectionsDesc": { - "message": "Bu qrupa əlavə edərək kolleksiyalara müraciət icazəsi verin." + "message": "Bu qrupa əlavə edərək kolleksiyalara erişim icazəsi verin." }, "restrictedCollectionAssignmentDesc": { "message": "Yalnız idarə etdiyiniz kolleksiyaları təyin edə bilərsiniz." @@ -8137,13 +8149,13 @@ "message": "Server" }, "exportData": { - "message": "Məlumatı xaricə köçür" + "message": "Veriləri xaricə köçür" }, "exportingOrganizationSecretDataTitle": { - "message": "Təşkilatın Sirr Datasını xaricə köçürmə" + "message": "Təşkilatın Sirr Verilərini xaricə köçürmə" }, "exportingOrganizationSecretDataDescription": { - "message": "Yalnız $ORGANIZATION$ ilə əlaqəli Sirr Meneceri məlumatları xaricə köçürüləcək. Digər məhsullardakı və ya digər təşkilatlardan olan elementlər daxil edilmir.", + "message": "Yalnız $ORGANIZATION$ ilə əlaqəli Sirr Meneceri veriləri xaricə köçürüləcək. Digər məhsullardakı və ya digər təşkilatlardan olan elementlər daxil edilmir.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -8218,13 +8230,13 @@ "message": "Lisenziyanı yüklə" }, "projectPeopleDescription": { - "message": "Qrup və ya insanların bu layihəyə müraciətinə icazə verin." + "message": "Qrup və ya insanların bu layihəyə erişməsinə icazə verin." }, "projectPeopleSelectHint": { "message": "İnsanları və ya qrupları yazın və ya seçin" }, "projectServiceAccountsDescription": { - "message": "Xidmət hesablarının bu layihəyə müraciətinə icazə verin." + "message": "Xidmət hesablarının bu layihəyə erişməsinə icazə verin." }, "projectServiceAccountsSelectHint": { "message": "Xidmət hesablarını yazın və ya seçin" @@ -8233,16 +8245,16 @@ "message": "Əməkdaşlığa başlamaq insanları və ya qrupları əlavə edin" }, "projectEmptyServiceAccountAccessPolicies": { - "message": "Müraciət icazəsi veriləcək xidmət hesablarını əlavə edin" + "message": "Erişim icazəsi veriləcək xidmət hesablarını əlavə et" }, "serviceAccountPeopleDescription": { - "message": "Qrup və ya insanların bu xidmət hesabına müraciətinə icazə verin." + "message": "Qrup və ya insanların bu xidmət hesabına erişməsinə icazə verin." }, "serviceAccountProjectsDescription": { "message": "Bu xidmət hesabına layihələr təyin edin. " }, "serviceAccountEmptyProjectAccesspolicies": { - "message": "Müraciət icazəsi vermək üçün layihə əlavə edin" + "message": "Erişim icazəsi vermək üçün layihə əlavə edin" }, "canReadWrite": { "message": "Oxuya, yaza bilər" @@ -8257,16 +8269,16 @@ "message": "Yeni güvənlik tövsiyələrini qarşılamaq və hesab qorumasını təkmilləşdirmək üçün şifrələmə ayarlarınızı güncəlləyin." }, "kdfSettingsChangeLogoutWarning": { - "message": "Davam etsəniz, bütün aktiv seanslardan çıxış edəcəksiniz. Təkrar giriş etməyiniz və əgər varsa iki addımlı girişi tamamlamağınız lazım olacaq. Data itkisini önləmək üçün şifrələmə ayarlarınızı dəyişdirməzdən əvvəl seyfinizi xaricə köçürməyinizi tövsiyə edirik." + "message": "Davam etsəniz, bütün aktiv seanslardan çıxış edəcəksiniz. Təkrar giriş etməyiniz və əgər varsa iki addımlı girişi tamamlamağınız lazım olacaq. Veri itkisini önləmək üçün şifrələmə ayarlarınızı dəyişdirməzdən əvvəl seyfinizi xaricə köçürməyinizi tövsiyə edirik." }, "secretsManager": { "message": "Sirr Meneceri" }, "secretsManagerAccessDescription": { - "message": "\"Sirr Meneceri\"nə istifadəçi müraciətini aktivləşdir." + "message": "\"Sirr Meneceri\"nə istifadəçi erişimini aktivləşdir." }, "userAccessSecretsManagerGA": { - "message": "Bu istifadəçi \"Sirr Meneceri\"nə müraciət edə bilər" + "message": "Bu istifadəçi \"Sirr Meneceri\"nə erişə bilər" }, "important": { "message": "Vacib:" @@ -8297,7 +8309,7 @@ "message": "Daxilə köçürmə faylını oxumağa çalışarkən xəta baş verdi" }, "accessedSecretWithId": { - "message": "$SECRET_ID$ identifikatoruna sahib bir sirrə müraciət edildi.", + "message": "$SECRET_ID$ identifikatoruna sahib bir sirrə erişildi.", "placeholders": { "secret_id": { "content": "$1", @@ -8306,7 +8318,7 @@ } }, "accessedSecret": { - "message": "$SECRET_ID$ sirrinə müraciət edildi.", + "message": "$SECRET_ID$ sirrinə erişildi.", "placeholders": { "secret_id": { "content": "$1", @@ -8405,40 +8417,40 @@ "message": "Seçim tələb olunur." }, "saPeopleWarningTitle": { - "message": "Müraciət tokenləri hələ də əlçatandır" + "message": "Erişim tokenləri hələ də mövcuddur" }, "saPeopleWarningMessage": { - "message": "İnsanları xidmət hesabından silsəniz belə, yaratdıqları müraciət tokenləri silinmir. Güvənliyin ən yaxşı təcrübəsi üçün, xidmət hesabından silinmiş insanlar tərəfindən yaradılan müraciət tokenlərinin ləğv edilməsi tövsiyə olunur." + "message": "İnsanları xidmət hesabından silsəniz belə, yaratdıqları erişim tokenləri silinmir. Ən yaxşı təhlükəsizlik təcrübəsi üçün, xidmət hesabından silinmiş insanlar tərəfindən yaradılan erişim tokenlərinin ləğv edilməsi tövsiyə olunur." }, "smAccessRemovalWarningProjectTitle": { - "message": "Bu layihəyə müraciəti sil" + "message": "Bu layihəyə erişimi sil" }, "smAccessRemovalWarningProjectMessage": { - "message": "Bu əməliyyat, layihəyə olan müraciətinizi götürəcək." + "message": "Bu əməliyyat, layihəyə erişiminizi ləğv edəcək." }, "smAccessRemovalWarningSaTitle": { - "message": "Bu xidmət hesabına müraciəti sil" + "message": "Bu xidmət hesabına erişimi sil" }, "smAccessRemovalWarningSaMessage": { - "message": "Bu əməliyyat, xidmət hesabına olan müraciətinizi götürəcək." + "message": "Bu əməliyyat, xidmət hesabına olan erişiminizi ləğv edəcək." }, "removeAccess": { - "message": "Müraciəti sil" + "message": "Erişimi sil" }, "checkForBreaches": { - "message": "Bu parol üçün bilinən məlumat pozuntularını yoxlayın" + "message": "Bu parol üçün bilinən veri pozuntularını yoxlayın" }, "exposedMasterPassword": { "message": "İfşa olunmuş ana parol" }, "exposedMasterPasswordDesc": { - "message": "Parol, məlumat pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" + "message": "Parol, veri pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" }, "weakAndExposedMasterPassword": { "message": "Zəif və ifşa olunmuş ana parol" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" + "message": "Zəif parol, veri pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" }, "characterMinimum": { "message": "Minimum $LENGTH$ simvol", @@ -8590,14 +8602,14 @@ "message": "İstifadəçi, hesab geri qaytarılması vasitəsilə verilən bir parolu güncəllədi." }, "activatedAccessToSecretsManager": { - "message": "\"Sirr Meneceri\"nə müraciət aktivləşdirildi", + "message": "\"Sirr Meneceri\"nə erişim aktivləşdirildi", "description": "Confirmation message that one or more users gained access to Secrets Manager" }, "activateAccess": { - "message": "Müraciəti aktivləşdir" + "message": "Erişimi aktivləşdir" }, "bulkEnableSecretsManagerDescription": { - "message": "Aşağıdakı üzvlər üçün \"Sirr Meneceri\"nə müraciət icazəsi verin. \"Parol Meneceri\"ndə verilmiş rol, \"Sirr Meneceri\"nə də aiddir.", + "message": "Aşağıdakı üzvlər üçün \"Sirr Meneceri\"nə erişim icazəsi verin. \"Parol Meneceri\"ndə verilmiş rol, \"Sirr Meneceri\"nə də aiddir.", "description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager." }, "activateSecretsManager": { @@ -8659,7 +8671,7 @@ "message": "Hesabın ana parolu yoxdur" }, "removeOrgUserNoMasterPasswordDesc": { - "message": "$USER$ istifadəçisini onun üçün ana parol ayarlamadan silmək, hesablarına tam müraciəti məhdudlaşdıra bilər. Davam etmək istədiyinizə əminsiniz?", + "message": "$USER$ istifadəçisini onun üçün ana parol ayarlamadan silmək, hesablarına tam erişimi məhdudlaşdıra bilər. Davam etmək istədiyinizə əminsiniz?", "placeholders": { "user": { "content": "$1", @@ -8671,7 +8683,7 @@ "message": "Ana parol yoxdur" }, "removeMembersWithoutMasterPasswordWarning": { - "message": "Ana parolu olmayan üzvlərin onlar üçün parol ayarlamadan silinməsi, hesablarına tam müraciəti məhdudlaşdıra bilər." + "message": "Ana parolu olmayan üzvləri, onlar üçün parol təyin etmədən silmək, hesablarına tam erişimi məhdudlaşdıra bilər." }, "approvedAuthRequest": { "message": "$ID$ üçün təsdiqlənmiş cihaz.", @@ -8761,7 +8773,7 @@ } }, "secretsManagerForPlanDesc": { - "message": "Mühəndislik və DevOps komandalarının proqram təminatının inkişaf dövrü boyunca sirləri idarə etmək üçün." + "message": "Mühəndislik və DevOps komandalarının yazılım gəlişdirmə dövrü boyunca sirləri idarə etmək üçün." }, "free2PersonOrganization": { "message": "Ödənişsiz 2 nəfərlik Təşkilatlar" @@ -8803,7 +8815,7 @@ "message": "\"Sirr Meneceri\"nə abunə ol" }, "addSecretsManagerUpgradeDesc": { - "message": "Əvvəlki planınızla yaradılan bütün sirlərə müraciəti davam etdirmək üçün \"Sirr Meneceri\"ni yüksəldilmiş planınıza əlavə edin." + "message": "Əvvəlki planınızla yaradılan bütün sirlərə erişimi davam etdirmək üçün \"Sirr Meneceri\"ni yüksəldilmiş planınıza əlavə edin." }, "additionalServiceAccounts": { "message": "Əlavə xidmət hesabları" @@ -8878,7 +8890,7 @@ "message": "Beta" }, "assignCollectionAccess": { - "message": "Kolleksiya müraciəti təyin et" + "message": "Kolleksiya erişimini təyin et" }, "editedCollections": { "message": "Düzəliş edilən kolleksiyalar" @@ -8931,7 +8943,7 @@ "message": "Veb tətbiqi açmadan giriş məlumatlarını cəld saxlamaq və formları avto-doldurmaq üçün uzantını istifadə edin." }, "projectAccessUpdated": { - "message": "Layihə müraciəti güncəlləndi" + "message": "Layihəyə erişim güncəlləndi" }, "unexpectedErrorSend": { "message": "Bu Send yüklənərkən gözlənilməz bir xəta baş verdi. Daha sonra yenidən sınayın." @@ -8946,10 +8958,10 @@ "message": "Yer limitinə çatıldı. Əlavə yer satın almaq üçün provayderinizlə əlaqə saxlayın." }, "collectionAccessRestricted": { - "message": "Kolleksiya müraciəti məhdudlaşdırıldı" + "message": "Kolleksiya erişimi məhdudlaşdırıldı" }, "readOnlyCollectionAccess": { - "message": "Bu kolleksiyanı idarə etmək üçün müraciətiniz yoxdur." + "message": "Bu kolleksiyanı idarə etmək üçün erişiminiz yoxdur." }, "grantManageCollectionWarningTitle": { "message": "\"Kolleksiyanı idarə etmə\" icazələri əskikdir" @@ -8958,16 +8970,16 @@ "message": "Kolleksiyanın silinməsi daxil olmaqla tam kolleksiya idarəetməsinə icazə vermək üçün \"Kolleksiyanı idarə etmə\" icazələrini verin." }, "grantCollectionAccess": { - "message": "Qrup və ya üzvlərin bu kolleksiyaya müraciətinə icazə verin." + "message": "Qrup və ya üzvlərin bu kolleksiyaya erişməsinə icazə ver." }, "grantCollectionAccessMembersOnly": { - "message": "Üzvlərin bu kolleksiyaya müraciətinə icazə verin." + "message": "Üzvlərin bu kolleksiyaya erişməsinə icazə ver." }, "adminCollectionAccess": { - "message": "Administratorlar kolleksiyalara müraciət edə və onları idarə edə bilər." + "message": "İnzibatçılar kolleksiyalara erişə və onları idarə edə bilər." }, "serviceAccountAccessUpdated": { - "message": "Xidmət hesabına müraciət güncəlləndi" + "message": "Xidmət hesabına erişim güncəlləndi" }, "commonImportFormats": { "message": "Ortaq formatlar", @@ -9089,10 +9101,10 @@ "message": "Bu kolleksiyalara təyin et" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementi görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementi görə biləcək." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementləri görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementləri görə biləcək." }, "selectCollectionsToAssign": { "message": "Təyin ediləcək kolleksiyaları seçin" @@ -9226,7 +9238,7 @@ "description": "Title for creating a new machine account." }, "machineAccountsNoItemsMessage": { - "message": "\"Sirr\" müraciətini avtomatlaşdırmağa başlamaq üçün yeni bir maşın hesabı yaradın.", + "message": "Sirr erişimini avtomatlaşdırmağa başlamaq üçün yeni bir maşın hesabı yaradın.", "description": "Message to encourage the user to start creating machine accounts." }, "machineAccountsNoItemsTitle": { @@ -9293,16 +9305,16 @@ "description": "Notifies that a machine account has been updated" }, "projectMachineAccountsDescription": { - "message": "Maşın hesablarının bu layihəyə müraciətinə icazə verin." + "message": "Maşın hesablarının bu layihəyə erişməsinə icazə verin." }, "projectMachineAccountsSelectHint": { "message": "Maşın hesablarını yazın və ya seçin" }, "projectEmptyMachineAccountAccessPolicies": { - "message": "Müraciət icazəsi veriləcək maşın hesablarını əlavə edin" + "message": "Erişim icazəsi veriləcək maşın hesablarını əlavə edin" }, "machineAccountPeopleDescription": { - "message": "Qrup və ya insanların bu maşın hesabına müraciətinə icazə verin." + "message": "Qrup və ya insanların bu maşın hesabına erişməsinə icazə verin." }, "machineAccountProjectsDescription": { "message": "Bu maşın hesabına layihələr təyin edin. " @@ -9311,13 +9323,13 @@ "message": "Bir maşın hesabı yarat" }, "maPeopleWarningMessage": { - "message": "İnsanları maşın hesabından silsəniz belə, yaratdıqları müraciət tokenləri silinmir. Güvənliyin ən yaxşı təcrübəsi üçün, maşın hesabından silinmiş insanlar tərəfindən yaradılan müraciət tokenlərinin ləğv edilməsi tövsiyə olunur." + "message": "İnsanları maşın hesabından silsəniz belə, yaratdıqları erişim tokenləri silinmir. Ən yaxşı ttəhlükəsizlik təcrübəsi üçün, maşın hesabından silinmiş insanlar tərəfindən yaradılan erişim tokenlərinin ləğv edilməsi tövsiyə olunur." }, "smAccessRemovalWarningMaTitle": { - "message": "Bu maşın hesabına müraciəti sil" + "message": "Bu maşın hesabına erişimi sil" }, "smAccessRemovalWarningMaMessage": { - "message": "Bu əməliyyat, maşın hesabına olan müraciətinizi götürəcək." + "message": "Bu əməliyyat, maşın hesabına olan erişiminizi ləğv edəcək." }, "machineAccountsIncluded": { "message": "$COUNT$ maşın hesabı daxildir", @@ -9371,7 +9383,7 @@ "message": "Maksimal mümkün maşın hesabı qiyməti" }, "machineAccountAccessUpdated": { - "message": "Maşın hesabına müraciət güncəlləndi" + "message": "Maşın hesabına erişim güncəlləndi" }, "restrictedGroupAccessDesc": { "message": "Özünüzü bir qrupa əlavə edə bilməzsiniz." @@ -9380,7 +9392,7 @@ "message": "Provayderi sil" }, "deleteProviderConfirmation": { - "message": "Bir provayderin silinməsi daimi və geri qaytarıla bilməyən prosesdir. Provayderin və əlaqəli bütün datanın silinməsini təsdiqləmək üçün ana parolunuzu daxil edin." + "message": "Bir provayderin silinməsi daimi və geri qaytarıla bilməyən prosesdir. Provayderin və əlaqəli bütün verilərin silinməsini təsdiqləmək üçün ana parolunuzu daxil edin." }, "deleteProviderName": { "message": "$ID$ silinə bilmir", @@ -9404,7 +9416,7 @@ "message": "Provayder silindi" }, "providerDeletedDesc": { - "message": "Provayder və bütün əlaqəli datalar silindi." + "message": "Provayder və bütün əlaqəli verilər silinib." }, "deleteProviderRecoverConfirmDesc": { "message": "Bu Provayderi silmək üçün tələb göndərdiniz. Təsdiqləmək üçün aşağıdakı düyməni istifadə edin." @@ -9475,10 +9487,10 @@ "message": "Platformanız üçün icra bələdçisini istifadə edərək Bitwarden üçün cihaz idarəetməsini konfiqurasiya edin." }, "crowdstrikeEventIntegrationDesc": { - "message": "Send event data to your Logscale instance" + "message": "Event verilərini öz Logscale instance\"na göndər" }, "failedToSaveIntegration": { - "message": "Failed to save integration. Please try again later." + "message": "İnteqrasiya saxlanılmadı. Lütfən daha sonra yenidən sınayın." }, "deviceIdMissing": { "message": "Cihaz kimliyi əskikdir" @@ -9496,7 +9508,7 @@ "message": "Bu keçidi e-poçtunuzdan masaüstündə yenidən açın." }, "connectIntegrationButtonDesc": { - "message": "Connect $INTEGRATION$", + "message": "$INTEGRATION$ ilə bağlantı qur", "placeholders": { "integration": { "content": "$1", @@ -9565,10 +9577,10 @@ "message": "URL" }, "bearerToken": { - "message": "Bearer Token" + "message": "Bearer Tokeni" }, "index": { - "message": "Index" + "message": "İndeks" }, "selectAPlan": { "message": "Bir plan seçin" @@ -9592,10 +9604,10 @@ "message": "Yeni client uğurla yaradıldı" }, "noAccess": { - "message": "Müraciət yoxdur" + "message": "Erişim yoxdur" }, "collectionAdminConsoleManaged": { - "message": "Bu kolleksiya yalnız admin konsolundan əlçatandır" + "message": "Yalnız admin konsolu bu kolleksiyaya erişə bilər" }, "organizationOptionsMenu": { "message": "Təşkilat Menyusuna keç" @@ -9674,7 +9686,7 @@ "message": "Məlumata bax" }, "viewAccess": { - "message": "Müraciətə bax" + "message": "Erişimə bax" }, "noCollectionsSelected": { "message": "Heç bir kolleksiya seçməmisiniz." @@ -9768,10 +9780,10 @@ "description": "A hint that shows up on the Provider setup page to inform the admin the billing email will receive the provider's invoices." }, "upgradeOrganizationEnterprise": { - "message": "Üzv müraciətini yoxlayaraq güvənlik risklərini müəyyənləşdir" + "message": "Üzv erişimini yoxlayaraq güvənlik risklərini müəyyənləşdir" }, "onlyAvailableForEnterpriseOrganization": { - "message": "Müəssisə planına yüksəltməklə təşkilat daxilində üzv müraciətinə cəld baxın." + "message": "Müəssisə planına yüksəltməklə təşkilat daxilində üzv erişiminə cəld baxın." }, "date": { "message": "Tarix" @@ -9780,13 +9792,13 @@ "message": "Müştəri hesabatını xaricə köçür" }, "memberAccessReport": { - "message": "Üzv müraciəti" + "message": "Üzv erişimi" }, "memberAccessReportDesc": { - "message": "Üzvlərin düzgün kimlik məlumatlarına müraciət etdiklərinə və onların hesabınlarının güvəndə olduğuna əmin olun. Üzv müraciəti və hesab konfiqurasiyalarının CSV-sini əldə etmək üçün bu hesabatı istifadə edin." + "message": "Üzvlərin düzgün kimlik məlumatlarına erişdiklərinə və onların hesabınlarının güvəndə olduğuna əmin olun. Üzv erişimi və hesab konfiqurasiyalarının CSV-sini əldə etmək üçün bu hesabatı istifadə edin." }, "memberAccessReportPageDesc": { - "message": "Qruplar, kolleksiyalar və kolleksiya elementləri arasında təşkilat üzvlərinin müraciətini yoxlanışdan keçirin. CSV xaricə köçürməsi, kolleksiya icazələri və hesab konfiqurasiyaları haqqında məlumatlar da daxil olmaqla hər bir üzv üçün detallı məlumat təqdim edir." + "message": "Qruplar, kolleksiyalar və kolleksiya elementləri arasında təşkilat üzvlərinin erişimini yoxlanışdan keçirin. CSV xaricə köçürməsi, kolleksiya icazələri və hesab konfiqurasiyaları haqqında məlumatlar da daxil olmaqla hər bir üzv üçün detallı məlumat təqdim edir." }, "memberAccessReportNoCollection": { "message": "(Kolleksiya yoxdur)" @@ -9834,22 +9846,22 @@ "message": " Abunəliyinizi bərpa etmək üçün Müştəri Dəstəyi ilə əlaqə saxlayın." }, "secretPeopleDescription": { - "message": "Qrupların və ya insanların bu sirrə müraciətinə icazə verin. İnsanlar üçün təyin edilən icazələr, qruplar tərəfindən təyin edilən icazələri yararsız edəcək." + "message": "Qrupların və ya insanların bu sirrə erişməsinə icazə verin. İnsanlar üçün təyin edilən icazələr, qruplar tərəfindən təyin edilən icazələri yararsız edəcək." }, "secretPeopleEmptyMessage": { - "message": "Bu sirrə müraciəti paylaşmaq üçün insanları və ya qrupları əlavə edin" + "message": "Bu sirrə erişimi paylaşmaq üçün insanları və ya qrupları əlavə edin" }, "secretMachineAccountsDescription": { - "message": "Maşın hesablarının bu sirrə müraciətinə icazə verin." + "message": "Maşın hesablarının bu sirrə erişməsinə icazə ver." }, "secretMachineAccountsEmptyMessage": { - "message": "Bu sirrə müraciət icazəsi vermək üçün maşın hesabları əlavə et" + "message": "Bu sirrə erişim icazəsi vermək üçün maşın hesabları əlavə et" }, "smAccessRemovalWarningSecretTitle": { - "message": "Bu sirrə müraciəti sil" + "message": "Bu sirrə erişimi sil" }, "smAccessRemovalSecretMessage": { - "message": "Bu əməliyyat, bu sirrə olan müraciətinizi götürəcək." + "message": "Bu əməliyyat, bu sirrə olan erişiminizi ləğv edəcək." }, "invoice": { "message": "Faktura" @@ -9896,7 +9908,7 @@ "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "providerClientVaultPrivacyNotification": { - "message": "Bildiriş: Bu ayın sonu, client seyf gizliliyi yaxşılaşdırılacaq və provayder üzvləri artıq client seyf elementlərinə birbaşa müraciət edə bilməyəcək. Suallar üçün", + "message": "Bildiriş: Bu ayın sonu, client seyf gizliliyi yaxşılaşdırılacaq və provayder üzvləri artıq client seyf elementlərinə birbaşa erişə bilməyəcək. Suallar üçün", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'." }, "contactBitwardenSupport": { @@ -9950,7 +9962,7 @@ } }, "data": { - "message": "Data" + "message": "Veri" }, "purchasedSeatsRemoved": { "message": "satın alınmış yerlər silindi" @@ -9968,13 +9980,13 @@ "message": "Layihə kimliyi" }, "projectsAccessedByMachineAccount": { - "message": "Bu maşın hesabı ilə aşağıdakı layihələrə müraciət edilə bilər." + "message": "Bu maşın hesabı ilə aşağıdakı layihələrə erişilə bilər." }, "config": { "message": "Konfiqurasiya" }, "learnMoreAboutEmergencyAccess": { - "message": "Fövqəladə hal müraciət haqqında daha ətraflı" + "message": "Fövqəladə hal erişimi barədə daha ətraflı" }, "learnMoreAboutMatchDetection": { "message": "Uyuşma aşkarlaması haqqında daha ətraflı" @@ -10004,7 +10016,7 @@ "message": "Veb sayt ikonlarını istifadə etmə haqqında daha ətraflı" }, "learnMoreAboutUserAccess": { - "message": "İstifadəçi müraciəti haqqında daha ətraflı" + "message": "İstifadəçi erişimi barədə daha ətraflı" }, "learnMoreAboutMemberRoles": { "message": "Üzv rolları və icazələr haqqında daha ətraflı" @@ -10100,7 +10112,7 @@ "message": "Limitsiz üzv dəvət et" }, "accessToCreateGroups": { - "message": "Qrup yaratma müraciəti" + "message": "Qrup yaratma erişimi" }, "syncGroupsAndUsersFromDirectory": { "message": "Qrupları və istifadəçiləri bir kataloqdan sinxronlaşdır" @@ -10109,7 +10121,7 @@ "message": "Ailənizin giriş məlumatlarını güvəndə saxlayın" }, "accessToPremiumFeatures": { - "message": "Premium özəlliklərə müraciət" + "message": "Premium özəlliklərə erişim" }, "additionalStorageGbMessage": { "message": "GB əlavə saxlama sahəsi" @@ -10157,7 +10169,7 @@ "message": "Limitsiz kolleksiya" }, "secureDataSharing": { - "message": "Güvənli data paylaşımı" + "message": "Güvənli veri paylaşımı" }, "eventLogMonitoring": { "message": "Event log izləmə" @@ -10212,13 +10224,13 @@ "message": "Xarakter sayını gizlət" }, "editAccess": { - "message": "Müraciətə düzəliş et" + "message": "Erişimə düzəliş et" }, "textHelpText": { - "message": "Təhlükəsizlik sualları kimi datalar üçün mətn xanalarını istifadə edin" + "message": "Təhlükəsizlik sualları kimi verilər üçün mətn xanalarını istifadə edin" }, "hiddenHelpText": { - "message": "Parol kimi həssas datalar üçün gizli xanaları istifadə edin" + "message": "Parol kimi həssas verilər üçün gizli xanaları istifadə edin" }, "checkBoxHelpText": { "message": "\"E-poçtu xatırla\" kimi formun təsdiq qutusunu avto-doldurmaq istəyirsinizsə təsdiq qutularını istifadə edin" @@ -10316,10 +10328,10 @@ } }, "organizationUserDeletedDesc": { - "message": "İstifadəçi təşkilatdan çıxarıldı və əlaqələndirilmiş bütün istifadəçi dataları silindi." + "message": "İstifadəçi təşkilatdan çıxarılıb və əlaqələndirilmiş bütün istifadəçi veriləri silinib." }, "deletedUserIdEventMessage": { - "message": "Deleted user $ID$", + "message": "Silinmiş istifadəçi $ID$", "placeholders": { "id": { "content": "$1", @@ -10349,7 +10361,7 @@ "message": "Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "suspendedOwnerOrgMessage": { - "message": "Təşkilatınıza yenidən müraciət qazanmaq üçün bir ödəniş üsulu əlavə edin." + "message": "Təşkilatınıza yenidən erişmək üçün bir ödəniş üsulu əlavə edin." }, "deleteMembers": { "message": "Üzvləri sil" @@ -10503,7 +10515,7 @@ "message": "Təşkilata güvənilmir" }, "emergencyAccessTrustWarning": { - "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal müraciəti icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" + "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal erişim icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" }, "orgTrustWarning": { "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu təşkilatın üzvüsünüzsə, hesab geri qaytarma fəaldırsa və aşağıda görünən barmaq izi təşkilatın barmaq izi ilə uyuşursa davam edin." @@ -10684,7 +10696,7 @@ "message": "Təyin edilmiş yer sayı, boş yer sayından çoxdur." }, "userkeyRotationDisclaimerEmergencyAccessText": { - "message": "Fövqəladə hal müraciətini fəallaşdırdığınız $NUM_USERS$ kontakt üçün barmaq izi ifadəsi.", + "message": "Fövqəladə hal erişimini fəallaşdırdığınız $NUM_USERS$ kontakt üçün barmaq izi ifadəsi.", "placeholders": { "num_users": { "content": "$1", @@ -10702,7 +10714,7 @@ } }, "userkeyRotationDisclaimerDescription": { - "message": "Şifrələmə açarlarını döndərmək, sizdən hesabınızı geri qaytara biləcək istənilən təşkilatın açarlarına və fövqəladə hal müraciətini fəallaşdırdığınız istənilən kontakta güvənməyinizi tələb edəcək. Davam etmək üçün əmin olun ki, aşağıdakıları doğrulaya bilirsiniz:" + "message": "Şifrələmə açarlarını döndərmək, sizdən hesabınızı geri qaytara biləcək istənilən təşkilatın açarlarına və fövqəladə hal erişimini fəallaşdırdığınız istənilən kontakta güvənməyinizi tələb edəcək. Davam etmək üçün əmin olun ki, aşağıdakıları doğrulaya bilirsiniz:" }, "userkeyRotationDisclaimerTitle": { "message": "Güvənilməyən şifrələmə açarları" @@ -10717,7 +10729,7 @@ "message": "Üzvlərin öz hesablarının kilidini PIN ilə açmasına icazə verilməsin." }, "upgradeForFullEventsMessage": { - "message": "Event log-ları təşkilatınız üçün saxlanılmır. Təşkilatın event log-larına tam müraciət əldə etmək üçün Teams və ya Enterprise planına yüksəldin." + "message": "Event log-ları təşkilatınız üçün saxlanılmır. Təşkilatın event log-larına tam erişmək üçün Teams və ya Enterprise planına yüksəldin." }, "upgradeEventLogTitleMessage": { "message": "Təşkilatınızın event log-larını görmək üçün yüksəldin." @@ -10742,7 +10754,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "İstənilən platformada faylları və dataları hər kəslə paylaşın. İfşa olunmağı məhdudlaşdıraraq məlumatlarınız ucdan-uca şifrələnmiş qalacaq.", + "message": "İstənilən platformada faylları və veriləri hər kəslə güvənli şəkildə paylaşın. Məlumatlarınız, ifşa olunmamaq üçün ucdan-uca şifrələnmiş qalacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "generatorNudgeTitle": { @@ -10793,13 +10805,13 @@ "message": "Kimliklərinizlə, uzun qeydiyyat və ya əlaqə xanalarını daha tez avtomatik doldurun." }, "newNoteNudgeTitle": { - "message": "Həssas datalarınızı güvənli şəkildə saxlayın" + "message": "Həssas verilərinizi güvənli şəkildə saxlayın" }, "newNoteNudgeBody": { - "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas dataları təhlükəsiz saxlayın." + "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas veriləri təhlükəsiz saxlayın." }, "newSshNudgeTitle": { - "message": "Gəlişdirici dostu SSH müraciəti" + "message": "Gəlişdirici dostu SSH erişimi" }, "newSshNudgeBodyOne": { "message": "Açarlarınızı saxlayın və sürətli, şifrələnmiş kimlik doğrulama üçün SSH agentinə bağlayın.", @@ -10854,7 +10866,7 @@ "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "setupExtensionContentAlt": { - "message": "Bitwarden brauzer uzantısı ilə, asanlıqla yeni giriş məlumatlarını yarada, saxlanılmış giriş məlumatlarınıza birbaşa brauzerin alət çubuğundan müraciət edə və Bitwarden avto-doldurmanı istifadə edərək hesablarınıza cəld şəkildə daxil ola bilərsiniz." + "message": "Bitwarden brauzer uzantısı ilə, asanlıqla yeni giriş məlumatlarını yarada, saxlanılmış giriş məlumatlarınıza birbaşa brauzerin alət çubuğundan erişə və Bitwarden avto-doldurmanı istifadə edərək hesablarınıza cəld şəkildə daxil ola bilərsiniz." }, "restart": { "message": "Yenidən başlat" @@ -10931,14 +10943,14 @@ } }, "unpaidInvoices": { - "message": "Unpaid invoices" + "message": "Ödənilməmiş fakturalar" }, "unpaidInvoicesForServiceUser": { - "message": "Your subscription has not been paid. Contact your provider administrator to restore service to you and your clients.", + "message": "Abunəliyinizin ödənişi edilməyib. Xidmətləri həm sizə, həm də müştərilərinizə bərpa etmək üçün provayder inzibatçınızla əlaqə saxlayın.", "description": "A message shown in a non-dismissible dialog to service users of unpaid providers." }, "providerSuspended": { - "message": "$PROVIDER$ is suspended", + "message": "$PROVIDER$ dayandırılıb", "placeholders": { "provider": { "content": "$1", @@ -10947,11 +10959,11 @@ } }, "restoreProviderPortalAccessViaCustomerSupport": { - "message": "To restore access to your provider portal, contact Bitwarden Customer Support to renew your subscription.", + "message": "Provayder portalınıza erişimi bərpa etmək məqsədilə abunəliyinizi yeniləmək üçün Bitwarden Müştəri Dəstəyi ilə əlaqə saxlayın.", "description": "A message shown in a non-dismissible dialog to any user of a suspended providers." }, "restoreProviderPortalAccessViaPaymentMethod": { - "message": "Your subscription has not been paid. To restore service to you and your clients, add a payment method by $CANCELLATION_DATE$.", + "message": "Abunəliyinizin ödənişi edilməyib. Xidmətləri həm sizə, həm də müştərilərinizə bərpa etmək üçün $CANCELLATION_DATE$ tarixinə qədər bir ödəniş üsulu əlavə edin.", "placeholders": { "cancellation_date": { "content": "$1", @@ -10961,7 +10973,7 @@ "description": "A message shown in a non-dismissible dialog to admins of unpaid providers." }, "subscribetoEnterprise": { - "message": "Subscribe to $PLAN$", + "message": "$PLAN$ planına abunə ol", "placeholders": { "plan": { "content": "$1", @@ -10970,7 +10982,7 @@ } }, "subscribeEnterpriseSubtitle": { - "message": "Your 7-day $PLAN$ trial starts today. Add a payment method now to continue using these features after your trial ends: ", + "message": "7 günlük $PLAN$ sınağı bu gün başlayır. Sınaq müddəti bitdikdən sonra bu özəllikləri istifadə etməyə davam etmək üçün bir ödəniş üsulu əlavə edin: ", "placeholders": { "plan": { "content": "$1", @@ -10979,6 +10991,18 @@ } }, "unlimitedSecretsAndProjects": { - "message": "Unlimited secrets and projects" + "message": "Limitsiz sirr və layihə" + }, + "providersubscriptionCanceled": { + "message": "Abunəlik ləğv edildi" + }, + "providersubCanceledmessage": { + "message": "Təkrar abunə olmaq üçün Bitwarden Müştəri Dəstəyi ilə əlaqə saxlayın." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 3921940657b..7ec6e2e3338 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Выдаліць асабістае сховішча" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 5ea290d81f0..7079aa5d492 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Отключете Битоурден на устройството си или в " }, - "areYouTryingToAccessYourAccount": { - "message": "Опитвате ли се да получите достъп до акаунта си?" - }, "accessAttemptBy": { "message": "Опит за достъп от $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Тази заявка вече не е активна." }, - "logInConfirmedForEmailOnDevice": { - "message": "Вписването за $EMAIL$ на $DEVICE$ е одобрено", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Вие отказахте опит за вписване от друго устройство. Ако това наистина сте били Вие, опитайте да се впишете от устройството отново." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Заявката за вписване за $EMAIL$ на $DEVICE$ е одобрена", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Задължителна собственост на организационните данни" }, + "organizationDataOwnershipDesc": { + "message": "Изискване на всички елементи да бъдат притежавани от организация, премахвайки възможността за съхраняване на елементи в отделен акаунт.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Всички елементи ще се притежават от и съхраняват в организацията, което ще означава, че управлението, видимостта и докладите ще се извършват от организацията. Когато това и включено, всеки член ще може да съхранява елементите си в стандартна колекция. Научете повече относно управлението на ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "жизнения цикъл на данните за удостоверяване", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Наистина ли искате да продължите?" + }, + "organizationDataOwnershipWarning1": { + "message": "ще остане достъпна за членовете" + }, + "organizationDataOwnershipWarning2": { + "message": "няма да бъде автоматично избрана при създаване на нови елементи" + }, + "organizationDataOwnershipWarning3": { + "message": "не може да се управлява от Конзолата за администриране, докато потребителят не бъде премахнат" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Изключвайки тази политика, стандартната колекция: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Научете повече относно ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Индивидуално притежание" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Неограничен брой тайни и проекти" + }, + "providersubscriptionCanceled": { + "message": "Абонаментът е преустановен" + }, + "providersubCanceledmessage": { + "message": "Ако искате да се абонирате отново, свържете се с поддръжката на Битуорден." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 6f522d4db62..687bab189ba 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 7896b4ef1ce..bbd2939f500 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 7a9726fb57d..7829ae52d9d 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Suprimeix la caixa forta individual" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 0431703599d..9dc89d7a7e6 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -1030,7 +1030,7 @@ "message": "Úroveň přístupu" }, "accessing": { - "message": "Přistupování" + "message": "Přístup k" }, "loggedOut": { "message": "Odhlášení" @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Odemknout Bitwarden na Vašem zařízení nebo na " }, - "areYouTryingToAccessYourAccount": { - "message": "Pokoušíte se získat přístup k Vašemu účtu?" - }, "accessAttemptBy": { "message": "Pokus o přístup z $EMAIL$", "placeholders": { @@ -3236,7 +3233,7 @@ "message": "Přednostní zákaznická podpora" }, "xDayFreeTrial": { - "message": "$COUNT$denní zkušební verze, možno kdykoli zrušit", + "message": "$COUNT$denní zkušební verze, můžete kdykoli zrušit", "placeholders": { "count": { "content": "$1", @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Tento požadavek již není platný." }, - "logInConfirmedForEmailOnDevice": { - "message": "Přihlášení bylo potvrzeno z $EMAIL$ pro $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Pokus o přihlášení byl zamítnut z jiného zařízení. Pokud jste to opravdu Vy, zkuste se znovu přihlásit do zařízení." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Požadavek na přihlášení byl schválen pro $EMAIL$ na $DEVICE$", "placeholders": { @@ -4025,7 +4006,7 @@ } }, "creatingAccountOn": { - "message": "Vytváření účtu na" + "message": "Vytvořit účet na" }, "checkYourEmail": { "message": "Zkontrolujte Váš e-mail" @@ -4040,7 +4021,7 @@ "message": "Žádný e-mail?" }, "goBack": { - "message": "Zpět" + "message": "Vraťte se" }, "toEditYourEmailAddress": { "message": "pro úpravu Vaší e-mailové adresy." @@ -4639,10 +4620,10 @@ "message": "Odhlásit odběr" }, "atAnyTime": { - "message": "kdykoli." + "message": "můžete kdykoli." }, "byContinuingYouAgreeToThe": { - "message": "Pokračováním souhlasíte s" + "message": "Pokračováním souhlasíte s dokumenty" }, "and": { "message": "a" @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Vynutit vlastnictví dat organizace" }, + "organizationDataOwnershipDesc": { + "message": "Vyžaduje, aby byly všechny položky vlastněny organizací s odebráním volby ukládat položky na úrovni účtu.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Všechny položky budou vlastněny a uloženy v organizaci, což umožní organizaci ovládání, viditelnost a hlášení. Pokud je zapnuto, bude k dispozici výchozí sbírka pro každého člena pro ukládání položek. Další informace o správě ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "životního cyklu pověření", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Opravdu chcete pokračovat?" + }, + "organizationDataOwnershipWarning1": { + "message": "bude i nadále přístupné členům" + }, + "organizationDataOwnershipWarning2": { + "message": "nebude automaticky vybráno při vytváření nových položek" + }, + "organizationDataOwnershipWarning3": { + "message": "nelze spravovat z konzole pro správce, dokud není uživatel odpojen" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Odmítnutím této zásady se jedná o výchozí sbírku: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Více informací o ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Odebrat osobní trezor" }, @@ -5597,7 +5609,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineLearnMore": { - "message": "Dozvědět se více o", + "message": "Získejte více informací o", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more about** Bitwarden Send or sign up to try it today.'" }, "sendVaultCardProductDesc": { @@ -5701,7 +5713,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or **sign up** to try it today.'" }, "sendAccessTaglineTryToday": { - "message": "abyste to vyzkoušeli ještě dnes.", + "message": "pro vyzkoušení ještě dnes.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendAccessCreatorIdentifier": { @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Neomezené tajné klíče a projekty" + }, + "providersubscriptionCanceled": { + "message": "Předplatné bylo zrušeno" + }, + "providersubCanceledmessage": { + "message": "Chcete-li se znovu přihlásit, kontaktujte zákaznickou podporu Bitwarden." + }, + "showMore": { + "message": "Zobrazit více" + }, + "showLess": { + "message": "Zobrazit méně" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 0dc3f6db8c6..0c4557f0fe4 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index b5ee42479af..a212a3d555d 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Anmodningen er ikke længere gyldig." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login bekræftet for $EMAIL$ på $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Du nægtede et loginforsøg fra en anden enhed. Hvis dette virkelig var dig, prøv at logge ind med enheden igen." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Fjern individuel boks" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 004dad19ab3..908a9a7dc34 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Entsperre Bitwarden auf deinem Gerät oder mit der " }, - "areYouTryingToAccessYourAccount": { - "message": "Versuchst du auf dein Konto zuzugreifen?" - }, "accessAttemptBy": { "message": "Zugriffsversuch von $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Diese Anfrage ist nicht mehr gültig." }, - "logInConfirmedForEmailOnDevice": { - "message": "Anmeldung von $EMAIL$ auf $DEVICE$ bestätigt", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Du hast einen Anmeldeversuch von einem anderen Gerät abgelehnt. Wenn du das wirklich warst, versuche dich erneut mit dem Gerät anzumelden." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Anmeldeanfrage für $EMAIL$ auf $DEVICE$ genehmigt", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Eigentumsrechte an Unternehmensdaten erzwingen" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Persönlichen Tresor entfernen" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 7cee4a5e65b..276f5a9e79b 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Προσωπική Ιδιοκτησία" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 751041c1070..85e425999ff 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organisation data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organisation, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organisation, enabling organisation-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription cancelled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 0e0a527902d..da410dd5066 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organisation data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organisation, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organisation, enabling organisation-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Personal Ownership" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription cancelled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index b01524e54cb..05306f3b7c4 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Malŝlosu Bitwarden'on en via aparato aŭ en la " }, - "areYouTryingToAccessYourAccount": { - "message": "Ĉu vi provadas aliri vian konton?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Persona Posedo" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 189d0d8c582..917b70c17b8 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -42,7 +42,7 @@ "message": "Restaurar miembros" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "No se puede restaurar el acceso a la organización" }, "allApplicationsWithCount": { "message": "Todas las aplicaciones ($COUNT$)", @@ -654,7 +654,7 @@ "message": "Nota segura" }, "typeNote": { - "message": "Note" + "message": "Nota" }, "typeSshKey": { "message": "Clave SSH" @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Desbloquea Bitwarden en tu dispositivo o en la " }, - "areYouTryingToAccessYourAccount": { - "message": "¿Estás intentando acceder a tu cuenta?" - }, "accessAttemptBy": { "message": "Intento de acceso de $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Esta solicitud ya no es válida." }, - "logInConfirmedForEmailOnDevice": { - "message": "Inicio de sesión confirmado para $EMAIL$ en $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -4633,7 +4614,7 @@ "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." }, "subscribe": { - "message": "Subscribe" + "message": "Suscribirse" }, "unsubscribe": { "message": "Darse de baja" @@ -5175,7 +5156,7 @@ "message": "Texto" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Añade una contraseña opcional para que los destinatarios accedan a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -5203,7 +5184,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "¿Estás seguro de que quieres eliminar permanentemente este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "¿Estás seguro de que quieres proceder?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Propiedad personal" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 36fca68a02a..d4705a02d5e 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Ava Bitwarden oma seadmes või avades " }, - "areYouTryingToAccessYourAccount": { - "message": "Kas sa püüad praegu oma kontole sisse logida?" - }, "accessAttemptBy": { "message": "$EMAIL$ proovis juurdepääsu saada", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Personaalne salvestamine" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index f666d9146af..7329d500a46 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Ezabatu kutxa gotor pertsonala" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 14742332573..48c95439c46 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "قفل Bitwarden را روی دستگاه خود باز کنید یا روی " }, - "areYouTryingToAccessYourAccount": { - "message": "آیا در تلاش برای دسترسی به حساب کاربری خود هستید؟" - }, "accessAttemptBy": { "message": "تلاش برای دسترسی به سیستم توسط $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "این درخواست دیگر معتبر نیست." }, - "logInConfirmedForEmailOnDevice": { - "message": "ورود به سیستم برای $EMAIL$ در $DEVICE$ تأیید شد", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "شما تلاش برای ورود به سیستم از دستگاه دیگری را رد کردید. اگر واقعاً این شما بودید، سعی کنید دوباره با دستگاه وارد شوید." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "اجرای مالکیت داده‌های سازمانی" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "حذف گاوصندوق شخصی" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 0054cd5099d..f9ff592d0b2 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Yritätkö käyttää tiliäsi?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Tämä pyyntö ei ole enää voimassa." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Poista yksityinen holvi" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index eea5d54c5a2..2bbb9eef493 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Alisin ang indibidwal na vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index b235c16fe49..91caf3c78ff 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Déverrouillez Bitwarden sur votre appareil ou sur le " }, - "areYouTryingToAccessYourAccount": { - "message": "Essayez-vous d'accéder à votre compte ?" - }, "accessAttemptBy": { "message": "Tentative d'accès par $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Cette demande n'est plus valide." }, - "logInConfirmedForEmailOnDevice": { - "message": "Connexion confirmée pour $EMAIL$ sur $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Vous avez refusé une tentative de connexion depuis un autre appareil. Si c'était vraiment vous, essayez de vous connecter à nouveau avec l'appareil." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Demande de connexion approuvée pour $EMAIL$ sur $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Forcer la propriété des données de l'organisation" }, + "organizationDataOwnershipDesc": { + "message": "Exiger que tous les éléments appartiennent à une organisation, en supprimant la possibilité de sauvegarder des éléments au niveau du compte.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Tous les éléments seront détenus et enregistrés dans l'organisation, ce qui activera les contrôles, la visibilité et les rapports à l'échelle de l'organisation. Quand activé, une collection par défaut est disponible pour chaque membre pour enregistrer des éléments. En savoir plus sur la gestion de ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "cycle de vie des identifiants", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Êtes-vous sûr de vouloir continuer ?" + }, + "organizationDataOwnershipWarning1": { + "message": "restera accessible aux membres" + }, + "organizationDataOwnershipWarning2": { + "message": "ne sera pas automatiquement sélectionné lors de la création de nouveaux éléments" + }, + "organizationDataOwnershipWarning3": { + "message": "ne peut pas être géré depuis la Console Admin jusqu'à ce que l'utilisateur soit déconnecté" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "En désactivant cette politique de sécurité, la collection par défaut : " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Apprenez-en plus sur ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Supprimer le coffre individuel" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Projets et Secrets illimités" + }, + "providersubscriptionCanceled": { + "message": "Abonnement annulé" + }, + "providersubCanceledmessage": { + "message": "Pour vous réinscrire, contactez l'Assistance Client de Bitwarden." + }, + "showMore": { + "message": "Afficher plus" + }, + "showLess": { + "message": "Afficher moins" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index 95b34ad308d..52a479b7552 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 0afcbd44c1b..858e14ad09d 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "בטל נעילת Bitwarden במכשיר שלך או ב" }, - "areYouTryingToAccessYourAccount": { - "message": "האם אתה מנסה לגשת לחשבון שלך?" - }, "accessAttemptBy": { "message": "ניסיון גישה על ידי $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "בקשה זו אינה תקפה עוד." }, - "logInConfirmedForEmailOnDevice": { - "message": "הכניסה אושרה עבור $EMAIL$ ב־$DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "דחית ניסיון כניסה ממכשיר אחר. אם זה באמת היית אתה, נסה להיכנס עם המכשיר שוב." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "הסר כספת אישית" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index e8d1ffb706f..bd0c488cc14 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index ce81d99590e..c4e6594bbad 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Otključaj Bitwarden na svojem uređaju ili na " }, - "areYouTryingToAccessYourAccount": { - "message": "Pokušavaš li pristupiti svom računu?" - }, "accessAttemptBy": { "message": "$EMAIL$ pokušava pristupiti", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Ovaj zahtjev više nije valjan." }, - "logInConfirmedForEmailOnDevice": { - "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odbijena je prijava na drugom uređaju. Ako si ovo stvarno ti, pokušaj se ponovno prijaviti uređajem." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Provedi vlasništvo nad podacima organizacije" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Ukloni osobni trezor" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Neograničen broj tajni i projekata" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index b12e1131043..87cb9ba8dbe 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "A Bitwarden zárolás feloldása az eszközön vagy: " }, - "areYouTryingToAccessYourAccount": { - "message": "A fiókhoz próbálunk hozzáférni?" - }, "accessAttemptBy": { "message": "Bejelentkezési kísérlet $EMAIL$ segítségével", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "A kérés a továbbiakban már nem érvényes." }, - "logInConfirmedForEmailOnDevice": { - "message": "A bejelelentketés $EMAIL$ email címmel megerősítésre került $DEVICE$ eszközön.", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Megtagadásra került egy bejelentkezési kísérletet egy másik eszközről. Ha valóban mi voltunk, próbáljunk meg újra bejelentkezni az eszközzel." - }, "loginRequestApprovedForEmailOnDevice": { "message": "A bejelentkezési kérelem jóváhagyásra került: $EMAIL$ - $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "A szervezet adat tulajdonjogának érvényesítése" }, + "organizationDataOwnershipDesc": { + "message": "Szükséges, hogy minden elem egy szervezet tulajdonában legyen, megújítva a fiókszintű elemek tárolásának lehetőségét.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Minden elem a szervezet tulajdonába és elmentésre kerül, lehetővé téve az egész szervezetre kiterjedő vezérlést, láthatóságot és jelentést. Ha be van kapcsolva, minden tag számára elérhető egy alapértelmezett gyűjtemény az elemek tárolására. Tudjunk meg többet a kezelésről:", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "hitelesítő életciklus", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Biztosan folytatni szeretnénk?" + }, + "organizationDataOwnershipWarning1": { + "message": "a tagok számára hozzáférhető marad" + }, + "organizationDataOwnershipWarning2": { + "message": "nem lesz automatikusan kiválasztva új elemek létrehozásakor" + }, + "organizationDataOwnershipWarning3": { + "message": "nem kezelhető az Adminisztrációs konzolból, amíg a felhasználó ki nem kerül a rendszerből" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "A házirend kikapcsolásával az alapértelmezett gyűjtemény:" + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Bővebben:", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Személyes tulajdon" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Korlátlan titkos elem és projekt" + }, + "providersubscriptionCanceled": { + "message": "Az előfizetés törlésre került." + }, + "providersubCanceledmessage": { + "message": "Az ismételt feliratkozáshoz lépjünk kapcsolatba a Bitwarden Ügyféltámogatással." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index f4ff6a3ce31..efb113e383a 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Kepemilikan Pribadi" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index c79a4258a0e..9ca29a5cfb5 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Sblocca Bitwarden sul tuo dispositivo o su " }, - "areYouTryingToAccessYourAccount": { - "message": "Stai cercando di accedere al tuo account?" - }, "accessAttemptBy": { "message": "Tentativo di accesso di $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "La richiesta non è più valida." }, - "logInConfirmedForEmailOnDevice": { - "message": "Accesso confermato per $EMAIL$ con $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Hai negato un tentativo di accesso da un altro dispositivo. Se eri davvero tu, prova di nuovo ad accedere con il dispositivo." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Forza la proprietà dei dati dell'organizzazione" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Rimuovi cassaforte individuale" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 317dd8bca3a..b1d976e71f8 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "デバイスまたは" }, - "areYouTryingToAccessYourAccount": { - "message": "アカウントにアクセスしようとしていますか?" - }, "accessAttemptBy": { "message": "$EMAIL$ によるログインの試行", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "このリクエストは無効になりました。" }, - "logInConfirmedForEmailOnDevice": { - "message": "$EMAIL$ に $DEVICE$ でのログインを承認しました", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "別のデバイスからのログイン試行を拒否しました。本当にあなたであった場合は、もう一度デバイスでログインしてみてください。" - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "個別の保管庫を削除" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 1623582257a..f53695494fb 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 24e3fc8075f..a9815b4cabe 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 00dee3d34b8..834cd0411d0 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "ವೈಯಕ್ತಿಕ ಮಾಲೀಕತ್ವ" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 8c79f02bd7d..2eae794d5f0 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "개인 소유권" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 722eef1a68f..b043a3cee57 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Bitwarden jāatslēdz savā ierīcē vai " }, - "areYouTryingToAccessYourAccount": { - "message": "Vai mēģini piekļūt savam kontam?" - }, "accessAttemptBy": { "message": "$EMAIL$ piekļuves mēģinājums", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Šis pieprasījums vairs nav derīgs." }, - "logInConfirmedForEmailOnDevice": { - "message": "$EMAIL$ pieteikšanās apstiprināta ierīcē $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Tu noraidīji pieteikšanās mēģinājumu no citas ierīces. Ja tas tiešām biji Tu, mēģini pieteikties no ierīces vēlreiz!" - }, "loginRequestApprovedForEmailOnDevice": { "message": "$EMAIL$ pieteikšanās pieprasījums apstiprināts $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Uzspiest apvienības datu īpašumtiesības" }, + "organizationDataOwnershipDesc": { + "message": "Visiem vienumiem jāpieder apvienībai, tādējādi noņemot iespēju glabāt tos konta līmenī.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Vai tiešām turpināt?" + }, + "organizationDataOwnershipWarning1": { + "message": "turpinās būt pieejams dalībniekiem" + }, + "organizationDataOwnershipWarning2": { + "message": "netiks automātiski atlasīts, kad tiks izveidoti jauni vienumi" + }, + "organizationDataOwnershipWarning3": { + "message": "nav pārvaldāms pārvaldītāja konsolē, līdz lietotājs ir atstājis apvienību" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Pēc šīs pamatnostādnes izslēgšanas noklusējuma krājums: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Uzzināt vairāk par ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Personīgās īpašumtiesības" }, @@ -9478,7 +9490,7 @@ "message": "Nosūtīt notikum udatus uz savu Logscale instanci" }, "failedToSaveIntegration": { - "message": "Failed to save integration. Please try again later." + "message": "Neizdevās saglabāt iekļaušanu. Lūgums vēlāk mēģināt vēlreiz." }, "deviceIdMissing": { "message": "Trūkst ierīces Id" @@ -9565,10 +9577,10 @@ "message": "URL" }, "bearerToken": { - "message": "Bearer Token" + "message": "Uzrādītāja pilnvara" }, "index": { - "message": "Index" + "message": "Indekss" }, "selectAPlan": { "message": "Atlasīt plānu" @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Neierobežoti noslēpumi un projekti" + }, + "providersubscriptionCanceled": { + "message": "Abonements atcelts" + }, + "providersubCanceledmessage": { + "message": "Lai abonētu no jauna, jāsazināš ar Bitwarden klientu atbalstu." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 49f7e3257ab..9deffcdcc4a 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "വ്യക്തിഗത ഉടമസ്ഥാവകാശം" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index dec7fd66f1e..6ded0deaf02 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 24e3fc8075f..a9815b4cabe 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 65186458868..761081e2c5d 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Denne forespørselen er ikke lenger gyldig." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Personlig eierskap" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 0ee36ae9e06..905bb21fa6a 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 9485b1bb573..8a3ab51f088 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Ontgrendel Bitwarden op je apparaat of op de " }, - "areYouTryingToAccessYourAccount": { - "message": "Probeer je toegang te krijgen tot je account?" - }, "accessAttemptBy": { "message": "Inlogpoging door $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Dit verzoek is niet langer geldig." }, - "logInConfirmedForEmailOnDevice": { - "message": "Inloggen voor $EMAIL$ bevestigd op $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Je hebt een inlogpoging vanaf een ander apparaat geweigerd. Als je dit toch echt zelf was, probeer dan opnieuw in te loggen met het apparaat." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Inloggen voor $EMAIL$ goedgekeurd op $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Gegevenseigendom van organisatie afdwingen" }, + "organizationDataOwnershipDesc": { + "message": "Verplicht dat items eigendom zijn van een organisatie, dit verwijdert de mogelijkheid van het opslaan van items op accountniveau.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Alle items worden eigendom en opgeslagen bij de organisatie, wat organisatiebrede controle, zichtbaarheid en rapportage mogelijk maakt. Bij inschakelen is er een standaardcollectie beschikbaar voor elk lid voor het opslaan van items. Meer informatie over het beheren van de ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "levenscyclus van inloggegevens", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Weet je zeker dat je wilt doorgaan?" + }, + "organizationDataOwnershipWarning1": { + "message": "beschikbaar voor leden" + }, + "organizationDataOwnershipWarning2": { + "message": "niet automatisch geselecteerd bij het maken van nieuwe items" + }, + "organizationDataOwnershipWarning3": { + "message": "niet beheerd vanuit de beheerdersconsole totdat de gebruiker is verwijderd" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Met het uitschakelen van dit beleid, wordt de standaardcollectie: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Leer meer over de ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Persoonlijk eigendom" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Onbeperkte geheimen en projecten" + }, + "providersubscriptionCanceled": { + "message": "Abonnement opgezegd" + }, + "providersubCanceledmessage": { + "message": "Neem contact op met Bitwarden Customer Support om je opnieuw te abonneren." + }, + "showMore": { + "message": "Meer weergeven" + }, + "showLess": { + "message": "Minder weergeven" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index c8b4abb158f..a38a81e2fa7 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 24e3fc8075f..a9815b4cabe 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index bc4775d9545..8cda445dd90 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" }, - "areYouTryingToAccessYourAccount": { - "message": "Czy próbujesz uzyskać dostęp do swojego konta?" - }, "accessAttemptBy": { "message": "Próba dostępu przez $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "To żądanie jest już nieważne." }, - "logInConfirmedForEmailOnDevice": { - "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odrzucono próby logowania z innego urządzenia. Jeśli to naprawdę Ty, spróbuj ponownie zalogować się za pomocą urządzenia." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Wymuś własność danych organizacji" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Własność osobista" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Nieograniczone sekrety i projekty" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 80fbce621eb..8d5d1ca0334 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Desbloqueie o Bitwarden no seu dispositivo ou na " }, - "areYouTryingToAccessYourAccount": { - "message": "Você está tentando acessar sua conta?" - }, "accessAttemptBy": { "message": "Tentativa de acesso por $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido não é mais válido." }, - "logInConfirmedForEmailOnDevice": { - "message": "Acesso confirmado para $EMAIL$ no $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Você negou uma tentativa de acesso de outro dispositivo. Se isso realmente foi você, tente fazer login com o dispositivo novamente." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Propriedade Pessoal" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 7f9b240a74e..f114abd7fcf 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Desbloqueie o Bitwarden no seu dispositivo ou no " }, - "areYouTryingToAccessYourAccount": { - "message": "Está a tentar aceder à sua conta?" - }, "accessAttemptBy": { "message": "Tentativa de acesso por $EMAIL$", "placeholders": { @@ -3509,7 +3506,7 @@ "message": "Cofre web" }, "webApp": { - "message": "Web app" + "message": "Aplicação web" }, "cli": { "message": "CLI" @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Este pedido já não é válido." }, - "logInConfirmedForEmailOnDevice": { - "message": "Início de sessão confirmado para $EMAIL$ no $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Recusou uma tentativa de início de sessão de outro dispositivo. Se foi realmente o caso, tente iniciar sessão com o dispositivo novamente." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Pedido de início de sessão aprovado para $EMAIL$ no $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Reforçar a propriedade dos dados da organização" }, + "organizationDataOwnershipDesc": { + "message": "Exigir que todos os itens sejam propriedade de uma organização, removendo a opção de armazenar itens ao nível da conta.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Todos os itens pertencerão e serão guardados na organização, permitindo controlos, visibilidade e relatórios para toda a organização. Quando ativada, estará disponível uma coleção predefinida para cada membro armazenar itens. Saiba mais sobre como gerir o ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "ciclo de vida das credenciais", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Tens a certeza de que queres continuar?" + }, + "organizationDataOwnershipWarning1": { + "message": "continuará a ser acessível aos membros" + }, + "organizationDataOwnershipWarning2": { + "message": "não será selecionado automaticamente ao criar novos itens" + }, + "organizationDataOwnershipWarning3": { + "message": "não pode ser gerido a partir da Consola de administração até que o utilizador seja transferido para o exterior" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Ao desativar esta política, a coleção predefinida: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Saiba mais sobre o ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remover cofre pessoal" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Segredos e projetos ilimitados" + }, + "providersubscriptionCanceled": { + "message": "Subscrição cancelada" + }, + "providersubCanceledmessage": { + "message": "Para voltar a subscrever, contacte o Apoio ao cliente do Bitwarden." + }, + "showMore": { + "message": "Mostrar mais" + }, + "showLess": { + "message": "Mostrar menos" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 44f4ac5a26b..df17d756e1a 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Înlăturați seiful personal" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 9b490c4a761..15f44e30474 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Разблокируйте Bitwarden на своем устройстве или " }, - "areYouTryingToAccessYourAccount": { - "message": "Вы пытаетесь получить доступ к своему аккаунту?" - }, "accessAttemptBy": { "message": "Попытка доступа $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Этот запрос больше не действителен." }, - "logInConfirmedForEmailOnDevice": { - "message": "Вход подтвержден для $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Вы отклонили попытку авторизации с другого устройства. Если это действительно были вы, попробуйте авторизоваться с этого устройства еще раз." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Запрос входа для $EMAIL$ на $DEVICE$ одобрен", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Принудительное соблюдение прав собственности на данные организации" }, + "organizationDataOwnershipDesc": { + "message": "Необходимо, чтобы все элементы принадлежали организации, что исключает возможность их хранения на уровне аккаунта.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Все элементы будут принадлежать организации и сохраняться в ней, что позволит осуществлять контроль, видимость и отчетность в масштабах всей организации. При включении для каждого участника будет доступна коллекция по умолчанию для хранения элементов. Узнайте больше об управлении ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "жизненным циклом учетных данных", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Вы уверены, что хотите продолжить?" + }, + "organizationDataOwnershipWarning1": { + "message": "будет оставаться доступным для участников" + }, + "organizationDataOwnershipWarning2": { + "message": "не будет автоматически выбираться при создании новых элементов" + }, + "organizationDataOwnershipWarning3": { + "message": "невозможно управлять из консоли администратора до тех пор, пока пользователь не будет удален" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "При отключении этой политики коллекция по умолчанию: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Узнайте больше о ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Удалить личное хранилище" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Неограниченные секреты и проекты" + }, + "providersubscriptionCanceled": { + "message": "Подписка отменена" + }, + "providersubCanceledmessage": { + "message": "Чтобы повторно оформить подписку, обратитесь в службу поддержки Bitwarden." + }, + "showMore": { + "message": "Больше" + }, + "showLess": { + "message": "Меньше" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index be2aeaf3a65..28af6e7d7fc 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index e43d2c30be4..327e6dabfe0 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Odomknúť Bitwarden vo svojom zariadení alebo vo " }, - "areYouTryingToAccessYourAccount": { - "message": "Snažíte sa získať prístup k svojmu účtu?" - }, "accessAttemptBy": { "message": "Pokus o prístup z $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Táto žiadosť už nie je platná." }, - "logInConfirmedForEmailOnDevice": { - "message": "Potvrdené prihlásenie pomocou $EMAIL$ na $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Odmietli ste pokus o prihlásenie z iného zariadenia. Ak ste to boli naozaj vy, skúste sa prihlásiť pomocou zariadenia znova." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Potvrdené prihlásenie pre $EMAIL$ na $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Požadovanie vlastníctva údajov organizácie" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Zakázať osobný trezor" }, @@ -9478,7 +9490,7 @@ "message": "Pošlite dáta z denníka udalostí do vašej inštancie Logscale" }, "failedToSaveIntegration": { - "message": "Failed to save integration. Please try again later." + "message": "Nepodarilo sa uložiť integráciu. Prosím skúste to neskôr." }, "deviceIdMissing": { "message": "Chýba ID zariadenia" @@ -9565,7 +9577,7 @@ "message": "URL" }, "bearerToken": { - "message": "Bearer Token" + "message": "Token nositeľa" }, "index": { "message": "Index" @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Neobmedzený počet položiek a projektov" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index f4646e04244..e1f7410763e 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index f370c3e61ec..d63ab19fa07 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index cab47f2de3b..56d526048a1 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Откључај Bitwarden на твом уређају или на " }, - "areYouTryingToAccessYourAccount": { - "message": "Да ли покушавате да приступите вашем налогу?" - }, "accessAttemptBy": { "message": "Покушај приступа са $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Овај захтев више није важећи." }, - "logInConfirmedForEmailOnDevice": { - "message": "Пријава потврђена за $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Одбили сте покушај пријаве са другог уређаја. Ако сте то заиста били ви, покушајте поново да се пријавите помоћу уређаја." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Захтев за пријаву одобрен за $EMAIL$ на $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Спровести власништво података о организацији" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Лично власништво" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Неограничене тајне и пројекте" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 1a580776494..11ea087ee12 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Lås upp Bitwarden på din enhet eller på " }, - "areYouTryingToAccessYourAccount": { - "message": "Försöker du komma åt ditt konto?" - }, "accessAttemptBy": { "message": "Åtkomstförsök via $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Denna begäran är inte längre giltig." }, - "logInConfirmedForEmailOnDevice": { - "message": "Inloggning bekräftad för $EMAIL$ på $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Du nekade ett inloggningsförsök från en annan enhet. Om detta verkligen var du, försök att logga in med enheten igen." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Inloggningsbegäran godkänd för $EMAIL$ på $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Genomför äganderätt till organisationsdata" }, + "organizationDataOwnershipDesc": { + "message": "Kräv att alla objekt ägs av en organisation och ta bort möjligheten att lagra objekt på kontonivå.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Alla objekt kommer att ägas och sparas i organisationen, vilket möjliggör kontroll, synlighet och rapportering för hela organisationen. När funktionen är aktiverad finns en standardsamling tillgänglig för varje medlem att lagra objekt i. Läs mer om hur du hanterar ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Är du säker på att du vill fortsätta?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Läs mer om ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Radera individuellt valv" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Obegränsade hemligheter och projekt" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 24e3fc8075f..a9815b4cabe 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index a9a386b350d..8b7702d7611 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Remove individual vault" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index e0ca6a42826..1fb0d56b480 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Hesabınıza erişmeye mi çalışıyorsunuz?" - }, "accessAttemptBy": { "message": "$EMAIL$ erişim denemesi", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Bu istek artık geçerli değil." }, - "logInConfirmedForEmailOnDevice": { - "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Başka bir cihazdan giriş isteğini reddettiniz. Yanlışlıkla yaptıysanız aynı cihazdan yeniden giriş yapmayı deneyin." - }, "loginRequestApprovedForEmailOnDevice": { "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "kullanıcı kapalı oluncaya kadar yönetici arayüzünden yönetilemez" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Kişisel kasayı kaldır" }, @@ -9475,7 +9487,7 @@ "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, "crowdstrikeEventIntegrationDesc": { - "message": "Send event data to your Logscale instance" + "message": "Etkinlik verilerini Logscale'e gönderin" }, "failedToSaveIntegration": { "message": "Failed to save integration. Please try again later." @@ -9595,7 +9607,7 @@ "message": "Erişim yok" }, "collectionAdminConsoleManaged": { - "message": "This collection is only accessible from the admin console" + "message": "Bu derlem yalnızca yönetici arayüzünden erişilebilir" }, "organizationOptionsMenu": { "message": "Toggle Organization Menu" @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Abonelik iptal edildi" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Daha fazla göster" + }, + "showLess": { + "message": "Daha az göster" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 8276161df98..8cbd33a5b02 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -569,7 +569,7 @@ "message": "Скасувати" }, "later": { - "message": "Later" + "message": "Пізніше" }, "canceled": { "message": "Скасовано" @@ -630,7 +630,7 @@ "message": "Пошук в групах" }, "resetSearch": { - "message": "Reset search" + "message": "Скинути пошук" }, "allItems": { "message": "Усі записи" @@ -654,7 +654,7 @@ "message": "Захищена нотатка" }, "typeNote": { - "message": "Note" + "message": "Нотатка" }, "typeSshKey": { "message": "Ключ SSH" @@ -871,10 +871,10 @@ "message": "Копіювати ім'я" }, "cardNumber": { - "message": "card number" + "message": "номер картки" }, "copyFieldCipherName": { - "message": "Copy $FIELD$, $CIPHERNAME$", + "message": "Копіювати $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Розблокуйте Bitwarden на своєму пристрої або у " }, - "areYouTryingToAccessYourAccount": { - "message": "Ви намагаєтесь отримати доступ до свого облікового запису?" - }, "accessAttemptBy": { "message": "Спроба доступу з $EMAIL$", "placeholders": { @@ -3509,7 +3506,7 @@ "message": "Вебсховище" }, "webApp": { - "message": "Web app" + "message": "Вебпрограма" }, "cli": { "message": "CLI" @@ -3977,24 +3974,8 @@ "thisRequestIsNoLongerValid": { "message": "Цей запит більше недійсний." }, - "logInConfirmedForEmailOnDevice": { - "message": "Підтверджено вхід для $EMAIL$ на $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Ви відхилили спробу входу з іншого пристрою. Якщо це були дійсно ви, спробуйте ввійти з пристроєм знову." - }, "loginRequestApprovedForEmailOnDevice": { - "message": "Login request approved for $EMAIL$ on $DEVICE$", + "message": "Запит входу підтверджено для $EMAIL$ на $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -4154,7 +4135,7 @@ "message": "Переглянути запит входу" }, "loginRequest": { - "message": "Login request" + "message": "Запит входу" }, "freeTrialEndPromptCount": { "message": "Ваш безплатний пробний період завершується через $COUNT$ днів.", @@ -4633,7 +4614,7 @@ "message": "Отримуйте поради, оголошення та можливості дослідження від Bitwarden у своїй поштовій скриньці." }, "subscribe": { - "message": "Subscribe" + "message": "Передплатити" }, "unsubscribe": { "message": "Відписатися" @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Примусове володіння даними організації" }, + "organizationDataOwnershipDesc": { + "message": "Вимагати, щоб усіма записами володіла організація, вилучивши функцію збереження на рівні облікового запису.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "Усі записи зберігатимуться в організації та належатимуть їй, забезпечуючи керування, доступність і звітування на рівні організації. Якщо ввімкнути цю функцію, кожен учасник зможе зберігати записи в типовій збірці. Докладніше про ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "життєвий цикл облікових даних", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Ви дійсно хочете продовжити?" + }, + "organizationDataOwnershipWarning1": { + "message": "залишиться доступною учасникам" + }, + "organizationDataOwnershipWarning2": { + "message": "не вибиратиметься автоматично під час створення нових записів" + }, + "organizationDataOwnershipWarning3": { + "message": "недоступна для керування в консолі адміністрування, доки не вилучити користувача" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "Вимкнувши цю політику, типова збірка: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Докладніше про ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Вилучити особисте сховище" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 6d2b0902643..5ca53c9396f 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Mở khóa Bitwarden trên thiết bị của bạn hoặc trên " }, - "areYouTryingToAccessYourAccount": { - "message": "Bạn đang cố gắng truy cập tài khoản của mình?" - }, "accessAttemptBy": { "message": "Cố gắng truy cập bởi $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "Yêu cầu này không còn hiệu lực." }, - "logInConfirmedForEmailOnDevice": { - "message": "Đã xác nhận đăng nhập cho $EMAIL$ trên $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "Bạn đã từ chối một lần đăng nhập từ thiết bị khác. Nếu thực sự là bạn, hãy thử đăng nhập lại bằng thiết bị đó." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Thực thi quyền sở hữu dữ liệu của tổ chức" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "Xóa kho lưu trữ riêng lẻ" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 5a61a42212a..d0e54c289e5 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "解锁您设备上的 Bitwarden 或通过" }, - "areYouTryingToAccessYourAccount": { - "message": "您正在尝试访问您的账户吗?" - }, "accessAttemptBy": { "message": "$EMAIL$ 的访问尝试", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "此请求已失效。" }, - "logInConfirmedForEmailOnDevice": { - "message": "已确认 $EMAIL$ 在 $DEVICE$ 上的登录", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "您拒绝了一个来自其他设备的登录尝试。若确实是您本人,请尝试再次发起设备登录。" - }, "loginRequestApprovedForEmailOnDevice": { "message": "已批准 $EMAIL$ 在 $DEVICE$ 上的登录请求", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "强制组织数据所有权" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "禁用个人密码库" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "不限数量的机密和工程" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index e74ac10fc47..2b61c4322ed 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -1428,9 +1428,6 @@ "notificationSentDevicePart1": { "message": "Unlock Bitwarden on your device or on the " }, - "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" - }, "accessAttemptBy": { "message": "Access attempt by $EMAIL$", "placeholders": { @@ -3977,22 +3974,6 @@ "thisRequestIsNoLongerValid": { "message": "This request is no longer valid." }, - "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", - "placeholders": { - "email": { - "content": "$1", - "example": "name@example.com" - }, - "device": { - "content": "$2", - "example": "iOS" - } - } - }, - "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." - }, "loginRequestApprovedForEmailOnDevice": { "message": "Login request approved for $EMAIL$ on $DEVICE$", "placeholders": { @@ -5444,6 +5425,37 @@ "organizationDataOwnership": { "message": "Enforce organization data ownership" }, + "organizationDataOwnershipDesc": { + "message": "Require all items to be owned by an organization, removing the option to store items at the account level.", + "description": "This is the policy description shown in the policy list." + }, + "organizationDataOwnershipContent": { + "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection be available for each member to store items. Learn more about managing the credential lifecycle.'" + }, + "organizationDataOwnershipContentAnchor": { + "message": "credential lifecycle", + "description": "This will be used as a hyperlink" + }, + "organizationDataOwnershipWarningTitle": { + "message": "Are you sure you want to proceed?" + }, + "organizationDataOwnershipWarning1": { + "message": "will remain accessible to members" + }, + "organizationDataOwnershipWarning2": { + "message": "will not be automatically selected when creating new items" + }, + "organizationDataOwnershipWarning3": { + "message": "cannot be managed from the Admin Console until the user is offboarded" + }, + "organizationDataOwnershipWarningContentTop": { + "message": "By turning this policy off, the default collection: " + }, + "organizationDataOwnershipWarningContentBottom": { + "message": "Learn more about the ", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" + }, "personalOwnership": { "message": "停用個人密碼庫" }, @@ -10980,5 +10992,17 @@ }, "unlimitedSecretsAndProjects": { "message": "Unlimited secrets and projects" + }, + "providersubscriptionCanceled": { + "message": "Subscription canceled" + }, + "providersubCanceledmessage": { + "message": "To resubscribe, contact Bitwarden Customer Support." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } -} \ No newline at end of file +} From d3c6ba9f4b442b5a42cd5e83a51125e89c159cf6 Mon Sep 17 00:00:00 2001 From: Patrick Lenihan <83040764+Game4Move78@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:58:47 +0100 Subject: [PATCH 18/50] [PM-20220] feat: Add support for fd and unix socket bindings (#14262) * Add support for unix sockets with (unix://) scheme * Add support for listening socket FD (fd+listening:// scheme) * Add support for connected socket FD (fd+connected:// scheme) --------- Co-authored-by: Addison Beck --- apps/cli/src/commands/serve.command.ts | 33 ++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/apps/cli/src/commands/serve.command.ts b/apps/cli/src/commands/serve.command.ts index 801f505f1ae..c0ec37d3c9c 100644 --- a/apps/cli/src/commands/serve.command.ts +++ b/apps/cli/src/commands/serve.command.ts @@ -1,3 +1,6 @@ +import http from "node:http"; +import net from "node:net"; + import * as koaRouter from "@koa/router"; import { OptionValues } from "commander"; import * as koa from "koa"; @@ -50,11 +53,33 @@ export class ServeCommand { this.serveConfigurator.configureRouter(router); - server - .use(router.routes()) - .use(router.allowedMethods()) - .listen(port, hostname === "all" ? null : hostname, () => { + server.use(router.routes()).use(router.allowedMethods()); + + if (hostname.startsWith("fd+connected://")) { + const fd = parseInt(hostname.slice("fd+connected://".length)); + const httpServer = http.createServer(server.callback()); + const socket = new net.Socket({ fd: fd, readable: true, writable: true }); + // allow idle sockets, incomplete handshakes and slow requests + httpServer.keepAliveTimeout = 0; + httpServer.headersTimeout = 0; + httpServer.timeout = 0; + socket.pause(); + httpServer.emit("connection", socket); + socket.resume(); // Let the HTTP parser start reading + } else if (hostname.startsWith("fd+listening://")) { + const fd = parseInt(hostname.slice("fd+listening://".length)); + server.listen({ fd }, () => { + this.serviceContainer.logService.info("Listening on " + hostname); + }); + } else if (hostname.startsWith("unix://")) { + const socketPath = hostname.slice("unix://".length); + server.listen(socketPath, () => { + this.serviceContainer.logService.info("Listening on " + hostname); + }); + } else { + server.listen(port, hostname === "all" ? null : hostname, () => { this.serviceContainer.logService.info("Listening on " + hostname + ":" + port); }); + } } } From af12e376f72805e0b8324215506ee7856f751577 Mon Sep 17 00:00:00 2001 From: Bryan Cunningham Date: Mon, 11 Aug 2025 11:33:09 -0400 Subject: [PATCH 19/50] [CL-725] dialog adjustments (#15660) * update dialog spacing/borders * update scroll bottom threshold * add shadow to dialog * adjust simple dialog shadow * update scroll util comment * add background input to other dialog stories * assign initial value to isScrollable * add larger padding on alt background content * update tab border color * update tab content padding * update tab content spacing * revert tab border color change * bring back tab border color changes * update web header border to match new tab border * add background to props in story --- .../layouts/header/web-header.component.html | 2 +- .../src/dialog/dialog/dialog.component.html | 22 +++++++++---------- .../src/dialog/dialog/dialog.component.ts | 22 +++++++++++++++++-- .../src/dialog/dialog/dialog.stories.ts | 14 +++++++++--- .../simple-dialog.component.html | 2 +- .../src/tabs/shared/tab-header.component.ts | 2 +- .../tabs/shared/tab-list-item.directive.ts | 2 +- .../tabs/tab-group/tab-group.component.html | 2 +- .../components/src/utils/has-scrolled-from.ts | 3 ++- 9 files changed, 49 insertions(+), 22 deletions(-) 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 4b0da4ae569..2f0d39c7b6c 100644 --- a/apps/web/src/app/layouts/header/web-header.component.html +++ b/apps/web/src/app/layouts/header/web-header.component.html @@ -2,7 +2,7 @@ *ngIf="routeData$ | async as routeData" class="-tw-m-6 tw-mb-3 tw-flex tw-flex-col tw-p-6" [ngClass]="{ - 'tw-border-0 tw-border-b tw-border-solid tw-border-secondary-300 tw-bg-background-alt tw-pb-0': + 'tw-border-0 tw-border-b tw-border-solid tw-border-secondary-100 tw-bg-background-alt tw-pb-0': tabsContainer.childElementCount !== 0, }" > diff --git a/libs/components/src/dialog/dialog/dialog.component.html b/libs/components/src/dialog/dialog/dialog.component.html index 5ae5a9b60e8..94fc9ef06a0 100644 --- a/libs/components/src/dialog/dialog/dialog.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -1,18 +1,18 @@ @let isDrawer = dialogRef?.isDrawer;
    - @let showHeaderBorder = !isDrawer || background() === "alt" || bodyHasScrolledFrom().top; + @let showHeaderBorder = bodyHasScrolledFrom().top;
    @@ -59,25 +59,25 @@
    - @let showFooterBorder = !isDrawer || background() === "alt" || bodyHasScrolledFrom().bottom; + @let showFooterBorder = + (!bodyHasScrolledFrom().top && isScrollable) || bodyHasScrolledFrom().bottom;