diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 96e16776545..ca57ccf4f86 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -154,7 +154,6 @@ "@types/glob", "@types/lowdb", "@types/node", - "@types/node-forge", "@types/node-ipc", "@yao-pkg/pkg", "anyhow", @@ -192,7 +191,6 @@ "napi", "napi-build", "napi-derive", - "node-forge", "node-ipc", "nx", "oo7", @@ -415,14 +413,16 @@ }, { matchPackageNames: [ + "@types/node-forge", "aes", "big-integer", "cbc", + "linux-keyutils", + "memsec", + "node-forge", "rsa", "russh-cryptovec", "sha2", - "memsec", - "linux-keyutils", ], description: "Key Management owned dependencies", commitMessagePrefix: "[deps] KM:", diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 09ea964823c..2ace8ff8b96 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -436,8 +436,8 @@ "sync": { "message": "Sync" }, - "syncVaultNow": { - "message": "Sync vault now" + "syncNow": { + "message": "Sync now" }, "lastSync": { "message": "Last sync:" @@ -455,9 +455,6 @@ "bitWebVaultApp": { "message": "Bitwarden web app" }, - "importItems": { - "message": "Import items" - }, "select": { "message": "Select" }, @@ -1325,8 +1322,11 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" + "export": { + "message": "Export" + }, + "import": { + "message": "Import" }, "fileFormat": { "message": "File format" @@ -4215,10 +4215,6 @@ "ignore": { "message": "Ignore" }, - "importData": { - "message": "Import data", - "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" - }, "importError": { "message": "Import error" }, @@ -4805,6 +4801,15 @@ "accountSecurity": { "message": "Account security" }, + "phishingBlocker": { + "message": "Phishing Blocker" + }, + "enablePhishingDetection": { + "message": "Phishing detection" + }, + "enablePhishingDetectionDesc": { + "message": "Display warning before accessing suspected phishing sites" + }, "notifications": { "message": "Notifications" }, diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts index 4bacd453803..f3be535f00e 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -15,6 +15,7 @@ import { } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { AccountSwitcherService } from "./account-switcher.service"; @@ -71,11 +72,10 @@ describe("AccountSwitcherService", () => { describe("availableAccounts$", () => { it("should return all logged in accounts and an add account option when accounts are less than 5", async () => { - const accountInfo: AccountInfo = { + const accountInfo = mockAccountInfoWith({ name: "Test User 1", email: "test1@email.com", - emailVerified: true, - }; + }); avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); accountsSubject.next({ ["1" as UserId]: accountInfo, ["2" as UserId]: accountInfo }); @@ -109,11 +109,10 @@ describe("AccountSwitcherService", () => { const seedAccounts: Record = {}; const seedStatuses: Record = {}; for (let i = 0; i < numberOfAccounts; i++) { - seedAccounts[`${i}` as UserId] = { + seedAccounts[`${i}` as UserId] = mockAccountInfoWith({ email: `test${i}@email.com`, - emailVerified: true, name: "Test User ${i}", - }; + }); seedStatuses[`${i}` as UserId] = AuthenticationStatus.Unlocked; } avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); @@ -133,11 +132,10 @@ describe("AccountSwitcherService", () => { ); it("excludes logged out accounts", async () => { - const user1AccountInfo: AccountInfo = { + const user1AccountInfo = mockAccountInfoWith({ name: "Test User 1", email: "", - emailVerified: true, - }; + }); accountsSubject.next({ ["1" as UserId]: user1AccountInfo }); authStatusSubject.next({ ["1" as UserId]: AuthenticationStatus.LoggedOut }); accountsSubject.next({ diff --git a/apps/browser/src/auth/popup/settings/account-security.component.html b/apps/browser/src/auth/popup/settings/account-security.component.html index b5d725b4a82..bb6b141c6c5 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.html +++ b/apps/browser/src/auth/popup/settings/account-security.component.html @@ -128,6 +128,20 @@ + + +

{{ "phishingBlocker" | i18n }}

+
+ + + {{ + "enablePhishingDetection" | i18n + }} + {{ "enablePhishingDetectionDesc" | i18n }} + + +
+

{{ "otherOptions" | i18n }}

diff --git a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts index d0ab4793301..0f799fe7d4d 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts @@ -3,9 +3,10 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { ActivatedRoute } from "@angular/router"; import { mock } from "jest-mock-extended"; -import { firstValueFrom, of } from "rxjs"; +import { firstValueFrom, of, BehaviorSubject } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; +import { NudgesService } from "@bitwarden/angular/vault"; import { LockService } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; @@ -14,12 +15,15 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeoutSettingsService, VaultTimeoutStringType, VaultTimeoutAction, } from "@bitwarden/common/key-management/vault-timeout"; +import { ProfileResponse } from "@bitwarden/common/models/response/profile.response"; 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"; @@ -27,12 +31,12 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { MessageSender } from "@bitwarden/common/platform/messaging"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider } from "@bitwarden/common/platform/state"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { DialogService, ToastService } from "@bitwarden/components"; +import { newGuid } from "@bitwarden/guid"; import { BiometricStateService, BiometricsService, KeyService } from "@bitwarden/key-management"; import { BrowserApi } from "../../../platform/browser/browser-api"; @@ -54,18 +58,27 @@ describe("AccountSecurityComponent", () => { let component: AccountSecurityComponent; let fixture: ComponentFixture; - const mockUserId = Utils.newGuid() as UserId; + const mockUserId = newGuid() as UserId; + const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); - const vaultTimeoutSettingsService = mock(); + const apiService = mock(); + const billingService = mock(); const biometricStateService = mock(); - const policyService = mock(); - const pinServiceAbstraction = mock(); - const keyService = mock(); - const validationService = mock(); - const dialogService = mock(); - const platformUtilsService = mock(); - const lockService = mock(); const configService = mock(); + const dialogService = mock(); + const keyService = mock(); + const lockService = mock(); + const policyService = mock(); + const phishingDetectionSettingsService = mock(); + const pinServiceAbstraction = mock(); + const platformUtilsService = mock(); + const validationService = mock(); + const vaultNudgesService = mock(); + const vaultTimeoutSettingsService = mock(); + + // Mock subjects to control the phishing detection observables + let phishingAvailableSubject: BehaviorSubject; + let phishingEnabledSubject: BehaviorSubject; beforeEach(async () => { await TestBed.configureTestingModule({ @@ -73,29 +86,38 @@ describe("AccountSecurityComponent", () => { { provide: AccountService, useValue: accountService }, { provide: AccountSecurityComponent, useValue: mock() }, { provide: ActivatedRoute, useValue: mock() }, + { provide: ApiService, useValue: apiService }, + { + provide: BillingAccountProfileStateService, + useValue: billingService, + }, { provide: BiometricsService, useValue: mock() }, { provide: BiometricStateService, useValue: biometricStateService }, + { provide: CipherService, useValue: mock() }, + { provide: CollectionService, useValue: mock() }, + { provide: ConfigService, useValue: configService }, { provide: DialogService, useValue: dialogService }, { provide: EnvironmentService, useValue: mock() }, { provide: I18nService, useValue: mock() }, - { provide: MessageSender, useValue: mock() }, { provide: KeyService, useValue: keyService }, + { provide: LockService, useValue: lockService }, + { provide: LogService, useValue: mock() }, + { provide: MessageSender, useValue: mock() }, + { provide: NudgesService, useValue: vaultNudgesService }, + { provide: OrganizationService, useValue: mock() }, { provide: PinServiceAbstraction, useValue: pinServiceAbstraction }, + { + provide: PhishingDetectionSettingsServiceAbstraction, + useValue: phishingDetectionSettingsService, + }, { provide: PlatformUtilsService, useValue: platformUtilsService }, { provide: PolicyService, useValue: policyService }, { provide: PopupRouterCacheService, useValue: mock() }, + { provide: StateProvider, useValue: mock() }, { provide: ToastService, useValue: mock() }, { provide: UserVerificationService, useValue: mock() }, - { provide: VaultTimeoutSettingsService, useValue: vaultTimeoutSettingsService }, - { provide: StateProvider, useValue: mock() }, - { provide: CipherService, useValue: mock() }, - { provide: ApiService, useValue: mock() }, - { provide: LogService, useValue: mock() }, - { provide: OrganizationService, useValue: mock() }, - { provide: CollectionService, useValue: mock() }, { provide: ValidationService, useValue: validationService }, - { provide: LockService, useValue: lockService }, - { provide: ConfigService, useValue: configService }, + { provide: VaultTimeoutSettingsService, useValue: vaultTimeoutSettingsService }, ], }) .overrideComponent(AccountSecurityComponent, { @@ -110,10 +132,13 @@ describe("AccountSecurityComponent", () => { }) .compileComponents(); - fixture = TestBed.createComponent(AccountSecurityComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - + apiService.getProfile.mockResolvedValue( + mock({ + id: mockUserId, + creationDate: new Date().toISOString(), + }), + ); + vaultNudgesService.showNudgeSpotlight$.mockReturnValue(of(false)); vaultTimeoutSettingsService.getVaultTimeoutByUserId$.mockReturnValue( of(VaultTimeoutStringType.OnLocked), ); @@ -123,8 +148,25 @@ describe("AccountSecurityComponent", () => { vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$.mockReturnValue( of(VaultTimeoutAction.Lock), ); + vaultTimeoutSettingsService.availableVaultTimeoutActions$.mockReturnValue(of([])); biometricStateService.promptAutomatically$ = of(false); pinServiceAbstraction.isPinSet.mockResolvedValue(false); + configService.getFeatureFlag$.mockReturnValue(of(false)); + billingService.hasPremiumPersonally$.mockReturnValue(of(true)); + + policyService.policiesByType$.mockReturnValue(of([null])); + + // Mock readonly observables for phishing detection using BehaviorSubjects so + // tests can push different values after component creation. + phishingAvailableSubject = new BehaviorSubject(true); + phishingEnabledSubject = new BehaviorSubject(true); + + (phishingDetectionSettingsService.available$ as any) = phishingAvailableSubject.asObservable(); + (phishingDetectionSettingsService.enabled$ as any) = phishingEnabledSubject.asObservable(); + + fixture = TestBed.createComponent(AccountSecurityComponent); + component = fixture.componentInstance; + fixture.detectChanges(); }); afterEach(() => { @@ -233,6 +275,59 @@ describe("AccountSecurityComponent", () => { expect(pinInputElement).toBeNull(); }); + describe("phishing detection UI and setting", () => { + it("updates phishing detection setting when form value changes", async () => { + policyService.policiesByType$.mockReturnValue(of([null])); + + phishingAvailableSubject.next(true); + phishingEnabledSubject.next(true); + + // Init component + await component.ngOnInit(); + fixture.detectChanges(); + + // Initial form value should match enabled$ observable defaulting to true + expect(component.form.controls.enablePhishingDetection.value).toBe(true); + + // Change the form value to false + component.form.controls.enablePhishingDetection.setValue(false); + fixture.detectChanges(); + // Wait briefly to allow any debounced or async valueChanges handlers to run + // fixture.whenStable() does not work here + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(phishingDetectionSettingsService.setEnabled).toHaveBeenCalledWith(mockUserId, false); + }); + + it("shows phishing detection element when available$ is true", async () => { + policyService.policiesByType$.mockReturnValue(of([null])); + phishingAvailableSubject.next(true); + phishingEnabledSubject.next(true); + + await component.ngOnInit(); + fixture.detectChanges(); + + const phishingDetectionElement = fixture.debugElement.query( + By.css("#phishingDetectionAction"), + ); + expect(phishingDetectionElement).not.toBeNull(); + }); + + it("hides phishing detection element when available$ is false", async () => { + policyService.policiesByType$.mockReturnValue(of([null])); + phishingAvailableSubject.next(false); + phishingEnabledSubject.next(true); + + await component.ngOnInit(); + fixture.detectChanges(); + + const phishingDetectionElement = fixture.debugElement.query( + By.css("#phishingDetectionAction"), + ); + expect(phishingDetectionElement).toBeNull(); + }); + }); + describe("updateBiometric", () => { let browserApiSpy: jest.SpyInstance; diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 4ff29c8853e..7c36754c894 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -32,6 +32,7 @@ import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/ import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { @@ -62,6 +63,7 @@ import { SelectModule, TypographyModule, ToastService, + SwitchComponent, } from "@bitwarden/components"; import { KeyService, @@ -110,6 +112,7 @@ import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; SpotlightComponent, TypographyModule, SessionTimeoutInputLegacyComponent, + SwitchComponent, ], }) export class AccountSecurityComponent implements OnInit, OnDestroy { @@ -130,6 +133,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { pinLockWithMasterPassword: false, biometric: false, enableAutoBiometricsPrompt: true, + enablePhishingDetection: true, }); protected showAccountSecurityNudge$: Observable = @@ -141,6 +145,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { ); protected readonly consolidatedSessionTimeoutComponent$: Observable; + protected readonly phishingDetectionAvailable$: Observable; protected refreshTimeoutSettings$ = new BehaviorSubject(undefined); private destroy$ = new Subject(); @@ -167,10 +172,14 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { private vaultNudgesService: NudgesService, private validationService: ValidationService, private logService: LogService, + private phishingDetectionSettingsService: PhishingDetectionSettingsServiceAbstraction, ) { this.consolidatedSessionTimeoutComponent$ = this.configService.getFeatureFlag$( FeatureFlag.ConsolidatedSessionTimeoutComponent, ); + + // Check if user phishing detection available + this.phishingDetectionAvailable$ = this.phishingDetectionSettingsService.available$; } async ngOnInit() { @@ -251,6 +260,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { enableAutoBiometricsPrompt: await firstValueFrom( this.biometricStateService.promptAutomatically$, ), + enablePhishingDetection: await firstValueFrom(this.phishingDetectionSettingsService.enabled$), }; this.form.patchValue(initialValues, { emitEvent: false }); @@ -361,6 +371,16 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { ) .subscribe(); + this.form.controls.enablePhishingDetection.valueChanges + .pipe( + concatMap(async (enabled) => { + const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.phishingDetectionSettingsService.setEnabled(userId, enabled); + }), + takeUntil(this.destroy$), + ) + .subscribe(); + this.refreshTimeoutSettings$ .pipe( switchMap(() => diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 8df21bc66ef..ab16788ea6f 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, firstValueFrom, of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { ExtensionCommand } from "@bitwarden/common/autofill/constants"; @@ -17,6 +17,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { ThemeTypes } from "@bitwarden/common/platform/enums"; import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -80,11 +81,12 @@ describe("NotificationBackground", () => { const organizationService = mock(); const userId = "testId" as UserId; - const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ + const activeAccountSubject = new BehaviorSubject({ id: userId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(() => { diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts index 1348928b7e9..1738485f289 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts @@ -18,6 +18,7 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; @@ -123,9 +124,10 @@ describe("context-menu", () => { autofillSettingsService.enableContextMenu$ = of(true); accountService.activeAccount$ = of({ id: "userId" as UserId, - email: "", - emailVerified: false, - name: undefined, + ...mockAccountInfoWith({ + email: "", + name: undefined, + }), }); }); diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 2540571abb0..7b509380f6d 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -82,7 +82,9 @@ import { import { isUrlInList } from "@bitwarden/common/autofill/utils"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/billing/services/account/billing-account-profile-state.service"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; import { HibpApiService } from "@bitwarden/common/dirt/services/hibp-api.service"; +import { PhishingDetectionSettingsService } from "@bitwarden/common/dirt/services/phishing-detection/phishing-detection-settings.service"; import { ClientType } from "@bitwarden/common/enums"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; import { @@ -497,6 +499,7 @@ export default class MainBackground { // DIRT private phishingDataService: PhishingDataService; + private phishingDetectionSettingsService: PhishingDetectionSettingsServiceAbstraction; constructor() { const logoutCallback = async (logoutReason: LogoutReason, userId?: UserId) => @@ -1475,12 +1478,18 @@ export default class MainBackground { this.platformUtilsService, ); - PhishingDetectionService.initialize( + this.phishingDetectionSettingsService = new PhishingDetectionSettingsService( this.accountService, this.billingAccountProfileStateService, this.configService, + this.organizationService, + this.stateProvider, + ); + + PhishingDetectionService.initialize( this.logService, this.phishingDataService, + this.phishingDetectionSettingsService, messageListener, ); diff --git a/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.spec.ts b/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.spec.ts index e33b4b1b4f1..ceb18bd1573 100644 --- a/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.spec.ts +++ b/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.spec.ts @@ -1,9 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { Observable, of } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessageListener } from "@bitwarden/messaging"; @@ -11,17 +9,12 @@ import { PhishingDataService } from "./phishing-data.service"; import { PhishingDetectionService } from "./phishing-detection.service"; describe("PhishingDetectionService", () => { - let accountService: AccountService; - let billingAccountProfileStateService: BillingAccountProfileStateService; - let configService: ConfigService; let logService: LogService; let phishingDataService: MockProxy; let messageListener: MockProxy; + let phishingDetectionSettingsService: MockProxy; beforeEach(() => { - accountService = { getAccount$: jest.fn(() => of(null)) } as any; - billingAccountProfileStateService = {} as any; - configService = { getFeatureFlag$: jest.fn(() => of(false)) } as any; logService = { info: jest.fn(), debug: jest.fn(), warning: jest.fn(), error: jest.fn() } as any; phishingDataService = mock(); messageListener = mock({ @@ -29,16 +22,17 @@ describe("PhishingDetectionService", () => { return new Observable(); }, }); + phishingDetectionSettingsService = mock({ + on$: of(true), + }); }); it("should initialize without errors", () => { expect(() => { PhishingDetectionService.initialize( - accountService, - billingAccountProfileStateService, - configService, logService, phishingDataService, + phishingDetectionSettingsService, messageListener, ); }).not.toThrow(); @@ -61,6 +55,7 @@ describe("PhishingDetectionService", () => { // logService, // phishingDataService, // messageListener, + // phishingDetectionSettingsService, // ); // }); @@ -81,6 +76,7 @@ describe("PhishingDetectionService", () => { // logService, // phishingDataService, // messageListener, + // phishingDetectionSettingsService, // ); // }); }); diff --git a/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.ts b/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.ts index 4917e740be8..e04d08559ab 100644 --- a/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.ts +++ b/apps/browser/src/dirt/phishing-detection/services/phishing-detection.service.ts @@ -1,21 +1,16 @@ import { - combineLatest, concatMap, distinctUntilChanged, EMPTY, filter, map, merge, - of, Subject, switchMap, tap, } from "rxjs"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CommandDefinition, MessageListener } from "@bitwarden/messaging"; @@ -50,11 +45,9 @@ export class PhishingDetectionService { private static _didInit = false; static initialize( - accountService: AccountService, - billingAccountProfileStateService: BillingAccountProfileStateService, - configService: ConfigService, logService: LogService, phishingDataService: PhishingDataService, + phishingDetectionSettingsService: PhishingDetectionSettingsServiceAbstraction, messageListener: MessageListener, ) { if (this._didInit) { @@ -118,22 +111,9 @@ export class PhishingDetectionService { .messages$(PHISHING_DETECTION_CANCEL_COMMAND) .pipe(switchMap((message) => BrowserApi.closeTab(message.tabId))); - const activeAccountHasAccess$ = combineLatest([ - accountService.activeAccount$, - configService.getFeatureFlag$(FeatureFlag.PhishingDetection), - ]).pipe( - switchMap(([account, featureEnabled]) => { - if (!account) { - logService.debug("[PhishingDetectionService] No active account."); - return of(false); - } - return billingAccountProfileStateService - .hasPremiumFromAnySource$(account.id) - .pipe(map((hasPremium) => hasPremium && featureEnabled)); - }), - ); + const phishingDetectionActive$ = phishingDetectionSettingsService.on$; - const initSub = activeAccountHasAccess$ + const initSub = phishingDetectionActive$ .pipe( distinctUntilChanged(), switchMap((activeUserHasAccess) => { diff --git a/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts b/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts index 57ef285bdf5..8fdae06e28a 100644 --- a/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts +++ b/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts @@ -76,11 +76,14 @@ const decorators = (options: { { provide: AccountService, useValue: { + // We can't use mockAccountInfoWith() here because we can't take a dependency on @bitwarden/common/spec. + // This is because that package relies on jest dependencies that aren't available here. activeAccount$: of({ id: "test-user-id" as UserId, name: "Test User 1", email: "test@email.com", emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", }), }, }, diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index bb89eff1147..39c53b7da56 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -41,6 +41,7 @@ import { import { ExtensionNewDeviceVerificationComponentService } from "@bitwarden/browser/auth/services/new-device-verification/extension-new-device-verification-component.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService, @@ -67,6 +68,8 @@ import { UserNotificationSettingsServiceAbstraction, } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; +import { PhishingDetectionSettingsServiceAbstraction } from "@bitwarden/common/dirt/services/abstractions/phishing-detection-settings.service.abstraction"; +import { PhishingDetectionSettingsService } from "@bitwarden/common/dirt/services/phishing-detection/phishing-detection-settings.service"; import { ClientType } from "@bitwarden/common/enums"; import { KeyGenerationService } from "@bitwarden/common/key-management/crypto"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; @@ -512,6 +515,17 @@ const safeProviders: SafeProvider[] = [ useClass: UserNotificationSettingsService, deps: [StateProvider], }), + safeProvider({ + provide: PhishingDetectionSettingsServiceAbstraction, + useClass: PhishingDetectionSettingsService, + deps: [ + AccountService, + BillingAccountProfileStateService, + ConfigService, + OrganizationService, + StateProvider, + ], + }), safeProvider({ provide: MessageListener, useFactory: (subject: Subject>>, ngZone: NgZone) => diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts index 6d79f430a37..6e73d9811f2 100644 --- a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts @@ -16,6 +16,7 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; @@ -96,9 +97,10 @@ describe("SendV2Component", () => { useValue: { activeAccount$: of({ id: "123", - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }), }, }, diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html index d6bf3a3a253..5473bbe620e 100644 --- a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html @@ -1,5 +1,5 @@ - + @@ -21,7 +21,7 @@ bitFormButton buttonType="primary" > - {{ "exportVault" | i18n }} + {{ "export" | i18n }} diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts index 459b328c44e..e9636e09873 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts @@ -11,6 +11,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { ProductTierType } from "@bitwarden/common/billing/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CipherId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; @@ -60,9 +61,10 @@ describe("OpenAttachmentsComponent", () => { const accountService = { activeAccount$: of({ id: mockUserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }), }; const formStatusChange$ = new BehaviorSubject<"enabled" | "disabled">("enabled"); diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html index 225640137e8..c042af8cbac 100644 --- a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html @@ -15,7 +15,7 @@ diff --git a/apps/cli/src/key-management/commands/unlock.command.spec.ts b/apps/cli/src/key-management/commands/unlock.command.spec.ts index 70e9a8fd232..50ef414ec37 100644 --- a/apps/cli/src/key-management/commands/unlock.command.spec.ts +++ b/apps/cli/src/key-management/commands/unlock.command.spec.ts @@ -15,6 +15,7 @@ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/co import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; import { KeyService } from "@bitwarden/key-management"; @@ -48,9 +49,10 @@ describe("UnlockCommand", () => { const mockMasterPassword = "testExample"; const activeAccount: Account = { id: "user-id" as UserId, - email: "user@example.com", - emailVerified: true, - name: "User", + ...mockAccountInfoWith({ + email: "user@example.com", + name: "User", + }), }; const mockUserKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; const mockSessionKey = new Uint8Array(64) as CsprngArray; diff --git a/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs b/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs index f542e23129a..6fb6e6134c7 100644 --- a/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs +++ b/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs @@ -18,7 +18,7 @@ use crate::{ pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[ BrowserConfig { name: "Chrome", - data_dir: &[".config/google-chrome"], + data_dir: &[".config/google-chrome", "snap/chromium/common/chromium"], }, BrowserConfig { name: "Chromium", diff --git a/apps/desktop/src/app/tools/export/export-desktop.component.html b/apps/desktop/src/app/tools/export/export-desktop.component.html index 9aa59c5a636..a969b86b950 100644 --- a/apps/desktop/src/app/tools/export/export-desktop.component.html +++ b/apps/desktop/src/app/tools/export/export-desktop.component.html @@ -1,5 +1,5 @@ - {{ "exportVault" | i18n }} + {{ "export" | i18n }} - {{ "exportVault" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/app/tools/import/org-import.component.html b/apps/web/src/app/tools/import/org-import.component.html index 25efa9ec0c7..00e4a7690a2 100644 --- a/apps/web/src/app/tools/import/org-import.component.html +++ b/apps/web/src/app/tools/import/org-import.component.html @@ -16,6 +16,6 @@ bitFormButton buttonType="primary" > - {{ "importData" | i18n }} + {{ "import" | i18n }} diff --git a/apps/web/src/app/tools/vault-export/export-web.component.html b/apps/web/src/app/tools/vault-export/export-web.component.html index e3d0ca75d25..1ff34f4c988 100644 --- a/apps/web/src/app/tools/vault-export/export-web.component.html +++ b/apps/web/src/app/tools/vault-export/export-web.component.html @@ -15,6 +15,6 @@ bitFormButton buttonType="primary" > - {{ "confirmFormat" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/app/tools/vault-export/org-vault-export.component.html b/apps/web/src/app/tools/vault-export/org-vault-export.component.html index 01975272e76..e781a839896 100644 --- a/apps/web/src/app/tools/vault-export/org-vault-export.component.html +++ b/apps/web/src/app/tools/vault-export/org-vault-export.component.html @@ -16,6 +16,6 @@ bitFormButton buttonType="primary" > - {{ "confirmFormat" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.html b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.html index 6eb9b89b05b..3aa2f4b3bc1 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.html +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.html @@ -2,43 +2,53 @@ {{ title }} + @if (cipherIsArchived) { + {{ "archiveNoun" | i18n }} + } +
- - - - - - + @if (showCipherView) { + + } + + @if (loadForm) { + + + + + + }
- - + @if (showRestore) { + + } + + @if (showEdit) { - + } + - - -
- -
+ + @if (showCancel) { + + } + + @if (showClose) { + + } + + @if (showDelete) { +
+ +
+ }
diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts index 6716cde629a..11862b569fc 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { provideNoopAnimations } from "@angular/platform-browser/animations"; import { ActivatedRoute, Router } from "@angular/router"; +import { of } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; @@ -95,6 +96,10 @@ describe("VaultItemDialogComponent", () => { fixture = TestBed.createComponent(TestVaultItemDialogComponent); component = fixture.componentInstance; + Object.defineProperty(component, "userHasPremium$", { + get: () => of(false), + configurable: true, + }); fixture.detectChanges(); }); @@ -135,4 +140,35 @@ describe("VaultItemDialogComponent", () => { expect(component.getTestTitle()).toBe("newItemHeaderCard"); }); }); + describe("submitButtonText$", () => { + it("should return 'unArchiveAndSave' when premium is false and cipher is archived", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(false)); + component["cipherIsArchived"] = true; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("unArchiveAndSave"); + done(); + }); + }); + + it("should return 'save' when cipher is archived and user has premium", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(true)); + component["cipherIsArchived"] = true; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("save"); + done(); + }); + }); + + it("should return 'save' when cipher is not archived", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(false)); + component["cipherIsArchived"] = false; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("save"); + done(); + }); + }); + }); }); diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index 8508596a67b..d7b9ee97123 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -12,7 +12,7 @@ import { } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { Router } from "@angular/router"; -import { firstValueFrom, Subject, switchMap } from "rxjs"; +import { firstValueFrom, Observable, Subject, switchMap } from "rxjs"; import { map } from "rxjs/operators"; import { CollectionView } from "@bitwarden/admin-console/common"; @@ -222,10 +222,10 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { protected collections?: CollectionView[]; /** - * Flag to indicate if the user has access to attachments via a premium subscription. + * Flag to indicate if the user has a premium subscription. Using for access to attachments, and archives * @protected */ - protected canAccessAttachments$ = this.accountService.activeAccount$.pipe( + protected userHasPremium$ = this.accountService.activeAccount$.pipe( switchMap((account) => this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ), @@ -253,6 +253,8 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { protected showRestore: boolean; + protected cipherIsArchived: boolean; + protected get loadingForm() { return this.loadForm && !this.formReady; } @@ -278,6 +280,16 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { return this.cipher != undefined && (this.params.mode === "view" || this.loadingForm); } + protected get submitButtonText$(): Observable { + return this.userHasPremium$.pipe( + map((hasPremium) => + this.cipherIsArchived && !hasPremium + ? this.i18nService.t("unArchiveAndSave") + : this.i18nService.t("save"), + ), + ); + } + /** * Flag to initialize/attach the form component. */ @@ -363,6 +375,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { this.filter = await firstValueFrom(this.routedVaultFilterService.filter$); this.showRestore = await this.canUserRestore(); + this.cipherIsArchived = this.cipher.isArchived; this.performingInitialLoad = false; } @@ -392,6 +405,9 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { cipherView.collectionIds?.includes(c.id), ); + // Track cipher archive state for btn text and badge updates + this.cipherIsArchived = this.cipher.isArchived; + // If the cipher was newly created (via add/clone), switch the form to edit for subsequent edits. if (this._originalFormMode === "add" || this._originalFormMode === "clone") { this.formConfig.mode = "edit"; @@ -468,7 +484,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { }; openAttachmentsDialog = async () => { - const canAccessAttachments = await firstValueFrom(this.canAccessAttachments$); + const canAccessAttachments = await firstValueFrom(this.userHasPremium$); if (!canAccessAttachments) { await this.premiumUpgradeService.promptForPremium(this.cipher?.organizationId); diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index d56c9d15cff..5b9f9db3e62 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -172,7 +172,7 @@ @if (!viewingOrgVault) { - diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts index 92c49ac218a..a723f1e942b 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts @@ -253,14 +253,6 @@ export class VaultCipherRowComponent implements OnInit ); } - protected get hasPasswordToCopy() { - return CipherViewLikeUtils.hasCopyableValue(this.cipher, "password"); - } - - protected get hasUsernameToCopy() { - return CipherViewLikeUtils.hasCopyableValue(this.cipher, "username"); - } - protected get permissionText() { if (!this.cipher.organizationId || this.cipher.collectionIds.length === 0) { return this.i18nService.t("manageCollection"); @@ -319,6 +311,9 @@ export class VaultCipherRowComponent implements OnInit } protected get isIdentityCipher() { + if (CipherViewLikeUtils.isArchived(this.cipher) && !this.userCanArchive) { + return false; + } return CipherViewLikeUtils.getType(this.cipher) === this.CipherType.Identity && !this.isDeleted; } @@ -394,6 +389,13 @@ export class VaultCipherRowComponent implements OnInit return this.organization.canEditAllCiphers || (this.cipher.edit && this.cipher.viewPassword); } + protected get showFavorite() { + if (CipherViewLikeUtils.isArchived(this.cipher) && !this.userCanArchive) { + return false; + } + return true; + } + protected toggleFavorite() { this.onEvent.emit({ type: "toggleFavorite", diff --git a/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts b/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts index 6b46cd89956..2ba9dd6fad4 100644 --- a/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts +++ b/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts @@ -2,14 +2,18 @@ import { TestBed } from "@angular/core/testing"; import { BehaviorSubject, firstValueFrom, take, timeout } from "rxjs"; import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { DeviceType } from "@bitwarden/common/enums"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider } from "@bitwarden/common/platform/state"; -import { FakeStateProvider, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { + FakeStateProvider, + mockAccountServiceWith, + mockAccountInfoWith, +} from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; @@ -27,8 +31,11 @@ describe("VaultBannersService", () => { const fakeStateProvider = new FakeStateProvider(mockAccountServiceWith(userId)); const getEmailVerified = jest.fn().mockResolvedValue(true); const lastSync$ = new BehaviorSubject(null); - const accounts$ = new BehaviorSubject>({ - [userId]: { email: "test@bitwarden.com", emailVerified: true, name: "name" } as AccountInfo, + const accounts$ = new BehaviorSubject({ + [userId]: mockAccountInfoWith({ + email: "test@bitwarden.com", + name: "name", + }), }); const pendingAuthRequests$ = new BehaviorSubject>([]); diff --git a/apps/web/src/app/vault/individual-vault/vault.component.html b/apps/web/src/app/vault/individual-vault/vault.component.html index 522b63c21fd..df1b727154f 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.html +++ b/apps/web/src/app/vault/individual-vault/vault.component.html @@ -31,19 +31,23 @@ >
- - {{ trashCleanupWarning }} - - -

{{ "premiumSubscriptionEndedDesc" | i18n }}

- {{ - "restartPremium" | i18n - }} -
+ @if (activeFilter.isDeleted) { + + {{ trashCleanupWarning }} + + } + + @if (showSubscriptionEndedMessaging$ | async) { + + +
+ {{ "premiumSubscriptionEndedDesc" | i18n }} +
+ {{ "restartPremium" | i18n }} +
+
+ } + implements OnInit, OnDestr this.vaultFilterService.clearOrganizationFilter(); } + async navigateToGetPremium() { + await this.router.navigate(["/settings/subscription/premium"]); + } + async onVaultItemsEvent(event: VaultItemEvent) { this.processingEvent = true; try { diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 923e65fbf99..d5314274775 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Stuur kluis uit" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Lêerformaat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bevestig hoofwagwoord" }, - "confirmFormat": { - "message": "Bevestig formaat" - }, "filePassword": { "message": "Lêerwagwoord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nutsmiddels" }, + "import": { + "message": "Import" + }, "importData": { "message": "Voer data in" }, @@ -5169,9 +5163,21 @@ "message": "Herstel", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Daar is ou lêeraanhegsels in u kluis wat herstel moet word alvorens u u rekening se enkripsiesleutel kan roteer." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "U rekening se vingerafdrukfrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Suksesvol heruitgenooi" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Suksesvol verwyder" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Kluisuittel is nie binne toegelate omvang nie." }, - "disablePersonalVaultExport": { - "message": "Deaktiveer uitstuur van persoonlike kluis" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ongeldige bevestigingskode" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO geaktiveer" }, - "disabledSso": { - "message": "SSO gedeaktiveer" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Bediener" }, - "exportData": { - "message": "Stuur data uit" - }, "exportingOrganizationSecretDataTitle": { "message": "Stuur tans organisasiegeheimdata uit" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Gekose streekvlag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 4999534a5f6..c85ad682d0a 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "التصدير من" }, - "exportVault": { - "message": "تصدير الخزانة" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "صيغة الملف" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "تأكيد كلمة المرور الرئيسية" }, - "confirmFormat": { - "message": "تأكيد التنسيق" - }, "filePassword": { "message": "كلمة مرور الملف" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "الأدوات" }, + "import": { + "message": "Import" + }, "importData": { "message": "استيراد البيانات" }, @@ -5169,9 +5163,21 @@ "message": "اصلاح", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "عبارة بصمة حسابك", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "رمز التحقق غير صالح" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 409d2a4edde..9068514ce55 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Buradan xaricə köçür" }, - "exportVault": { - "message": "Seyfi xaricə köçür" - }, - "exportSecrets": { - "message": "Sirləri xaricə köçür" - }, "fileFormat": { "message": "Fayl formatı" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Ana parolu təsdiqlə" }, - "confirmFormat": { - "message": "Formatı təsdiqlə" - }, "filePassword": { "message": "Fayl parolu" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alətlər" }, + "import": { + "message": "Daxilə köçür" + }, "importData": { "message": "Veriləri daxilə köçür" }, @@ -3063,7 +3057,7 @@ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "Fayl qoşmaları üçün $SIZE$ şifrələnmiş anbar sahəsi.", "placeholders": { "size": { "content": "$1", @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Premium abunəliyiniz bitdi" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "Arxivinizə təkrar erişmək üçün Premium abunəliyinizi yenidən başladın. Təkrar başlatmazdan əvvəl arxivlənmiş elementin detallarına düzəliş etsəniz, həmin element seyfinizə daşınacaq." }, "restartPremium": { - "message": "Restart Premium" + "message": "\"Premium\"u yenidən başlat" }, "additionalStorageGb": { "message": "Əlavə saxlama sahəsi (GB)" @@ -4627,19 +4621,19 @@ "message": "Daha ətraflı" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "Şifrələmə ayarlarını güncəlləyərkən bir xəta baş verdi." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Şifrələmə ayarlarınızı güncəlləyin" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Tövsiyə edilən yeni şifrələmə ayarları, hesabınızın təhlükəsizliyini artıracaq. İndi güncəlləmək üçün ana parolunuzu daxil edin." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Davam etmək üçün kimliyinizi təsdiqləyin" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Ana parolunuzu daxil edin" }, "updateSettings": { "message": "Güncəlləmə ayarları" @@ -5169,9 +5163,21 @@ "message": "Düzəlt", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Şifrələməni düzəlt" + }, + "fixEncryptionTooltip": { + "message": "Bu fayl, köhnə bir şifrələmə üsulunu istifadə edir." + }, + "attachmentUpdated": { + "message": "Qoşma güncəllənib" + }, "oldAttachmentsNeedFixDesc": { "message": "Hesabınızın şifrələmə açarını döndərməzdən əvvəl, seyfinizdəki köhnə fayl qoşmalarını düzəltməlisiniz." }, + "itemsTransferred": { + "message": "Elementlər köçürüldü" + }, "yourAccountsFingerprint": { "message": "Hesabınızın barmaq izi ifadəsi", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Uğurla yenidən dəvət edildi." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ istifadəçi təkrar dəvət edildi", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$/$SELECTEDCOUNT$ istifadəçi təkrar dəvət edildi. $LIMIT$ dəvət limitinə görə $EXCLUDEDCOUNT$ dəvət edilmədi.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Uğurla çıxarıldı" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Seyf bitmə vaxtı, icazə verilən aralıqda deyil." }, - "disablePersonalVaultExport": { - "message": "Fərdi seyfi xaricə köçürməni ləğv et" + "disableExport": { + "message": "Xaricə köçürməni sil" }, "disablePersonalVaultExportDescription": { "message": "Üzvlərin fərdi seyflərindən veriləri xaricə köçürməsinə icazə verilməsin." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Yararsız doğrulama kodu" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Aşağıdakı təşkilatların üzvləri üçün artıq ana parol tələb olunmur. Lütfən aşağıdakı domeni təşkilatınızın inzibatçısı ilə təsdiqləyin." - }, "keyConnectorDomain": { "message": "Key Connector domeni" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO fəaldır" }, - "disabledSso": { - "message": "SSO sıradan çıxarılıb" + "ssoTurnedOff": { + "message": "SSO söndürüldü" }, "emailMustLoginWithSso": { "message": "$EMAIL$, Vahid Daxil olma üsulu ilə giriş etməlidir", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Veriləri xaricə köçür" - }, "exportingOrganizationSecretDataTitle": { "message": "Təşkilatın Sirr Verilərini xaricə köçürmə" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO girişi tələb olunur" }, + "emailRequiredForSsoLogin": { + "message": "SSO üçün e-poçt tələb olunur" + }, "selectedRegionFlag": { "message": "Seçilmiş bölgə bayrağı" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Ailə üzvlüyü" }, - "planDescPremium": { - "message": "Tam onlayn təhlükəsizlik" + "advancedOnlineSecurity": { + "message": "Qabaqcıl onlayn təhlükəsizlik" }, "planDescFamiliesV2": { "message": "Ailəniz üçün Premium təhlükəsizlik" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Təşkilatınız, artıq Bitwarden-ə giriş etmək üçün ana parol istifadə etmir. Davam etmək üçün təşkilatı və domeni doğrulayın." + }, + "continueWithLogIn": { + "message": "Giriş etməyə davam" + }, + "doNotContinue": { + "message": "Davam etmə" + }, + "domain": { + "message": "Domen" + }, + "keyConnectorDomainTooltip": { + "message": "Bu domen, hesabınızın şifrələmə açarlarını saxlayacaq, ona görə də, bu domenə güvəndiyinizə əmin olun. Əmin deyilsinizsə, adminizlə əlaqə saxlayın." + }, + "verifyYourOrganization": { + "message": "Giriş etmək üçün təşkilatınızı doğrulayın" + }, + "organizationVerified": { + "message": "Təşkilat doğrulandı" + }, + "domainVerified": { + "message": "Domen doğrulandı" + }, + "leaveOrganizationContent": { + "message": "Təşkilatınızı doğrulamasanız, təşkilata erişiminiz ləğv ediləcək." + }, + "leaveNow": { + "message": "İndi tərk et" + }, + "verifyYourDomainToLogin": { + "message": "Giriş etmək üçün domeninizi doğrulayın" + }, + "verifyYourDomainDescription": { + "message": "Giriş prosesini davam etdirmək üçün bu domeni doğrulayın." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Giriş prosesini davam etdirmək üçün bu təşkilatı və domeni doğrulayın." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Heç bir kritik tətbiq seçilməyib" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "İstifadəçi doğrulaması uğursuz oldu." + }, + "recoveryDeleteCiphersTitle": { + "message": "Geri qaytarıla bilməyən seyf elementlərini sil" + }, + "recoveryDeleteCiphersDesc": { + "message": "Seyfinizdəki bəzi elementlər geri qaytarıla bilmədi. Bu geri qaytarıla bilməyən elementləri seyfinizdən silmək istəyirsiniz?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Geri qaytarıla bilməyən qovluqları sil" + }, + "recoveryDeleteFoldersDesc": { + "message": "Qovluqlarınızdan bəziləri geri qaytarıla bilmədi. Bu geri qaytarıla bilməyən qovluqları seyfinizdən silmək istəyirsiniz?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Şifrələmə açarını əvəz et" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Public-key şifrələmə açar cütü geri qaytarıla bilmədi. Şifrələmə açarınızı yeni bir açar cütü ilə əvəz etmək istəyirsiniz? Bu proses, mövcud fövqəladə hal və təşkilat üzvlüyünüzü yenidən qurmağınızı tələb edir." + }, + "recoveryStepSyncTitle": { + "message": "Verilər sinxronlaşdırılır" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Şifrələmə açarı tamlığı doğrulanır" + }, + "recoveryStepUserInfoTitle": { + "message": "İstifadəçi məlumatı doğrulanır" + }, + "recoveryStepCipherTitle": { + "message": "Seyf elementinin tamlığı doğrulanır" + }, + "recoveryStepFoldersTitle": { + "message": "Qovluq tamlığı doğrulanır" + }, + "dataRecoveryTitle": { + "message": "Veri geri qaytarma və diaqnostika" + }, + "dataRecoveryDescription": { + "message": "Hesabınızla bağlı problemləri diaqnostika etmək və bərpa etmək üçün veri geri qaytarma alətini istifadə edin. Diaqnostika prosesini işə saldıqdan sonra, dəstək üçün diaqnostika log-larını saxlama və aşkarlanan problemləri həll etmə seçimləriniz olacaq." + }, + "runDiagnostics": { + "message": "Diaqnostikanı işə sal" + }, + "repairIssues": { + "message": "Problemləri həll et" + }, + "saveDiagnosticLogs": { + "message": "Diaqnostika log-larını saxla" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Bu ayar, təşkilatınız tərəfindən idarə olunur." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Təşkilatınız, maksimum seyf bitmə vaxtını $HOURS$ saat $MINUTES$ dəqiqə olaraq ayarladı.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Təşkilatınız, seansın ilkin bitmə vaxtını Brauzer təzələnəndə olaraq təyin etdi." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maksimum bitmə vaxtı $HOURS$ saat $MINUTES$ dəqiqə dəyərini aşa bilməz", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Brauzer təzələnəndə" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Vaxt bitmə əməliyyatınızı dəyişdirmək üçün bir kilid açma üsulu qurun." + }, + "leaveConfirmationDialogTitle": { + "message": "Tərk etmək istədiyinizə əminsiniz?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Rədd cavabı versəniz, fərdi elementləriniz hesabınızda qalacaq, paylaşılan elementlərə və təşkilat özəlliklərinə erişimi itirəcəksiniz." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Erişimi təkrar qazanmaq üçün admininizlə əlaqə saxlayın." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Tərk et: $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Seyfimi necə idarə edim?" + }, + "transferItemsToOrganizationTitle": { + "message": "Elementləri bura köçür: $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$, təhlükəsizlik və riayətlilik üçün bütün elementlərin təşkilata aid olmasını tələb edir. Elementlərinizin sahibliyini transfer etmək üçün qəbul edin.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Transferi qəbul et" + }, + "declineAndLeave": { + "message": "Rədd et və tərk et" + }, + "whyAmISeeingThis": { + "message": "Bunu niyə görürəm?" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index d0de973f30f..b5f7a4dfa18 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Экспартаваць сховішча" - }, - "exportSecrets": { - "message": "Экспартаванне сакрэтаў" - }, "fileFormat": { "message": "Фармат файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Пацвердзіць асноўны пароль" }, - "confirmFormat": { - "message": "Пацвердзіць фармат" - }, "filePassword": { "message": "Пароль файла" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Інструменты" }, + "import": { + "message": "Import" + }, "importData": { "message": "Імпартаванне даных" }, @@ -5169,9 +5163,21 @@ "message": "Выправіць", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "У вашым сховішчы ёсць старыя далучаныя файлы, якія неабходна выправіць перад тым, як змяніць ключ шыфравання ўліковага запісу." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Фраза адбітку пальца вашага ўліковага запісу", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Паспяхова паўторна запрошаны." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Паспяхова выдалена" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Час чакання сховішча па-за межамі дазволенага дыяпазону." }, - "disablePersonalVaultExport": { - "message": "Выдаліць экспартаванне асабістага сховішча" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Не дазваляць удзельнікам экспартаваць даныя з іх індывідуальнага сховішча." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Памылковы праверачны код" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO уключана" }, - "disabledSso": { - "message": "SSO адключаны" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Экспартаванне даных" - }, "exportingOrganizationSecretDataTitle": { "message": "Экспартаванне сакрэтных даных арганізацыі" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Сцяг выбранага рэгіёна" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index e058bdee1bd..a57f9bcebb2 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Изнасяне от" }, - "exportVault": { - "message": "Изнасяне на трезора" - }, - "exportSecrets": { - "message": "Изнасяне на тайните" - }, "fileFormat": { "message": "Формат на файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Потвърждаване на главната парола" }, - "confirmFormat": { - "message": "Потвърждаване на формата" - }, "filePassword": { "message": "Парола на файла" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Инструменти" }, + "import": { + "message": "Внасяне" + }, "importData": { "message": "Внасяне на данни" }, @@ -5169,9 +5163,21 @@ "message": "Поправяне", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Поправяне на шифроването" + }, + "fixEncryptionTooltip": { + "message": "Този файл използва остарял метод на шифроване." + }, + "attachmentUpdated": { + "message": "Прикаченият файл е актуализиран" + }, "oldAttachmentsNeedFixDesc": { "message": "В трезора ви има стари прикачени файлове. Те трябва да бъдат поправени, за да можете да смените ключа за шифриране на абонамента." }, + "itemsTransferred": { + "message": "Елементите са прехвърлени" + }, "yourAccountsFingerprint": { "message": "Уникална фраза, идентифицираща абонамента ви", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Успешно изпратени наново покани." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ повторно поканени потребители", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ от $SELECTEDCOUNT$ повторно поканени потребители. $EXCLUDEDCOUNT$ не бяха поканени, поради ограничението от $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Успешно премахване" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Времето за изчакване на трезора не е в позволения интервал." }, - "disablePersonalVaultExport": { - "message": "Забраняване на изнасянето на личния трезор" + "disableExport": { + "message": "Премахване на изнесеното" }, "disablePersonalVaultExportDescription": { "message": "Да не се разрешава на членовете да изнасят данните от собствените си трезори." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Грешен код за потвърждаване" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "За членовете на следната организация вече не се изисква главна парола. Потвърдете домейна по-долу с администратора на организацията си." - }, "keyConnectorDomain": { "message": "Домейн на конектора за ключове" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "Еднократното удостоверяване е включено" }, - "disabledSso": { + "ssoTurnedOff": { "message": "Еднократното удостоверяване е изключено" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Сървър" }, - "exportData": { - "message": "Изнасяне на данни" - }, "exportingOrganizationSecretDataTitle": { "message": "Изнасяне на тайните данни на организацията" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Необходимо е вписване чрез еднократно удостоверяване" }, + "emailRequiredForSsoLogin": { + "message": "За еднократно удостоверяване е необходима е-поща" + }, "selectedRegionFlag": { "message": "Знаме на избрания регион" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Членство за семейства" }, - "planDescPremium": { - "message": "Пълна сигурност в Интернет" + "advancedOnlineSecurity": { + "message": "Разширена сигурност в Интернет" }, "planDescFamiliesV2": { "message": "Допълнителна защита за Вашето семейство" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Вашата организация вече не използва главни пароли за вписване в Битуорден. За да продължите, потвърдете организацията и домейна." + }, + "continueWithLogIn": { + "message": "Продължаване с вписването" + }, + "doNotContinue": { + "message": "Не продължавам" + }, + "domain": { + "message": "Домейн" + }, + "keyConnectorDomainTooltip": { + "message": "Този домейн ще съхранява ключовете за шифроване на акаунта Ви, така че се уверете, че му имате доверие. Ако имате съмнения, свържете се с администратора си." + }, + "verifyYourOrganization": { + "message": "Потвърдете организацията си, за да се впишете" + }, + "organizationVerified": { + "message": "Организацията е потвърдена" + }, + "domainVerified": { + "message": "Домейнът е потвърден" + }, + "leaveOrganizationContent": { + "message": "Ако не потвърдите организацията, достъпът Ви до нея ще бъде преустановен." + }, + "leaveNow": { + "message": "Напускане сега" + }, + "verifyYourDomainToLogin": { + "message": "Потвърдете домейна си, за да се впишете" + }, + "verifyYourDomainDescription": { + "message": "За да продължите с вписването, потвърдете този домейн." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "За да продължите с вписването, потвърдете организацията и домейна." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Няма избрани важни приложения" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Проверката на потребителя беше неуспешна." + }, + "recoveryDeleteCiphersTitle": { + "message": "Изтриване на невъзстановимите елементи от трезора" + }, + "recoveryDeleteCiphersDesc": { + "message": "Някои от елементите в трезора не могат да бъдат възстановени. Искате ли да ги изтриете от трезора си?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Изтриване на невъзстановимите папки" + }, + "recoveryDeleteFoldersDesc": { + "message": "Някои от папките не могат да бъдат възстановени. Искате ли да ги изтриете от трезора си?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Подмяна на ключа за шифроване" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Вашата двойка ключове за шифроване не може да бъде възстановена. Искате ли да замените ключа си за шифроване с нова двойка? Ще трябва да настроите аварийния достъп отново, както и членствата си в организации." + }, + "recoveryStepSyncTitle": { + "message": "Синхронизиране на данните…" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Потвърждаване на целостта на ключа за шифроване" + }, + "recoveryStepUserInfoTitle": { + "message": "Потвърждаване на информацията за потребителя" + }, + "recoveryStepCipherTitle": { + "message": "Потвърждаване на целостта на данните в трезора" + }, + "recoveryStepFoldersTitle": { + "message": "Потвърждаване на целостта на папките" + }, + "dataRecoveryTitle": { + "message": "Възстановяване и диагностика на данните" + }, + "dataRecoveryDescription": { + "message": "Използвайте инструмента за възстановяване на данните, за да направите проверка и поправка, ако има проблеми с акаунта Ви. След изпълнението на диагностиката ще имате възможност да запазите нейния журнал, в случай, че са нужни на поддръжката, както и ще можете да опитате да поправите откритите проблеми." + }, + "runDiagnostics": { + "message": "Стартиране на диагностиката" + }, + "repairIssues": { + "message": "Поправяне на проблемите" + }, + "saveDiagnosticLogs": { + "message": "Запазване на журнала от диагностиката" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Тази настройка се управлява от организацията Ви." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Организацията Ви е настроила максималното разрешено време за достъп на [%1$i] час(а) и [%2$i] минути.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Организацията Ви е настроила стандартното разрешено време за достъп да бъде до презареждане на страницата в браузъра." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Максималното време на достъп не може да превишава $HOURS$ час(а) и $MINUTES$ минути", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "При презареждане на страницата в браузъра" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Задайте метод за отключване, за да може да промените действието при изтичане на времето за достъп" + }, + "leaveConfirmationDialogTitle": { + "message": "Наистина ли искате да напуснете?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Ако откажете, Вашите собствени елементи ще останат в акаунта Ви, но ще загубите достъп до споделените елементи и функционалностите на организацията." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Свържете се с администратор, за да получите достъп отново." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Напускане на $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Как да управлявам трезора си?" + }, + "transferItemsToOrganizationTitle": { + "message": "Прехвърляне на елементи към $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ изисква всички елементи да станат притежание на организацията, за по-добра сигурност и съвместимост. Изберете, че приемате, за да прехвърлите собствеността на елементите си към организацията.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Приемане на прехвърлянето" + }, + "declineAndLeave": { + "message": "Отказване и напускане" + }, + "whyAmISeeingThis": { + "message": "Защо виждам това?" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 915f2bff970..f2ff447005c 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 4c3005bda33..63c22b86251 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 8b3e85e936e..7e6c8e20085 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporta des de" }, - "exportVault": { - "message": "Exporta la caixa forta" - }, - "exportSecrets": { - "message": "Exporta secrets" - }, "fileFormat": { "message": "Format de fitxer" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirma la contrasenya mestra" }, - "confirmFormat": { - "message": "Confirma el format" - }, "filePassword": { "message": "Contrasenya del fitxer" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Eines" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importa dades" }, @@ -5169,9 +5163,21 @@ "message": "Corregeix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Hi ha arxius adjunts antics a la vostra caixa forta que s'han de corregir abans de poder rotar la clau de xifratge del vostre compte." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Frase d'empremta digital del vostre compte", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Tornat a convidar correctament." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Suprimit correctament" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "El temps d'espera de la caixa forta no es troba dins de l'interval permès." }, - "disablePersonalVaultExport": { - "message": "Inhabilita l'exportació de la caixa forta personal" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "No permetes que els membres exporten dades des de la seua caixa forta individual." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Codi de verificació no vàlid" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO habilitat" }, - "disabledSso": { - "message": "SSO inhabilitat" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dades" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportació de dades secretes de l’organització" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Inici de sessió SSO necessari" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Bandera de la regió seleccionada" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index aceb40291df..923cfb66a14 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportovat z" }, - "exportVault": { - "message": "Exportovat trezor" - }, - "exportSecrets": { - "message": "Exportovat tajné klíče" - }, "fileFormat": { "message": "Formát souboru" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrzení hlavního hesla" }, - "confirmFormat": { - "message": "Potvrdit formát" - }, "filePassword": { "message": "Heslo souboru" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nástroje" }, + "import": { + "message": "Importovat" + }, "importData": { "message": "Importovat data" }, @@ -5169,9 +5163,21 @@ "message": "Opravit", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Opravit šifrování" + }, + "fixEncryptionTooltip": { + "message": "Tento soubor používá zastaralou šifrovací metodu." + }, + "attachmentUpdated": { + "message": "Příloha byla aktualizována" + }, "oldAttachmentsNeedFixDesc": { "message": "Ve Vašem trezoru jsou staré přílohy vyžadující opravu před změnou šifrovacího klíče k Vašemu účtu." }, + "itemsTransferred": { + "message": "Převedené položky" + }, "yourAccountsFingerprint": { "message": "Fráze otisku prstu Vašeho účtu", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Znovu úspěšně pozváno" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ uživatelů bylo znovu pozváno", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ z $SELECTEDCOUNT$ uživatelů bylo znovu pozváno. $EXCLUDEDCOUNT$ nebylo pozváno z důvodu limitu pozvánky: $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Úspěšně odebráno" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Časový limit trezoru není v rámci povoleného rozsahu." }, - "disablePersonalVaultExport": { - "message": "Odebrat osobní export trezoru" + "disableExport": { + "message": "Odebrat export" }, "disablePersonalVaultExportDescription": { "message": "Nedovolí, aby členové exportovali svá osobní data trezoru." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Neplatný ověřovací kód" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Hlavní heslo již není vyžadováno pro členy následující organizace. Potvrďte níže uvedenou doménu u správce Vaší organizace." - }, "keyConnectorDomain": { "message": "Doména Key Connectoru" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "SSO je zapnuto" }, - "disabledSso": { + "ssoTurnedOff": { "message": "SSO je vypnuto" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportovat data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportování tajných dat organizace" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Přihlášení SSO je povinné" }, + "emailRequiredForSsoLogin": { + "message": "Pro SSO je vyžadován e-mail" + }, "selectedRegionFlag": { "message": "Vlajka zvoleného regionu" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Členství v rodinách" }, - "planDescPremium": { - "message": "Dokončit online zabezpečení" + "advancedOnlineSecurity": { + "message": "Pokročilé zabezpečení online" }, "planDescFamiliesV2": { "message": "Prémiové zabezpečení pro Vaši rodinu" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Vaše organizace již k přihlášení do Bitwardenu nepoužívá hlavní hesla. Chcete-li pokračovat, ověřte organizaci a doménu." + }, + "continueWithLogIn": { + "message": "Pokračovat s přihlášením" + }, + "doNotContinue": { + "message": "Nepokračovat" + }, + "domain": { + "message": "Doména" + }, + "keyConnectorDomainTooltip": { + "message": "Tato doména uloží šifrovací klíče Vašeho účtu, takže se ujistěte, že jí věříte. Pokud si nejste jisti, kontaktujte Vašeho správce." + }, + "verifyYourOrganization": { + "message": "Ověřte svou organizaci pro přihlášení" + }, + "organizationVerified": { + "message": "Organizace byla ověřena" + }, + "domainVerified": { + "message": "Doména byla ověřena" + }, + "leaveOrganizationContent": { + "message": "Pokud neověříte svou organizaci, Váš přístup k organizaci bude zrušen." + }, + "leaveNow": { + "message": "Opustit hned" + }, + "verifyYourDomainToLogin": { + "message": "Ověřte svou doménu pro přihlášení" + }, + "verifyYourDomainDescription": { + "message": "Chcete-li pokračovat v přihlášení, ověřte tuto doménu." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Chcete-li pokračovat v přihlášení, ověřte organizaci a doménu." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Nejsou vybrány žádné kritické aplikace" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Ověření uživatele se nezdařilo." + }, + "recoveryDeleteCiphersTitle": { + "message": "Smazat neobnovitelné položky trezoru" + }, + "recoveryDeleteCiphersDesc": { + "message": "Některé z Vašich trezorů nelze obnovit. Chcete smazat tyto neobnovitelné položky z Vašeho trezoru?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Smazat neobnovitelné složky" + }, + "recoveryDeleteFoldersDesc": { + "message": "Některé z Vašich složek nelze obnovit. Chcete smazat tyto neobnovitelné složky z Vašeho trezoru?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Nahradit šifrovací klíč" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Nelze obnovit Váš pár šifrovacích klíčů veřejného klíče. Chcete nahradit Váš šifrovací klíč novým párem klíčů? To bude vyžadovat, abyste znovu nastavili stávající nouzový přístup a členství v organizaci." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizování dat" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Ověřování integrity šifrovacího klíče" + }, + "recoveryStepUserInfoTitle": { + "message": "Ověřování informací o uživateli" + }, + "recoveryStepCipherTitle": { + "message": "Ověřování integrity položky trezoru" + }, + "recoveryStepFoldersTitle": { + "message": "Ověřování integrity složky" + }, + "dataRecoveryTitle": { + "message": "Obnova dat a diagnostika" + }, + "dataRecoveryDescription": { + "message": "Použijte nástroj pro obnovení dat k diagnostice a opravě problémů s Vaším účtem. Po spuštění diagnostiky máte možnost uložit diagnostické protokoly pro podporu a možnost opravit všechny zjištěné problémy." + }, + "runDiagnostics": { + "message": "Spustit diagnostiku" + }, + "repairIssues": { + "message": "Problémy s opravou" + }, + "saveDiagnosticLogs": { + "message": "Uložit diagnostické protokoly" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Tato nastavení je spravováno Vaší organizací." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Vaše organizace nastavila maximální časový limit relace na $HOURS$ hodin a $MINUTES$ minut.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Vaše organizace nastavila výchozí časový limit relace na Při obnovení prohlížeče." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximální časový limit nesmí překročit $HOURS$ hodin a $MINUTES$ minut", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Při obnovení prohlížeče" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Nastavte metodu odemknutí, abyste změnili akci při vypršení časového limitu" + }, + "leaveConfirmationDialogTitle": { + "message": "Opravdu chcete odejít?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Odmítnutím zůstanou Vaše osobní položky ve Vašem účtu, ale ztratíte přístup ke sdíleným položkám a funkcím organizace." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Obraťte se na svého správce, abyste znovu získali přístup." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Opustit $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Jak mohu spravovat svůj trezor?" + }, + "transferItemsToOrganizationTitle": { + "message": "Přenést položky do $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ vyžaduje, aby byly všechny položky vlastněny organizací z důvodu bezpečnosti a shody. Klepnutím na tlačítko pro převod vlastnictví Vašich položek.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Přijmout převod" + }, + "declineAndLeave": { + "message": "Odmítnout a opustit" + }, + "whyAmISeeingThis": { + "message": "Proč se mi toto zobrazuje?" } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index 108b1ebe23a..5a8845a48cc 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 904dc69a0e3..56ccbf6abdf 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksportér fra" }, - "exportVault": { - "message": "Eksportér boks" - }, - "exportSecrets": { - "message": "Eksportér hemmeligheder" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekræft hovedadgangskode" }, - "confirmFormat": { - "message": "Bekræft format" - }, "filePassword": { "message": "Filadgangskode" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Værktøjer" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importér data" }, @@ -5169,9 +5163,21 @@ "message": "Reparér", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Der er gamle filvedhæftninger i din boks, der skal repareres, før du kan rotere din kontos krypteringsnøgle." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Din kontos fingeraftrykssætning", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Hermed geninviteret." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Hermed fjernet" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Boks-timeout er ikke inden for det tilladte interval." }, - "disablePersonalVaultExport": { - "message": "Fjern individuel bokseksport" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Tillad ikke medlemmer at eksportere data fra deres individuelle bokse." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ugyldig bekræftelseskode" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO aktiveret" }, - "disabledSso": { - "message": "SSO deaktiveret" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Eksportér data" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksporterer organisations hemmelige data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO-login er obligatorisk" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Valgte områdeflag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 6c354cd9064..d4ccac0d49f 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -15,13 +15,13 @@ "message": "Keine kritischen Anwendungen gefährdet" }, "accessIntelligence": { - "message": "Zugriff auf Informationen" + "message": "Access Intelligence" }, "passwordRisk": { "message": "Passwort-Risiko" }, "noEditPermissions": { - "message": "Du hast keine Berechtigung, diesen Eintrag zu bearbeiten" + "message": "Du bist nicht berechtigt, diesen Eintrag zu bearbeiten" }, "reviewAtRiskPasswords": { "message": "Überprüfe gefährdete Passwörter (schwach, kompromittiert oder wiederverwendet) in allen Anwendungen. Wähle deine kritischsten Anwendungen aus, um die Sicherheitsmaßnahmen für deine Benutzer zu priorisieren, um gefährdete Passwörter zu beseitigen." @@ -182,7 +182,7 @@ "message": "Keine Daten gefunden" }, "noDataInOrgDescription": { - "message": "Importiere die Zugangsdaten deiner Organisation, um mit der Zugangsintelligenz zu beginnen. Sobald du dies getan hast, kannst du:" + "message": "Importiere die Zugangsdaten deiner Organisation, um mit Access Intelligence zu beginnen. Sobald du dies getan hast, kannst du:" }, "feature1Title": { "message": "Anwendungen als kritisch markieren" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportieren ab" }, - "exportVault": { - "message": "Tresor exportieren" - }, - "exportSecrets": { - "message": "Geheimnisse exportieren" - }, "fileFormat": { "message": "Dateiformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Master-Passwort bestätigen" }, - "confirmFormat": { - "message": "Format bestätigen" - }, "filePassword": { "message": "Dateipasswort" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Werkzeuge" }, + "import": { + "message": "Import" + }, "importData": { "message": "Daten importieren" }, @@ -3063,7 +3057,7 @@ "message": "1 GB verschlüsselter Speicherplatz für Dateianhänge." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ verschlüsselter Speicher für Dateianhänge.", "placeholders": { "size": { "content": "$1", @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Dein Premium-Abonnement ist abgelaufen" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "Starte dein Premium-Abonnement neu, um den Zugriff auf dein Archiv wiederherzustellen. Wenn du die Details für einen archivierten Eintrag vor dem Neustart bearbeitest, wird er wieder zurück in deinen Tresor verschoben." }, "restartPremium": { - "message": "Restart Premium" + "message": "Premium neu starten" }, "additionalStorageGb": { "message": "Zusätzlicher Speicher (GB)" @@ -4479,7 +4473,7 @@ "message": "Browser aktualisieren" }, "generatingYourAccessIntelligence": { - "message": "Deine Zugangsintelligenz wird generiert..." + "message": "Deine Access Intelligence wird generiert..." }, "fetchingMemberData": { "message": "Mitgliedsdaten werden abgerufen..." @@ -4627,19 +4621,19 @@ "message": "Erfahre mehr" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "Beim Aktualisieren der Verschlüsselungseinstellungen ist ein Fehler aufgetreten." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Aktualisiere deine Verschlüsselungseinstellungen" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Die neuen empfohlenen Verschlüsselungseinstellungen verbessern deine Kontosicherheit. Gib dein Master-Passwort ein, um sie zu aktualisieren." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Bestätige deine Identität, um fortzufahren" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Gib dein Master-Passwort ein" }, "updateSettings": { "message": "Einstellungen aktualisieren" @@ -5169,9 +5163,21 @@ "message": "Reparieren", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Verschlüsselung reparieren" + }, + "fixEncryptionTooltip": { + "message": "Diese Datei verwendet eine veraltete Verschlüsselungsmethode." + }, + "attachmentUpdated": { + "message": "Anhang aktualisiert" + }, "oldAttachmentsNeedFixDesc": { "message": "Es gibt alte Dateianhänge in deinem Tresor, die repariert werden müssen, bevor du deinen Verschlüsselungsschlüssel erneuern kannst." }, + "itemsTransferred": { + "message": "Einträge übertragen" + }, "yourAccountsFingerprint": { "message": "Fingerabdruck-Phrase deines Kontos", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Erfolgreich erneut eingeladen" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ Benutzer erneut eingeladen", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ von $SELECTEDCOUNT$ Benutzern erneut eingeladen. $EXCLUDEDCOUNT$ wurden wegen des Einladungslimits von $LIMIT$ nicht eingeladen.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Erfolgreich entfernt" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Tresor-Timeout ist außerhalb des zulässigen Bereichs." }, - "disablePersonalVaultExport": { - "message": "Persönlichen Tresor-Export deaktivieren" + "disableExport": { + "message": "Export entfernen" }, "disablePersonalVaultExportDescription": { "message": "Mitgliedern nicht erlauben, Daten aus ihrem persönlichen Tresor zu exportieren." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ungültiger Verifizierungscode" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Für Mitglieder der folgenden Organisation ist kein Master-Passwort mehr erforderlich. Bitte bestätige die folgende Domain bei deinem Organisations-Administrator." - }, "keyConnectorDomain": { "message": "Key Connector-Domain" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "SSO aktiviert" }, - "disabledSso": { + "ssoTurnedOff": { "message": "SSO deaktiviert" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Daten exportieren" - }, "exportingOrganizationSecretDataTitle": { "message": "Geheimnisdaten der Organisation exportieren" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO-Anmeldung ist erforderlich" }, + "emailRequiredForSsoLogin": { + "message": "Für SSO ist eine E-Mail-Adresse erforderlich" + }, "selectedRegionFlag": { "message": "Flagge der ausgewählten Region" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families-Mitgliedschaft" }, - "planDescPremium": { - "message": "Umfassende Online-Sicherheit" + "advancedOnlineSecurity": { + "message": "Erweiterte Online-Sicherheit" }, "planDescFamiliesV2": { "message": "Premium-Sicherheit für deine Familie" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Deine Organisation verwendet keine Master-Passwörter mehr, um sich bei Bitwarden anzumelden. Verifiziere die Organisation und Domain, um fortzufahren." + }, + "continueWithLogIn": { + "message": "Mit der Anmeldung fortfahren" + }, + "doNotContinue": { + "message": "Nicht fortfahren" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "Diese Domain speichert die Verschlüsselungsschlüssel deines Kontos. Stelle daher sicher, dass du ihr vertraust. Wenn du dir nicht sicher bist, wende dich an deinen Administrator." + }, + "verifyYourOrganization": { + "message": "Verifiziere deine Organisation, um dich anzumelden" + }, + "organizationVerified": { + "message": "Organisation verifiziert" + }, + "domainVerified": { + "message": "Domain verifiziert" + }, + "leaveOrganizationContent": { + "message": "Wenn du deine Organisation nicht verifizierst, wird dein Zugriff auf die Organisation widerrufen." + }, + "leaveNow": { + "message": "Jetzt verlassen" + }, + "verifyYourDomainToLogin": { + "message": "Verifiziere deine Domain, um dich anzumelden" + }, + "verifyYourDomainDescription": { + "message": "Verifiziere diese Domain, um mit der Anmeldung fortzufahren." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Um mit der Anmeldung fortzufahren, verifiziere die Organisation und Domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Es sind keine kritischen Anwendungen ausgewählt" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Benutzerverifizierung fehlgeschlagen." + }, + "recoveryDeleteCiphersTitle": { + "message": "Nicht-wiederherstellbare Tresor-Einträge löschen" + }, + "recoveryDeleteCiphersDesc": { + "message": "Einige deiner Tresor-Einträge konnten nicht wiederhergestellt werden. Möchtest du diese nicht-wiederherstellbaren Einträge in deinem Tresor löschen?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Nicht-wiederherstellbare Ordner löschen" + }, + "recoveryDeleteFoldersDesc": { + "message": "Einige deiner Ordner konnten nicht wiederhergestellt werden. Möchtest du diese nicht-wiederherstellbaren Ordner in deinem Tresor löschen?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Verschlüsselungsschlüssel ersetzen" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Dein öffentliches Verschlüsselungsschlüsselpaar konnte nicht wiederhergestellt werden. Möchtest du deinen Verschlüsselungsschlüssel durch ein neues Schlüsselpaar ersetzen? Dazu musst du bestehenden Notfallzugänge und Organisationsmitgliedschaften erneut einrichten." + }, + "recoveryStepSyncTitle": { + "message": "Daten werden synchronisiert" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Integrität des Verschlüsselungsschlüssels wird verifiziert" + }, + "recoveryStepUserInfoTitle": { + "message": "Benutzerinformationen werden verifiziert" + }, + "recoveryStepCipherTitle": { + "message": "Integrität des Tresoreintrags wird verifiziert" + }, + "recoveryStepFoldersTitle": { + "message": "Ordnerintegrität wird verifiziert" + }, + "dataRecoveryTitle": { + "message": "Datenwiederherstellung und Diagnose" + }, + "dataRecoveryDescription": { + "message": "Verwende das Werkzeug zur Datenwiederherstellung, um Probleme mit deinem Konto zu diagnostizieren und zu beheben. Nach dem Ausführen der Diagnose hast du die Möglichkeit, die Diagnoseprotokolle für den Support zu speichern und alle erkannten Probleme zu beheben." + }, + "runDiagnostics": { + "message": "Diagnose ausführen" + }, + "repairIssues": { + "message": "Probleme beheben" + }, + "saveDiagnosticLogs": { + "message": "Diagnoseprotokolle speichern" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Diese Einstellung wird von deiner Organisation verwaltet." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Deine Organisation hat das maximale Sitzungs-Timeout auf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) festgelegt.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Deine Organisation hat das Standard-Sitzungs-Timeout auf \"Bei Browser-Aktualisierung\" gesetzt." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Das maximale Timeout darf $HOURS$ Stunde(n) und $MINUTES$ Minute(n) nicht überschreiten", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Bei Browser-Aktualisierung" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Stell eine Entsperrmethode ein, um deine Timeout-Aktion zu ändern" + }, + "leaveConfirmationDialogTitle": { + "message": "Bist du sicher, dass du gehen willst?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Wenn du ablehnst, bleiben deine persönlichen Einträge in deinem Konto erhalten, aber du wirst den Zugriff auf geteilte Einträge und Organisationsfunktionen verlieren." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Kontaktiere deinen Administrator, um wieder Zugriff zu erhalten." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "$ORGANIZATION$ verlassen", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Wie kann ich meinen Tresor verwalten?" + }, + "transferItemsToOrganizationTitle": { + "message": "Einträge zu $ORGANIZATION$ übertragen", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ erfordert zur Sicherheit und Compliance, dass alle Einträge der Organisation gehören. Klicke auf Akzeptieren, um den Besitz deiner Einträge zu übertragen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Übertragung annehmen" + }, + "declineAndLeave": { + "message": "Ablehnen und verlassen" + }, + "whyAmISeeingThis": { + "message": "Warum wird mir das angezeigt?" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index f6e8abfd612..92dd55f4c8b 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Εξαγωγή από" }, - "exportVault": { - "message": "Εξαγωγή Vault" - }, - "exportSecrets": { - "message": "Εξαγωγή μυστικών" - }, "fileFormat": { "message": "Μορφή Αρχείου" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Επιβεβαίωση κύριου κωδικού πρόσβασης" }, - "confirmFormat": { - "message": "Επιβεβαίωση μορφής" - }, "filePassword": { "message": "Κωδικός πρόσβασης αρχείου" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Εργαλεία" }, + "import": { + "message": "Import" + }, "importData": { "message": "Εισαγωγή Δεδομένων" }, @@ -5169,9 +5163,21 @@ "message": "Επιδιόρθωση", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Υπάρχουν στο παρελθόν παλιά συνημμένα αρχεία που πρέπει να διορθωθούν πριν την περιστροφή κλειδιού κρυπτογράφησης του λογαριασμού σας." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Φράση δακτυλικών αποτυπωμάτων λογαριασμού", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Επιτυχής ανάκληση." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Καταργήθηκε με επιτυχία" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Το χρονικό όριο λήξης του θησαυ/κίου δεν είναι εντός του επιτρεπόμενου εύρους." }, - "disablePersonalVaultExport": { - "message": "Απενεργοποίηση Εξαγωγής Προσωπικών Vault" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Μη έγκυρος κωδικός επαλήθευσης" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Ενεργοποιημένο SSO" }, - "disabledSso": { - "message": "Απενεργοποιημένο SSO" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Διακομιστής" }, - "exportData": { - "message": "Εξαγωγή δεδομένων" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Απαιτείται σύνδεση SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 3b0554547c5..680c28f0747 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8757,9 +8751,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -11600,6 +11591,9 @@ "unArchive": { "message": "Unarchive" }, + "unArchiveAndSave": { + "message": "Unarchive and save" + }, "itemsInArchive": { "message": "Items in archive" }, diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index be621369c77..e49ac4ac0f6 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organisation. Please confirm the domain below with your organisation administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { + "ssoTurnedOff": { "message": "SSO turned off" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organisation Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organisation is no longer using master passwords to log into Bitwarden. To continue, verify the organisation and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organisation to log in" + }, + "organizationVerified": { + "message": "Organisation verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organisation, your access to the organisation will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organisation and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organisation memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronising data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organisation." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organisation has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organisation has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organisation features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organisation for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index aafb9a01f3e..cfcfa1681c8 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organisation. Please confirm the domain below with your organisation administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organisation is no longer using master passwords to log into Bitwarden. To continue, verify the organisation and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organisation to log in" + }, + "organizationVerified": { + "message": "Organisation verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organisation, your access to the organisation will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organisation and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organisation memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronising data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organisation." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organisation has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organisation has set the default session timeout to On browser restart." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organisation features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organisation for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 220d9492c67..8dd7923b58a 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Elporti el" }, - "exportVault": { - "message": "Elporti la trezorejon" - }, - "exportSecrets": { - "message": "Elporti la sekretojn" - }, "fileFormat": { "message": "Dosierformato" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Konfirmi la ĉefpasvorton" }, - "confirmFormat": { - "message": "Konfirmu formaton" - }, "filePassword": { "message": "Pasvorto de la dosiero" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Iloj" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importi Datumojn" }, @@ -5169,9 +5163,21 @@ "message": "Ripari", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Estas malnovaj dosieraj aldonaĵoj en via trezorejo, kiuj devas esti riparitaj antaŭ ol vi povas turni la ĉifran ŝlosilon de via konto." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Fingrospuro de via konto", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Servilo" }, - "exportData": { - "message": "Elporti datumon" - }, "exportingOrganizationSecretDataTitle": { "message": "En elportado de Sekretaj Datumoj de Organizo" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO-salutado estas bezonata" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Elektis flagon de regiono" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index b0a3716cf60..b0778ef02cc 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar desde" }, - "exportVault": { - "message": "Exportar caja fuerte" - }, - "exportSecrets": { - "message": "Exportar secretos" - }, "fileFormat": { "message": "Formato de archivo" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar contraseña maestra" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Contraseña del archivo" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Herramientas" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importar datos" }, @@ -5169,9 +5163,21 @@ "message": "Arreglar", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Hay archivos adjuntos antiguos en la caja fuerte que necesitan ser corregidos antes de poder rotar la clave de encriptación de su cuenta." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Frase de la huella digital de su cuenta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvitado con éxito." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Eliminado con éxito" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "El tiempo de espera de la caja fuerte no está dentro del rango permitido." }, - "disablePersonalVaultExport": { - "message": "Desactivar exportación de la caja fuerte personal" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "No permita a los miembros exportar datos de su caja fuerte individual." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Código de verificación no válido" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO habilitado" }, - "disabledSso": { - "message": "SSO desactivado" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar datos" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportando caja fuerte de la organización" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Región seleccionada" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 1388e25bc13..03e56857413 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Ekspordi asukohast" }, - "exportVault": { - "message": "Hoidla sisu eksportimine" - }, - "exportSecrets": { - "message": "Ekspordi saladused" - }, "fileFormat": { "message": "Failivorming" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Kinnita ülemparool" }, - "confirmFormat": { - "message": "Kinnita formaat" - }, "filePassword": { "message": "Faili parool" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tööriistad" }, + "import": { + "message": "Import" + }, "importData": { "message": "Andmete importimine" }, @@ -5169,9 +5163,21 @@ "message": "Paranda", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Hoidlas on vanu failimanuseid, mida peab enne konto krüpteerimise võtme roteerimist parandama." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Sinu konto unikaalne sõnajada", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Edukalt uuesti kutsutud." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Edukalt eemaldatud" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Hoidla ajalõpp pole lubatud piirides." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Vale kinnituskood" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO sisse lülitatud" }, - "disabledSso": { - "message": "SSO välja lülitatud" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index c2fa69d56b8..f28b334e9ff 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Esportatu kutxa gotorra" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Fitxategiaren formatua" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Pasahitz nagusia baieztatu" }, - "confirmFormat": { - "message": "Formatua baieztatu" - }, "filePassword": { "message": "Fitxategi pasahitza" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tresnak" }, + "import": { + "message": "Import" + }, "importData": { "message": "Inportatu datuak" }, @@ -5169,9 +5163,21 @@ "message": "Konpondu", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Kutxa gotorrean eranskin zaharrak daude, eta konpondu beharra dute zure kontuko zifratze-gakoa berritu ahal izateko." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Zure kontuaren hatz-marka esaldia", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Behar bezala bergonbidatua." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Behar bezala kendua" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Kutxa gotorreko itxaronaldia ez dago baimendutako tartean." }, - "disablePersonalVaultExport": { - "message": "Desgaitu kutxa gotor pertsonalaren esportazioa" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Egiaztatze-kodea ez da baliozkoa" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO gaituta" }, - "disabledSso": { - "message": "SSO desgaituta" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index c8623050394..75235dca1b3 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "برون ریزی از" }, - "exportVault": { - "message": "برون ریزی گاوصندوق" - }, - "exportSecrets": { - "message": "برون ریزی رازها" - }, "fileFormat": { "message": "فرمت پرونده" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "تأیید کلمه عبور اصلی" }, - "confirmFormat": { - "message": "فرمت را تأیید کنید" - }, "filePassword": { "message": "کلمه عبور پرونده" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ابزار" }, + "import": { + "message": "Import" + }, "importData": { "message": "درون ریزی داده" }, @@ -5169,9 +5163,21 @@ "message": "اصلاح", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "پرونده‌های پیوستی قدیمی در گاوصندوق شما وجود دارد که قبل از اینکه بتوانید کلید رمزگذاری حساب خود را بچرخانید باید اصلاح شوند." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "عبارت اثر انگشت حساب شما", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "با موفقیت مجدد دعوت شد" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "با موفقیت حذف شد" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "مهلت زمانی گاوصندوق در محدوده مجاز نیست." }, - "disablePersonalVaultExport": { - "message": "حذف برون ریزی گاوصندوق شخصی" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "به اعضا اجازه ندهید که داده‌های گاوصندوق شخصی خود را برون ریزی کنند." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "کد تأیید نامعتبر است" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "برای اعضای سازمان زیر، کلمه عبور اصلی دیگر لازم نیست. لطفاً دامنه زیر را با مدیر سازمان خود تأیید کنید." - }, "keyConnectorDomain": { "message": "دامنه رابط کلید" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO روشن شد" }, - "disabledSso": { - "message": "SSO روشن شد" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "سرور" }, - "exportData": { - "message": "برون ریزی داده" - }, "exportingOrganizationSecretDataTitle": { "message": "برون ریزی داده‌های مخفی سازمان" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "ورود از طریق SSO الزامی است" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "پرچم منطقه انتخاب شد" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 181c8d4f125..adda39d725b 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Vie lähteestä" }, - "exportVault": { - "message": "Vie holvi" - }, - "exportSecrets": { - "message": "Vie salaisuudet" - }, "fileFormat": { "message": "Tiedostomuoto" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Vahvista pääsalasana" }, - "confirmFormat": { - "message": "Vahvista muoto" - }, "filePassword": { "message": "Tiedoston salasana" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Työkalut" }, + "import": { + "message": "Import" + }, "importData": { "message": "Tuo tietoja" }, @@ -5169,9 +5163,21 @@ "message": "Korjaa", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Holvissasi on vanhoja tiedostoliitteitä, jotka on korjattava ennen kuin voit uudistaa tilisi salausavaimen." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Tilisi tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Uuudelleenkutsu onnistui" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Poisto onnistui." }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Holvin aikakatkaisu ei ole sallitun alueen sisällä." }, - "disablePersonalVaultExport": { - "message": "Estä yksityisen holvin vienti" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Älä salli jäsenten viedä henkilökohtaisten holviensa tietoja." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Virheellinen todennuskoodi" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Kertakirjautuminen otettiin käyttöön" }, - "disabledSso": { - "message": "Kertakirjautuminen poistettiin käytöstä" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Palvelin" }, - "exportData": { - "message": "Vie tietoja" - }, "exportingOrganizationSecretDataTitle": { "message": "Organisaation salaisten tietojen vienti" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Kertakirjautuminen vaaditaan" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Valitun alueen lippu" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index f3542368044..1a4720094b9 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "I-export ang vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format ng file" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Kumpirmahin ang master password" }, - "confirmFormat": { - "message": "Kumpirmahin ang pag-format" - }, "filePassword": { "message": "Password ng file" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Mga Kagamitan" }, + "import": { + "message": "Import" + }, "importData": { "message": "Mag-import ng data" }, @@ -5169,9 +5163,21 @@ "message": "Ayusin ang", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "May mga lumang file attachment sa iyong vault na kailangang ayusin bago mo maiikot ang encryption key ng iyong account." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Ang fingerprint pala ng iyong account", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Matagumpay na naimbitahan muli" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Matagumpay na tinanggal" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Hindi pinapayagan ang vault timeout." }, - "disablePersonalVaultExport": { - "message": "Alisin ang indibidwal na pag export ng vault" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Maling verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Nakabukas ang SSO" }, - "disabledSso": { - "message": "Nakabukas ang SSO" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "I-export ang mga datos" - }, "exportingOrganizationSecretDataTitle": { "message": "Pag-eexport ng Sekretong Data ng Organisasyon" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index e5fcf929f0d..c2f107b9437 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporter à partir de" }, - "exportVault": { - "message": "Exporter le coffre" - }, - "exportSecrets": { - "message": "Exporter les secrets" - }, "fileFormat": { "message": "Format de fichier" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmer le mot de passe principal" }, - "confirmFormat": { - "message": "Confirmer le format" - }, "filePassword": { "message": "Mot de Passe du Fichier" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Outils" }, + "import": { + "message": "Importer" + }, "importData": { "message": "Importer des données" }, @@ -5075,7 +5069,7 @@ "message": "4 heures" }, "onRefresh": { - "message": "Au rechargement de la page" + "message": "À l'actualisation du navigateur" }, "dateUpdated": { "message": "Mis à jour", @@ -5169,9 +5163,21 @@ "message": "Réparer", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Corriger le chiffrement" + }, + "fixEncryptionTooltip": { + "message": "Ce fichier utilise une méthode de chiffrement obsolète." + }, + "attachmentUpdated": { + "message": "Pièce jointe mise à jour" + }, "oldAttachmentsNeedFixDesc": { "message": "Il y a d'anciennes pièces jointes dans votre coffre qui doivent être réparées avant que vous ne puissiez régénérer la clé de chiffrement de votre compte." }, + "itemsTransferred": { + "message": "Éléments transférés" + }, "yourAccountsFingerprint": { "message": "Phrase d'empreinte de votre compte", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Réinvité avec succès." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ ont été réinvités", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ des utilisateurs de $SELECTEDCOUNT$ ont été ré-invités. $EXCLUDEDCOUNT$ n'ont pas été invités en raison de la limite d'invitation de $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Supprimé avec succès" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Le délai de mise en veille du coffre n'est pas dans l'intervalle de temps autorisé." }, - "disablePersonalVaultExport": { - "message": "Supprimer l'exportation individuelle du coffre" + "disableExport": { + "message": "Supprimer l'exportation" }, "disablePersonalVaultExportDescription": { "message": "Ne pas autoriser les membres à exporter des données de leur coffre individuel." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Code de vérification invalide" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Un mot de passe maître n'est plus requis pour les membres de l'organisation suivante. Veuillez confirmer le domaine ci-dessous avec l'administrateur de votre organisation." - }, "keyConnectorDomain": { "message": "Domaine Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO activé" }, - "disabledSso": { - "message": "SSO désactivé" + "ssoTurnedOff": { + "message": "SSO éteint" }, "emailMustLoginWithSso": { "message": "$EMAIL$ doit se connecter avec une Authentification Unique (SSO)", @@ -8718,9 +8747,6 @@ "server": { "message": "Serveur" }, - "exportData": { - "message": "Exporter les données" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportation des Données Secrètes de l'Organisation" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "La connexion SSO est requise" }, + "emailRequiredForSsoLogin": { + "message": "Le courriel est requis pour le SSO" + }, "selectedRegionFlag": { "message": "Drapeau de la région sélectionnée" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Abonnement à Familles" }, - "planDescPremium": { - "message": "Sécurité en ligne complète" + "advancedOnlineSecurity": { + "message": "Sécurité en ligne avancée" }, "planDescFamiliesV2": { "message": "Sécurité Premium pour votre famille" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Votre organisation n'utilise plus les mots de passe principaux pour se connecter à Bitwarden. Pour continuer, vérifiez l'organisation et le domaine." + }, + "continueWithLogIn": { + "message": "Continuer avec la connexion" + }, + "doNotContinue": { + "message": "Ne pas continuer" + }, + "domain": { + "message": "Domaine" + }, + "keyConnectorDomainTooltip": { + "message": "Ce domaine stockera les clés de chiffrement de votre compte, alors assurez-vous que vous lui faites confiance. Si vous n'êtes pas sûr, vérifiez auprès de votre administrateur." + }, + "verifyYourOrganization": { + "message": "Vérifiez votre organisation pour vous connecter" + }, + "organizationVerified": { + "message": "Organisation vérifiée" + }, + "domainVerified": { + "message": "Domaine vérifié" + }, + "leaveOrganizationContent": { + "message": "Si vous ne vérifiez pas votre organisation, votre accès à l'organisation sera révoqué." + }, + "leaveNow": { + "message": "Quitter maintenant" + }, + "verifyYourDomainToLogin": { + "message": "Vérifiez votre domaine pour vous connecter" + }, + "verifyYourDomainDescription": { + "message": "Pour continuer à vous connecter, vérifiez ce domaine." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Pour continuer à vous connecter, vérifiez l'organisation et le domaine." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Aucune application critique n'est sélectionnée" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "La vérification de l'utilisateur a échoué." + }, + "recoveryDeleteCiphersTitle": { + "message": "Supprimer les éléments non récupérables du coffre" + }, + "recoveryDeleteCiphersDesc": { + "message": "Certains éléments de votre coffre n'ont pu être récupérés. Voulez-vous supprimer ces éléments non récupérables de votre coffre ?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Supprimer les dossiers non récupérables" + }, + "recoveryDeleteFoldersDesc": { + "message": "Certains de vos dossiers n'ont pu être récupérés. Voulez-vous supprimer ces dossiers irrécupérables de votre coffre ?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Remplacer la clé de chiffrement" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Votre paire de clés de chiffrement à clé publique n'a pu être récupérée. Voulez-vous remplacer votre clé de chiffrement par une nouvelle paire de clés ? Cela vous demandera de reconfigurer les accès d'urgence existants et les adhésions à l'organisation." + }, + "recoveryStepSyncTitle": { + "message": "Synchronisation des données" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Vérification de l'intégrité de la clé de chiffrement" + }, + "recoveryStepUserInfoTitle": { + "message": "Vérification des informations de l'utilisateur" + }, + "recoveryStepCipherTitle": { + "message": "Vérification de l'intégrité de l'élément du coffre" + }, + "recoveryStepFoldersTitle": { + "message": "Vérification de l'intégrité du dossier" + }, + "dataRecoveryTitle": { + "message": "Récupération des données et Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Utilisez l'outil de récupération de données pour diagnostiquer et réparer les problèmes avec votre compte. Après avoir exécuté les diagnostics, vous avez la possibilité d'enregistrer les journaux de diagnostic pour la prise en charge et l'option de réparer tous les problèmes détectés." + }, + "runDiagnostics": { + "message": "Lancer le diagnostique" + }, + "repairIssues": { + "message": "Réparer les problèmes" + }, + "saveDiagnosticLogs": { + "message": "Enregistrer les journaux de diagnostic" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Ce paramètre est géré par votre organisation." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Votre organisation a réglé le délai d'expiration de session maximal à $HOURS$ heure(s) et $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Votre organisation a défini le délai d'expiration de session par défaut sur À l'actualisation du navigateur." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Le délai d'expiration de session maximal ne peut pas dépasser $HOURS$ heure(s) et $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "À l'actualisation du navigateur" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Configurez une méthode de déverrouillage pour changer le délai d'expiration de votre coffre" + }, + "leaveConfirmationDialogTitle": { + "message": "Êtes-vous sûr de vouloir quitter ?" + }, + "leaveConfirmationDialogContentOne": { + "message": "En refusant, vos éléments personnels resteront dans votre compte, mais vous perdrez l'accès aux éléments partagés et aux fonctionnalités de l'organisation." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contactez votre administrateur pour regagner l'accès." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Quitter $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Comment gérer mon coffre ?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transférer les éléments vers $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ exige que tous les éléments soient détenus par l’organisation pour des raisons de sécurité et de conformité. Cliquez sur Accepter pour transférer la propriété de vos éléments.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accepter le transfert" + }, + "declineAndLeave": { + "message": "Refuser et quitter" + }, + "whyAmISeeingThis": { + "message": "Pourquoi est-ce que je vois ça ?" } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index f7a848bd025..6e33295162c 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index d723cb42140..baf7bafeb7a 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "ייצא מ־" }, - "exportVault": { - "message": "ייצא כספת" - }, - "exportSecrets": { - "message": "ייצא סודות" - }, "fileFormat": { "message": "פורמט קובץ" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "אמת סיסמה ראשית" }, - "confirmFormat": { - "message": "אשר פורמט" - }, "filePassword": { "message": "סיסמת קובץ" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "כלים" }, + "import": { + "message": "Import" + }, "importData": { "message": "ייבא נתונים" }, @@ -5169,9 +5163,21 @@ "message": "תקן", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "בכספת שלך קיים קובץ מצורף ישן שצריך לעבור תיקון לפני שתוכל להחליף את מפתחות ההצפנה של החשבון שלך." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "הסיסמה של טביעת האצבעות בחשבון שלך", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "הוזמנו בהצלחה" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "הוסרו בהצלחה" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "פסק זמן לכספת אינו בטווח המותר." }, - "disablePersonalVaultExport": { - "message": "הסר ייצוא כספת אישית" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "אל תאפשר לחברים לייצא נתונים מהכספת האישית שלהם." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "קוד אימות שגוי" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "סיסמה ראשית אינה נדרשת עוד עבור חברים בארגון הבא. נא לאשר את הדומיין שלהלן עם מנהל הארגון שלך." - }, "keyConnectorDomain": { "message": "דומיין של Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO מופעל" }, - "disabledSso": { - "message": "SSO כבוי" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ מוכרח להיכנס עם כניסה יחידה", @@ -8718,9 +8747,6 @@ "server": { "message": "שרת" }, - "exportData": { - "message": "ייצא נתונים" - }, "exportingOrganizationSecretDataTitle": { "message": "ייצוא נתונים ארגון סודיים" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "נדרשת כניסת SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "דגל האזור שנבחר" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "חברות למשפחות" }, - "planDescPremium": { - "message": "השלם אבטחה מקוונת" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "אבטחת פרימיום למשפחה שלך" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "לא סומנו יישומים קריטים" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 1c5a211aaca..bd4089e240f 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index f357718bab0..1716bdd25e8 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Izvezi iz" }, - "exportVault": { - "message": "Izvezi trezor" - }, - "exportSecrets": { - "message": "Izvezi tajne" - }, "fileFormat": { "message": "Format datoteke" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrdi glavnu lozinku" }, - "confirmFormat": { - "message": "Potvrdi oblik" - }, "filePassword": { "message": "Lozinka datoteke" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alati" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvezi podatke" }, @@ -5169,9 +5163,21 @@ "message": "Popravi", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Postoje stari privitci u tvom trezoru koje je potrebno popraviti prije rotacije ključa za šifriranje." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Jedinstvena fraza tvog računa", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Uspješno ponovno pozvano" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Uspješno uklonjeno" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Istek trezora nije unutar zadanog vremena." }, - "disablePersonalVaultExport": { - "message": "Onemogući izvoz osobnog trezora" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Onemogućuje korisnicima izvoz osobnog trezora." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Nevažeći kôd za provjeru" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Glavna lozinka više nije obavezna za članove ove organizacije. Provjeri prikazanu domenu sa svojim administratorom." - }, "keyConnectorDomain": { "message": "Domena konektora ključa" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO omogućen" }, - "disabledSso": { - "message": "SSO onemogućen" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ se mora prijavljivati sa SSO", @@ -8718,9 +8747,6 @@ "server": { "message": "Poslužitelj" }, - "exportData": { - "message": "Izvezi podatke" - }, "exportingOrganizationSecretDataTitle": { "message": "Izvoz tajnih podataka organizacije" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Potrebna je SSO prijava" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Zastava odabrane regije" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Obiteljsko članstvo" }, - "planDescPremium": { - "message": "Dovrši online sigurnost" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium sigurnost za tvoju obitelj" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Nisu odabrane kritične aplikacije" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 3d360541b93..38720b614fc 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportálás innen:" }, - "exportVault": { - "message": "Széf exportálása" - }, - "exportSecrets": { - "message": "Titkos adatok exportálása" - }, "fileFormat": { "message": "Fájlformátum" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Mesterjelszó megerősítése" }, - "confirmFormat": { - "message": "Formátum megerősítése" - }, "filePassword": { "message": "Fájl jelszó" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Eszközök" }, + "import": { + "message": "Importálás" + }, "importData": { "message": "Adatok importálása" }, @@ -5169,9 +5163,21 @@ "message": "Javítás", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Titkosítás javítása" + }, + "fixEncryptionTooltip": { + "message": "Ez a fájl elavult titkosítási módszert használ." + }, + "attachmentUpdated": { + "message": "A melléklet frissítésre került." + }, "oldAttachmentsNeedFixDesc": { "message": "A széfben régi mellékletek vannak, amelyeket javítani kell a fiók titkosító kulcsának fordítása előtt." }, + "itemsTransferred": { + "message": "Az elemek átvitelre kerültek." + }, "yourAccountsFingerprint": { "message": "Fiók ujjlenyomat kifejezés", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Az ismételt meghívás sikeres volt." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ felhasználó ismételten meghívásra került.", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ / $SELECTEDCOUNT$ felhasználó ismételten meghívásra került. $EXCLUDEDCOUNT$ nem kapott meghívást $LIMIT$ meghívási korlát miatt.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Az eltávolítás sikeres volt." }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "A széf időkifutás nincs az engedélyezett intervallunban." }, - "disablePersonalVaultExport": { - "message": "A személyes széf exportálás eltávolítása" + "disableExport": { + "message": "Exportálás eltávolítása" }, "disablePersonalVaultExportDescription": { "message": "Ne engedjük meg a tagoknak, hogy adatokat exportáljanak a saját széfből." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Érvénytelen ellenőrző kód" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A következő szervezet tagjai számára már nincs szükség mesterjelszóra. Erősítsük meg az alábbi tartományt a szervezet adminisztrátorával." - }, "keyConnectorDomain": { "message": "Key Connector tartomány" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Az SSO bekapcsolásra került." }, - "disabledSso": { - "message": "Az SSO bekapcsolásra került." + "ssoTurnedOff": { + "message": "Az SSO kikapcsolásra került." }, "emailMustLoginWithSso": { "message": "$EMAIL$ segítségével be kell jelentkezni egyszeri bejelentkezéssel.", @@ -8718,9 +8747,6 @@ "server": { "message": "Szerver" }, - "exportData": { - "message": "Adatok exportálása" - }, "exportingOrganizationSecretDataTitle": { "message": "Szervezeti titkos adatok exportálása" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO bejelentkezés szükséges" }, + "emailRequiredForSsoLogin": { + "message": "Email cím szükséges az SSO esetén." + }, "selectedRegionFlag": { "message": "Kiválasztott régió zászló" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Családi tagság" }, - "planDescPremium": { - "message": "Teljes körű online biztonság" + "advancedOnlineSecurity": { + "message": "Bővített online biztonság" }, "planDescFamiliesV2": { "message": "Prémium biztonság a család számára" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "A szervezet már nem használ mesterjelszavakat a Bitwardenbe bejelentkezéshez. A folytatáshoz ellenőrizzük a szervezetet és a tartományt." + }, + "continueWithLogIn": { + "message": "Folytatás bejelentkezéssel" + }, + "doNotContinue": { + "message": "Nincs folytatás" + }, + "domain": { + "message": "Tartomány" + }, + "keyConnectorDomainTooltip": { + "message": "Ez a tartomány tárolja a fiók titkosítási kulcsait, ezért győződjünk meg róla, hogy megbízunk-e benne. Ha nem vagyunk biztos benne, érdeklődjünk adminisztrátornál." + }, + "verifyYourOrganization": { + "message": "Szervezet ellenőrzése a bejelentkezéshez" + }, + "organizationVerified": { + "message": "A szervezet ellenőrzésre került." + }, + "domainVerified": { + "message": "A tartomány ellenőrzésre került." + }, + "leaveOrganizationContent": { + "message": "Ha nem ellenőrizzük a szervezetet, a szervezethez hozzáférés visszavonásra kerül." + }, + "leaveNow": { + "message": "Elhagyás most" + }, + "verifyYourDomainToLogin": { + "message": "Tartomány ellenőrzése a bejelentkezéshez" + }, + "verifyYourDomainDescription": { + "message": "A bejelentkezés folytatásához ellenőrizzük ezt a tartományt." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "A bejelentkezés folytatásához ellenőrizzük a szervezetet és a tartományt." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Nincsenek veszélyben levő kritikus alkalmazások." }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "A felhasználó ellenőrzése sikertelen volt." + }, + "recoveryDeleteCiphersTitle": { + "message": "Helyreállíthatatlan széf elemek törlése" + }, + "recoveryDeleteCiphersDesc": { + "message": "Néhány széf elemet nem sikerült helyreállítani. Törölni szeretnénk ezeket a helyreállíthatatlan elemeket a széfből?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Helyreállíthatatlan mappák törlése" + }, + "recoveryDeleteFoldersDesc": { + "message": "Néhány mappát nem sikerült helyreállítani. Törölni szeretnénk ezeket a helyreállíthatatlan nappákat a széfből?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Titkosító kulcs cseréje" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "A nyilvános kulcsú titkosítás kulcspárját nem sikerült helyreállítani. Szeretnénk lecserélni a titkosítási kulcsot egy új kulcspárra? Ehhez újra be kell üzemelni a meglévő vészhelyzeti hozzáférési és szervezeti tagságokat." + }, + "recoveryStepSyncTitle": { + "message": "Adatok szinkronizálása" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Titkosítási kulcs integritás ellenőrzése" + }, + "recoveryStepUserInfoTitle": { + "message": "Felhasználói információk ellenőrzése" + }, + "recoveryStepCipherTitle": { + "message": "Széf elem integritás ellenőrzése" + }, + "recoveryStepFoldersTitle": { + "message": "Mappa integritás ellenőrzése" + }, + "dataRecoveryTitle": { + "message": "Adat helyreállítás és diagnosztika" + }, + "dataRecoveryDescription": { + "message": "Használjuk az adat helyreállítási eszközt a fiókkal kapcsolatos problémák diagnosztizálásához és javításához. A diagnosztika futtatása után lehetőség van a diagnosztikai naplók mentésére támogatáshoz, valamint az észlelt problémák kijavításához." + }, + "runDiagnostics": { + "message": "Diagnosztika futtatása" + }, + "repairIssues": { + "message": "Hibák javítása" + }, + "saveDiagnosticLogs": { + "message": "Diagnosztikai naplók mentése" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Ezt a beállítást a szervezet lezeli." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "A szervezet a munkamenet maximális munkamenet időkifutását $HOURS$ órára és $MINUTES$ percre állította be.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "A szervezet az alapértelmezett munkamenet időkifutást a Böngésző frissítésekor értékre állította." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "A maximális időtúllépés nem haladhatja meg a $HOURS$ óra és $MINUTES$ perc értéket.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Böngésző frissítésekor" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Állítsunk be egy feloldási módot a széf időkifutási műveletének módosításához." + }, + "leaveConfirmationDialogTitle": { + "message": "Biztosan szeretnénk kilépni?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Az elutasítással a személyes elemek a fiókban maradnak, de elveszítjük hozzáférést a megosztott elemekhez és a szervezeti funkciókhoz." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Lépjünk kapcsolatba az adminisztrátorral a hozzáférés visszaszerzéséért." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "$ORGANIZATION$ elhagyása", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Hogyan kezeljem a széfet?" + }, + "transferItemsToOrganizationTitle": { + "message": "Elemek átvitele $ORGANIZATION$ szervezethez", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ megköveteli, hogy minden elem a szervezet tulajdonában legyen a biztonság és a megfelelőség érdekében. Kattintás az elfogadásra az elemek tulajdonjogának átruházásához.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Átvitel elfogadása" + }, + "declineAndLeave": { + "message": "Elutasítás és kilépés" + }, + "whyAmISeeingThis": { + "message": "Miért látható ez?" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 4dc41e8f928..165deb7b917 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Ekspor dari" }, - "exportVault": { - "message": "Ekspor Brankas" - }, - "exportSecrets": { - "message": "Ekspor rahasia" - }, "fileFormat": { "message": "Format Berkas" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Konfirmasi sandi utama" }, - "confirmFormat": { - "message": "Konfirmasi format" - }, "filePassword": { "message": "Sandi berkas" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alat" }, + "import": { + "message": "Import" + }, "importData": { "message": "Impor Data" }, @@ -5169,9 +5163,21 @@ "message": "Perbaiki", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Ada lampiran berkas lama di brankas Anda yang perlu diperbaiki sebelum Anda dapat memutar kunci enkripsi akun Anda." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Frase sidik jari akun Anda", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Berhasil mengundang kembali." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Penghapusan sukses" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Kode verifikasi tidak valid" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO aktif" }, - "disabledSso": { - "message": "SSO tidak aktif" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 459f1dfd3a4..87015d32666 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Esporta da" }, - "exportVault": { - "message": "Esporta cassaforte" - }, - "exportSecrets": { - "message": "Esporta segreti" - }, "fileFormat": { "message": "Formato file" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Conferma password principale" }, - "confirmFormat": { - "message": "Conferma formato" - }, "filePassword": { "message": "Password del file" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Strumenti" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importa dati" }, @@ -3063,7 +3057,7 @@ "message": "1 GB di spazio di archiviazione crittografato per gli allegati." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "Archivio crittografato di $SIZE$ per allegati.", "placeholders": { "size": { "content": "$1", @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Il tuo abbonamento Premium è scaduto" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "Per recuperare l'accesso al tuo archivio, riavvia il tuo abbonamento Premium. Se modifichi i dettagli di un elemento archiviato prima del riavvio, sarà spostato nella tua cassaforte." }, "restartPremium": { - "message": "Restart Premium" + "message": "Riavvia Premium" }, "additionalStorageGb": { "message": "Spazio di archiviazione aggiuntivo (GB)" @@ -4627,19 +4621,19 @@ "message": "Ulteriori informazioni" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "S'è verificato un errore durante l'aggiornamento delle impostazioni di crittografia." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Aggiorna le impostazioni di crittografia" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Le impostazioni di crittografia consigliate miglioreranno la sicurezza del tuo account. Inserisci la password principale per aggiornare." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Conferma la tua identità per continuare" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Inserisci la password principale" }, "updateSettings": { "message": "Aggiorna le impostazioni" @@ -5169,9 +5163,21 @@ "message": "Correggi", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Correggi la crittografia" + }, + "fixEncryptionTooltip": { + "message": "Questo file usa un metodo di crittografia obsoleto." + }, + "attachmentUpdated": { + "message": "Allegato aggiornato" + }, "oldAttachmentsNeedFixDesc": { "message": "Ci sono vecchi file allegati nella tua cassaforte che devono essere corretti prima di poter ruotare la chiave di crittografia del tuo account." }, + "itemsTransferred": { + "message": "Elementi trasferiti" + }, "yourAccountsFingerprint": { "message": "Frase impronta del tuo account", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Invitato di nuovo" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ utente/i ri-invitato/i", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ utenti su $SELECTEDCOUNT$ ri-invitati. $EXCLUDEDCOUNT$ non hanno ricevuto l'invito a causa del limite di $LIMIT$ inviti.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Rimosso" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Il timeout della cassaforte non è all'interno dell'intervallo consentito." }, - "disablePersonalVaultExport": { - "message": "Rimuovi esportazione cassaforte individuale" + "disableExport": { + "message": "Rimuovi esportazione" }, "disablePersonalVaultExportDescription": { "message": "Non consentire ai membri di esportare i dati dalla loro cassaforte individuale." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Codice di verifica non valido" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "La password principale non è più richiesta per i membri dell'organizzazione. Per favore, conferma il dominio qui sotto con l'amministratore." - }, "keyConnectorDomain": { "message": "Dominio Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO attivato" }, - "disabledSso": { - "message": "SSO disattivato" + "ssoTurnedOff": { + "message": "Single Sign-On (SSO) disattivato" }, "emailMustLoginWithSso": { "message": "$EMAIL$ deve accedere con Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Esporta dati" - }, "exportingOrganizationSecretDataTitle": { "message": "Esportando dati segreti dell'organizzazione" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Il login SSO è obbligatorio" }, + "emailRequiredForSsoLogin": { + "message": "L'email è richiesta per SSO (Single Sign-On)" + }, "selectedRegionFlag": { "message": "Bandiera della regione selezionata" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Abbonamento famiglie" }, - "planDescPremium": { - "message": "Sicurezza online completa" + "advancedOnlineSecurity": { + "message": "Sicurezza online avanzata" }, "planDescFamiliesV2": { "message": "Sicurezza Premium per la tua famiglia" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Non ci sono applicazioni contrassegnate come critiche" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Verifica dell'utente non riuscita." + }, + "recoveryDeleteCiphersTitle": { + "message": "Elimina gli oggetti della cassaforte non recuperabili" + }, + "recoveryDeleteCiphersDesc": { + "message": "Alcuni oggetti della tua cassaforte non possono essere recuperati. Vuoi eliminarli?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Elimina le cartelle non recuperabili" + }, + "recoveryDeleteFoldersDesc": { + "message": "Alcune cartelle della tua cassaforte non possono essere recuperate. Vuoi eliminarle?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Cambia chiave crittografica" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "La tua coppia di chiavi crittografiche non può essere recuperata. Vuoi sostituirla con una nuova coppia di chiavi? Attenzione: dovrai impostare nuovamente i membri abilitati all'accesso d'emergenza." + }, + "recoveryStepSyncTitle": { + "message": "Sincronizzazione dati…" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifica integrità della chiave crittografica" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifica delle informazioni dell'utente" + }, + "recoveryStepCipherTitle": { + "message": "Verifica integrità dell'oggetto…" + }, + "recoveryStepFoldersTitle": { + "message": "Verifica integrità della cartella…" + }, + "dataRecoveryTitle": { + "message": "Recupero dati e diagnostica" + }, + "dataRecoveryDescription": { + "message": "Usa lo strumento di recupero dati per diagnosticare e riparare i problemi dell'account. Dopo la scansione della diagnostica, potrai salvare i registri diagnostici per il supporto e avrai la possibilità di riparare eventuali problemi rilevati." + }, + "runDiagnostics": { + "message": "Esegui la diagnostica" + }, + "repairIssues": { + "message": "Ripara i problemi rilevati" + }, + "saveDiagnosticLogs": { + "message": "Salva registri diagnostici" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Questa impostazione è gestita dalla tua organizzazione." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "La tua organizzazione ha impostato $HOURS$ ora/e e $MINUTES$ minuto/i come durata massima della sessione.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "In base alle impostazioni della tua organizzazione, la sessione terminerà ogni volta che la pagina sarà chiusa o ricaricata." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "La durata della sessione non può superare $HOURS$ ora/e e $MINUTES$ minuto/i", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Al refresh o riavvio del browser" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Imposta un metodo di sblocco per modificare l'azione al timeout" + }, + "leaveConfirmationDialogTitle": { + "message": "Vuoi davvero abbandonare?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Se rifiuti, tutti gli elementi esistenti resteranno nel tuo account, ma perderai l'accesso agli oggetti condivisi e alle funzioni organizzative." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contatta il tuo amministratore per recuperare l'accesso." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Abbandona $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Come si gestisce la cassaforte?" + }, + "transferItemsToOrganizationTitle": { + "message": "Trasferisci gli elementi in $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ richiede che tutti gli elementi siano di proprietà dell'organizzazione per motivi di conformità e sicurezza. Clicca su 'Accetta' per trasferire la proprietà.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accetta il trasferimento" + }, + "declineAndLeave": { + "message": "Rifiuta e abbandona" + }, + "whyAmISeeingThis": { + "message": "Perché vedo questo avviso?" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 33535634bc8..b7f3426fa6e 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "エクスポート元" }, - "exportVault": { - "message": "保管庫のエクスポート" - }, - "exportSecrets": { - "message": "シークレットのエクスポート" - }, "fileFormat": { "message": "ファイル形式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "マスターパスワードの確認" }, - "confirmFormat": { - "message": "フォーマットの確認" - }, "filePassword": { "message": "ファイルパスワード" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ツール" }, + "import": { + "message": "Import" + }, "importData": { "message": "データをインポート" }, @@ -5169,9 +5163,21 @@ "message": "修正", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "暗号化キーのローテーションを行う前に、保管庫内の古い添付ファイルを修正する必要があります。" }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "アカウントのパスフレーズ", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "再招待に成功しました" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "削除しました " }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "保管庫のタイムアウトは許可された範囲内にありません。" }, - "disablePersonalVaultExport": { - "message": "個別の保管庫のエクスポートを削除" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "メンバーが個人の保管庫からデータをエクスポートすることを許可しません。" @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "認証コードが間違っています" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO を有効にしました" }, - "disabledSso": { - "message": "SSOを無効にしました" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "サーバー" }, - "exportData": { - "message": "データのエクスポート" - }, "exportingOrganizationSecretDataTitle": { "message": "組織のシークレットデータのエクスポート" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO ログインが必要です" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "リージョン選択" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 47a46367feb..1018f2255fc 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "ექსპორტი საცავის" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ფაილის ფორმატი" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 608215f8155..26f146809b5 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 2f0759ff939..9b4407e3ec6 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "ರಫ್ತು ವಾಲ್ಟ್" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ಫೈಲ್ ಮಾದರಿ" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ಉಪಕರಣ" }, + "import": { + "message": "Import" + }, "importData": { "message": "ಡೇಟಾವನ್ನು ಆಮದು ಮಾಡಿ" }, @@ -5169,9 +5163,21 @@ "message": "ಹೊಂದಿಸು", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್‌ನಲ್ಲಿ ಹಳೆಯ ಫೈಲ್ ಲಗತ್ತುಗಳಿವೆ, ಅದನ್ನು ನಿಮ್ಮ ಖಾತೆಯ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ತಿರುಗಿಸುವ ಮೊದಲು ಸರಿಪಡಿಸಬೇಕಾಗಿದೆ." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "ನಿಮ್ಮ ಖಾತೆಯ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ನುಡಿಗಟ್ಟು", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "ಯಶಸ್ವಿಯಾಗಿ ಪುನಃ ಆಹ್ವಾನಿಸಲಾಗಿದೆ." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "ಯಶಸ್ವಿಯಾಗಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index aaef9d378e9..db88018ce26 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "보관함 내보내기" - }, - "exportSecrets": { - "message": "비밀 데이터 내보내기" - }, "fileFormat": { "message": "파일 형식" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "마스터 비밀번호 확인" }, - "confirmFormat": { - "message": "형식 확인" - }, "filePassword": { "message": "파일 암호" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "도구" }, + "import": { + "message": "Import" + }, "importData": { "message": "데이터 가져오기" }, @@ -5169,9 +5163,21 @@ "message": "수정", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "계정의 암호화 키를 교체하기 전에 보관함 내 오래된 파일 수정이 필요합니다." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "계정 지문 구절", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "성공적으로 재초대되었습니다." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "성공적으로 제거됨" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "개인 보관함 내보내기 비활성화" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "유효하지 않은 확인 코드" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO 활성화됨" }, - "disabledSso": { - "message": "SSO 비활성화됨" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index d627835b1f4..4b1a5307179 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Izgūt no" }, - "exportVault": { - "message": "Izgūt glabātavas saturu" - }, - "exportSecrets": { - "message": "Izgūt noslēpumus" - }, "fileFormat": { "message": "Datnes veids" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Apstiprināt galveno paroli" }, - "confirmFormat": { - "message": "Apstiprināt veidolu" - }, "filePassword": { "message": "Datnes parole" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Rīki" }, + "import": { + "message": "Ievietot" + }, "importData": { "message": "Ievietot datus" }, @@ -5169,9 +5163,21 @@ "message": "Salabot", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Salabot šifrēšanu" + }, + "fixEncryptionTooltip": { + "message": "Šī datne izmanto novecojušu šifrēšanas veidu." + }, + "attachmentUpdated": { + "message": "Pielikums atjaunināts" + }, "oldAttachmentsNeedFixDesc": { "message": "Glabātavā atrodas veci datņu pielikumi, kas ir jāsalabo, pirms tiek veikta konta šifrēšanas atslēgu maiņa." }, + "itemsTransferred": { + "message": "Vienumi pārcelti" + }, "yourAccountsFingerprint": { "message": "Konta atpazīšanas vārdkopa", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Uzaicinājums veiksmīgi nosūtīts atkārtoti." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ lietotāji uzaicināti atkārtoti", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "Atkārtoti uzaicināti $LIMIT$ no $SELECTEDCOUNT$ lieotājiem. $EXCLUDEDCOUNT$ netika uzaicināt uzaicinājumu ierobežojuma ($LIMIT$) dēļ.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Veiksmīgi noņemts" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Glabātavas noildze nav pieļaujamajās robežvērtībās." }, - "disablePersonalVaultExport": { - "message": "Atspējot personīgās glabātavas izgūšanu" + "disableExport": { + "message": "Noņemt izguvi" }, "disablePersonalVaultExportDescription": { "message": "Neļaut dalībniekiem izgūt datus no viņu glabātavas." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Nederīgs apliecinājuma kods" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Galvenā parole vairs nav nepieciešama turpmāk minētās apvienības dalībniekiem. Lūgums saskaņot zemāk esošo domēnu ar savas apvienības pārvaldītāju." - }, "keyConnectorDomain": { "message": "Key Connector domēns" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Iespējota vienotā pieteikšanās" }, - "disabledSso": { - "message": "Atspējota vienotā pieteikšanās" + "ssoTurnedOff": { + "message": "Vienotā pieteikšanās izslēgta" }, "emailMustLoginWithSso": { "message": "$EMAIL$ jāpiesakās ar vienoto pieteikšanos", @@ -8718,9 +8747,6 @@ "server": { "message": "Serveris" }, - "exportData": { - "message": "Izgūt datus" - }, "exportingOrganizationSecretDataTitle": { "message": "Apvienības slepeno datu izgūšana" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Vienotā pieteikšanās ir nepieciešama" }, + "emailRequiredForSsoLogin": { + "message": "SSO ir nepieciešama e-pasta adrese" + }, "selectedRegionFlag": { "message": "Atlasītā apgabala karogs" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Dalība ģimeņu plānā" }, - "planDescPremium": { - "message": "Pilnīga drošība tiešsaistē" + "advancedOnlineSecurity": { + "message": "Izvērsta tiešsaistes drošība" }, "planDescFamiliesV2": { "message": "Augstākā labuma drošība ģimenei" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Apvienība vairs neizmanto galvenās paroles, lai pieteiktos Bitwarden. Lai turpinātu, jāapliecina apvienība un domēns." + }, + "continueWithLogIn": { + "message": "Turpināt ar pieteikšanos" + }, + "doNotContinue": { + "message": "Neturpināt" + }, + "domain": { + "message": "Domēns" + }, + "keyConnectorDomainTooltip": { + "message": "Šajā domēnā tiks glabātas konta šifrēšanas atslēgas, tādēļ jāpārliecinās par uzticamību. Ja nav pārliecības, jāsazinās ar savu pārvaldītāju." + }, + "verifyYourOrganization": { + "message": "Jāapliecina apvienība, lai pieteiktos" + }, + "organizationVerified": { + "message": "Apvienība apliecināta" + }, + "domainVerified": { + "message": "Domēns ir apliecināts" + }, + "leaveOrganizationContent": { + "message": "Ja neapliecināsi apvienību, tiks atsaukta piekļuve tai." + }, + "leaveNow": { + "message": "Pamest tagad" + }, + "verifyYourDomainToLogin": { + "message": "Jāapliecina domēns, lai pieteiktos" + }, + "verifyYourDomainDescription": { + "message": "Lai turpinātu pieteikšanos, jāapliecina šis domēns." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Lai turpinātu pieteikšanos, jāapliecina apvienība un domēns." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Neviena būtiska lietotne nav atlasīta" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Lietotāja apliecināšana neizdevās." + }, + "recoveryDeleteCiphersTitle": { + "message": "Izdzēst neatkopjamos glabātavas vienumus" + }, + "recoveryDeleteCiphersDesc": { + "message": "Dažus no glabātavas vienumiem nevarēja atkopt. Vai izdzēst tos?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Izdzēst neatkopjamās mapes" + }, + "recoveryDeleteFoldersDesc": { + "message": "Dažus no mapēm nevarēja atkopt. Vai izdzēst neatkopjamās mapes no glabātavas?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Aizvietot šifrēšanas atslēgu" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Vai tiešām pamest?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Pēc noraidīšanas personīgie vienumi paliks Tavā kontā, bet Tu zaudēsi piekļvuvi kopīgotajiem vienumiem un apvienību iespējām." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Jāsazinās ar savu pārvaldītāju, lai atgūtu piekļuvi." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Pamest $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Kā es varu pārvaldīt savu glabātavu?" + }, + "transferItemsToOrganizationTitle": { + "message": "Pārcelt vienumus uz $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 8d49e35690e..5943f3630a3 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "വാൾട് എക്സ്പോർട്" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ഫയൽ ഫോർമാറ്റ്" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ഉപകരണങ്ങൾ" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import Data" }, @@ -5169,9 +5163,21 @@ "message": "പരിഹരിക്കുക", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "നിങ്ങളുടെ അക്കൗണ്ടിന്റെ എൻ‌ക്രിപ്ഷൻ കീ തിരിക്കുന്നതിന് മുമ്പ് ശരിയാക്കേണ്ട പഴയ ഫയൽ അറ്റാച്ചുമെന്റുകൾ നിങ്ങളുടെ നിലവറയിൽ ഉണ്ട്." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "നിങ്ങളുടെ അക്കൗണ്ടിൻ്റെ ഫിംഗർപ്രിന്റ് ഫ്രേസ്‌", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index 6ba6661c478..5d938996627 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index 608215f8155..26f146809b5 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 042444814e6..9e5c0a6cbf4 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksport fra" }, - "exportVault": { - "message": "Eksporter hvelvet" - }, - "exportSecrets": { - "message": "Eksporter hemmeligheter" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekreft hovedpassord" }, - "confirmFormat": { - "message": "Bekreft format" - }, "filePassword": { "message": "Filpassord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Verktøy" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importer data" }, @@ -5169,9 +5163,21 @@ "message": "Reparer", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Hvelvet ditt har gamle fil-vedlegg som må repareres før du kan oppdatere krypteringsnøkkelen til kontoen din." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Din kontos fingeravtrykksfrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvitasjon vellykket." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Fjernet" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Hvelv-timeout er utenfor gyldig intervall." }, - "disablePersonalVaultExport": { - "message": "Deaktivere personlig hvelv eksport" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ugyldig bekreftelseskode" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Skrudde på SSO" }, - "disabledSso": { - "message": "Skrudde av SSO" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Eksporter data" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksporterer organisasjonens hemmelige data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 31367740728..9de1b17c391 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 333df664f77..51ac08fd814 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporteren vanuit" }, - "exportVault": { - "message": "Kluis exporteren" - }, - "exportSecrets": { - "message": "Geheimen exporteren" - }, "fileFormat": { "message": "Bestandsindeling" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Nieuw hoofdwachtwoord bevestigen" }, - "confirmFormat": { - "message": "Formaat bevestigen" - }, "filePassword": { "message": "Bestandswachtwoord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Hulpmiddelen" }, + "import": { + "message": "Importeren" + }, "importData": { "message": "Gegevens importeren" }, @@ -5169,9 +5163,21 @@ "message": "Oplossen", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Versleuteling repareren" + }, + "fixEncryptionTooltip": { + "message": "Dit bestand gebruikt een verouderde versleutelingsmethode." + }, + "attachmentUpdated": { + "message": "Bijlagen bijgewerkt" + }, "oldAttachmentsNeedFixDesc": { "message": "Er zijn oude bestandsbijlagen in je kluis die aangepast moeten worden voordat je je encryptiesleutels kunt roteren." }, + "itemsTransferred": { + "message": "Items overgedragen" + }, "yourAccountsFingerprint": { "message": "Vingerafdrukzin van je account", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Succesvol opnieuw uitgenodigd" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ gebruikers opnieuw uitgenodigd", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ van $SELECTEDCOUNT$ gebruikers opnieuw uitgenodigd. $EXCLUDEDCOUNT$ werden niet uitgenodigd vanwege de $LIMIT$ uitnodigingslimiet.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Succesvol verwijderd" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Kluis time-out ligt niet binnen het toegestane bereik." }, - "disablePersonalVaultExport": { - "message": "Persoonlijke kluis exporteren uitschakelen" + "disableExport": { + "message": "Export verwijderen" }, "disablePersonalVaultExportDescription": { "message": "Exporteren van gegevens uit hun individuele kluis niet toestaan." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ongeldige verificatiecode" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Voor leden van de volgende organisatie is een hoofdwachtwoord niet langer nodig. Bevestig het domein hieronder met de beheerder van je organisatie." - }, "keyConnectorDomain": { "message": "Key Connector-domein" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO ingeschakeld" }, - "disabledSso": { - "message": "SSO uitgeschakeld" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ moet met Single Sign-on inloggen", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Gegevens exporteren" - }, "exportingOrganizationSecretDataTitle": { "message": "Geheime gegevens van de organisatie exporteren" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is vereist" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Geselecteerde regionale vlag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Lidmaatschap families" }, - "planDescPremium": { - "message": "Online beveiliging voltooien" + "advancedOnlineSecurity": { + "message": "Geavanceerde online beveiliging" }, "planDescFamiliesV2": { "message": "Premium beveiliging voor je familie" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Je organisatie maakt niet langer gebruik van hoofdwachtwoorden om in te loggen op Bitwarden. Controleer de organisatie en het domein om door te gaan." + }, + "continueWithLogIn": { + "message": "Doorgaan met inloggen" + }, + "doNotContinue": { + "message": "Niet verder gaan" + }, + "domain": { + "message": "Domein" + }, + "keyConnectorDomainTooltip": { + "message": "Dit domein zal de encryptiesleutels van je account opslaan, dus zorg ervoor dat je het vertrouwt. Als je het niet zeker weet, controleer dan bij je beheerder." + }, + "verifyYourOrganization": { + "message": "Verifieer je organisatie om in te loggen" + }, + "organizationVerified": { + "message": "Organisatie geverifieerd" + }, + "domainVerified": { + "message": "Domein geverifieerd" + }, + "leaveOrganizationContent": { + "message": "Als je je organisatie niet verifieert, wordt je toegang tot de organisatie ingetrokken." + }, + "leaveNow": { + "message": "Nu verlaten" + }, + "verifyYourDomainToLogin": { + "message": "Verifieer je domein om in te loggen" + }, + "verifyYourDomainDescription": { + "message": "Bevestig dit domein om verder te gaan met inloggen." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Bevestig organisatie en domein om verder te gaan met inloggen." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Geen belangrijke applicaties geselecteerd" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Onherstelbare kluisitems verwijderen" + }, + "recoveryDeleteCiphersDesc": { + "message": "Sommige kluisitems konden niet worden hersteld. Wilt je deze onherstelbare items uit je kluis verwijderen?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Onherstelbare mappen verwijderen" + }, + "recoveryDeleteFoldersDesc": { + "message": "Sommige mappen konden niet worden hersteld. Wilt je deze onherstelbare mappen uit je kluis verwijderen?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Encryptiesleutel vervangen" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Je sleutelpaar voor versleuteling met publieke sleutel kon niet worden hersteld. Wilt je je encryptiesleutel vervangen door een nieuwe sleutel? Hiervoor zal je bestaande noodtoegang en organisatielidmaatschappen opnieuw moeten instellen." + }, + "recoveryStepSyncTitle": { + "message": "Data synchroniseren" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Integriteit encryptiesleutel verifiëren" + }, + "recoveryStepUserInfoTitle": { + "message": "Gebruikersinformatie verifiëren" + }, + "recoveryStepCipherTitle": { + "message": "Integriteit kluisitem verifiëren" + }, + "recoveryStepFoldersTitle": { + "message": "Integriteit map verifiëren" + }, + "dataRecoveryTitle": { + "message": "Gegevensherstel en diagnostiek" + }, + "dataRecoveryDescription": { + "message": "Gebruik het hulpmiddelen voor gegevensherstel om problemen met je account te diagnosticeren en repareren. Na het uitvoeren van de diagnose heb je de optie om diagnostische logboeken op te slaan voor ondersteuning en de optie om gedetecteerde problemen op te lossen." + }, + "runDiagnostics": { + "message": "Diagnose uitvoeren" + }, + "repairIssues": { + "message": "Problemen oplossen" + }, + "saveDiagnosticLogs": { + "message": "Diagnostische logs opslaan" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Deze instelling wordt beheerd door je organisatie." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Je organisatie heeft de maximale sessietime-out ingesteld op $HOURS$ uur en $MINUTES$ minuten.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Je organisatie heeft de standaard sessietime-out ingesteld op Browser verversen." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximale time-out kan niet langer zijn dan $HOURS$ uur en $MINUTES$ minu(u) t(en)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Browser verversen" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Stel een ontgrendelingsmethode in om je kluis time-out actie te wijzigen" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 32c452cf657..389bf4516e3 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index 608215f8155..26f146809b5 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index f5e6b898bff..18207f16ca6 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksportuj z" }, - "exportVault": { - "message": "Eksportuj sejf" - }, - "exportSecrets": { - "message": "Eksportuj sekrety" - }, "fileFormat": { "message": "Format pliku" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potwierdź hasło główne" }, - "confirmFormat": { - "message": "Potwierdź format" - }, "filePassword": { "message": "Hasło pliku" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Narzędzia" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importuj dane" }, @@ -5169,9 +5163,21 @@ "message": "Napraw", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "W Twoim sejfie istnieją stare załączniki, które muszą zostać naprawione, zanim będziesz mógł zmienić klucz szyfrowania Twojego konta." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Unikalny identyfikator Twojego konta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Zaproszony ponownie" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Usunięto" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Czas blokowania sejfu nie jest w dozwolonym zakresie." }, - "disablePersonalVaultExport": { - "message": "Wyłącz eksportowanie osobistego sejfu" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Nie zezwalaj użytkownikom na eksport danych z ich indywidualnego sejfu." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Kod weryfikacyjny jest nieprawidłowy" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Hasło główne nie jest już wymagane dla członków następującej organizacji. Proszę potwierdzić poniższą domenę u administratora organizacji." - }, "keyConnectorDomain": { "message": "Domena Key Connector'a" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "Logowanie jednokrotne SSO zostało włączone" }, - "disabledSso": { - "message": "Logowanie jednokrotne SSO zostało wyłączone" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Serwer" }, - "exportData": { - "message": "Eksportuj dane" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksportowanie sekretnych danych organizacji" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Logowaniez użyciem SSO jest wymagane" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Flaga wybranego regionu" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index ff5686cbba8..297afd6f0bb 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -1519,7 +1519,7 @@ "message": "Pressione sua YubiKey para autenticar-se" }, "authenticationTimeout": { - "message": "Tempo limite da autenticação atingido" + "message": "Limite de tempo da autenticação atingido" }, "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." @@ -1958,10 +1958,10 @@ "message": "Confirmar exportação de segredos" }, "exportWarningDesc": { - "message": "Esta exportação contém os dados do seu cofre em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague o arquivo imediatamente após terminar de usá-lo." + "message": "Esta exportação contém os dados do seu cofre em um formato sem criptografia. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague o arquivo imediatamente após terminar de usá-lo." }, "exportSecretsWarningDesc": { - "message": "Esta exportação contém seus dados de segredos em um formato não criptografado. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague-o imediatamente após terminar de usá-lo." + "message": "Esta exportação contém seus dados de segredos em um formato sem criptografia. Você não deve armazenar ou enviar o arquivo exportado por canais inseguros (como e-mail). Apague-o imediatamente após terminar de usá-lo." }, "encExportKeyWarningDesc": { "message": "Esta exportação criptografa seus dados usando a chave de criptografia da sua conta. Se você rotacionar a chave de criptografia da sua conta, você deve exportar novamente, já que você não será capaz de descriptografar este arquivo de exportação." @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar de" }, - "exportVault": { - "message": "Exportar cofre" - }, - "exportSecrets": { - "message": "Exportar segredos" - }, "fileFormat": { "message": "Formato do arquivo" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar senha principal" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Senha do arquivo" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Ferramentas" }, + "import": { + "message": "Importar" + }, "importData": { "message": "Importar dados" }, @@ -2871,7 +2865,7 @@ } }, "noExposedPasswords": { - "message": "Nenhum item em seu cofre tem senhas expostas em vazamentos de dados conhecidos." + "message": "Nenhum item no seu cofre tem senhas expostas em vazamentos de dados conhecidos." }, "checkExposedPasswords": { "message": "Conferir senhas expostas" @@ -3078,7 +3072,7 @@ "message": "Acesso de emergência" }, "premiumSignUpReports": { - "message": "Higiene de senhas, saúde da conta, e relatórios sobre vazamentos de dados para manter o seu cofre seguro." + "message": "Relatórios de higiene de senha, saúde da conta, e vazamentos de dados para manter o seu cofre seguro." }, "premiumSignUpTotp": { "message": "Gerador de código de verificação TOTP (2FA) para credenciais no seu cofre." @@ -4331,7 +4325,7 @@ "message": "Esta solicitação não é mais válida." }, "loginRequestApprovedForEmailOnDevice": { - "message": "Solicitação de autenticação aprovada para $EMAIL$ em $DEVICE$", + "message": "Solicitação de acesso aprovada para $EMAIL$ em $DEVICE$", "placeholders": { "email": { "content": "$1", @@ -4344,10 +4338,10 @@ } }, "youDeniedLoginAttemptFromAnotherDevice": { - "message": "Você negou uma tentativa de autenticação de outro dispositivo. Se era você, tente se conectar com o dispositivo novamente." + "message": "Você negou uma tentativa de acesso de outro dispositivo. Se era você, tente se conectar com o dispositivo novamente." }, "loginRequestHasAlreadyExpired": { - "message": "A solicitação de autenticação já expirou." + "message": "A solicitação de acesso já expirou." }, "justNow": { "message": "Agora há pouco" @@ -4512,13 +4506,13 @@ "message": "Você está usando um navegador da web não suportado. O cofre web pode não funcionar corretamente." }, "youHaveAPendingLoginRequest": { - "message": "Você tem uma solicitação de autenticação pendente de outro dispositivo." + "message": "Você tem uma solicitação de acesso pendente de outro dispositivo." }, "reviewLoginRequest": { - "message": "Revisar solicitação de autenticação" + "message": "Revisar solicitação de acesso" }, "loginRequest": { - "message": "Solicitação de autenticação" + "message": "Solicitação de acesso" }, "freeTrialEndPromptCount": { "message": "Seu teste grátis termina em $COUNT$ dias.", @@ -5045,13 +5039,13 @@ "message": "Filtros" }, "vaultTimeout": { - "message": "Tempo limite do cofre" + "message": "Limite de tempo do cofre" }, "vaultTimeout1": { - "message": "Tempo limite" + "message": "Limite de tempo" }, "vaultTimeoutDesc": { - "message": "Escolha quando o seu cofre executará a ação do tempo limite do cofre." + "message": "Escolha quando o seu cofre executará a ação do limite de tempo do cofre." }, "vaultTimeoutLogoutDesc": { "message": "Escolha quando seu cofre será desconectado." @@ -5169,9 +5163,21 @@ "message": "Corrigir", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Corrigir criptografia" + }, + "fixEncryptionTooltip": { + "message": "Este arquivo está usando um método de criptografia desatualizado." + }, + "attachmentUpdated": { + "message": "Anexo atualizado" + }, "oldAttachmentsNeedFixDesc": { "message": "Há anexos de arquivos antigos no seu cofre que precisam ser corrigidos antes que você possa rotacionar a chave de criptografia da sua conta." }, + "itemsTransferred": { + "message": "Itens transferidos" + }, "yourAccountsFingerprint": { "message": "A frase biométrica da sua conta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5320,7 +5326,7 @@ "message": "Preferência do usuário" }, "vaultTimeoutAction": { - "message": "Ação do tempo limite do cofre" + "message": "Ação do limite de tempo do cofre" }, "vaultTimeoutActionLockDesc": { "message": "A senha principal ou outro método de desbloqueio é necessário para acessar seu cofre novamente." @@ -5397,10 +5403,10 @@ } }, "vaultTimeoutLogOutConfirmation": { - "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação on-line após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" + "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação on-line após o período de limite de tempo. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de ação do tempo limite" + "message": "Confirmação de ação do limite de tempo" }, "hidePasswords": { "message": "Ocultar senhas" @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Re-convidado com sucesso" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ usuários re-convidados", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ dos $SELECTEDCOUNT$ usuários foram re-convidados. $EXCLUDEDCOUNT$ não foram convidados devido ao limite de convite de $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removido com sucesso" }, @@ -6665,22 +6697,22 @@ "message": "Sua organização atualizou suas opções de descriptografia. Configure uma senha principal para acessar seu cofre." }, "sessionTimeoutPolicyTitle": { - "message": "Tempo limite da sessão" + "message": "Limite de tempo da sessão" }, "sessionTimeoutPolicyDescription": { - "message": "Configure um tempo limite máximo para a sessão de todos os membros, exceto os proprietários." + "message": "Configure um limite de tempo máximo para a sessão de todos os membros, exceto os proprietários." }, "maximumAllowedTimeout": { - "message": "Tempo limite máximo permitido" + "message": "Limite de tempo máximo permitido" }, "maximumAllowedTimeoutRequired": { - "message": "Tempo limite máximo permitido é necessário." + "message": "Limite de tempo máximo permitido é necessário." }, "sessionTimeoutPolicyInvalidTime": { "message": "Tempo é inválido. Altere pelo menos um valor." }, "sessionTimeoutAction": { - "message": "Ação do tempo limite da sessão" + "message": "Ação do limite de tempo da sessão" }, "immediately": { "message": "Imediatamente" @@ -6698,7 +6730,7 @@ "message": "Minutos" }, "sessionTimeoutConfirmationNeverTitle": { - "message": "Você tem certeza de que deseja permitir um tempo limite máximo de \"Nunca\" para todos os membros?" + "message": "Você tem certeza de que deseja permitir um limite de tempo máximo de \"Nunca\" para todos os membros?" }, "sessionTimeoutConfirmationNeverDescription": { "message": "Esta opção salvará as chaves criptográficas dos seus membros em seus dispositivos. Se escolher esta opção, certifique-se de que seus dispositivos estão adequadamente protegidos." @@ -6713,7 +6745,7 @@ "message": "O aplicativo móvel e web usarão \"no reinício do aplicativo\" como tempo máximo permitido, já que a opção não é suportada." }, "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização configuraram o seu máximo permitido do tempo limite do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "message": "As políticas da sua organização configuraram o seu máximo permitido do limite de tempo do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -6739,7 +6771,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. \nO tempo limite máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre está configurada como $ACTION$.", + "message": "As políticas da sua organização estão afetando o limite de tempo do seu cofre. \nO limite de tempo máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de limite de tempo do seu cofre está configurada como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -6756,7 +6788,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "As políticas da sua organização configuraram a ação do tempo limite do seu cofre para $ACTION$.", + "message": "As políticas da sua organização configuraram a ação do limite de tempo do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -6765,16 +6797,16 @@ } }, "vaultTimeoutToLarge": { - "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." + "message": "O limite de tempo do seu cofre excede as restrições estabelecidas pela sua organização." }, "vaultCustomTimeoutMinimum": { - "message": "O mínimo do tempo limite personalizado é de 1 minuto." + "message": "O mínimo do limite de tempo personalizado é de 1 minuto." }, "vaultTimeoutRangeError": { - "message": "Tempo limite do cofre não está dentro do intervalo permitido." + "message": "Limite de tempo do cofre não está dentro do intervalo permitido." }, - "disablePersonalVaultExport": { - "message": "Remover exportação do cofre individual" + "disableExport": { + "message": "Remover exportação" }, "disablePersonalVaultExportDescription": { "message": "Não permita que os membros exportem dados do seu cofre individual." @@ -6840,7 +6872,7 @@ "message": "Escopos personalizados" }, "additionalUserIdClaimTypes": { - "message": "Tipos de reivindicação de ID de usuário personalizado" + "message": "Tipos personalizados de reivindicação de ID de usuário" }, "additionalEmailClaimTypes": { "message": "Tipos de reivindicação de e-mail" @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Código de verificação inválido" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Uma senha principal não é mais necessária para membros da seguinte organização. Confirme o domínio abaixo com o administrador da sua organização." - }, "keyConnectorDomain": { "message": "Domínio do Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO foi ativado" }, - "disabledSso": { - "message": "SSO foi desativado" + "ssoTurnedOff": { + "message": "SSO desativado" }, "emailMustLoginWithSso": { "message": "$EMAIL$ deve se conectar com a autenticação única", @@ -8718,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dados" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportando dados de segredos da organização" }, @@ -9095,7 +9121,7 @@ "message": "Importar segredos" }, "getStarted": { - "message": "Vamos começar" + "message": "Introdução" }, "complete": { "message": "$COMPLETED$ concluídos dos $TOTAL$", @@ -9153,7 +9179,7 @@ "message": "Remover acesso" }, "checkForBreaches": { - "message": "Conferir vazamentos de dados conhecidos por esta senha" + "message": "Conferir se esta senha vazou ao público" }, "exposedMasterPassword": { "message": "Senha principal exposta" @@ -9377,7 +9403,7 @@ "message": "Solicitação de acesso negada" }, "allLoginRequestsDenied": { - "message": "Todas as solicitações de autenticação foram negadas" + "message": "Todas as solicitações de acesso foram negadas" }, "loginRequestApproved": { "message": "Solicitação de acesso aprovada" @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Autenticação com SSO é necessário" }, + "emailRequiredForSsoLogin": { + "message": "O e-mail é necessário para o SSO" + }, "selectedRegionFlag": { "message": "Bandeira da região selecionada" }, @@ -9464,7 +9493,7 @@ "message": "Problemas para acessar?" }, "loginApproved": { - "message": "Autenticação aprovada" + "message": "Acesso aprovado" }, "userEmailMissing": { "message": "E-mail do usuário ausente" @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Assinatura do Famílias" }, - "planDescPremium": { - "message": "Segurança on-line completa" + "advancedOnlineSecurity": { + "message": "Segurança on-line avançada" }, "planDescFamiliesV2": { "message": "Segurança Premium para a sua família" @@ -12166,28 +12195,28 @@ "message": "Um domínio deve ser reivindicado antes de ativar esta política." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Configure um método de desbloqueio para alterar a ação do tempo limite do cofre." + "message": "Configure um método de desbloqueio para alterar a ação do limite de tempo do cofre." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Os requisitos de política empresarial foram aplicados às suas opções de tempo limite" + "message": "Os requisitos de política empresarial foram aplicados às suas opções de limite de tempo" }, "vaultTimeoutTooLarge": { - "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." + "message": "O limite de tempo do seu cofre excede as restrições estabelecidas pela sua organização." }, "neverLockWarning": { "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Ao usar o \"Nunca\", a chave de criptografia do seu cofre é armazenada no seu dispositivo. Se você usar esta opção, deve garantir que mantém seu dispositivo devidamente protegido." }, "sessionTimeoutSettingsAction": { - "message": "Ação do tempo limite" + "message": "Ação do limite de tempo" }, "sessionTimeoutHeader": { - "message": "Tempo limite da sessão" + "message": "Limite de tempo da sessão" }, "appearance": { "message": "Aparência" }, "vaultTimeoutPolicyMaximumError": { - "message": "O tempo limite excede a restrição configurada pela sua organização: máximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "message": "O limite de tempo excede a restrição configurada pela sua organização: máximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { "hours": { "content": "$1", @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "A sua organização não está mais usando senhas principais para se conectar ao Bitwarden. Para continuar, verifique a organização e o domínio." + }, + "continueWithLogIn": { + "message": "Continuar acessando" + }, + "doNotContinue": { + "message": "Não continuar" + }, + "domain": { + "message": "Domínio" + }, + "keyConnectorDomainTooltip": { + "message": "Este domínio armazenará as chaves de criptografia da sua conta, então certifique-se que confia nele. Se não tiver certeza, verifique com o seu administrador." + }, + "verifyYourOrganization": { + "message": "Verifique sua organização para se conectar" + }, + "organizationVerified": { + "message": "Organização verificada" + }, + "domainVerified": { + "message": "Domínio verificado" + }, + "leaveOrganizationContent": { + "message": "Se você não verificar a sua organização, o seu acesso à organização será revogado." + }, + "leaveNow": { + "message": "Sair agora" + }, + "verifyYourDomainToLogin": { + "message": "Verifique seu domínio para se conectar" + }, + "verifyYourDomainDescription": { + "message": "Para continuar se conectando, verifique este domínio." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Para continuar se conectando, verifique a organização e o domínio." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Nenhum aplicativo crítico foi selecionado" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Falha na verificação do usuário." + }, + "recoveryDeleteCiphersTitle": { + "message": "Apagar itens não recuperáveis do cofre" + }, + "recoveryDeleteCiphersDesc": { + "message": "Alguns dos itens do seu cofre não puderam ser recuperados. Gostaria de apagar estes itens não recuperáveis do seu cofre?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Apagar pastas não recuperáveis" + }, + "recoveryDeleteFoldersDesc": { + "message": "Algumas das suas pastas não puderam ser recuperadas. Gostaria de apagar estas pastas não recuperáveis do seu cofre?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Substituir chave de criptografia" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "O seu par de chaves de criptografia de chave pública não pôde ser recuperado. Gostaria de substituir sua chave de criptografia com um novo par? Ao fazer isso, será necessário reconfigurar o acesso de emergência existente e participações de organizações." + }, + "recoveryStepSyncTitle": { + "message": "Sincronizando dados" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verificando integridade da chave de criptografia" + }, + "recoveryStepUserInfoTitle": { + "message": "Verificando informações do usuário" + }, + "recoveryStepCipherTitle": { + "message": "Verificando integridade do item do cofre" + }, + "recoveryStepFoldersTitle": { + "message": "Verificando integridade da pasta" + }, + "dataRecoveryTitle": { + "message": "Diagnósticos e recuperação de dados" + }, + "dataRecoveryDescription": { + "message": "Use a ferramenta de recuperação de dados para diagnosticar e resolver problemas com a sua conta. Ao executar os diagnósticos, você tem a opção de salvar os registros de diagnóstico para suporte, e a opção de resolver quaisquer problemas detectados." + }, + "runDiagnostics": { + "message": "Executar diagnósticos" + }, + "repairIssues": { + "message": "Resolver problemas" + }, + "saveDiagnosticLogs": { + "message": "Salvar registros de diagnóstico" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Esta configuração é gerenciada pela sua organização." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "A sua organização configurou o tempo de limite máximo da sessão para $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "A sua organização configurou o limite de tempo padrão da sessão para ser no recarregar do navegador." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "O limite de tempo máximo não pode exceder $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "No recarregar do navegador" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Configure um método de desbloqueio para alterar a ação do limite de tempo" + }, + "leaveConfirmationDialogTitle": { + "message": "Tem certeza de que quer sair?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Se recusar, seus itens pessoais continuarão na sua conta, mas você perderá o acesso aos itens compartilhados e os recursos de organização." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Entre em contato com o seu administrador para recuperar o acesso." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Sair de $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Como gerencio meu cofre?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transferir itens para $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ exige que todos os itens sejam propriedade da organização por segurança e conformidade. Clique em aceitar para transferir a propriedade dos seus itens.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Aceitar transferência" + }, + "declineAndLeave": { + "message": "Recusar e sair" + }, + "whyAmISeeingThis": { + "message": "Por que estou vendo isso?" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 73ba923b416..a3a5a627215 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar de" }, - "exportVault": { - "message": "Exportar cofre" - }, - "exportSecrets": { - "message": "Exportar segredos" - }, "fileFormat": { "message": "Formato do ficheiro" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar a palavra-passe mestra" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Palavra-passe do ficheiro" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Ferramentas" }, + "import": { + "message": "Importar" + }, "importData": { "message": "Importar dados" }, @@ -5169,9 +5163,21 @@ "message": "Corrigir", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Corrigir encriptação" + }, + "fixEncryptionTooltip": { + "message": "Este ficheiro está a utilizar um método de encriptação desatualizado." + }, + "attachmentUpdated": { + "message": "Anexo atualizado" + }, "oldAttachmentsNeedFixDesc": { "message": "Existem anexos de ficheiros antigos no seu cofre que têm de ser corrigidos antes de poder regenerar a chave de encriptação da sua conta." }, + "itemsTransferred": { + "message": "Itens transferidos" + }, "yourAccountsFingerprint": { "message": "Frase de impressão digital da sua conta", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5854,7 +5860,7 @@ "description": "This will be used as a hyperlink" }, "organizationDataOwnershipWarningTitle": { - "message": "Tens a certeza de que queres continuar?" + "message": "Tem a certeza de que pretende continuar?" }, "organizationDataOwnershipWarning1": { "message": "continuará a ser acessível aos membros" @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Convidado novamente com sucesso" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ utilizadores convidados novamente", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ de $SELECTEDCOUNT$ utilizadores convidados novamente. $EXCLUDEDCOUNT$ não foram convidados devido ao limite de $LIMIT$ convites.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removido com sucesso" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "O tempo limite do cofre não está dentro do intervalo permitido." }, - "disablePersonalVaultExport": { - "message": "Remover a exportação do cofre individual" + "disableExport": { + "message": "Remover exportação" }, "disablePersonalVaultExportDescription": { "message": "Não permitir que os membros exportem dados do seu cofre individual." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Código de verificação inválido" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Já não é necessária uma palavra-passe mestra para os membros da seguinte organização. Por favor, confirme o domínio abaixo com o administrador da sua organização." - }, "keyConnectorDomain": { "message": "Domínio do Key Connector" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "SSO ativado" }, - "disabledSso": { + "ssoTurnedOff": { "message": "SSO desativado" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dados" - }, "exportingOrganizationSecretDataTitle": { "message": "A exportar dados secretos da organização" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "É necessário um início de sessão SSO" }, + "emailRequiredForSsoLogin": { + "message": "O e-mail é necessário para o SSO" + }, "selectedRegionFlag": { "message": "Bandeira da região selecionada" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Adesão familiar" }, - "planDescPremium": { - "message": "Segurança total online" + "advancedOnlineSecurity": { + "message": "Segurança online avançada" }, "planDescFamiliesV2": { "message": "Segurança de topo para a sua família" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "A sua organização já não utiliza palavras-passe mestras para iniciar sessão no Bitwarden. Para continuar, verifique a organização e o domínio." + }, + "continueWithLogIn": { + "message": "Continuar com o início de sessão" + }, + "doNotContinue": { + "message": "Não continuar" + }, + "domain": { + "message": "Domínio" + }, + "keyConnectorDomainTooltip": { + "message": "Este domínio armazenará as chaves de encriptação da sua conta, portanto certifique-se de que confia nele. Se não tiver a certeza, verifique com o seu administrador." + }, + "verifyYourOrganization": { + "message": "Verifique a sua organização para iniciar sessão" + }, + "organizationVerified": { + "message": "Organização verificada" + }, + "domainVerified": { + "message": "Domínio verificado" + }, + "leaveOrganizationContent": { + "message": "Se não verificar a sua organização, o seu acesso à organização será revogado." + }, + "leaveNow": { + "message": "Sair agora" + }, + "verifyYourDomainToLogin": { + "message": "Verifique o seu domínio para iniciar sessão" + }, + "verifyYourDomainDescription": { + "message": "Para continuar com o início de sessão, verifique este domínio." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Para continuar com o início de sessão, verifique a organização e o domínio." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Não foram selecionadas aplicações críticas" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Falha na verificação do utilizador." + }, + "recoveryDeleteCiphersTitle": { + "message": "Eliminar itens irrecuperáveis do cofre" + }, + "recoveryDeleteCiphersDesc": { + "message": "Alguns dos seus itens do cofre não puderam ser recuperados. Pretende eliminar esses itens irrecuperáveis do seu cofre?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Eliminar pastas irrecuperáveis" + }, + "recoveryDeleteFoldersDesc": { + "message": "Alguns das suas pastas não puderam ser recuperados. Pretende eliminar essas pastas irrecuperáveis do seu cofre?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Substituir chave de encriptação" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Não foi possível recuperar o seu par de chaves de encriptação de chave pública. Pretende substituir a sua chave de encriptação por um novo par de chaves? Isto exigirá que configure novamente os acessos de emergência existentes e as associações à organização." + }, + "recoveryStepSyncTitle": { + "message": "A sincronizar dados" + }, + "recoveryStepPrivateKeyTitle": { + "message": "A verificar a integridade da chave de encriptação" + }, + "recoveryStepUserInfoTitle": { + "message": "A verificar informações do utilizador" + }, + "recoveryStepCipherTitle": { + "message": "A verificar a integridade dos itens do cofre" + }, + "recoveryStepFoldersTitle": { + "message": "A verificar a integridade da pasta" + }, + "dataRecoveryTitle": { + "message": "Recuperação de Dados e Diagnóstico" + }, + "dataRecoveryDescription": { + "message": "Utilize a ferramenta de recuperação de dados para diagnosticar e resolver problemas na sua conta. Após executar os diagnósticos, terá a opção de guardar os registos de diagnóstico para suporte e a opção de reparar quaisquer problemas detetados." + }, + "runDiagnostics": { + "message": "Executar diagnóstico" + }, + "repairIssues": { + "message": "Resolver problemas" + }, + "saveDiagnosticLogs": { + "message": "Guardar registos de diagnóstico" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Esta configuração é gerida pela sua organização." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "A sua organização definiu o tempo limite máximo da sessão para $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "A sua organização definiu o tempo limite de sessão predefinido para Ao atualizar o navegador." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "O tempo limite máximo não pode ser superior a $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Ao atualizar o navegador" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Configure um método de desbloqueio para alterar a sua ação de tempo limite" + }, + "leaveConfirmationDialogTitle": { + "message": "Tem a certeza de que pretende sair?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Ao recusar, os seus itens pessoais permanecerão na sua conta, mas perderá o acesso aos itens partilhados e às funcionalidades da organização." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Entre em contacto com o seu administrador para recuperar o acesso." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Sair de $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Como posso gerir o meu cofre?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transferir itens para $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ exige que todos os itens sejam propriedade da organização por motivos de segurança e conformidade. Clique em Aceitar para transferir a propriedade dos seus itens.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Aceitar transferência" + }, + "declineAndLeave": { + "message": "Recusar e sair" + }, + "whyAmISeeingThis": { + "message": "Porque é que estou a ver isto?" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 8efd88e49aa..1a573ef82fe 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export seif" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format fișier" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmare parolă principală" }, - "confirmFormat": { - "message": "Confirmare format" - }, "filePassword": { "message": "Parola fișierului" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Unelte" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importare date" }, @@ -5169,9 +5163,21 @@ "message": "Repară", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "Există atașamente de fișiere vechi în seiful dvs. care trebuie reparate înainte de a putea revoca cheia de criptare a contului." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Fraza amprentă a contului dvs.", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvitat cu succes" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Eliminat cu succes" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Timpul de expirare al seifului nu este în intervalul permis." }, - "disablePersonalVaultExport": { - "message": "Înlăturați exportul de seif individual" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Cod de verificare nevalid" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO a fost activat" }, - "disabledSso": { - "message": "SSO a fost activat" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 0691b4e654b..0d7ccc71c00 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -1522,7 +1522,7 @@ "message": "Таймаут аутентификации" }, "authenticationSessionTimedOut": { - "message": "Сеанс аутентификации завершился по времени. Пожалуйста, попробуйте войти еще раз." + "message": "Сессия аутентификации завершилась по времени. Пожалуйста, перезапустите процесс авторизации." }, "verifyYourIdentity": { "message": "Подтвердите вашу личность" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Экспорт из" }, - "exportVault": { - "message": "Экспорт хранилища" - }, - "exportSecrets": { - "message": "Экспорт секретов" - }, "fileFormat": { "message": "Формат файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Подтвердите мастер-пароль" }, - "confirmFormat": { - "message": "Подтвердить формат" - }, "filePassword": { "message": "Пароль к файлу" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Инструменты" }, + "import": { + "message": "Импорт" + }, "importData": { "message": "Импорт данных" }, @@ -4479,7 +4473,7 @@ "message": "Обновить браузер" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Ваша информация о доступе генерируется..." }, "fetchingMemberData": { "message": "Получение данных о пользователях..." @@ -5054,7 +5048,7 @@ "message": "Выберите тайм-аут для хранилища и действие, которое необходимо предпринять." }, "vaultTimeoutLogoutDesc": { - "message": "Выберите, когда сеанс хранилища будет завершен." + "message": "Выберите время выхода из хранилища." }, "oneMinute": { "message": "1 минута" @@ -5169,9 +5163,21 @@ "message": "Исправить", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Исправить шифрование" + }, + "fixEncryptionTooltip": { + "message": "Этот файл использует устаревший метод шифрования." + }, + "attachmentUpdated": { + "message": "Вложение обновлено" + }, "oldAttachmentsNeedFixDesc": { "message": "В вашем хранилище есть старые вложения файлов, которые необходимо исправить, прежде чем вы сможете сменить ключ шифрования вашего аккаунта." }, + "itemsTransferred": { + "message": "Элементы переданы" + }, "yourAccountsFingerprint": { "message": "Фраза отпечатка вашего аккаунта", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Повторно приглашен успешно" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ пользователей снова приглашены", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ из $SELECTEDCOUNT$ пользователей повторно приглашены. $EXCLUDEDCOUNT$ не был приглашен из-за лимита приглашений $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Удален(-о) успешно" }, @@ -6647,7 +6679,7 @@ "message": "Мастер-пароль не соответствует требованиям политики этой организации. Чтобы присоединиться к организации, нужно обновить мастер-пароль. Текущая сессия будет завершена и потребуется повторная авторизация. Сессии на других устройствах могут оставаться активными в течение часа." }, "updateWeakMasterPasswordWarning": { - "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущий сеанс будет завершен и потребуется повторная авторизация. Сеансы на других устройствах могут оставаться активными в течение часа." + "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущая сессия будет завершена и потребуется повторная авторизация. Сессии на других устройствах могут оставаться активными в течение часа." }, "automaticAppLoginWithSSO": { "message": "Автовход с помощью SSO" @@ -6665,10 +6697,10 @@ "message": "Ваша организация обновила параметры расшифровки. Пожалуйста, установите мастер-пароль для доступа к вашему хранилищу." }, "sessionTimeoutPolicyTitle": { - "message": "Тайм-аут сеанса" + "message": "Тайм-аут сессии" }, "sessionTimeoutPolicyDescription": { - "message": "Установите максимальный тайм-аут сеанса для всех участников, кроме владельцев." + "message": "Установите максимальный тайм-аут сессии для всех участников, кроме владельцев." }, "maximumAllowedTimeout": { "message": "Максимально допустимый тайм-аут" @@ -6680,7 +6712,7 @@ "message": "Время указано неверно. Измените хотя бы одно значение." }, "sessionTimeoutAction": { - "message": "Действие при тайм-ауте сеанса" + "message": "Действие при тайм-ауте сессии" }, "immediately": { "message": "Немедленно" @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Тайм-аут хранилища находится за пределами допустимого диапазона." }, - "disablePersonalVaultExport": { - "message": "Удалить экспорт личного хранилища" + "disableExport": { + "message": "Удалить экспорт" }, "disablePersonalVaultExportDescription": { "message": "Запретить пользователям экспортировать данные из их собственного хранилища." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Неверный код подтверждения" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Мастер-пароль больше не требуется для членов следующей организации. Пожалуйста, подтвердите указанный ниже домен у администратора вашей организации." - }, "keyConnectorDomain": { "message": "Домен соединителя ключей" }, @@ -7154,7 +7183,7 @@ "enabledSso": { "message": "SSO включен" }, - "disabledSso": { + "ssoTurnedOff": { "message": "SSO отключен" }, "emailMustLoginWithSso": { @@ -8718,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Экспорт данных" - }, "exportingOrganizationSecretDataTitle": { "message": "Экспорт секретных данных организации" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Требуется логин SSO" }, + "emailRequiredForSsoLogin": { + "message": "Для SSO необходим email" + }, "selectedRegionFlag": { "message": "Флаг выбранного региона" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Членство Families" }, - "planDescPremium": { - "message": "Полная онлайн-защищенность" + "advancedOnlineSecurity": { + "message": "Расширенная онлайн-безопасность" }, "planDescFamiliesV2": { "message": "Премиальная защищенность \n для вашей семьи" @@ -12172,22 +12201,22 @@ "message": "К настройкам тайм-аута были применены требования корпоративной политики" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Тайм-аут вашего хранилища превышает ограничения, установленные вашей организацией." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Вы действительно хотите отключить блокировку хранилища? В этом случае ключ шифрования вашего хранилища будет сохранен на вашем устройстве. Отключая блокировку, вы должны убедиться, что ваше устройство надежно защищено." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Тайм-аут действия" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Тайм-аут сессии" }, "appearance": { - "message": "Appearance" + "message": "Внешний вид" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Время ожидания превышает установленное организацией максимальное ограничение: $HOURS$ час. $MINUTES$ мин.", "placeholders": { "hours": { "content": "$1", @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Ваша организация больше не использует мастер-пароли для входа в Bitwarden. Чтобы продолжить, подтвердите организацию и домен." + }, + "continueWithLogIn": { + "message": "Продолжить с логином" + }, + "doNotContinue": { + "message": "Не продолжать" + }, + "domain": { + "message": "Домен" + }, + "keyConnectorDomainTooltip": { + "message": "В этом домене будут храниться ключи шифрования вашего аккаунта, поэтому убедитесь, что вы ему доверяете. Если вы не уверены, обратитесь к своему администратору." + }, + "verifyYourOrganization": { + "message": "Подтвердите свою организацию для входа" + }, + "organizationVerified": { + "message": "Организация подтверждена" + }, + "domainVerified": { + "message": "Домен верифицирован" + }, + "leaveOrganizationContent": { + "message": "Если вы не подтвердите свою организацию, ваш доступ к ней будет аннулирован." + }, + "leaveNow": { + "message": "Покинуть" + }, + "verifyYourDomainToLogin": { + "message": "Подтвердите свой домен для входа" + }, + "verifyYourDomainDescription": { + "message": "Чтобы продолжить с логином, подтвердите этот домен." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Чтобы продолжить с логином, подтвердите организацию и домен." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Критичные приложения не выбраны" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "Проверка пользователя не удалась." + }, + "recoveryDeleteCiphersTitle": { + "message": "Удалить невосстановимые элементы хранилища" + }, + "recoveryDeleteCiphersDesc": { + "message": "Некоторые элементы вашего хранилища восстановить не удалось. Вы хотите удалить элементы, которые невозможно восстановить из вашего хранилища?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Удалить невосстановимые папки" + }, + "recoveryDeleteFoldersDesc": { + "message": "Некоторые папки вашего хранилища восстановить не удалось. Вы хотите удалить папки, которые невозможно восстановить из вашего хранилища?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Сменить ключ шифрования" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Не удалось восстановить вашу пару ключей шифрования с публичным ключом. Вы хотите заменить свой ключ шифрования на новую пару ключей? Для этого вам потребуется заново настроить существующий экстренный доступ и членство в организации." + }, + "recoveryStepSyncTitle": { + "message": "Синхронизация данных" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Проверка целостности ключа шифрования" + }, + "recoveryStepUserInfoTitle": { + "message": "Проверка информации о пользователе" + }, + "recoveryStepCipherTitle": { + "message": "Проверка целостности хранилища" + }, + "recoveryStepFoldersTitle": { + "message": "Проверка целостности папки" + }, + "dataRecoveryTitle": { + "message": "Восстановление и диагностика данных" + }, + "dataRecoveryDescription": { + "message": "Используйте инструмент восстановления данных для диагностики и устранения неполадок с вашим аккаунтом. После запуска диагностики у вас будет возможность сохранить журналы диагностики для поддержки и устранить любые обнаруженные неполадки." + }, + "runDiagnostics": { + "message": "Запустить диагностику" + }, + "repairIssues": { + "message": "Решить проблемы" + }, + "saveDiagnosticLogs": { + "message": "Сохранить журналы диагностики" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Эта настройка управляется вашей организацией." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "В вашей организации максимальный тайм-аут сессии установлен равным $HOURS$ час. и $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Ваша организация установила тайм-аут сессии по умолчанию на При обновлении браузера." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Максимальный тайм-аут не может превышать $HOURS$ час. и $MINUTES$ мин.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "При обновлении браузера" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Установите способ разблокировки для изменения действия при истечении тайм-аута" + }, + "leaveConfirmationDialogTitle": { + "message": "Вы уверены, что хотите покинуть?" + }, + "leaveConfirmationDialogContentOne": { + "message": "В случае отказа ваши личные данные останутся в вашем аккаунте, но вы потеряете доступ к общим элементам и возможностям организации." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Свяжитесь с вашим администратором для восстановления доступа." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Покинуть $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Как я могу управлять своим хранилищем?" + }, + "transferItemsToOrganizationTitle": { + "message": "Перенести элементы в $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ требует, чтобы все элементы принадлежали организации для обеспечения безопасности и соответствия требованиям. Нажмите Принять, чтобы передать собственность на ваши элементы.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Принять передачу" + }, + "declineAndLeave": { + "message": "Отклонить и покинуть" + }, + "whyAmISeeingThis": { + "message": "Почему я это вижу?" } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index d4c4d143600..f896cc8c79a 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 70578e5bf59..cb0adb25c0a 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -94,7 +94,7 @@ "message": "Pre sledovanie progresu, priraďte členom úlohy" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Po kontrole aplikácií a ich označení za kritické, predeľte členom úlohu na zmenu svojho hesla." }, "sendReminders": { "message": "Poslať upomienky" @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Nenašli sa žiadne údaje" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Ak chcete začať s prehľadom o prístupe, importujete prihlasovacie dáta vašej organizácie. Keď to spravíte, budete môcť:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Označiť aplikácie za kritické" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Toto vám pomôže prioritne odstrániť ohrozenia vo vašich najdôležitejších aplikáciach." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Pomôcť členom zlepšiť si zabezpečenie" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Prideľte ohrozeným členom bezpečnostné úlohy pre aktualizáciu prihlasovacích údajov." }, "feature3Title": { - "message": "Monitor progress" + "message": "Sledovať progres" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Zobrazte zlepšenie zabezpečenia sledovaním zmien v priebehu času." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Generovať report" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Môžete začať generovať reporty. Po generovaní budete môcť:" }, "noCriticalApplicationsTitle": { "message": "Neoznačili ste žiadne aplikácie ako kritické" @@ -266,13 +266,13 @@ "message": "Ohrozených členov" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Títo členovia majú prístup k ohrozeným položkám kritických aplikácii." }, "membersWithAtRiskPasswords": { "message": "Členovia s ohrozenými heslami" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Členom vašej organizácie budú pridelené úlohy na zmenu ohrozených hesiel. Upozornenie obdržia prostredníctvom rozšírenia Bitwarden pre prehliadače." }, "membersAtRiskCount": { "message": "$COUNT$ ohrozených členov", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Títo členovia sa prihlasujú do kritických aplikácií so slabým, uniknutým alebo viacnásobne použitým heslom." }, "atRiskMembersDescriptionNone": { "message": "These are no members logging into applications with weak, exposed, or reused passwords." @@ -386,13 +386,13 @@ "message": "Uprednostniť kritické aplikácie" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Vyberte ktoré aplikácie sú pre vašu organizáciu najkritickejšie. Potom budete môcť členom prideliť bezpečnostné úlohy pre vyriešenie ohrozených hesiel." }, "reviewNewApplications": { "message": "Review new applications" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Skontrolujte nové aplikácie s ohrozenými položkami a označte tie, ktoré chcete podrobne sledovať za kritické. Potom budete môcť prideliť členom bezpečnostné úlohy pre odstránenie ohrození." }, "clickIconToMarkAppAsCritical": { "message": "Aplikáciu označíte za kritickú kliknutím na ikonu hviezdičky" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportovať z" }, - "exportVault": { - "message": "Export trezoru" - }, - "exportSecrets": { - "message": "Exportovať položky" - }, "fileFormat": { "message": "Formát Súboru" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrdiť hlavné heslo" }, - "confirmFormat": { - "message": "Potvrdiť formát" - }, "filePassword": { "message": "Heslo súboru" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nástroje" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import dát" }, @@ -3063,7 +3057,7 @@ "message": "1 GB šifrovaného úložiska pre prílohy." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ šifrovaného úložiska na prílohy.", "placeholders": { "size": { "content": "$1", @@ -4627,19 +4621,19 @@ "message": "Zistiť viac" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "Pri aktualizácii nastavení šifrovania došlo k chybe." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Aktualizujte nastavenie šifrovania" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Nové odporúčané nastavenia šifrovania zlepšia bezpečnosť vášho účtu. Ak ich chcete aktualizovať teraz, zadajte hlavné heslo." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Ak chcete pokračovať, potvrďte svoju identitu" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Zadajte hlavné heslo" }, "updateSettings": { "message": "Update settings" @@ -5169,9 +5163,21 @@ "message": "Opraviť", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "V trezore máte staré prílohy ktoré musia byť opravené pred tým, než budete môcť obnoviť šifrovací kľúč k účtu." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Fráza odtlačku vašeho účtu", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5846,7 +5852,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Všetky položky budú vo vlastníctve organizácie a uložené v nej, čo umožní kontrolu, prehľadnosť a vykazovanie v rámci celej organizácie. Po zapnutí bude každému členovi k dispozícii predvolená zbierka na ukladanie položiek. Dozvedieť sa viac o správe ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Opätovné pozvanie úspešné." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ používateľov opätovne pozvaných", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ z $SELECTEDCOUNT$ používateľov opätovne pozvaných. $EXCLUDEDCOUNT$ nebolo pozvaných kvôli limitu $LIMIT$ pozvánok.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Odstránenie úspešné" }, @@ -6686,7 +6718,7 @@ "message": "Okamžite" }, "onSystemLock": { - "message": "Keď je systém uzamknutý" + "message": "Pri uzamknutí systému" }, "onAppRestart": { "message": "Po reštarte aplikácie" @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Časový limit trezoru nie je v povolenom rozsahu." }, - "disablePersonalVaultExport": { - "message": "Zakázať export osobného trezora" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Zakázať používateľom exportovať údaje zo súkromného trezora." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Neplatný verifikačný kód" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Hlavné heslo sa už nevyžaduje pre členov tejto organizácie. Nižšie uvedenú doménu potvrďte u správcu organizácie." - }, "keyConnectorDomain": { "message": "Doména Key Connectora" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO povolené" }, - "disabledSso": { - "message": "SSO zakázané" + "ssoTurnedOff": { + "message": "Jednotné prihlásenie vypnuté" }, "emailMustLoginWithSso": { "message": "$EMAIL$ sa musí prihlásiť cez prihlasovací formulár spoločnosti ", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportovať dáta" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportovať tajné dáta Organizácie" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Vyžaduje sa prihlásenie cez SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -9857,11 +9886,11 @@ "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreePlan": { - "message": "Switching to free plan", + "message": "Prechod na bezplatný plán", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreeOrg": { - "message": "Switching to free organization", + "message": "Prechod na bezplatnú organizáciu", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "freeForOneYear": { @@ -9895,7 +9924,7 @@ "message": "Priradiť úlohy" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Odoslať upozornenia na zmenu hesla" }, "assignToCollections": { "message": "Prideliť k zbierkam" @@ -11704,7 +11733,7 @@ "message": "Rozšírenie Bitwarden nainštalované!" }, "bitwardenExtensionIsInstalled": { - "message": "Bitwarden extension is installed!" + "message": "Rozšírenie Bitwarden je nainštalované!" }, "openExtensionToAutofill": { "message": "Otvorte rozšírenie, prihláste sa a začnite automatické vypĺňanie." @@ -11721,11 +11750,11 @@ "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "openExtensionFromToolbarPart1": { - "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "message": "Ak sa rozšírenie neotvorilo, možno musíte otvoriť Bitwarden prostredníctvom ikony ", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" }, "openExtensionFromToolbarPart2": { - "message": " on the toolbar.", + "message": " na paneli nástrojov.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" }, "gettingStartedWithBitwardenPart3": { @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Členstvo pre rodiny" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Pokročilá bezpečnosť online" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12157,13 +12186,13 @@ "message": "Začať bezplatnú skúšku pre predplatné Rodiny" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Zablokovať vytváranie účtov na privlastnenej doméne" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Zabrániť používateľom mimo vašej organizácie vytvárať účet s emailom z privlastnených domén." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Pred zapnutím tohto pravidla musí byť doména privlastnená." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Set up an unlock method to change your vault timeout action." @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Nie sú vybrané žiadne kritické aplikácie" }, @@ -12206,6 +12274,140 @@ "message": "Ste si istí, že chcete pokračovať?" }, "userVerificationFailed": { - "message": "User verification failed." + "message": "Zlyhalo overenie používateľa." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Toto nastavenie spravuje vaša organizácia." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Vaša organizácia nastavila maximálny časový limit relácie na $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Vaša organizácia nastavila predvolený časový limit relácie na Pri reštarte prehliadača." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximálny časový limit nesmie prekročiť $HOURS$ hod. a $MINUTES$ min.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Pri reštarte prehliadača" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Nastavte metódu odomknutia, aby ste zmenili akciu pri vypršaní časového limitu" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 10c734ec6b7..8b86e7b6060 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Izvoz trezorja" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format datoteke" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potrdite glavno geslo" }, - "confirmFormat": { - "message": "Potrdi format" - }, "filePassword": { "message": "Geslo datoteke" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Orodja" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvozi podatke" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Identifikacijsko geslo vašega računa", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 0f8a2760370..1ff92f67064 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Izvezi trezor" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alati" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvezi podatke" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index f1f7dd3ca73..e1d19054ac3 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -197,13 +197,13 @@ "message": "Assign at-risk members guided security tasks to update credentials." }, "feature3Title": { - "message": "Monitor progress" + "message": "Праћење напретка" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Пратите промене током времена да бисте показали безбедносна побољшања." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Генеришите извештај" }, "noReportsRunDescription": { "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" @@ -344,10 +344,10 @@ "message": "Апликације које треба прегледати" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Прегледајте нове апликације" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "Нове апликације: $COUNT$", "placeholders": { "count": { "content": "$1", @@ -380,7 +380,7 @@ "message": "Review applications to secure the items most critical to your organization's security" }, "reviewApplications": { - "message": "Review applications" + "message": "Прегледајте апликације" }, "prioritizeCriticalApplications": { "message": "Дајте приоритет критичним апликацијама" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Извоз од" }, - "exportVault": { - "message": "Извоз сефа" - }, - "exportSecrets": { - "message": "Извоз тајне" - }, "fileFormat": { "message": "Формат датотеке" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Потрдити Главну Лозинку" }, - "confirmFormat": { - "message": "Потврдити формат" - }, "filePassword": { "message": "Лозинка датотеке" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Алатке" }, + "import": { + "message": "Увоз" + }, "importData": { "message": "Увези податке" }, @@ -3063,7 +3057,7 @@ "message": "1ГБ шифровано складиште за прилоге." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ шифровано складиште за прилоге.", "placeholders": { "size": { "content": "$1", @@ -3134,7 +3128,7 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Ваша Премијум претплата је завршена" }, "premiumSubscriptionEndedDesc": { "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." @@ -3263,10 +3257,10 @@ "message": "Следеће пуњење" }, "nextChargeHeader": { - "message": "Next Charge" + "message": "Следеће пуњење" }, "plan": { - "message": "Plan" + "message": "План" }, "details": { "message": "Детаљи" @@ -4636,10 +4630,10 @@ "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Да бисте наставили потврдите ваш идентитет" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Унети вашу главну лозинку" }, "updateSettings": { "message": "Ажурирај подешавања" @@ -5169,9 +5163,21 @@ "message": "Фиксирај", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Поправи шифровање" + }, + "fixEncryptionTooltip": { + "message": "Ова датотека користи застарели метод шифровања." + }, + "attachmentUpdated": { + "message": "Прилог је ажуриран" + }, "oldAttachmentsNeedFixDesc": { "message": "У вашем сефу постоје стари прилози који треба поправити да бисте могли да промените кључ за шифровање свог налога." }, + "itemsTransferred": { + "message": "Пренете ставке" + }, "yourAccountsFingerprint": { "message": "Ваша Сигурносна Фраза Сефа", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Успешно поновно позивање." }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Успешно уклоњено" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Временско ограничење сефа није у дозвољеном опсегу." }, - "disablePersonalVaultExport": { - "message": "Онемогућите извоз личног сефа" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Не дозволи члановима да извозе податке из свог индивидуалног сефа." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Неисправан верификациони код" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Главна лозинка више није потребна за чланове следеће организације. Молимо потврдите домен са администратором организације." - }, "keyConnectorDomain": { "message": "Домен конектора кључа" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO омогућен" }, - "disabledSso": { - "message": "SSO онемогућен" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Увези податке" - }, "exportingOrganizationSecretDataTitle": { "message": "Извоз тајних података организације" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO пријава је потребна" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Одабрана застава" }, @@ -11556,31 +11585,31 @@ "description": "Verb" }, "unArchive": { - "message": "Unarchive" + "message": "Врати из архиве" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Ставке у архиви" }, "noItemsInArchive": { "message": "Нема ставка у архиви" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Архивиране ставке ће се овде појавити и бити искључени из општих резултата претраге и сугестија о ауто-пуњењу." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "Ставка је послата у архиву" }, "itemsWereSentToArchive": { - "message": "Items were sent to archive" + "message": "Ставке су послате у архиву" }, "itemUnarchived": { - "message": "Item was unarchived" + "message": "Ставка враћена из архиве" }, "bulkArchiveItems": { - "message": "Items archived" + "message": "Ставке у архиви" }, "bulkUnarchiveItems": { - "message": "Items unarchived" + "message": "Ставке враћене из архиве" }, "archiveItem": { "message": "Archive item", @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12088,7 +12117,7 @@ "message": "There was an error calculating tax for your location. Please try again." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Добродошли у Bitwarden" }, "individualUpgradeDescriptionMessage": { "message": "Unlock more security features with Premium, or start sharing items with Families" @@ -12106,7 +12135,7 @@ "message": "Upgrade your plan" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Надогради сада" }, "formWillCreateNewFamiliesOrgMessage": { "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." @@ -12166,28 +12195,28 @@ "message": "A domain must be claimed before activating this policy." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Захтеви политике предузећа су примењени на опције тајмаута" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Да ли сте сигурни да желите да користите опцију „Никад“? Ако поставите опције закључавања на „Никада“, на вашем уређају се чува кључ за шифровање сефа. Ако користите ову опцију, осигурајте да је уређај правилно заштићен." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Акција тајмаута" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Истек сесије" }, "appearance": { - "message": "Appearance" + "message": "Изглед" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Тајмаут је већи него што је решила организација: макимум $HOURS$ сат(а) и $MINUTES$ минут(а)", "placeholders": { "hours": { "content": "$1", @@ -12199,13 +12228,186 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Ваша организација више не користи главне лозинке за пријаву на Bitwarden. Да бисте наставили, верификујте организацију и домен." + }, + "continueWithLogIn": { + "message": "Наставити са пријавом" + }, + "doNotContinue": { + "message": "Не настави" + }, + "domain": { + "message": "Домен" + }, + "keyConnectorDomainTooltip": { + "message": "Овај домен ће чувати кључеве за шифровање вашег налога, па се уверите да му верујете. Ако нисте сигурни, проверите код свог администратора." + }, + "verifyYourOrganization": { + "message": "Верификујте своју организацију да бисте се пријавили" + }, + "organizationVerified": { + "message": "Организација верификована" + }, + "domainVerified": { + "message": "Домен верификован" + }, + "leaveOrganizationContent": { + "message": "Ако не верификујете своју организацију, ваш приступ организацији ће бити опозван." + }, + "leaveNow": { + "message": "Напусти сада" + }, + "verifyYourDomainToLogin": { + "message": "Верификујте домен да бисте се пријавили" + }, + "verifyYourDomainDescription": { + "message": "Да бисте наставили са пријављивањем, верификујте овај домен." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "Да бисте наставили са пријављивањем, верификујте организацију и домен." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Желите ли заиста да наставите?" }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Усклађивање података" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Напустити $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 7f1275ee75c..7cca1d484b7 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -94,7 +94,7 @@ "message": "Tilldela medlemmar uppgifter för att övervaka framsteg" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "När du granskar applikationer och markerar dem som kritiska, tilldela uppgifter till dina medlemmar att ändra sina lösenord." }, "sendReminders": { "message": "Skicka påminnelser" @@ -182,31 +182,31 @@ "message": "Ingen data hittades" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Importera din organisations inloggningsdata för att komma igång med Access Intelligence. När du gör det kommer du att:" }, "feature1Title": { "message": "Markera applikationer som kritiska" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Detta kommer att hjälpa dig att minska risken för dina viktigaste applikationer först." }, "feature2Title": { "message": "Hjälp medlemmar att förbättra sin säkerhet" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Tilldela medlemmar i riskzonen tydliga säkerhetsuppgifter för att uppdatera inloggningsuppgifter." }, "feature3Title": { "message": "Övervaka framsteg" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Spåra förändringar över tid för att visa säkerhetsförbättringar." }, "noReportsRunTitle": { "message": "Generera rapport" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Du är redo att börja generera rapporter. När du genererar dem kommer du att kunna:" }, "noCriticalApplicationsTitle": { "message": "Du har inte markerat några applikationer som kritiska" @@ -266,13 +266,13 @@ "message": "Riskutsatta medlemmar" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Dessa medlemmar har tillgång till sårbara objekt för kritiska applikationer." }, "membersWithAtRiskPasswords": { "message": "Medlemmar med lösenord i riskzonen" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Medlemmar i din organisation kommer att tilldelas en uppgift att ändra sårbara lösenord. De kommer att få ett meddelande i deras Bitwarden-webbläsartillägg." }, "membersAtRiskCount": { "message": "$COUNT$ medlemmar i riskzonen", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Dessa medlemmar loggar in i kritiska applikationer med svaga, exponerade eller återanvända lösenord." }, "atRiskMembersDescriptionNone": { "message": "Det finns inga medlemmar som loggar in i applikationer med svaga, exponerade eller återanvända lösenord." @@ -362,13 +362,13 @@ "message": "Granska nu" }, "allCaughtUp": { - "message": "All caught up!" + "message": "Inget mer att göra!" }, "noNewApplicationsToReviewAtThisTime": { "message": "Inga nya applikationer att granska just nu" }, "organizationHasItemsSavedForApplications": { - "message": "Your organization has items saved for $COUNT$ applications", + "message": "Din organisation har sparade objekt för $COUNT$ applikationer", "placeholders": { "count": { "content": "$1", @@ -377,7 +377,7 @@ } }, "reviewApplicationsToSecureItems": { - "message": "Review applications to secure the items most critical to your organization's security" + "message": "Granska applikationer för att säkra de objekt som är mest kritiska för din organisations säkerhet" }, "reviewApplications": { "message": "Granska applikationer" @@ -386,22 +386,22 @@ "message": "Prioritera kritiska applikationer" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Välj vilka applikationer som är mest kritiska för din organisation. Då kommer du att kunna tilldela säkerhetsuppgifter till medlemmar för att ta bort risker." }, "reviewNewApplications": { "message": "Granska nya applikationer" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Granska nya applikationer med sårbara objekt och markera dem som du vill övervaka noga som kritiska. Då kommer du att kunna tilldela säkerhetsuppgifter till medlemmar för att ta bort risker." }, "clickIconToMarkAppAsCritical": { - "message": "Click the star icon to mark an app as critical" + "message": "Klicka på stjärnikonen för att markera en app som kritisk" }, "markAsCriticalPlaceholder": { "message": "Markera som kritisk funktionalitet kommer att implementeras i en framtida uppdatering" }, "applicationReviewSaved": { - "message": "Application review saved" + "message": "Applikationsgranskning sparad" }, "newApplicationsReviewed": { "message": "Nya applikationer granskade" @@ -875,7 +875,7 @@ "message": "Favoriter" }, "taskSummary": { - "message": "Task summary" + "message": "Uppgiftssammandrag" }, "types": { "message": "Typer" @@ -1717,7 +1717,7 @@ "message": "Inga objekt i valvet" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Valvet skyddar mer än bara dina lösenord. Förvara säkra inloggningar, ID-handlingar, kort och anteckningar säkert här." }, "emptyFavorites": { "message": "Du har inga favoritobjekt" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportera från" }, - "exportVault": { - "message": "Exportera valv" - }, - "exportSecrets": { - "message": "Exportera hemligheter" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekräfta huvudlösenord" }, - "confirmFormat": { - "message": "Bekräfta format" - }, "filePassword": { "message": "Fillösenord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Verktyg" }, + "import": { + "message": "Importera" + }, "importData": { "message": "Importera data" }, @@ -3044,7 +3038,7 @@ "message": "Se till att ditt konto har tillräckligt mycket tillgänglig kredit för detta köp. Om ditt konto inte har tillräckligt med tillgänglig kredit, kommer din sparade standardbetalningsmetod användas för skillnaden. Du kan lägga till kredit till ditt konto från faktureringssidan." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Du har inte tillräckligt med kontokredit för detta köp. Du kan lägga till kredit till ditt konto från faktureringssidan." }, "creditAppliedDesc": { "message": "Kontots kredit kan användas för att göra köp. Tillgänglig kredit kommer automatiskt tillämpas mot fakturor som genereras för detta konto." @@ -3063,7 +3057,7 @@ "message": "1 GB krypterad lagring." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ krypterad lagring för filbilagor.", "placeholders": { "size": { "content": "$1", @@ -3134,10 +3128,10 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Din Premium-prenumeration avslutades" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "För att återfå åtkomst till ditt arkiv, starta om Premium-prenumerationen. Om du redigerar detaljer för ett arkiverat objekt innan du startar om kommer det att flyttas tillbaka till ditt valv." }, "restartPremium": { "message": "Starta om Premium" @@ -4479,7 +4473,7 @@ "message": "Uppdatera webbläsare" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Genererar din Access Intelligence..." }, "fetchingMemberData": { "message": "Hämtar medlemsdata..." @@ -5096,7 +5090,7 @@ "message": "Organisationen är avstängd" }, "organizationIsSuspendedDesc": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + "message": "Objekt i inaktiverade organisationer är inte åtkomliga. Kontakta organisationens ägare för att få hjälp." }, "secretsAccessSuspended": { "message": "Avstängda organisationer kan inte nås. Kontakta din organisationsägare för hjälp." @@ -5169,9 +5163,21 @@ "message": "Åtgärda", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fixa kryptering" + }, + "fixEncryptionTooltip": { + "message": "Denna fil använder en föråldrad krypteringsmetod." + }, + "attachmentUpdated": { + "message": "Bilaga uppdaterad" + }, "oldAttachmentsNeedFixDesc": { "message": "Det finns gamla bilagor i ditt valv som behöver åtgärdas innan du kan rotera ditt kontos krypteringsnyckel." }, + "itemsTransferred": { + "message": "Objekt överförda" + }, "yourAccountsFingerprint": { "message": "Ditt kontos fingeravtrycksfras", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5484,7 +5490,7 @@ "message": "SSO-identifierare" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "message": "Ange detta id till dina medlemmar för att logga in med SSO. Medlemmar kan hoppa över att ange denna identifierare under SSO om en domän som gjorts anspråk på är inställd. ", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "claimedDomainsLearnMore": { @@ -5846,7 +5852,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Alla objekt kommer att ägas och sparas till organisationen, vilket möjliggör organisationsövergripande kontroller, synlighet och rapportering. När den är aktiverad kommer en standardsamling att finnas tillgänglig för varje medlem att lagra objekt. 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 will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -5897,7 +5903,7 @@ "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtensionOpened": { - "message": "Successfully opened the Bitwarden browser extension. You can now activate the automatic user confirmation setting." + "message": "Lyckades öppna Bitwarden-webbläsartillägg. Du kan nu aktivera inställningen för automatisk bekräftelse av användaren." }, "autoConfirmPolicyEditDescription": { "message": "Nya användare som bjuds in till organisationen kommer automatiskt att bekräftas när en administratörs enhet är upplåst. Innan du aktiverar denna policy, granska och godkänn följande: ", @@ -5907,7 +5913,7 @@ "message": "Potentiell säkerhetsrisk. " }, "autoConfirmAcceptSecurityRiskDescription": { - "message": "Automatic user confirmation could pose a security risk to your organization’s data." + "message": "Automatisk användarbekräftelse kan innebära en säkerhetsrisk för din organisations data." }, "autoConfirmAcceptSecurityRiskLearnMore": { "message": "Läs mer om riskerna", @@ -5917,10 +5923,10 @@ "message": "En organisationspolicy krävs. " }, "autoConfirmSingleOrgRequiredDesc": { - "message": "All members must only belong to this organization to activate this automation." + "message": "Alla medlemmar får bara tillhöra denna organisation för att aktivera denna automatisering." }, "autoConfirmSingleOrgExemption": { - "message": "Single organization policy will extend to all roles. " + "message": "En gemensam organisation policy kommer att utvidgas till alla roller. " }, "autoConfirmNoEmergencyAccess": { "message": "Ingen nödåtkomst. " @@ -5993,7 +5999,7 @@ "message": "Standardmatchning för URI" }, "invalidUriMatchDefaultPolicySetting": { - "message": "Please select a valid URI match detection option.", + "message": "Välj ett giltigt upptäcktsalternativ för URI-matchning.", "description": "Error message displayed when a user attempts to save URI match detection policy settings with an invalid selection." }, "modifiedPolicyId": { @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Bjöd in igen" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ användare återinbjudna", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ av $SELECTEDCOUNT$ användare återinbjudna. $EXCLUDEDCOUNT$ blev inte inbjudna på grund av gränsen på $LIMIT$ inbjudningar.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Tog bort" }, @@ -6653,7 +6685,7 @@ "message": "Automatisk inloggning med SSO" }, "automaticAppLoginWithSSODesc": { - "message": "Extend SSO security and convenience to unmanaged apps. When users launch an app from your identity provider, their login details are automatically filled and submitted, creating a one-click, secure flow from the identity provider to the app." + "message": "Utöka SSO-säkerhet och bekvämlighet till ohanterade appar. När användare startar en app från din identitetsleverantör fylls deras inloggningsuppgifter automatiskt i och skickas in, skapa ett enda klick, säkert flöde från identitetsleverantör till appen." }, "automaticAppLoginIdpHostLabel": { "message": "Identitetsleverantörens värd" @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout ligger inte inom tillåtet intervall." }, - "disablePersonalVaultExport": { - "message": "Ta bort export av enskilda valv" + "disableExport": { + "message": "Ta bort export" }, "disablePersonalVaultExportDescription": { "message": "Tillåt inte medlemmar att exportera data från sina individuella valv." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Ogiltig verifieringskod" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Ett huvudlösenord krävs inte längre för medlemmar i följande organisation. Vänligen bekräfta domänen nedan med din organisationsadministratör." - }, "keyConnectorDomain": { "message": "Key Connector-domän" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO aktiverad" }, - "disabledSso": { - "message": "SSO inaktiverad" + "ssoTurnedOff": { + "message": "SSO avstängd" }, "emailMustLoginWithSso": { "message": "$EMAIL$ måste logga in med Single Sign-on", @@ -7408,7 +7437,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Endast organisationsvalvet som är associerat med $ORGANIZATION$ kommer att exporteras.", "placeholders": { "organization": { "content": "$1", @@ -7417,7 +7446,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Endast organisationsvalvet som är associerat med $ORGANIZATION$ kommer att exporteras. Mina objektsamlingar kommer inte att inkluderas.", "placeholders": { "organization": { "content": "$1", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportera data" - }, "exportingOrganizationSecretDataTitle": { "message": "Export av hemliga organisationsdata" }, @@ -8936,7 +8962,7 @@ } }, "accessedProjectWithIdentifier": { - "message": "Accessed a project with identifier: $PROJECT_ID$.", + "message": "Kom åt ett projekt med identifierare: $PROJECT_ID$.", "placeholders": { "project_id": { "content": "$1", @@ -8963,7 +8989,7 @@ } }, "nameUnavailableServiceAccountDeleted": { - "message": "Deleted machine account Id: $SERVICE_ACCOUNT_ID$", + "message": "Tog bort maskinkonto med id: $SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -8981,7 +9007,7 @@ } }, "addedUserToServiceAccountWithId": { - "message": "Added user: $USER_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Lade till användare: $USER_ID$ till maskinkonto med identifierare: $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -8994,7 +9020,7 @@ } }, "removedUserToServiceAccountWithId": { - "message": "Removed user: $USER_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "Tog bort användare: $USER_ID$ från maskinkonto med identifierare: $SERVICE_ACCOUNT_ID$", "placeholders": { "user_id": { "content": "$1", @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO-inloggning krävs" }, + "emailRequiredForSsoLogin": { + "message": "E-postadress krävs för SSO" + }, "selectedRegionFlag": { "message": "Flagga för vald region" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Familjemedlemskap" }, - "planDescPremium": { - "message": "Komplett säkerhet online" + "advancedOnlineSecurity": { + "message": "Avancerad säkerhet online" }, "planDescFamiliesV2": { "message": "Premiumsäkerhet för din familj" @@ -12157,13 +12186,13 @@ "message": "Starta gratis testperiod för Families" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Blockera kontoskapande för domäner som gjorts anspråk på" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Förhindra användare från att skapa konton utanför din organisation med hjälp av e-postadresser från domäner som gjorts anspråk på." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "En domän måste göras anspråk på först innan denna policy aktiveras." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Konfigurera en upplåsningsmetod för att ändra tidsgränsåtgärden för valvet." @@ -12199,13 +12228,186 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Din organisation använder inte längre huvudlösenord för att logga in på Bitwarden. För att fortsätta, verifiera organisationen och domänen." + }, + "continueWithLogIn": { + "message": "Fortsätt med inloggning" + }, + "doNotContinue": { + "message": "Fortsätt inte" + }, + "domain": { + "message": "Domän" + }, + "keyConnectorDomainTooltip": { + "message": "Denna domän kommer att lagra dina krypteringsnycklar, så se till att du litar på den. Om du inte är säker, kontrollera med din administratör." + }, + "verifyYourOrganization": { + "message": "Verifiera din organisation för att logga in" + }, + "organizationVerified": { + "message": "Organisation verifierad" + }, + "domainVerified": { + "message": "Domän verifierad" + }, + "leaveOrganizationContent": { + "message": "Om du inte verifierar din organisation kommer din åtkomst till organisationen att återkallas." + }, + "leaveNow": { + "message": "Lämna nu" + }, + "verifyYourDomainToLogin": { + "message": "Verifiera din domän för att logga in" + }, + "verifyYourDomainDescription": { + "message": "För att fortsätta med inloggning, verifiera denna domän." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "För att fortsätta logga in, verifiera organisationen och domänen." + }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Inga kritiska applikationer är valda" }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Är du säker på att du vill fortsätta?" }, "userVerificationFailed": { "message": "Verifiering av användare misslyckades." + }, + "recoveryDeleteCiphersTitle": { + "message": "Ta bort oåterkalleliga valvobjekt" + }, + "recoveryDeleteCiphersDesc": { + "message": "Några av dina valvobjekt kunde inte återställas. Vill du ta bort dessa oåterkalleliga objekt från ditt valv?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Ta bort oåterkalleliga mappar" + }, + "recoveryDeleteFoldersDesc": { + "message": "Några av dina mappar kunde inte återställas. Vill du ta bort dessa oåterkalleliga mappar från ditt valv?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Ersätt krypteringsnyckel" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Ditt publika nyckelpar för kryptering kunde inte återställas. Vill du ersätta din krypteringsnyckel med ett nytt nyckelpar? Detta kommer att kräva att du konfigurerar befintlig nödåtkomst och organisationsmedlemskap igen." + }, + "recoveryStepSyncTitle": { + "message": "Synkroniserar data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifierar integritet för krypteringsnyckeln" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifierar användarinformation" + }, + "recoveryStepCipherTitle": { + "message": "Verifierar integritet för valvobjekt" + }, + "recoveryStepFoldersTitle": { + "message": "Verifierar mappintegritet" + }, + "dataRecoveryTitle": { + "message": "Dataåterställning och diagnostik" + }, + "dataRecoveryDescription": { + "message": "Använd verktyget för dataåterställning för att diagnostisera och reparera problem med ditt konto. Efter att ha kört diagnostik har du möjlighet att spara diagnostikloggar för support och möjlighet att reparera eventuella upptäckta problem." + }, + "runDiagnostics": { + "message": "Kör diagnostik" + }, + "repairIssues": { + "message": "Reparera problem" + }, + "saveDiagnosticLogs": { + "message": "Spara diagnostikloggar" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Den här inställningen hanteras av din organisation." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Din organisation har ställt in maximal sessionstidsgräns till $HOURS$ timmar och $MINUTES$ minut(er).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Din organisation har ställt in tidsgränsen för standardsession till Vid webbläsaruppdatering." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximal tidsgräns får inte överstiga $HOURS$ timmar och $MINUTES$ minut(er)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Vid webbläsaruppdatering" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Ställ in en upplåsningsmetod för att ändra din tidsgränsåtgärd" + }, + "leaveConfirmationDialogTitle": { + "message": "Är du säker på att du vill lämna?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Genom att avböja kommer dina personliga objekt att stanna på ditt konto, men du kommer att förlora åtkomst till delade objekt och organisationsfunktioner." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Kontakta administratören för att återfå åtkomst." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Lämna $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Hur hanterar jag mitt valv?" + }, + "transferItemsToOrganizationTitle": { + "message": "Överför objekt till $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ kräver att alla objekt ägs av organisationen för säkerhet och efterlevnad. Klicka på godkänn för att överföra ägarskapet för dina objekt.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Godkänn överföring" + }, + "declineAndLeave": { + "message": "Avböj och lämna" + }, + "whyAmISeeingThis": { + "message": "Varför ser jag det här?" } } diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json index 98970962d69..62e28d08097 100644 --- a/apps/web/src/locales/ta/messages.json +++ b/apps/web/src/locales/ta/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "இதிலிருந்து ஏற்றுமதி" }, - "exportVault": { - "message": "பெட்டகத்தை ஏற்றுமதி செய்" - }, - "exportSecrets": { - "message": "ரகசியங்களை ஏற்றுமதி செய்" - }, "fileFormat": { "message": "கோப்பு வடிவம்" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "முதன்மை கடவுச்சொல்லை உறுதிப்படுத்தவும்" }, - "confirmFormat": { - "message": "வடிவத்தை உறுதிப்படுத்தவும்" - }, "filePassword": { "message": "கோப்பு கடவுச்சொல்" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "கருவிகள்" }, + "import": { + "message": "Import" + }, "importData": { "message": "தரவை இம்போர்ட் செய்யவும்" }, @@ -5169,9 +5163,21 @@ "message": "சரிசெய்", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "உங்கள் வால்ட்டில் பழைய கோப்பு இணைப்புகள் உள்ளன, அவை உங்கள் கணக்கின் என்க்ரிப்ஷன் கீயைச் சுழற்றுவதற்கு முன் சரிசெய்யப்பட வேண்டும்." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "உங்கள் கணக்கின் ஃபிங்கர்பிரிண்ட் ஃபிரேஸ்", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "வெற்றிகரமாக மீண்டும் அழைக்கப்பட்டது" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "வெற்றிகரமாக அகற்றப்பட்டது" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "பெட்டக காலக்கெடு அனுமதிக்கப்பட்ட வரம்பிற்குள் இல்லை." }, - "disablePersonalVaultExport": { - "message": "தனிப்பட்ட பெட்டக ஏற்றுமதியை அகற்று" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "உறுப்பினர்கள் தங்கள் தனிப்பட்ட பெட்டகத்திலிருந்து தரவை ஏற்றுமதி செய்ய அனுமதிக்க வேண்டாம்." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "தவறான சரிபார்ப்புக் குறியீடு" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "பின்வரும் நிறுவனத்தின் உறுப்பினர்களுக்கு மாஸ்டர் கடவுச்சொல் இனி தேவையில்லை. தயவுசெய்து கீழே உள்ள டொமைனை உங்கள் நிறுவன நிர்வாகியுடன் உறுதிப்படுத்தவும்." - }, "keyConnectorDomain": { "message": "கீ கனெக்டர் டொமைன்" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO இயக்கப்பட்டது" }, - "disabledSso": { - "message": "SSO இயக்கப்பட்டது" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "சேவையகம்" }, - "exportData": { - "message": "தரவை ஏற்றுமதி செய்" - }, "exportingOrganizationSecretDataTitle": { "message": "நிறுவன இரகசிய தரவை ஏற்றுமதி செய்தல்" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO உள்நுழைவு தேவை" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "தேர்ந்தெடுக்கப்பட்ட பிராந்திய கொடி" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index 608215f8155..26f146809b5 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index c20cc2e5d8c..431c7fc014c 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "รูปแบบไฟล์" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -5169,9 +5163,21 @@ "message": "Fix", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "There are old file attachments in your vault that need to be fixed before you can rotate your account's encryption key." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Your account's fingerprint phrase", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Reinvited successfully" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Removed successfully" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Vault timeout is not within allowed range." }, - "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Do not allow members to export data from their individual vault." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Invalid verification code" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." - }, "keyConnectorDomain": { "message": "Key Connector domain" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO turned on" }, - "disabledSso": { - "message": "SSO turned on" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO login is required" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Selected region flag" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Complete online security" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Premium security for your family" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 829c0ca17dc..99e1225731f 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -39,7 +39,7 @@ } }, "noReportRan": { - "message": "You have not created a report yet" + "message": "Henüz bir rapor oluşturmadınız" }, "notifiedMembers": { "message": "Bildirilen üyeler" @@ -75,7 +75,7 @@ } }, "securityTasksCompleted": { - "message": "$COUNT$ out of $TOTAL$ security tasks completed", + "message": "$TOTAL$ güvenlik görevinden $COUNT$ tanesi tamamlandı", "placeholders": { "count": { "content": "$1", @@ -88,28 +88,28 @@ } }, "passwordChangeProgress": { - "message": "Password change progress" + "message": "Parola değiştirme ilerlemesi" }, "assignMembersTasksToMonitorProgress": { - "message": "Assign members tasks to monitor progress" + "message": "İlerlemeyi izlemek için üyelere görevler atayın" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Uygulamaları gözden geçirip kritik olarak işaretledikten sonra, parolalarını değiştirmeleri için üyelerinize görevler atayın." }, "sendReminders": { - "message": "Send reminders" + "message": "Hatırlatıcı gönder" }, "onceYouMarkApplicationsCriticalTheyWillDisplayHere": { - "message": "Once you mark applications critical, they will display here." + "message": "Uygulamaları kritik olarak işaretlediğinizde burada görüntülenecekler." }, "viewAtRiskMembers": { - "message": "View at-risk members" + "message": "Risk altındaki üyeleri görüntüle" }, "viewAtRiskApplications": { - "message": "View at-risk applications" + "message": "Risk altındaki uygulamaları görüntüle" }, "criticalApplicationsAreAtRisk": { - "message": "$COUNT$ out of $TOTAL$ critical applications are at-risk due to at-risk passwords", + "message": "Riskli parolalar nedeniyle $TOTAL$ kritik uygulamadan $COUNT$ tanesi risk altında", "placeholders": { "count": { "content": "$1", @@ -131,7 +131,7 @@ } }, "criticalApplicationsMarked": { - "message": "critical applications marked" + "message": "işaretlenmiş kritik uygulamalar" }, "countOfCriticalApplications": { "message": "$COUNT$ kritik uygulama", @@ -143,7 +143,7 @@ } }, "countOfApplicationsAtRisk": { - "message": "$COUNT$ applications at-risk", + "message": "$COUNT$ uygulama risk altında", "placeholders": { "count": { "content": "$1", @@ -152,7 +152,7 @@ } }, "countOfAtRiskPasswords": { - "message": "$COUNT$ passwords at-risk", + "message": "$COUNT$ parola risk altında", "placeholders": { "count": { "content": "$1", @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Veri bulunamadı" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Access Intelligence’i kullanmaya başlamak için kuruluşunuzun hesap verilerini içe aktarın. Bunu yaptıktan sonra şunları yapabileceksiniz:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Uygulamaları kritik olarak işaretle" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Bu, öncelikle en önemli uygulamalarınızdaki riskleri ortadan kaldırmanıza yardımcı olur." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Üyelerin güvenliklerini iyileştirmelerine yardımcı olun" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Kimlik bilgilerini güncellemeleri için risk altındaki üyelere rehberli güvenlik görevleri atayın." }, "feature3Title": { - "message": "Monitor progress" + "message": "İlerlemeyi izle" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Zaman içindeki değişiklikleri takip ederek güvenlikteki iyileşmeleri gösterin." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Rapor oluştur" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Artık rapor oluşturmaya hazırsınız. Rapor oluşturduğunuzda şunları yapabileceksiniz:" }, "noCriticalApplicationsTitle": { "message": "Hiçbir uygulamayı kritik olarak işaretlemediniz" @@ -224,19 +224,19 @@ "message": "Kritik olarak işaretle" }, "applicationsSelected": { - "message": "applications selected" + "message": "seçili uygulamalar" }, "selectApplication": { - "message": "Select application" + "message": "Uygulama seçin" }, "unselectApplication": { - "message": "Unselect application" + "message": "Uygulama seçimini kaldır" }, "applicationsMarkedAsCriticalSuccess": { "message": "Kritik olarak işaretlenmiş uygulamalar" }, "criticalApplicationsMarkedSuccess": { - "message": "$COUNT$ applications marked as critical", + "message": "$COUNT$ uygulama kritik olarak işaretlendi", "placeholders": { "count": { "content": "$1", @@ -245,7 +245,7 @@ } }, "applicationsMarkedAsCriticalFail": { - "message": "Failed to mark applications as critical" + "message": "Uygulamaların kritik olarak işaretlenmesi başarısız oldu" }, "application": { "message": "Uygulama" @@ -266,13 +266,13 @@ "message": "Riskli üyeler" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Bu üyelerin kritik uygulamalara ait güvenlik zafiyeti olan kayıtlara erişimi var." }, "membersWithAtRiskPasswords": { - "message": "Members with at-risk passwords" + "message": "Riskli parolalara sahip üyeler" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Kuruluşunuzdaki üyelere, güvenlik zafiyeti olan parolaları değiştirmeleri için bir görev atanacaktır. Bildirimi Bitwarden tarayıcı uzantıları içinde alacaklar." }, "membersAtRiskCount": { "message": "$COUNT$ üye risk altında", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Bu üyeler kritik uygulamalara zayıf, ele geçirilmiş veya yeniden kullanılan parolalarla giriş yapıyor." }, "atRiskMembersDescriptionNone": { "message": "Zayıf, ele geçirilmiş veya tekrar kullanılan parolayla uygulamalara giriş yapan üye yok." @@ -341,13 +341,13 @@ "message": "Toplam uygulama" }, "applicationsNeedingReview": { - "message": "Applications needing review" + "message": "Gözden geçirilmesi gereken uygulamalar" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Yeni uygulamaları gözden geçir" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "$COUNT$ yeni uygulama", "placeholders": { "count": { "content": "$1", @@ -356,19 +356,19 @@ } }, "newApplicationsDescription": { - "message": "Review new applications to mark as critical and keep your organization secure" + "message": "Kuruluşunuzun güvenliğini sağlamak için yeni uygulamaları gözden geçirip kritik olarak işaretleyin" }, "reviewNow": { - "message": "Review now" + "message": "Şimdi gözden geçir" }, "allCaughtUp": { "message": "Şimdilik bu kadar!" }, "noNewApplicationsToReviewAtThisTime": { - "message": "No new applications to review at this time" + "message": "Şu anda gözden geçirilecek yeni uygulama yok" }, "organizationHasItemsSavedForApplications": { - "message": "Your organization has items saved for $COUNT$ applications", + "message": "Kuruluşunuzun $COUNT$ uygulama için kaydedilmiş kayıtları var", "placeholders": { "count": { "content": "$1", @@ -377,37 +377,37 @@ } }, "reviewApplicationsToSecureItems": { - "message": "Review applications to secure the items most critical to your organization's security" + "message": "Kuruluşunuzun güvenliği açısından en kritik kayıtları güvence altına almak için uygulamaları gözden geçirin" }, "reviewApplications": { - "message": "Review applications" + "message": "Uygulamaları gözden geçir" }, "prioritizeCriticalApplications": { - "message": "Prioritize critical applications" + "message": "Kritik uygulamalara öncelik ver" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Kuruluşunuz için en kritik uygulamaları seçin. Ardından riskleri ortadan kaldırmak için üyelere güvenlik görevleri atayabilirsiniz." }, "reviewNewApplications": { - "message": "Review new applications" + "message": "Yeni uygulamaları gözden geçir" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Güvenlik zafiyeti olan kayıtlara sahip yeni uygulamaları gözden geçirip yakından izlemek istediklerinizi kritik olarak işaretleyin. Ardından riskleri ortadan kaldırmak için üyelere güvenlik görevleri atayabilirsiniz." }, "clickIconToMarkAppAsCritical": { - "message": "Click the star icon to mark an app as critical" + "message": "Bir uygulamayı kritik olarak işaretlemek için yıldız simgesine tıklayın" }, "markAsCriticalPlaceholder": { - "message": "Mark as critical functionality will be implemented in a future update" + "message": "Kritik olarak işaretle işlevselliği gelecekteki bir güncellemede uygulanacaktır" }, "applicationReviewSaved": { - "message": "Application review saved" + "message": "Uygulama incelemesi kaydedildi" }, "newApplicationsReviewed": { - "message": "New applications reviewed" + "message": "Yeni uygulamalar incelendi" }, "errorSavingReviewStatus": { - "message": "Error saving review status" + "message": "İnceleme durumu kaydedilirken hata oluştu" }, "pleaseTryAgain": { "message": "Lütfen yeniden deneyin" @@ -1390,7 +1390,7 @@ "message": "Bu pencereyi açık tutun ve tarayıcınızdan gelen talimatları uygulayın." }, "passkeyAuthenticationFailed": { - "message": "Passkey authentication failed. Please try again." + "message": "Geçiş anahtarı ile kimlik doğrulama başarısız oldu. Lütfen tekrar deneyin." }, "useADifferentLogInMethod": { "message": "Başka bir giriş yöntemi kullan" @@ -1720,13 +1720,13 @@ "message": "Kasanız sadece parolalarınız için değil. Hesaplarınızı, kimliklerinizi, kredi kartlarınızı ve notlarınızı da güvenle burada depolayabilirsiniz." }, "emptyFavorites": { - "message": "You haven't favorited any items" + "message": "Henüz hiçbir kaydı favorilere eklemediniz" }, "emptyFavoritesDesc": { - "message": "Add frequently used items to favorites for quick access." + "message": "Sık kullandığınız kayıtları hızlı erişim için favorilere ekleyin." }, "noSearchResults": { - "message": "No search results returned" + "message": "Arama sonucu bulunamadı" }, "clearFiltersOrTryAnother": { "message": "Filtreleri temizleyin veya başka bir arama yapmayı deneyin" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Dışa aktarılacak konum" }, - "exportVault": { - "message": "Kasayı dışa aktar" - }, - "exportSecrets": { - "message": "Sırları dışa aktar" - }, "fileFormat": { "message": "Dosya biçimi" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Ana parolayı onaylayın" }, - "confirmFormat": { - "message": "Biçimi onayla" - }, "filePassword": { "message": "Dosya parolası" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Araçlar" }, + "import": { + "message": "İçe aktar" + }, "importData": { "message": "Verileri içe aktar" }, @@ -3044,7 +3038,7 @@ "message": "Lütfen hesabınızda bu ödemeyi yapabilecek kadar kredi olduğundan emin olun. Eğer hesabınızda yeteri kadar kredi yoksa, aradaki fark varsayılan ödeme yöntemizinden karşılanacaktır. Faturalandırma sayfasından hesabınıza kredi ekleyebilirsiniz." }, "notEnoughAccountCredit": { - "message": "You do not have enough account credit for this purchase. You can add credit to your account from the Billing page." + "message": "Bu satın alma için yeterli hesap krediniz yok. Faturalandırma sayfasından hesabınıza kredi ekleyebilirsiniz." }, "creditAppliedDesc": { "message": "Hesabınızdaki krediyi satın alımlarda kullanabilirsiniz. Mevcut krediniz bu hesap için oluşturulan faturalardan otomatik olarak düşülecektir." @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Premium aboneliğiniz sona erdi" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "Arşivinize yeniden erişim kazanmak için Premium aboneliğinizi yeniden başlatın. Yeniden başlatmadan önce arşivlenmiş bir kaydın ayrıntılarını düzenlerseniz, kayıt tekrar kasanıza taşınır." }, "restartPremium": { - "message": "Restart Premium" + "message": "Premium’u yeniden başlat" }, "additionalStorageGb": { "message": "Ek depolama alanı (GB)" @@ -4479,34 +4473,34 @@ "message": "Tarayıcıyı güncelle" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Access Intelligence’ınız oluşturuluyor..." }, "fetchingMemberData": { - "message": "Fetching member data..." + "message": "Üye verileri getiriliyor..." }, "analyzingPasswordHealth": { - "message": "Analyzing password health..." + "message": "Parola sağlığı analiz ediliyor..." }, "calculatingRiskScores": { - "message": "Calculating risk scores..." + "message": "Risk puanları hesaplanıyor..." }, "generatingReportData": { - "message": "Generating report data..." + "message": "Rapor verileri oluşturuluyor..." }, "savingReport": { - "message": "Saving report..." + "message": "Rapor kaydediliyor..." }, "compilingInsights": { - "message": "Compiling insights..." + "message": "İçgörüler derleniyor..." }, "loadingProgress": { - "message": "Loading progress" + "message": "Yükleme ilerlemesi" }, "thisMightTakeFewMinutes": { - "message": "This might take a few minutes." + "message": "Bu işlem birkaç dakika sürebilir." }, "riskInsightsRunReport": { - "message": "Run report" + "message": "Raporu çalıştır" }, "updateBrowserDesc": { "message": "Desteklenmeyen bir web tarayıcısı kullanıyorsunuz. Web kasası düzgün çalışmayabilir." @@ -4591,7 +4585,7 @@ "message": "Davet kabul edildi" }, "invitationAcceptedDesc": { - "message": "Successfully accepted your invitation." + "message": "Davetiniz başarıyla kabul edildi." }, "inviteInitAcceptedDesc": { "message": "Artık bu kuruluşa erişebilirsiniz." @@ -4627,19 +4621,19 @@ "message": "Daha fazla bilgi al" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "Şifreleme ayarları güncellenirken bir hata oluştu." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Şifreleme ayarlarınızı güncelleyin" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Önerilen yeni şifreleme ayarları hesap güvenliğinizi artıracaktır. Şimdi güncellemek için ana parolanızı girin." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Devam etmek için kimliğinizi doğrulayın" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Ana parolanızı girin" }, "updateSettings": { "message": "Ayarları güncelle" @@ -5169,9 +5163,21 @@ "message": "Düzelt", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Şifrelemeyi düzelt" + }, + "fixEncryptionTooltip": { + "message": "Bu dosya eski bir şifreleme yöntemi kullanıyor." + }, + "attachmentUpdated": { + "message": "Ek güncellendi" + }, "oldAttachmentsNeedFixDesc": { "message": "Hesabınızın şifreleme anahtarını yenilemeden önce kasanızdaki eski dosya eklerini düzeltilmeniz gerekiyor." }, + "itemsTransferred": { + "message": "Kayıtlar aktarıldı" + }, "yourAccountsFingerprint": { "message": "Hesabınızın parmak izi ifadesi", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5484,11 +5490,11 @@ "message": "SSO tanımlayıcı" }, "ssoIdentifierHint": { - "message": "Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. ", + "message": "Üyelerinizin SSO ile hesaplarına erişebilmeleri için bu kimliği onlara verin. Bir sahiplenilmiş etki alanı yapılandırılmışsa, SSO sırasında üyeler bu tanımlayıcıyı girmeyi atlayabilir.", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "claimedDomainsLearnMore": { - "message": "Learn more", + "message": "Daha fazla bilgi alın", "description": "This will be used as part of a larger sentence, broken up to include a link. The full sentence will read 'Provide this ID to your members to login with SSO. Members can skip entering this identifier during SSO if a claimed domain is set up. Learn more'" }, "unlinkSso": { @@ -5846,7 +5852,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Tüm kayıtların mülkiyeti kuruluşa ait olacak ve kayıtlar kuruluşa kaydedilerek kuruluş genelinde denetim, görünürlük ve raporlama sağlanacaktır. Bu özellik açıldığında, her üyenin kayıtlarını kaydetmesi için varsayılan bir koleksiyon kullanıma sunulur. Yönetimi hakkında daha fazla bilgi edinin ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -5873,17 +5879,17 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about the credential lifecycle.'" }, "availableNow": { - "message": "Available now" + "message": "Şimdi kullanılabilir" }, "autoConfirm": { - "message": "Automatic confirmation of new users" + "message": "Yeni kullanıcıların otomatik onayı" }, "autoConfirmDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked.", + "message": "Kuruluşa davet edilen yeni kullanıcılar, bir yöneticinin cihazı kilitli değilken otomatik olarak onaylanacaktır.", "description": "This is the description of the policy as it appears in the 'Policies' page" }, "howToTurnOnAutoConfirm": { - "message": "How to turn on automatic user confirmation" + "message": "Otomatik kullanıcı onayı nasıl açılır" }, "autoConfirmExtension1": { "message": "Bitwarden uzantınızı açın" @@ -5897,39 +5903,39 @@ "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtensionOpened": { - "message": "Successfully opened the Bitwarden browser extension. You can now activate the automatic user confirmation setting." + "message": "Bitwarden tarayıcı uzantısı başarıyla açıldı. Artık otomatik kullanıcı onayı ayarını etkinleştirebilirsiniz." }, "autoConfirmPolicyEditDescription": { - "message": "New users invited to the organization will be automatically confirmed when an admin’s device is unlocked. Before turning on this policy, please review and agree to the following: ", + "message": "Kuruluşa davet edilen yeni kullanıcılar, bir yöneticinin cihazı kilitli değilken otomatik olarak onaylanacaktır. Bu ilkeyi etkinleştirmeden önce lütfen aşağıdakileri inceleyip kabul edin: ", "description": "This is the description of the policy as it appears inside the policy edit dialog" }, "autoConfirmAcceptSecurityRiskTitle": { - "message": "Potential security risk. " + "message": "Olası güvenlik riski. " }, "autoConfirmAcceptSecurityRiskDescription": { - "message": "Automatic user confirmation could pose a security risk to your organization’s data." + "message": "Otomatik kullanıcı onayı, kuruluşunuzun verileri için bir güvenlik riski oluşturabilir." }, "autoConfirmAcceptSecurityRiskLearnMore": { - "message": "Learn about the risks", + "message": "Riskler hakkında bilgi edinin", "description": "The is the link copy for the first check box option in the edit policy dialog" }, "autoConfirmSingleOrgRequired": { - "message": "Single organization policy required. " + "message": "Tek kuruluş ilkesi gereklidir. " }, "autoConfirmSingleOrgRequiredDesc": { - "message": "All members must only belong to this organization to activate this automation." + "message": "Bu otomasyonu etkinleştirmek için tüm üyelerin yalnızca bu kuruluşa ait olması gerekir." }, "autoConfirmSingleOrgExemption": { - "message": "Single organization policy will extend to all roles. " + "message": "Tek kuruluş ilkesinin kapsamı tüm rollere genişletilecektir. " }, "autoConfirmNoEmergencyAccess": { - "message": "No emergency access. " + "message": "Acil durum erişimi yok. " }, "autoConfirmNoEmergencyAccessDescription": { - "message": "Emergency Access will be removed." + "message": "Acil Erişim kaldırılacak." }, "autoConfirmCheckBoxLabel": { - "message": "I accept these risks and policy updates" + "message": "Bu riskleri ve ilke güncellemelerini kabul ediyorum" }, "personalOwnership": { "message": "Kişisel kasayı kaldır" @@ -5944,10 +5950,10 @@ "message": "Bir kuruluş ilkesi nedeniyle kişisel kasanıza hesap kaydetmeniz kısıtlanmış. Sahip seçeneğini bir kuruluş olarak değiştirin ve mevcut koleksiyonlar arasından seçim yapın." }, "desktopAutotypePolicy": { - "message": "Desktop Autotype Default Setting" + "message": "Masaüstü Otomatik Yazma Varsayılan Ayarı" }, "desktopAutotypePolicyDesc": { - "message": "Turn Desktop Autotype ON by default for members. Members can turn Autotype off manually in the Desktop client.", + "message": "Üyeler için Masaüstü Otomatik Yazma özelliğini varsayılan olarak AÇIK duruma getirin. Üyeler, Masaüstü istemcisinde Otomatik Yazma’yı manuel olarak kapatabilir.", "description": "This policy will enable Desktop Autotype by default for members on Unlock." }, "disableSend": { @@ -5987,13 +5993,13 @@ "message": "Varsayılan URI eşleşme tespiti" }, "uriMatchDetectionPolicyDesc": { - "message": "Determine when logins are suggested for autofill. Admins and owners are exempt from this policy." + "message": "Hesapların otomatik doldurma için ne zaman önerileceğini belirleyin. Yöneticiler ve sahipler bu ilkeden muaftır." }, "uriMatchDetectionOptionsLabel": { "message": "Varsayılan URI eşleşme tespiti" }, "invalidUriMatchDefaultPolicySetting": { - "message": "Please select a valid URI match detection option.", + "message": "Lütfen geçerli bir URl eşleşme algılama seçeneği seçin.", "description": "Error message displayed when a user attempts to save URI match detection policy settings with an invalid selection." }, "modifiedPolicyId": { @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Yeniden davet edildi" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ kullanıcı yeniden davet edildi", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$SELECTEDCOUNT$ kullanıcıdan $LIMIT$ tanesi yeniden davet edildi. $EXCLUDEDCOUNT$ kullanıcı, $LIMIT$ davet sınırı nedeniyle davet edilmedi.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Başarıyla kaldırıldı" }, @@ -6650,10 +6682,10 @@ "message": "Ana parolanız kuruluş ilkelerinizi karşılamıyor. Kasanıza erişmek için ana parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir." }, "automaticAppLoginWithSSO": { - "message": "Automatic login with SSO" + "message": "SSO ile otomatik hesap girişi" }, "automaticAppLoginWithSSODesc": { - "message": "Extend SSO security and convenience to unmanaged apps. When users launch an app from your identity provider, their login details are automatically filled and submitted, creating a one-click, secure flow from the identity provider to the app." + "message": "SSO güvenliğini ve kullanım kolaylığını yönetilmeyen uygulamalara da genişletin. Kullanıcılar bir uygulamayı kimlik sağlayıcınızdan başlattığında, hesap bilgileri otomatik olarak doldurulup gönderilir ve böylece kimlik sağlayıcıdan uygulamaya tek tıklamalı, güvenli bir akış sağlanır." }, "automaticAppLoginIdpHostLabel": { "message": "Kimlik sağlayıcı ana bilgisayarı" @@ -6668,16 +6700,16 @@ "message": "Oturum zaman aşımı" }, "sessionTimeoutPolicyDescription": { - "message": "Set a maximum session timeout for all members except owners." + "message": "Sahipler dışındaki tüm üyeler için maksimum oturum zaman aşımı belirleyin." }, "maximumAllowedTimeout": { - "message": "Maximum allowed timeout" + "message": "İzin verilen maksimum zaman aşımı" }, "maximumAllowedTimeoutRequired": { - "message": "Maximum allowed timeout is required." + "message": "İzin verilen maksimum zaman aşımı zorunludur." }, "sessionTimeoutPolicyInvalidTime": { - "message": "Time is invalid. Change at least one value." + "message": "Süre geçersiz. En az bir değeri değiştirin." }, "sessionTimeoutAction": { "message": "Oturum zaman aşımı eylemi" @@ -6698,19 +6730,19 @@ "message": "Dakika" }, "sessionTimeoutConfirmationNeverTitle": { - "message": "Are you certain you want to allow a maximum timeout of \"Never\" for all members?" + "message": "Tüm üyeler için maksimum zaman aşımının \"Asla\" olmasına izin vermek istediğinizden emin misiniz?" }, "sessionTimeoutConfirmationNeverDescription": { - "message": "This option will save your members' encryption keys on their devices. If you choose this option, ensure that their devices are adequately protected." + "message": "Bu seçenek, üyelerinizin şifreleme anahtarlarını cihazlarında kaydedecektir. Bu seçeneği tercih ederseniz, üyelerinizin cihazlarının yeterince korunduğundan emin olun." }, "learnMoreAboutDeviceProtection": { - "message": "Learn more about device protection" + "message": "Cihaz koruması hakkında daha fazla bilgi edinin" }, "sessionTimeoutConfirmationOnSystemLockTitle": { - "message": "\"System lock\" will only apply to the browser and desktop app" + "message": "\"Sistem kilidi\" yalnızca tarayıcı ve masaüstü uygulaması için geçerli olacaktır" }, "sessionTimeoutConfirmationOnSystemLockDescription": { - "message": "The mobile and web app will use \"on app restart\" as their maximum allowed timeout, since the option is not supported." + "message": "Bu seçenek desteklenmediğinden, mobil ve web uygulamaları için izin verilen maksimum zaman aşımı olarak \"uygulama yeniden başlatıldığında\" kullanılacaktır." }, "vaultTimeoutPolicyInEffect": { "message": "Kuruluş ilkeleriniz izin verilen maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Kasa zaman aşımı izin verilen aralıkta değil." }, - "disablePersonalVaultExport": { - "message": "Kişisel kasayı dışa aktarmayı kaldır" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Üyelerin kişisel kasalarındaki verileri dışa aktarmasına izin verme." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Geçersiz doğrulama kodu" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Aşağıdaki organizasyonun üyeleri için artık ana parola gerekmemektedir. Lütfen alan adını organizasyon yöneticinizle doğrulayın." - }, "keyConnectorDomain": { "message": "Key Connector alan adı" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO etkinleştirildi" }, - "disabledSso": { - "message": "SSO etkinleştirildi" + "ssoTurnedOff": { + "message": "SSO kapatıldı" }, "emailMustLoginWithSso": { "message": "$EMAIL$ çoklu oturum açma (SSO) ile giriş yapmalıdır", @@ -7408,7 +7437,7 @@ } }, "exportingOrganizationVaultFromPasswordManagerWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported.", + "message": "Yalnızca $ORGANIZATION$ ile ilişkilendirilmiş kuruluş kasası dışa aktarılacaktır.", "placeholders": { "organization": { "content": "$1", @@ -7417,7 +7446,7 @@ } }, "exportingOrganizationVaultFromAdminConsoleWithDataOwnershipDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. My items collections will not be included.", + "message": "Yalnızca $ORGANIZATION$ ile ilişkilendirilmiş kuruluş kasası dışa aktarılacaktır. Kayıtlarım koleksiyonları dahil edilmeyecektir.", "placeholders": { "organization": { "content": "$1", @@ -7583,7 +7612,7 @@ "message": "Bilinmeyen sır, bu sırra erişmek için izin istemeniz gerekebilir." }, "unknownServiceAccount": { - "message": "Unknown machine account, you may need to request permission to access this machine account." + "message": "Bilinmeyen makine hesabı, bu makine hesabına erişmek için izin talep etmeniz gerekebilir." }, "unknownProject": { "message": "Bilinmeyen proje, bu projeye erişmek için izin istemeniz gerekebilir." @@ -8718,9 +8747,6 @@ "server": { "message": "Sunucu" }, - "exportData": { - "message": "Verileri dışarı aktar" - }, "exportingOrganizationSecretDataTitle": { "message": "Kuruluş Gizli Verilerini Dışa Aktarma" }, @@ -8936,7 +8962,7 @@ } }, "accessedProjectWithIdentifier": { - "message": "Accessed a project with identifier: $PROJECT_ID$.", + "message": "$PROJECT_ID$ tanımlayıcısına sahip bir projeye erişildi.", "placeholders": { "project_id": { "content": "$1", @@ -8963,7 +8989,7 @@ } }, "nameUnavailableServiceAccountDeleted": { - "message": "Deleted machine account Id: $SERVICE_ACCOUNT_ID$", + "message": "Silinen makine hesabı ID’si: $SERVICE_ACCOUNT_ID$", "placeholders": { "service_account_id": { "content": "$1", @@ -8981,7 +9007,7 @@ } }, "addedUserToServiceAccountWithId": { - "message": "Added user: $USER_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabına $USER_ID$ kullanıcısı eklendi", "placeholders": { "user_id": { "content": "$1", @@ -8994,7 +9020,7 @@ } }, "removedUserToServiceAccountWithId": { - "message": "Removed user: $USER_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabından $USER_ID$ kullanıcısı kaldırıldı", "placeholders": { "user_id": { "content": "$1", @@ -9007,7 +9033,7 @@ } }, "removedGroupFromServiceAccountWithId": { - "message": "Removed group: $GROUP_ID$ from machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabından $GROUP_ID$ grubu kaldırıldı", "placeholders": { "group_id": { "content": "$1", @@ -9020,7 +9046,7 @@ } }, "serviceAccountCreatedWithId": { - "message": "Created machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabı oluşturuldu", "placeholders": { "service_account_id": { "content": "$1", @@ -9029,7 +9055,7 @@ } }, "addedGroupToServiceAccountId": { - "message": "Added group: $GROUP_ID$ to machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabına $GROUP_ID$ grubu eklendi", "placeholders": { "group_id": { "content": "$1", @@ -9042,7 +9068,7 @@ } }, "serviceAccountDeletedWithId": { - "message": "Deleted machine account with identifier: $SERVICE_ACCOUNT_ID$", + "message": "$SERVICE_ACCOUNT_ID$ kimlikli makine hesabı silindi", "placeholders": { "service_account_id": { "content": "$1", @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "SSO girişi gereklidir" }, + "emailRequiredForSsoLogin": { + "message": "SSO için e-posta gereklidir" + }, "selectedRegionFlag": { "message": "Seçilen bölgenin bayrağı" }, @@ -9857,11 +9886,11 @@ "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreePlan": { - "message": "Switching to free plan", + "message": "Ücretsiz plana geçiliyor", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreeOrg": { - "message": "Switching to free organization", + "message": "Ücretsiz kuruluşa geçiliyor", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "freeForOneYear": { @@ -9892,10 +9921,10 @@ "message": "Ata" }, "assignTasks": { - "message": "Assign tasks" + "message": "Görev ata" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Parolaları değiştirmek için bildirim gönder" }, "assignToCollections": { "message": "Koleksiyonlara ata" @@ -10293,13 +10322,13 @@ "message": "Etkinlik verilerini Logscale'e gönderin" }, "datadogEventIntegrationDesc": { - "message": "Send vault event data to your Datadog instance" + "message": "Kasa olay verilerini Datadog örneğinize gönderin" }, "failedToSaveIntegration": { "message": "Entegrasyon kaydedilemedi. Lütfen daha sonra tekrar deneyin." }, "mustBeOrgOwnerToPerformAction": { - "message": "You must be the organization owner to perform this action." + "message": "Bu işlemi gerçekleştirmek için kuruluş sahibi olmalısınız." }, "failedToDeleteIntegration": { "message": "Entegrasyon silinemedi. Lütfen daha sonra tekrar deneyin." @@ -11565,36 +11594,36 @@ "message": "Arşivde kayıt yok" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Arşivlenmiş kayıtlar burada görünür ve genel arama sonuçları ile otomatik doldurma önerilerinden hariç tutulur." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "Kayıt arşive gönderildi" }, "itemsWereSentToArchive": { - "message": "Items were sent to archive" + "message": "Kayıtlar arşive gönderildi" }, "itemUnarchived": { - "message": "Item was unarchived" + "message": "Kayıt arşivden çıkarıldı" }, "bulkArchiveItems": { - "message": "Items archived" + "message": "Kayıtlar arşivlendi" }, "bulkUnarchiveItems": { - "message": "Items unarchived" + "message": "Kayıtlar arşivden çıkarıldı" }, "archiveItem": { "message": "Kaydı arşivle", "description": "Verb" }, "archiveItemConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive this item?" + "message": "Arşivlenmiş kayıtlar genel arama sonuçları ve otomatik doldurma önerilerinden hariç tutulur. Bu kaydı arşivlemek istediğinizden emin misiniz?" }, "archiveBulkItems": { - "message": "Archive items", + "message": "Kayıtları arşivle", "description": "Verb" }, "archiveBulkItemsConfirmDesc": { - "message": "Archived items are excluded from general search results and autofill suggestions. Are you sure you want to archive these items?" + "message": "Arşivlenmiş kayıtlar genel arama sonuçları ve otomatik doldurma önerilerinden hariç tutulur. Bu kayıtları arşivlemek istediğinizden emin misiniz?" }, "businessUnit": { "message": "İş Birimi" @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Aile üyeliği" }, - "planDescPremium": { - "message": "Tam çevrimiçi güvenlik" + "advancedOnlineSecurity": { + "message": "Gelişmiş çevrimiçi güvenlik" }, "planDescFamiliesV2": { "message": "Aileniz için Premium güvenlik" @@ -12073,34 +12102,34 @@ "message": "Sorunsuz entegrasyon" }, "families": { - "message": "Families" + "message": "Aileler" }, "upgradeToFamilies": { - "message": "Upgrade to Families" + "message": "Aileler planına yükselt" }, "upgradeToPremium": { - "message": "Upgrade to Premium" + "message": "Premium’a yükselt" }, "familiesUpdated": { - "message": "You've upgraded to Families!" + "message": "Aileler planına yükseltildiniz!" }, "taxCalculationError": { - "message": "There was an error calculating tax for your location. Please try again." + "message": "Konumunuz için vergi hesaplanırken bir hata oluştu. Lütfen tekrar deneyin." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Bitwarden’a Hoş Geldiniz" }, "individualUpgradeDescriptionMessage": { - "message": "Unlock more security features with Premium, or start sharing items with Families" + "message": "Premium ile daha fazla güvenlik özelliğinin kilidini açın veya Aileler ile kayıtlarınızı paylaşmaya başlayın" }, "individualUpgradeTaxInformationMessage": { - "message": "Prices exclude tax and are billed annually." + "message": "Fiyatlara vergi dahil değildir ve yıllık olarak faturalandırılır." }, "organizationNameDescription": { - "message": "Your organization name will appear in invitations you send to members." + "message": "Kuruluş adınız, üyelere gönderdiğiniz davetlerde görünecektir." }, "continueWithoutUpgrading": { - "message": "Continue without upgrading" + "message": "Yükseltmeden devam et" }, "upgradeYourPlan": { "message": "Planınızı yükseltin" @@ -12109,19 +12138,19 @@ "message": "Şimdi yükselt" }, "formWillCreateNewFamiliesOrgMessage": { - "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." + "message": "Bu formu doldurmanız yeni bir Aileler kuruluşu oluşturacaktır. Ücretsiz kuruluşunuzu Yönetici Konsolu’ndan yükseltebilirsiniz." }, "upgradeErrorMessage": { - "message": "We encountered an error while processing your upgrade. Please try again." + "message": "Yükseltmenizi işlerken bir hata ile karşılaştık. Lütfen tekrar deneyin." }, "bitwardenFreeplanMessage": { - "message": "You have the Bitwarden Free plan" + "message": "Bitwarden Ücretsiz planını kullanıyorsunuz" }, "upgradeCompleteSecurity": { - "message": "Upgrade for complete security" + "message": "Tam güvenlik için yükselt" }, "viewbusinessplans": { - "message": "View business plans" + "message": "Kurumsal planları görüntüle" }, "updateEncryptionSettings": { "message": "Şifreleme ayarlarını güncelle" @@ -12133,37 +12162,37 @@ "message": "Algoritma" }, "encryptionKeySettingsHowShouldWeEncryptYourData": { - "message": "Choose how Bitwarden should encrypt your vault data. All options are secure, but stronger methods offer better protection - especially against brute-force attacks. Bitwarden recommends the default setting for most users." + "message": "Bitwarden’ın kasanızdaki verileri nasıl şifrelemesi gerektiğini seçin. Tüm seçenekler güvenlidir, ancak daha güçlü yöntemler özellikle kaba kuvvet saldırılarına karşı daha iyi koruma sağlar. Bitwarden, çoğu kullanıcı için varsayılan ayarı önerir." }, "encryptionKeySettingsIncreaseImproveSecurity": { - "message": "Increasing the values above the default will improve security, but your vault may take longer to unlock as a result." + "message": "Değerleri varsayılanın üzerine çıkarmak güvenliği artıracaktır, ancak bunun sonucunda kasanızın kilidinin açılması daha uzun sürebilir." }, "encryptionKeySettingsAlgorithmPopoverTitle": { - "message": "About encryption algorithms" + "message": "Şifreleme algoritmaları hakkında" }, "encryptionKeySettingsAlgorithmPopoverPBKDF2": { - "message": "PBKDF2-SHA256 is a well-tested encryption method that balances security and performance. Good for all users." + "message": "PBKDF2-SHA256, güvenlik ve performans arasında denge sağlayan, kapsamlı şekilde test edilmiş bir şifreleme yöntemidir. Tüm kullanıcılar için uygundur." }, "encryptionKeySettingsAlgorithmPopoverArgon2Id": { - "message": "Argon2id offers stronger protection against modern attacks. Best for advanced users with powerful devices." + "message": "Argon2id, modern saldırılara karşı daha güçlü koruma sağlar. Güçlü cihazlara sahip ileri düzey kullanıcılar için en iyisidir." }, "zipPostalCodeLabel": { - "message": "ZIP / Postal code" + "message": "Posta kodu" }, "cardNumberLabel": { - "message": "Card number" + "message": "Kart numarası" }, "startFreeFamiliesTrial": { - "message": "Start free Families trial" + "message": "Ücretsiz Aileler denemesini başlat" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Sahiplenilen etki alanları için hesap oluşturulmasını engelle" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Kullanıcıların, sahiplenilen etki alanlarına ait e-posta adreslerini kullanarak kuruluşunuzun dışında hesap oluşturmalarını engelleyin." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Bu ilkeyi etkinleştirmeden önce bir etki alanının sahiplenilmesi gerekir." }, "unlockMethodNeededToChangeTimeoutActionDesc": { "message": "Kasa zaman aşımı eyleminizi değiştirmek için kilit açma yönteminizi ayarlayın." @@ -12199,13 +12228,186 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Hiçbir kritik uygulama seçili değil" }, "confirmNoSelectedCriticalApplicationsDesc": { "message": "Devam etmek istediğinizden emin misiniz?" }, "userVerificationFailed": { "message": "Kullanıcı doğrulaması başarısız oldu." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Bu ayar kuruluşunuz tarafından yönetiliyor." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Kuruluşunuz maksimum kasa zaman aşımını $HOURS$ saat $MINUTES$ dakika olarak belirlemiş.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Kuruluşunuz varsayılan oturum zaman aşımını \"Tarayıcı yenilendiğinde\" olarak ayarladı." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maksimum zaman aşımı en fazla $HOURS$ saat $MINUTES$ dakika olabilir", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Tarayıcı yenilendiğinde" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Zaman aşımı eyleminizi değiştirmek için kilit açma yönteminizi ayarlayın" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index be571b0c146..b269058799d 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Експортувати з" }, - "exportVault": { - "message": "Експортувати сховище" - }, - "exportSecrets": { - "message": "Експортувати секрети" - }, "fileFormat": { "message": "Формат файлу" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Підтвердьте головний пароль" }, - "confirmFormat": { - "message": "Підтвердити формат" - }, "filePassword": { "message": "Пароль файлу" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Інструменти" }, + "import": { + "message": "Import" + }, "importData": { "message": "Імпортувати дані" }, @@ -5169,9 +5163,21 @@ "message": "Виправити", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Fix encryption" + }, + "fixEncryptionTooltip": { + "message": "This file is using an outdated encryption method." + }, + "attachmentUpdated": { + "message": "Attachment updated" + }, "oldAttachmentsNeedFixDesc": { "message": "У вашому сховищі є старі вкладені файли, які необхідно виправити перед тим, як оновлювати ключ шифрування облікового запису." }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "Фраза відбитка вашого облікового запису", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Повторне запрошення успішне" }, + "bulkReinviteSuccessToast": { + "message": "$COUNT$ users re-invited", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Успішно вилучено" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Час очікування сховища поза межами дозволеного діапазону." }, - "disablePersonalVaultExport": { - "message": "Вилучити експорт особистого сховища" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "Не дозволяти учасникам експортувати дані з їхнього особистого сховища." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Недійсний код підтвердження" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Головний пароль більше не є обов'язковим для учасників зазначеної організації. Підтвердьте вказаний нижче домен з адміністратором вашої організації." - }, "keyConnectorDomain": { "message": "Домен Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO увімкнено" }, - "disabledSso": { - "message": "SSO вимкнено" + "ssoTurnedOff": { + "message": "SSO turned off" }, "emailMustLoginWithSso": { "message": "$EMAIL$ must login with Single Sign-on", @@ -8718,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Експортувати дані" - }, "exportingOrganizationSecretDataTitle": { "message": "Експорт секретних даних організації" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Потрібно увійти через SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Прапор вибраного регіону" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Families membership" }, - "planDescPremium": { - "message": "Повна онлайн-безпека" + "advancedOnlineSecurity": { + "message": "Advanced online security" }, "planDescFamiliesV2": { "message": "Безпека Premium для вашої сім'ї" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "User verification failed." + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "This setting is managed by your organization." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Your organization has set the default session timeout to On browser refresh." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "On browser refresh" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Set an unlock method to change your timeout action" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 35e7db50023..7397aed6f94 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -21,7 +21,7 @@ "message": "Mật khẩu rủi ro" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Bạn không có quyền chỉnh sửa mục này" }, "reviewAtRiskPasswords": { "message": "Kiểm tra các mật khẩu có rủi ro (yếu, bị lộ hoặc được sử dụng lại) trên các ứng dụng. Chọn các ứng dụng quan trọng nhất của bạn để ưu tiên các biện pháp bảo mật cho người dùng nhằm giải quyết các mật khẩu có rủi ro." @@ -94,7 +94,7 @@ "message": "Giao tác vụ cho thành viên để theo dõi tiến trình" }, "onceYouReviewApplications": { - "message": "Once you review applications and mark them as critical, assign tasks to your members to change their passwords." + "message": "Khi bạn xem xét các ứng dụng và đánh dấu chúng là quan trọng, hãy giao nhiệm vụ cho các thành viên của bạn thay đổi mật khẩu." }, "sendReminders": { "message": "Gửi lời nhắc" @@ -179,34 +179,34 @@ } }, "noDataInOrgTitle": { - "message": "No data found" + "message": "Không tìm thấy dữ liệu" }, "noDataInOrgDescription": { - "message": "Import your organization's login data to get started with Access Intelligence. Once you do that, you'll be able to:" + "message": "Nhập dữ liệu đăng nhập của tổ chức bạn để bắt đầu với Access Intelligence. Khi thực hiện xong, bạn sẽ có thể:" }, "feature1Title": { - "message": "Mark applications as critical" + "message": "Đánh dấu ứng dụng là quan trọng" }, "feature1Description": { - "message": "This will help you remove risks to your most important applications first." + "message": "Điều này sẽ giúp bạn loại bỏ rủi ro đối với các ứng dụng quan trọng nhất trước tiên." }, "feature2Title": { - "message": "Help members improve their security" + "message": "Giúp thành viên cải thiện bảo mật" }, "feature2Description": { - "message": "Assign at-risk members guided security tasks to update credentials." + "message": "Giao các nhiệm vụ bảo mật có hướng dẫn cho các thành viên có rủi ro để cập nhật thông tin xác thực." }, "feature3Title": { - "message": "Monitor progress" + "message": "Theo dõi tiến độ" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Theo dõi các thay đổi theo thời gian để hiển thị những cải tiến bảo mật." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Tạo báo cáo" }, "noReportsRunDescription": { - "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" + "message": "Bạn đã sẵn sàng để bắt đầu tạo báo cáo. Một khi bạn tạo, bạn sẽ có thể:" }, "noCriticalApplicationsTitle": { "message": "Bạn chưa đánh dấu ứng dụng nào là quan trọng" @@ -266,13 +266,13 @@ "message": "Các thành viên có rủi ro" }, "membersWithAccessToAtRiskItemsForCriticalApplications": { - "message": "These members have access to vulnerable items for critical applications." + "message": "Các thành viên này có quyền truy cập vào các mục dễ bị tổn thương cho các ứng dụng quan trọng." }, "membersWithAtRiskPasswords": { "message": "Thành viên có mật khẩu rủi ro" }, "membersWillReceiveSecurityTask": { - "message": "Members of your organization will be assigned a task to change vulnerable passwords. They’ll receive a notification within their Bitwarden browser extension." + "message": "Các thành viên trong tổ chức của bạn sẽ được giao nhiệm vụ thay đổi mật khẩu dễ bị tổn thương. Họ sẽ nhận được thông báo trong tiện ích mở rộng trình duyệt Bitwarden của họ." }, "membersAtRiskCount": { "message": "$COUNT$ thành viên gặp rủi ro", @@ -302,7 +302,7 @@ } }, "atRiskMemberDescription": { - "message": "These members are logging into critical applications with weak, exposed, or reused passwords." + "message": "Các thành viên này đang đăng nhập vào các ứng dụng quan trọng bằng mật khẩu yếu, bị lộ hoặc được sử dụng lại." }, "atRiskMembersDescriptionNone": { "message": "Không có thành viên nào đăng nhập vào ứng dụng bằng mật khẩu yếu, dễ bị lộ hoặc được sử dụng lại." @@ -344,7 +344,7 @@ "message": "Ứng dụng cần xem lại" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Xem xét các ứng dụng mới" }, "newApplicationsWithCount": { "message": "$COUNT$ ứng dụng mới", @@ -368,7 +368,7 @@ "message": "Hiện tại không có ứng dụng mới nào để đánh giá" }, "organizationHasItemsSavedForApplications": { - "message": "Your organization has items saved for $COUNT$ applications", + "message": "Tổ chức của bạn có các mục được lưu cho $COUNT$ ứng dụng", "placeholders": { "count": { "content": "$1", @@ -377,22 +377,22 @@ } }, "reviewApplicationsToSecureItems": { - "message": "Review applications to secure the items most critical to your organization's security" + "message": "Xem xét các ứng dụng để bảo mật các mục quan trọng nhất đối với an ninh của tổ chức bạn" }, "reviewApplications": { - "message": "Review applications" + "message": "Xem xét ứng dụng" }, "prioritizeCriticalApplications": { "message": "Ưu tiên các ứng dụng quan trọng" }, "selectCriticalAppsDescription": { - "message": "Select which applications are most critical to your organization. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Chọn những ứng dụng nào là quan trọng nhất đối với tổ chức của bạn. Sau đó, bạn sẽ có thể giao các nhiệm vụ bảo mật cho các thành viên để loại bỏ rủi ro." }, "reviewNewApplications": { - "message": "Review new applications" + "message": "Xem xét các ứng dụng mới" }, "reviewNewAppsDescription": { - "message": "Review new applications with vulnerable items and mark those you’d like to monitor closely as critical. Then, you’ll be able to assign security tasks to members to remove risks." + "message": "Xem xét các ứng dụng mới có các mục dễ bị tổn thương và đánh dấu những ứng dụng bạn muốn giám sát chặt chẽ là quan trọng. Sau đó, bạn sẽ có thể giao các nhiệm vụ bảo mật cho các thành viên để loại bỏ rủi ro." }, "clickIconToMarkAppAsCritical": { "message": "Nhấp vào biểu tượng ngôi sao để đánh dấu một ứng dụng là quan trọng" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Xuất từ" }, - "exportVault": { - "message": "Xuất kho" - }, - "exportSecrets": { - "message": "Xuất bí mật" - }, "fileFormat": { "message": "Định dạng tập tin" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Nhập lại mật khẩu chính" }, - "confirmFormat": { - "message": "Xác nhận định dạng" - }, "filePassword": { "message": "Mật khẩu tập tin" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Công cụ" }, + "import": { + "message": "Import" + }, "importData": { "message": "Nhập dữ liệu" }, @@ -3063,7 +3057,7 @@ "message": "1GB bộ nhớ lưu trữ được mã hóa cho các tệp đính kèm." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ bộ nhớ lưu trữ được mã hóa cho các tệp đính kèm.", "placeholders": { "size": { "content": "$1", @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Gói đăng ký Cao cấp của bạn đã kết thúc" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "Để lấy lại quyền truy cập vào lưu trữ của bạn, hãy khởi động lại gói đăng ký Cao cấp. Nếu bạn chỉnh sửa chi tiết cho một mục đã lưu trữ trước khi khởi động lại, mục đó sẽ được chuyển trở lại kho của bạn." }, "restartPremium": { - "message": "Restart Premium" + "message": "Khởi động lại gói Cao cấp" }, "additionalStorageGb": { "message": "Dung lượng lưu trữ bổ sung (GB)" @@ -3263,16 +3257,16 @@ "message": "Lần thanh toán tiếp theo" }, "nextChargeHeader": { - "message": "Next Charge" + "message": "Lần thanh toán tiếp theo" }, "plan": { - "message": "Plan" + "message": "Gói" }, "details": { "message": "Chi tiết" }, "discount": { - "message": "discount" + "message": "giảm giá" }, "downloadLicense": { "message": "Tải về tệp giấy phép" @@ -4479,31 +4473,31 @@ "message": "Cập nhật trình duyệt" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Đang tạo Access Intelligence của bạn..." }, "fetchingMemberData": { - "message": "Fetching member data..." + "message": "Đang lấy dữ liệu thành viên..." }, "analyzingPasswordHealth": { - "message": "Analyzing password health..." + "message": "Đang phân tích độ mạnh mật khẩu..." }, "calculatingRiskScores": { - "message": "Calculating risk scores..." + "message": "Đang tính điểm rủi ro..." }, "generatingReportData": { - "message": "Generating report data..." + "message": "Đang tạo dữ liệu báo cáo..." }, "savingReport": { - "message": "Saving report..." + "message": "Đang lưu báo cáo..." }, "compilingInsights": { - "message": "Compiling insights..." + "message": "Đang biên soạn thông tin chi tiết..." }, "loadingProgress": { - "message": "Loading progress" + "message": "Đang tải tiến trình" }, "thisMightTakeFewMinutes": { - "message": "This might take a few minutes." + "message": "Quá trình này có thể mất vài phút." }, "riskInsightsRunReport": { "message": "Chạy báo cáo" @@ -4627,19 +4621,19 @@ "message": "Tìm hiểu thêm" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "Đã xảy ra lỗi khi cập nhật cài đặt mã hóa." }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "Cập nhật cài đặt mã hóa của bạn" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "Cài đặt mã hóa được khuyến nghị sẽ cải thiện bảo mật cho tài khoản của bạn. Nhập mật khẩu chính để cập nhật ngay." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Xác minh danh tính để tiếp tục" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Nhập mật khẩu chính của bạn" }, "updateSettings": { "message": "Cập nhật cài đặt" @@ -5169,9 +5163,21 @@ "message": "Sửa", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "Sửa mã hóa" + }, + "fixEncryptionTooltip": { + "message": "Tệp này đang sử dụng phương pháp mã hóa lỗi thời." + }, + "attachmentUpdated": { + "message": "Tệp đính kèm đã được cập nhật" + }, "oldAttachmentsNeedFixDesc": { "message": "Có một số tệp đính kèm cũ trong kho lưu trữ của bạn cần được sửa chữa trước khi bạn có thể thay đổi khóa mã hóa của tài khoản." }, + "itemsTransferred": { + "message": "Các mục đã chuyển" + }, "yourAccountsFingerprint": { "message": "Cụm từ xác thực tài khoản của bạn", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -5846,7 +5852,7 @@ "description": "This is the policy description shown in the policy list." }, "organizationDataOwnershipDescContent": { - "message": "All items will be owned and saved to the organization, enabling organization-wide controls, visibility, and reporting. When turned on, a default collection will be available for each member to store items. Learn more about managing the ", + "message": "Tất cả các mục sẽ thuộc sở hữu và được lưu vào tổ chức, cho phép kiểm soát, hiển thị và báo cáo trên toàn tổ chức. Khi được bật, một bộ sưu tập mặc định sẽ có sẵn cho mỗi thành viên để lưu trữ các mục. Tìm hiểu thêm về việc quản 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 will be available for each member to store items. Learn more about managing the credential lifecycle.'" }, "organizationDataOwnershipContentAnchor": { @@ -5886,14 +5892,14 @@ "message": "Cách bật xác nhận người dùng tự động" }, "autoConfirmExtension1": { - "message": "Open your Bitwarden extension" + "message": "Mở tiện ích mở rộng Bitwarden của bạn" }, "autoConfirmExtension2": { - "message": "Select", + "message": "Chọn", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtension3": { - "message": " Turn on", + "message": " Bật", "description": "This is a fragment of a larger sencence. The whole sentence will read: 'Select Turn on'" }, "autoConfirmExtensionOpened": { @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "Đã mời lại thành công" }, + "bulkReinviteSuccessToast": { + "message": "Đã mời lại $COUNT$ người dùng", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "Đã mời lại $LIMIT$ trong số $SELECTEDCOUNT$ người dùng. $EXCLUDEDCOUNT$ người đã không được mời do giới hạn mời là $LIMIT$.", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "Đã xóa thành công" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "Thời gian chờ của kho lưu trữ không nằm trong phạm vi cho phép." }, - "disablePersonalVaultExport": { - "message": "Xóa xuất dữ liệu kho riêng lẻ" + "disableExport": { + "message": "Xóa xuất" }, "disablePersonalVaultExportDescription": { "message": "Không cho phép thành viên xuất dữ liệu từ kho lưu trữ cá nhân của họ." @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "Mã xác minh không đúng" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Không còn yêu cầu mật khẩu chính đối với các thành viên của tổ chức sau. Vui lòng xác nhận tên miền bên dưới với quản trị viên của tổ chức bạn." - }, "keyConnectorDomain": { "message": "Tên miền Key Connector" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO đã bật" }, - "disabledSso": { - "message": "SSO đã được bật" + "ssoTurnedOff": { + "message": "Đã tắt SSO" }, "emailMustLoginWithSso": { "message": "$EMAIL$ phải đăng nhập bằng Đăng nhập một lần", @@ -8718,9 +8747,6 @@ "server": { "message": "Máy chủ" }, - "exportData": { - "message": "Xuất dữ liệu" - }, "exportingOrganizationSecretDataTitle": { "message": "Xuất dữ liệu bí mật của tổ chức" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "Yêu cầu đăng nhập bằng SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "Cờ vùng đã chọn" }, @@ -9857,11 +9886,11 @@ "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreePlan": { - "message": "Switching to free plan", + "message": "Chuyển sang gói miễn phí", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "switchToFreeOrg": { - "message": "Switching to free organization", + "message": "Chuyển sang tổ chức miễn phí", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "freeForOneYear": { @@ -9895,7 +9924,7 @@ "message": "Giao tác vụ" }, "assignSecurityTasksToMembers": { - "message": "Send notifications to change passwords" + "message": "Gửi thông báo thay đổi mật khẩu" }, "assignToCollections": { "message": "Gán vào bộ sưu tập" @@ -11704,7 +11733,7 @@ "message": "Đã cài đặt tiện ích mở rộng Bitwarden!" }, "bitwardenExtensionIsInstalled": { - "message": "Bitwarden extension is installed!" + "message": "Tiện ích mở rộng Bitwarden đã được cài đặt!" }, "openExtensionToAutofill": { "message": "Mở tiện ích mở rộng để đăng nhập và bắt đầu tự động điền." @@ -11721,11 +11750,11 @@ "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'For tips on getting started with Bitwarden visit the Learning Center and Help Center'" }, "openExtensionFromToolbarPart1": { - "message": "If the extension didn't open, you may need to open Bitwarden from the icon ", + "message": "Nếu tiện ích mở rộng không mở, bạn có thể cần mở Bitwarden từ biểu tượng ", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" }, "openExtensionFromToolbarPart2": { - "message": " on the toolbar.", + "message": " trên thanh công cụ.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'If the extension didn't open, you may need to open Bitwarden from the icon [Bitwarden Icon] on the toolbar.'" }, "gettingStartedWithBitwardenPart3": { @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "Gói Bitwarden Gia đình" }, - "planDescPremium": { - "message": "Bảo mật trực tuyến toàn diện" + "advancedOnlineSecurity": { + "message": "Bảo mật trực tuyến nâng cao" }, "planDescFamiliesV2": { "message": "Bảo mật cao cấp cho gia đình bạn" @@ -12157,37 +12186,37 @@ "message": "Bắt đầu dùng thử Gói Gia đình miễn phí" }, "blockClaimedDomainAccountCreation": { - "message": "Block account creation for claimed domains" + "message": "Chặn tạo tài khoản cho các tên miền đã xác nhận quyền sở hữu" }, "blockClaimedDomainAccountCreationDesc": { - "message": "Prevent users from creating accounts outside of your organization using email addresses from claimed domains." + "message": "Ngăn người dùng tạo tài khoản bên ngoài tổ chức của bạn bằng địa chỉ email từ các tên miền đã xác nhận." }, "blockClaimedDomainAccountCreationPrerequisite": { - "message": "A domain must be claimed before activating this policy." + "message": "Cần phải xác nhận tên miền trước khi kích hoạt chính sách này." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Thiết lập phương thức mở khóa để thay đổi hành động sau khi đóng kho." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Các yêu cầu chính sách của doanh nghiệp đã được áp dụng cho các tùy chọn thời gian mở kho của bạn" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Thời gian mở kho vượt quá giới hạn do tổ chức của bạn đặt ra." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Bạn có chắc chắn muốn chọn \"Không bao giờ\" không? Lựa chọn này sẽ lưu khóa mã hóa kho của bạn trực tiếp trên thiết bị. Hãy nhớ bảo vệ thiết bị của bạn thật cẩn thận nếu bạn chọn tùy chọn này." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Hành động sau khi đóng kho" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Thời gian hết phiên" }, "appearance": { - "message": "Appearance" + "message": "Giao diện" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Thời gian mở kho đã vượt quá giới hạn do tổ chức của bạn đặt ra: Tối đa $HOURS$ giờ và $MINUTES$ phút", "placeholders": { "hours": { "content": "$1", @@ -12199,13 +12228,186 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { - "message": "No critical applications are selected" + "message": "Không có ứng dụng quan trọng nào được chọn" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Bạn có chắc chắn muốn tiếp tục không?" }, "userVerificationFailed": { - "message": "User verification failed." + "message": "Xác minh người dùng thất bại." + }, + "recoveryDeleteCiphersTitle": { + "message": "Xóa các mục kho không thể khôi phục" + }, + "recoveryDeleteCiphersDesc": { + "message": "Một số mục trong kho của bạn không thể khôi phục được. Bạn có muốn xóa các mục không thể khôi phục này khỏi kho của bạn không?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Xóa các thư mục không thể khôi phục" + }, + "recoveryDeleteFoldersDesc": { + "message": "Một số thư mục của bạn không thể khôi phục được. Bạn có muốn xóa các thư mục không thể khôi phục này khỏi kho của bạn không?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Thay thế khóa mã hóa" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Cặp khóa mã hóa công khai của bạn không thể khôi phục được. Bạn có muốn thay thế khóa mã hóa của mình bằng một cặp khóa mới không? Việc này sẽ yêu cầu bạn thiết lập lại quyền truy cập khẩn cấp và tư cách thành viên tổ chức hiện có." + }, + "recoveryStepSyncTitle": { + "message": "Đang đồng bộ hóa dữ liệu" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Đang xác minh tính toàn vẹn của khóa mã hóa" + }, + "recoveryStepUserInfoTitle": { + "message": "Đang xác minh thông tin người dùng" + }, + "recoveryStepCipherTitle": { + "message": "Đang xác minh tính toàn vẹn của mục kho" + }, + "recoveryStepFoldersTitle": { + "message": "Đang xác minh tính toàn vẹn của thư mục" + }, + "dataRecoveryTitle": { + "message": "Khôi phục Dữ liệu và Chẩn đoán" + }, + "dataRecoveryDescription": { + "message": "Sử dụng công cụ khôi phục dữ liệu để chẩn đoán và sửa chữa các sự cố với tài khoản của bạn. Sau khi chạy chẩn đoán, bạn có tùy chọn lưu nhật ký chẩn đoán để được hỗ trợ và tùy chọn sửa chữa bất kỳ sự cố nào được phát hiện." + }, + "runDiagnostics": { + "message": "Chạy Chẩn đoán" + }, + "repairIssues": { + "message": "Sửa chữa Sự cố" + }, + "saveDiagnosticLogs": { + "message": "Lưu Nhật ký Chẩn đoán" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "Cài đặt này do tổ chức của bạn quản lý." + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "Tổ chức của bạn đã đặt thời gian chờ phiên tối đa là $HOURS$ giờ và $MINUTES$ phút.", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "Tổ chức của bạn đã đặt thời gian chờ phiên mặc định là Khi làm mới trình duyệt." + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "Thời gian chờ tối đa không thể vượt quá $HOURS$ giờ và $MINUTES$ phút", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "Khi làm mới trình duyệt" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "Đặt phương thức mở khóa để thay đổi hành động khi hết thời gian chờ" + }, + "leaveConfirmationDialogTitle": { + "message": "Bạn có chắc chắn muốn rời đi không?" + }, + "leaveConfirmationDialogContentOne": { + "message": "Bằng việc từ chối, các mục cá nhân sẽ vẫn nằm trong tài khoản của bạn, nhưng bạn sẽ mất quyền truy cập vào các mục được chia sẻ và tính năng tổ chức." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Liên hệ quản trị viên của bạn để lấy lại quyền truy cập." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Rời khỏi $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "Tôi quản lý kho của mình như thế nào?" + }, + "transferItemsToOrganizationTitle": { + "message": "Chuyển các mục đến $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ yêu cầu tất cả các mục phải thuộc sở hữu của tổ chức để đảm bảo an ninh và tuân thủ. Nhấp chấp nhận để chuyển quyền sở hữu các mục của bạn.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Chấp nhận chuyển" + }, + "declineAndLeave": { + "message": "Từ chối và rời đi" + }, + "whyAmISeeingThis": { + "message": "Tại sao tôi thấy điều này?" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 7d898c79952..073afec7fe6 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -1375,7 +1375,7 @@ "message": "使用设备登录" }, "loginWithDeviceEnabledNote": { - "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他登录选项吗?" + "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他选项吗?" }, "needAnotherOptionV1": { "message": "需要其他选项吗?" @@ -1411,7 +1411,7 @@ "message": "通行密钥无效。请重试。" }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "不支持通行密钥 2FA。请更新 App 再登录。" + "message": "不支持通行密钥 2FA。请更新 App 以登录。" }, "loginWithPasskeyInfo": { "message": "使用已生成的通行密钥,无需密码即可自动登录。生物识别(例如面部识别或指纹)或其他 FIDO2 安全方法将用于验证您的身份。" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "导出自" }, - "exportVault": { - "message": "导出密码库" - }, - "exportSecrets": { - "message": "导出机密" - }, "fileFormat": { "message": "文件格式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "确认主密码" }, - "confirmFormat": { - "message": "确认格式" - }, "filePassword": { "message": "文件密码" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "工具" }, + "import": { + "message": "导入" + }, "importData": { "message": "导入数据" }, @@ -3010,7 +3004,7 @@ "message": "泄漏报告于" }, "reportError": { - "message": "加载报告时发生错误。请重试" + "message": "尝试加载报告时发生错误。请重试" }, "billing": { "message": "计费" @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "您的高级版订阅已结束" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "要重新获取存档的访问权限,请重启您的高级版订阅。如果您在重启前编辑了存档项目的详细信息,它将被移回您的密码库中。" }, "restartPremium": { - "message": "Restart Premium" + "message": "重启高级版" }, "additionalStorageGb": { "message": "附加存储 (GB)" @@ -3655,7 +3649,7 @@ "message": "确定要退出该组织吗?" }, "leftOrganization": { - "message": "您已经退出该组织。" + "message": "您已退出该组织" }, "defaultCollection": { "message": "默认集合" @@ -3718,7 +3712,7 @@ "message": "撤销成员后,他们将不再具有对组织数据的访问权限。要快速恢复此成员的访问权限,请转到「已撤销」标签页。" }, "removeUserConfirmationKeyConnector": { - "message": "警告!此用户需要 Key Connector 来管理他们的加密。从您的组织中移除此用户将永久停用他们的账户。此操作无法撤消。您要继续吗?" + "message": "警告!此用户需要 Key Connector 来管理他们的加密。从您的组织中移除此用户将永久停用他们的账户。此操作无法撤消。要继续吗?" }, "externalId": { "message": "外部 ID" @@ -4627,19 +4621,19 @@ "message": "进一步了解" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "更新加密设置时发生错误。" }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "更新您的加密设置" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "新推荐的加密设置将提高您的账户安全性。输入您的主密码以立即更新。" }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "确认您的身份以继续" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "输入您的主密码" }, "updateSettings": { "message": "更新设置" @@ -5163,15 +5157,27 @@ "message": "此项目有需要修复的旧文件附件。" }, "attachmentFixDescription": { - "message": "此附件使用了过时的加密方式。请选择「修复」以下载、重新加密并重新上传附件。" + "message": "此附件使用了过时的加密方式。选择「修复」以下载、重新加密然后重新上传此附件。" }, "fix": { "message": "修复", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "修复加密" + }, + "fixEncryptionTooltip": { + "message": "此文件正在使用过时的加密方式。" + }, + "attachmentUpdated": { + "message": "附件已更新" + }, "oldAttachmentsNeedFixDesc": { "message": "需要先修复您的密码库中的旧文件附件,然后才能轮换您账户的加密密钥。" }, + "itemsTransferred": { + "message": "项目已传输" + }, "yourAccountsFingerprint": { "message": "您的账户指纹短语", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "重新邀请成功" }, + "bulkReinviteSuccessToast": { + "message": "已重新邀请 $COUNT$ 位用户", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "已重新邀请 $SELECTEDCOUNT$ 位用户中的 $LIMIT$ 位。由于邀请限制为 $LIMIT$ 人,$EXCLUDEDCOUNT$ 位用户没有被邀请。", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "移除成功" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "密码库超时不在允许的范围内。" }, - "disablePersonalVaultExport": { - "message": "禁用个人密码库导出" + "disableExport": { + "message": "移除导出" }, "disablePersonalVaultExportDescription": { "message": "不允许成员从个人密码库导出数据。" @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "无效的验证码" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "以下组织的成员不再需要主密码。请与您的组织管理员确认下面的域名。" - }, "keyConnectorDomain": { "message": "Key Connector 域名" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "SSO 已启用" }, - "disabledSso": { - "message": "SSO 已关闭" + "ssoTurnedOff": { + "message": "SSO 已停用" }, "emailMustLoginWithSso": { "message": "$EMAIL$ 必须使用单点登录", @@ -8545,7 +8574,7 @@ "message": "您不能两次声明同一个域名。" }, "domainNotAvailable": { - "message": "别人正在使用 $DOMAIN$。请使用其他域名。", + "message": "别人正在使用 $DOMAIN$。请使用其他域名以继续。", "placeholders": { "DOMAIN": { "content": "$1", @@ -8718,9 +8747,6 @@ "server": { "message": "服务器" }, - "exportData": { - "message": "导出数据" - }, "exportingOrganizationSecretDataTitle": { "message": "正在导出组织机密数据" }, @@ -8870,7 +8896,7 @@ "message": "描述" }, "errorReadingImportFile": { - "message": "尝试读取导入的文件时出错" + "message": "尝试读取导入的文件时发生错误" }, "accessedSecretWithId": { "message": "访问了标识符为 $SECRET_ID$ 的机密", @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "要求 SSO 登录" }, + "emailRequiredForSsoLogin": { + "message": "SSO 要求使用电子邮箱" + }, "selectedRegionFlag": { "message": "选择的区域旗帜" }, @@ -10579,7 +10608,7 @@ "message": "无效的税务 ID,如有疑问,请联系支持。" }, "billingPreviewInvoiceError": { - "message": "预览账单时出错。请稍后再试。" + "message": "预览账单时发生错误。请稍后再试。" }, "unverified": { "message": "未验证" @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "家庭成员" }, - "planDescPremium": { - "message": "全面的在线安全防护" + "advancedOnlineSecurity": { + "message": "高级在线安全防护" }, "planDescFamiliesV2": { "message": "为您的家庭提供高级安全防护" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "您的组织已不再使用主密码登录 Bitwarden。要继续,请验证组织和域名。" + }, + "continueWithLogIn": { + "message": "继续登录" + }, + "doNotContinue": { + "message": "不要继续" + }, + "domain": { + "message": "域名" + }, + "keyConnectorDomainTooltip": { + "message": "此域名将存储您的账户加密密钥,所以请确保您信任它。如果您不确定,请与您的管理员联系。" + }, + "verifyYourOrganization": { + "message": "验证您的组织以登录" + }, + "organizationVerified": { + "message": "组织已验证" + }, + "domainVerified": { + "message": "域名已验证" + }, + "leaveOrganizationContent": { + "message": "如果不验证您的组织,您对组织的访问权限将被撤销。" + }, + "leaveNow": { + "message": "立即退出" + }, + "verifyYourDomainToLogin": { + "message": "验证您的域名以登录" + }, + "verifyYourDomainDescription": { + "message": "要继续登录,请验证此域名。" + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "要继续登录,请验证组织和域名。" + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "未选择任何关键应用程序" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "用户验证失败。" + }, + "recoveryDeleteCiphersTitle": { + "message": "删除无法恢复的密码库项目" + }, + "recoveryDeleteCiphersDesc": { + "message": "您的部分密码库项目无法恢复。要从您的密码库中删除这些无法恢复的项目吗?" + }, + "recoveryDeleteFoldersTitle": { + "message": "删除无法恢复的文件夹" + }, + "recoveryDeleteFoldersDesc": { + "message": "您的部分文件夹无法恢复。要从您的密码库中删除这些无法恢复的文件夹吗?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "替换加密密钥" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "您的公钥加密密钥对无法恢复。要使用新的密钥对替换您的加密密钥吗?这将要求您重新设置现有的紧急访问和组织成员资格。" + }, + "recoveryStepSyncTitle": { + "message": "正在同步数据" + }, + "recoveryStepPrivateKeyTitle": { + "message": "正在验证加密密钥的完整性" + }, + "recoveryStepUserInfoTitle": { + "message": "正在验证用户信息" + }, + "recoveryStepCipherTitle": { + "message": "正在验证密码库项目的完整性" + }, + "recoveryStepFoldersTitle": { + "message": "正在验证文件夹的完整性" + }, + "dataRecoveryTitle": { + "message": "数据恢复和诊断" + }, + "dataRecoveryDescription": { + "message": "使用数据恢复工具诊断并修复您的账户问题。运行诊断程序后,您可以选择保存诊断日志以供支持使用,也可以选择修复任何检测到的问题。" + }, + "runDiagnostics": { + "message": "运行诊断程序" + }, + "repairIssues": { + "message": "修复问题" + }, + "saveDiagnosticLogs": { + "message": "保存诊断日志" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "此设置由您的组织管理。" + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "您的组织已将最大会话超时设置为 $HOURS$ 小时 $MINUTES$ 分钟。", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "您的组织已将默认会话超时设置为「浏览器刷新时」。" + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "最大超时不能超过 $HOURS$ 小时 $MINUTES$ 分钟", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "浏览器刷新时" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "设置一个解锁方式以更改您的超时动作" + }, + "leaveConfirmationDialogTitle": { + "message": "确定要退出吗?" + }, + "leaveConfirmationDialogContentOne": { + "message": "拒绝后,您的个人项目将保留在您的账户中,但您将失去对共享项目和组织功能的访问权限。" + }, + "leaveConfirmationDialogContentTwo": { + "message": "联系您的管理员以重新获取访问权限。" + }, + "leaveConfirmationDialogConfirmButton": { + "message": "退出 $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "我该如何管理我的密码库?" + }, + "transferItemsToOrganizationTitle": { + "message": "传输项目到 $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "出于安全和合规考虑,$ORGANIZATION$ 要求所有项目归组织所有。点击「接受」以传输您的项目的所有权。", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "接受传输" + }, + "declineAndLeave": { + "message": "拒绝并退出" + }, + "whyAmISeeingThis": { + "message": "为什么我会看到这个?" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 95c345f74d7..364389a1535 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "匯出自" }, - "exportVault": { - "message": "匯出密碼庫" - }, - "exportSecrets": { - "message": "匯出機密" - }, "fileFormat": { "message": "檔案格式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "確認主密碼" }, - "confirmFormat": { - "message": "確認格式" - }, "filePassword": { "message": "檔案密碼" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "工具" }, + "import": { + "message": "Import" + }, "importData": { "message": "匯入資料" }, @@ -3063,7 +3057,7 @@ "message": "用於檔案附件的 1 GB 的加密檔案儲存空間。" }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "用於檔案附件的 $SIZE$ 加密儲存空間。", "placeholders": { "size": { "content": "$1", @@ -3134,13 +3128,13 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "您的進階版訂閱已到期" }, "premiumSubscriptionEndedDesc": { - "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." + "message": "若要重新存取您的封存項目,請重新啟用進階版訂閱。若您在重新啟用前編輯封存項目的詳細資料,它將會被移回您的密碼庫。" }, "restartPremium": { - "message": "Restart Premium" + "message": "重新啟用進階版" }, "additionalStorageGb": { "message": "額外儲存空間 (GB)" @@ -4627,19 +4621,19 @@ "message": "深入了解" }, "migrationsFailed": { - "message": "An error occurred updating the encryption settings." + "message": "更新加密設定時發生錯誤。" }, "updateEncryptionSettingsTitle": { - "message": "Update your encryption settings" + "message": "更新您的加密設定" }, "updateEncryptionSettingsDesc": { - "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." + "message": "新的建議加密設定將提升您的帳戶安全性。請輸入主密碼以立即更新。" }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "請先確認身分後再繼續" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "輸入您的主密碼" }, "updateSettings": { "message": "更新設定" @@ -5169,9 +5163,21 @@ "message": "修正", "description": "This is a verb. ex. 'Fix The Car'" }, + "fixEncryption": { + "message": "修正加密" + }, + "fixEncryptionTooltip": { + "message": "此檔案使用了過時的加密方式。" + }, + "attachmentUpdated": { + "message": "附件已更新" + }, "oldAttachmentsNeedFixDesc": { "message": "需要先修正密碼庫中舊的檔案附件,然後才能輪換帳戶的加密金鑰。" }, + "itemsTransferred": { + "message": "Items transferred" + }, "yourAccountsFingerprint": { "message": "您帳戶的指紋短語", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." @@ -6453,6 +6459,32 @@ "bulkReinviteMessage": { "message": "已成功重新邀請。" }, + "bulkReinviteSuccessToast": { + "message": "已重新邀請 $COUNT$ 位使用者", + "placeholders": { + "count": { + "content": "$1", + "example": "12" + } + } + }, + "bulkReinviteLimitedSuccessToast": { + "message": "已重新邀請 $SELECTEDCOUNT$ 位使用者中的 $LIMIT$ 位。有 $EXCLUDEDCOUNT$ 位因達到 $LIMIT$ 的邀請上限而未被邀請。", + "placeholders": { + "limit": { + "content": "$1", + "example": "4,000" + }, + "selectedCount": { + "content": "$2", + "example": "4,005" + }, + "excludedCount": { + "content": "$3", + "example": "5" + } + } + }, "bulkRemovedMessage": { "message": "已成功移除。" }, @@ -6773,8 +6805,8 @@ "vaultTimeoutRangeError": { "message": "密碼庫逾時時間不在允許的範圍內。" }, - "disablePersonalVaultExport": { - "message": "停用個人密碼庫匯出" + "disableExport": { + "message": "Remove export" }, "disablePersonalVaultExportDescription": { "message": "不允許成員從其個人密碼庫匯出資料。" @@ -7094,9 +7126,6 @@ "invalidVerificationCode": { "message": "無效的驗證碼" }, - "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "以下組織的成員已不再需要主密碼。請與你的組織管理員確認下方的網域。" - }, "keyConnectorDomain": { "message": "Key Connector 網域" }, @@ -7154,8 +7183,8 @@ "enabledSso": { "message": "已啟用 SSO" }, - "disabledSso": { - "message": "已停用 SSO" + "ssoTurnedOff": { + "message": "SSO 已關閉" }, "emailMustLoginWithSso": { "message": "$EMAIL$ 必須使用單一登入 (SSO) 登入", @@ -8718,9 +8747,6 @@ "server": { "message": "伺服器" }, - "exportData": { - "message": "匯出資料" - }, "exportingOrganizationSecretDataTitle": { "message": "匯出組織機密資料" }, @@ -9448,6 +9474,9 @@ "ssoLoginIsRequired": { "message": "需要登入 SSO" }, + "emailRequiredForSsoLogin": { + "message": "Email is required for SSO" + }, "selectedRegionFlag": { "message": "選定的區域標記" }, @@ -11961,8 +11990,8 @@ "familiesMembership": { "message": "家庭會員" }, - "planDescPremium": { - "message": "完整的線上安全" + "advancedOnlineSecurity": { + "message": "進階線上安全防護" }, "planDescFamiliesV2": { "message": "為你的家人提供進階安全" @@ -12199,6 +12228,45 @@ } } }, + "removeMasterPasswordForOrgUserKeyConnector": { + "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + }, + "continueWithLogIn": { + "message": "Continue with log in" + }, + "doNotContinue": { + "message": "Do not continue" + }, + "domain": { + "message": "Domain" + }, + "keyConnectorDomainTooltip": { + "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + }, + "verifyYourOrganization": { + "message": "Verify your organization to log in" + }, + "organizationVerified": { + "message": "Organization verified" + }, + "domainVerified": { + "message": "Domain verified" + }, + "leaveOrganizationContent": { + "message": "If you don't verify your organization, your access to the organization will be revoked." + }, + "leaveNow": { + "message": "Leave now" + }, + "verifyYourDomainToLogin": { + "message": "Verify your domain to log in" + }, + "verifyYourDomainDescription": { + "message": "To continue with log in, verify this domain." + }, + "confirmKeyConnectorOrganizationUserDescription": { + "message": "To continue with log in, verify the organization and domain." + }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "未選取任何關鍵應用程式" }, @@ -12207,5 +12275,139 @@ }, "userVerificationFailed": { "message": "使用者驗證失敗。" + }, + "recoveryDeleteCiphersTitle": { + "message": "Delete unrecoverable vault items" + }, + "recoveryDeleteCiphersDesc": { + "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + }, + "recoveryDeleteFoldersTitle": { + "message": "Delete unrecoverable folders" + }, + "recoveryDeleteFoldersDesc": { + "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + }, + "recoveryReplacePrivateKeyTitle": { + "message": "Replace encryption key" + }, + "recoveryReplacePrivateKeyDesc": { + "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + }, + "recoveryStepSyncTitle": { + "message": "Synchronizing data" + }, + "recoveryStepPrivateKeyTitle": { + "message": "Verifying encryption key integrity" + }, + "recoveryStepUserInfoTitle": { + "message": "Verifying user information" + }, + "recoveryStepCipherTitle": { + "message": "Verifying vault item integrity" + }, + "recoveryStepFoldersTitle": { + "message": "Verifying folder integrity" + }, + "dataRecoveryTitle": { + "message": "Data Recovery and Diagnostics" + }, + "dataRecoveryDescription": { + "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + }, + "runDiagnostics": { + "message": "Run Diagnostics" + }, + "repairIssues": { + "message": "Repair Issues" + }, + "saveDiagnosticLogs": { + "message": "Save Diagnostic Logs" + }, + "sessionTimeoutSettingsManagedByOrganization": { + "message": "此設定由您的組織管理。" + }, + "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { + "message": "您的組織已將最長工作階段逾時設為 $HOURS$ 小時與 $MINUTES$ 分鐘。", + "placeholders": { + "hours": { + "content": "$1", + "example": "8" + }, + "minutes": { + "content": "$2", + "example": "2" + } + } + }, + "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { + "message": "您的組織已將預設工作階段逾時設定為「在瀏覽器重新整理時」。" + }, + "sessionTimeoutSettingsPolicyMaximumError": { + "message": "最長逾時時間不可超過 $HOURS$ 小時 $MINUTES$ 分鐘", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "sessionTimeoutOnRestart": { + "message": "於瀏覽器重新整理時" + }, + "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { + "message": "設定一個解鎖方式來變更您的密碼庫逾時動作。" + }, + "leaveConfirmationDialogTitle": { + "message": "Are you sure you want to leave?" + }, + "leaveConfirmationDialogContentOne": { + "message": "By declining, your personal items will stay in your account, but you'll lose access to shared items and organization features." + }, + "leaveConfirmationDialogContentTwo": { + "message": "Contact your admin to regain access." + }, + "leaveConfirmationDialogConfirmButton": { + "message": "Leave $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "howToManageMyVault": { + "message": "How do I manage my vault?" + }, + "transferItemsToOrganizationTitle": { + "message": "Transfer items to $ORGANIZATION$", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "transferItemsToOrganizationContent": { + "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "acceptTransfer": { + "message": "Accept transfer" + }, + "declineAndLeave": { + "message": "Decline and leave" + }, + "whyAmISeeingThis": { + "message": "Why am I seeing this?" } } diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/datadog-configuration.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/datadog-configuration.ts index e788ebba7f2..51217a85877 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/datadog-configuration.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/datadog-configuration.ts @@ -1,14 +1,15 @@ -import { OrganizationIntegrationServiceType } from "../organization-integration-service-type"; +import { OrgIntegrationConfiguration } from "../integration-builder"; +import { OrganizationIntegrationServiceName } from "../organization-integration-service-type"; -export class DatadogConfiguration { +export class DatadogConfiguration implements OrgIntegrationConfiguration { uri: string; apiKey: string; - service: OrganizationIntegrationServiceType; + service: OrganizationIntegrationServiceName; - constructor(uri: string, apiKey: string, service: string) { + constructor(uri: string, apiKey: string, service: OrganizationIntegrationServiceName) { this.uri = uri; this.apiKey = apiKey; - this.service = service as OrganizationIntegrationServiceType; + this.service = service; } toString(): string { diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/hec-configuration.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/hec-configuration.ts index cdb7a5f265a..d7e0cec1840 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/hec-configuration.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/hec-configuration.ts @@ -1,15 +1,16 @@ -import { OrganizationIntegrationServiceType } from "../organization-integration-service-type"; +import { OrgIntegrationConfiguration } from "../integration-builder"; +import { OrganizationIntegrationServiceName } from "../organization-integration-service-type"; -export class HecConfiguration { +export class HecConfiguration implements OrgIntegrationConfiguration { uri: string; scheme = "Bearer"; token: string; - service: OrganizationIntegrationServiceType; + service: OrganizationIntegrationServiceName; - constructor(uri: string, token: string, service: string) { + constructor(uri: string, token: string, service: OrganizationIntegrationServiceName) { this.uri = uri; this.token = token; - this.service = service as OrganizationIntegrationServiceType; + this.service = service; } toString(): string { diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/webhook-configuration.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/webhook-configuration.ts index a4dca7378ba..2b9ed6f7bda 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/webhook-configuration.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/configuration/webhook-configuration.ts @@ -1,11 +1,16 @@ +import { OrgIntegrationConfiguration } from "../integration-builder"; +import { OrganizationIntegrationServiceName } from "../organization-integration-service-type"; + // Added to reflect how future webhook integrations could be structured within the OrganizationIntegration -export class WebhookConfiguration { +export class WebhookConfiguration implements OrgIntegrationConfiguration { propA: string; propB: string; + service: OrganizationIntegrationServiceName; - constructor(propA: string, propB: string) { + constructor(propA: string, propB: string, service: OrganizationIntegrationServiceName) { this.propA = propA; this.propB = propB; + this.service = service; } toString(): string { diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-builder.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-builder.ts new file mode 100644 index 00000000000..ae790a67408 --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-builder.ts @@ -0,0 +1,94 @@ +import { DatadogConfiguration } from "./configuration/datadog-configuration"; +import { HecConfiguration } from "./configuration/hec-configuration"; +import { DatadogTemplate } from "./integration-configuration-config/configuration-template/datadog-template"; +import { HecTemplate } from "./integration-configuration-config/configuration-template/hec-template"; +import { OrganizationIntegrationServiceName } from "./organization-integration-service-type"; +import { OrganizationIntegrationType } from "./organization-integration-type"; + +/** + * Defines the structure for organization integration configuration + */ +export interface OrgIntegrationConfiguration { + service: OrganizationIntegrationServiceName; + toString(): string; +} + +/** + * Defines the structure for organization integration template + */ +export interface OrgIntegrationTemplate { + service: OrganizationIntegrationServiceName; + toString(): string; +} + +/** + * Builder class for creating organization integration configurations and templates + */ +export class OrgIntegrationBuilder { + static buildHecConfiguration( + uri: string, + token: string, + service: OrganizationIntegrationServiceName, + ): OrgIntegrationConfiguration { + return new HecConfiguration(uri, token, service); + } + + static buildHecTemplate( + index: string, + service: OrganizationIntegrationServiceName, + ): OrgIntegrationTemplate { + return new HecTemplate(index, service); + } + + static buildDataDogConfiguration(uri: string, apiKey: string): OrgIntegrationConfiguration { + return new DatadogConfiguration(uri, apiKey, OrganizationIntegrationServiceName.Datadog); + } + + static buildDataDogTemplate(service: OrganizationIntegrationServiceName): OrgIntegrationTemplate { + return new DatadogTemplate(service); + } + + static buildConfiguration( + type: OrganizationIntegrationType, + configuration: string, + ): OrgIntegrationConfiguration { + switch (type) { + case OrganizationIntegrationType.Hec: { + const hecConfig = this.convertToJson(configuration); + return this.buildHecConfiguration(hecConfig.uri, hecConfig.token, hecConfig.service); + } + case OrganizationIntegrationType.Datadog: { + const datadogConfig = this.convertToJson(configuration); + return this.buildDataDogConfiguration(datadogConfig.uri, datadogConfig.apiKey); + } + default: + throw new Error(`Unsupported integration type: ${type}`); + } + } + + static buildTemplate( + type: OrganizationIntegrationType, + template: string, + ): OrgIntegrationTemplate { + switch (type) { + case OrganizationIntegrationType.Hec: { + const hecTemplate = this.convertToJson(template); + return this.buildHecTemplate(hecTemplate.index, hecTemplate.service); + } + case OrganizationIntegrationType.Datadog: { + const datadogTemplate = this.convertToJson(template); + return this.buildDataDogTemplate(datadogTemplate.service); + } + default: + throw new Error(`Unsupported integration type: ${type}`); + } + } + + private static convertToJson(jsonString?: string): T { + try { + return JSON.parse(jsonString || "{}") as T; + } catch { + throw new Error("Invalid integration configuration: JSON parse error"); + } + } +} diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/datadog-template.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/datadog-template.ts index 9aa6e34f478..d8e168aacbe 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/datadog-template.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/datadog-template.ts @@ -1,14 +1,15 @@ -import { OrganizationIntegrationServiceType } from "../../organization-integration-service-type"; +import { OrgIntegrationTemplate } from "../../integration-builder"; +import { OrganizationIntegrationServiceName } from "../../organization-integration-service-type"; -export class DatadogTemplate { +export class DatadogTemplate implements OrgIntegrationTemplate { source_type_name = "Bitwarden"; title: string = "#Title#"; text: string = "ActingUser: #ActingUserId#\nUser: #UserId#\nEvent: #Type#\nOrganization: #OrganizationId#\nPolicyId: #PolicyId#\nIpAddress: #IpAddress#\nDomainName: #DomainName#\nCipherId: #CipherId#\n"; - service: OrganizationIntegrationServiceType; + service: OrganizationIntegrationServiceName; - constructor(service: string) { - this.service = service as OrganizationIntegrationServiceType; + constructor(service: OrganizationIntegrationServiceName) { + this.service = service; } toString(): string { diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/hec-template.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/hec-template.ts index 7a841697fde..e1b474d0e77 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/hec-template.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/hec-template.ts @@ -1,14 +1,15 @@ -import { OrganizationIntegrationServiceType } from "../../organization-integration-service-type"; +import { OrgIntegrationTemplate } from "../../integration-builder"; +import { OrganizationIntegrationServiceName } from "../../organization-integration-service-type"; -export class HecTemplate { +export class HecTemplate implements OrgIntegrationTemplate { event = "#EventMessage#"; source = "Bitwarden"; index: string; - service: OrganizationIntegrationServiceType; + service: OrganizationIntegrationServiceName; - constructor(index: string, service: string) { + constructor(index: string, service: OrganizationIntegrationServiceName) { this.index = index; - this.service = service as OrganizationIntegrationServiceType; + this.service = service; } toString(): string { diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/webhook-template.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/webhook-template.ts index 7c51e98282b..fb482d1f367 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/webhook-template.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/integration-configuration-config/configuration-template/webhook-template.ts @@ -1,9 +1,14 @@ +import { OrgIntegrationTemplate } from "../../integration-builder"; +import { OrganizationIntegrationServiceName } from "../../organization-integration-service-type"; + // Added to reflect how future webhook integrations could be structured within the OrganizationIntegration -export class WebhookTemplate { +export class WebhookTemplate implements OrgIntegrationTemplate { + service: OrganizationIntegrationServiceName; propA: string; propB: string; - constructor(propA: string, propB: string) { + constructor(service: OrganizationIntegrationServiceName, propA: string, propB: string) { + this.service = service; this.propA = propA; this.propB = propB; } diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-configuration.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-configuration.ts index 0209460b630..5271dcd18da 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-configuration.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-configuration.ts @@ -4,31 +4,25 @@ import { OrganizationIntegrationId, } from "@bitwarden/common/types/guid"; -import { DatadogTemplate } from "./integration-configuration-config/configuration-template/datadog-template"; -import { HecTemplate } from "./integration-configuration-config/configuration-template/hec-template"; -import { WebhookTemplate } from "./integration-configuration-config/configuration-template/webhook-template"; -import { WebhookIntegrationConfigurationConfig } from "./integration-configuration-config/webhook-integration-configuration-config"; +import { OrgIntegrationTemplate } from "./integration-builder"; export class OrganizationIntegrationConfiguration { id: OrganizationIntegrationConfigurationId; integrationId: OrganizationIntegrationId; eventType?: EventType | null; - configuration?: WebhookIntegrationConfigurationConfig | null; filters?: string; - template?: HecTemplate | WebhookTemplate | DatadogTemplate | null; + template?: OrgIntegrationTemplate | null; constructor( id: OrganizationIntegrationConfigurationId, integrationId: OrganizationIntegrationId, eventType?: EventType | null, - configuration?: WebhookIntegrationConfigurationConfig | null, filters?: string, - template?: HecTemplate | WebhookTemplate | DatadogTemplate | null, + template?: OrgIntegrationTemplate | null, ) { this.id = id; this.integrationId = integrationId; this.eventType = eventType; - this.configuration = configuration; this.filters = filters; this.template = template; } diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-service-type.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-service-type.ts index e9e93adc0ff..9634ad7249a 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-service-type.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration-service-type.ts @@ -1,7 +1,7 @@ -export const OrganizationIntegrationServiceType = Object.freeze({ +export const OrganizationIntegrationServiceName = Object.freeze({ CrowdStrike: "CrowdStrike", Datadog: "Datadog", } as const); -export type OrganizationIntegrationServiceType = - (typeof OrganizationIntegrationServiceType)[keyof typeof OrganizationIntegrationServiceType]; +export type OrganizationIntegrationServiceName = + (typeof OrganizationIntegrationServiceName)[keyof typeof OrganizationIntegrationServiceName]; diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration.ts index d32c92a460a..84b633a207c 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/models/organization-integration.ts @@ -1,29 +1,27 @@ import { OrganizationIntegrationId } from "@bitwarden/common/types/guid"; -import { DatadogConfiguration } from "./configuration/datadog-configuration"; -import { HecConfiguration } from "./configuration/hec-configuration"; -import { WebhookConfiguration } from "./configuration/webhook-configuration"; +import { OrgIntegrationConfiguration } from "./integration-builder"; import { OrganizationIntegrationConfiguration } from "./organization-integration-configuration"; -import { OrganizationIntegrationServiceType } from "./organization-integration-service-type"; +import { OrganizationIntegrationServiceName } from "./organization-integration-service-type"; import { OrganizationIntegrationType } from "./organization-integration-type"; export class OrganizationIntegration { id: OrganizationIntegrationId; type: OrganizationIntegrationType; - serviceType: OrganizationIntegrationServiceType; - configuration: HecConfiguration | WebhookConfiguration | DatadogConfiguration | null; + serviceName: OrganizationIntegrationServiceName; + configuration: OrgIntegrationConfiguration | null; integrationConfiguration: OrganizationIntegrationConfiguration[] = []; constructor( id: OrganizationIntegrationId, type: OrganizationIntegrationType, - serviceType: OrganizationIntegrationServiceType, - configuration: HecConfiguration | WebhookConfiguration | DatadogConfiguration | null, + serviceName: OrganizationIntegrationServiceName, + configuration: OrgIntegrationConfiguration | null, integrationConfiguration: OrganizationIntegrationConfiguration[] = [], ) { this.id = id; this.type = type; - this.serviceType = serviceType; + this.serviceName = serviceName; this.configuration = configuration; this.integrationConfiguration = integrationConfiguration; } diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.spec.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.spec.ts deleted file mode 100644 index 0545f95cb83..00000000000 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.spec.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { mock } from "jest-mock-extended"; -import { firstValueFrom } from "rxjs"; - -import { - OrganizationId, - OrganizationIntegrationConfigurationId, - OrganizationIntegrationId, -} from "@bitwarden/common/types/guid"; - -import { DatadogConfiguration } from "../models/configuration/datadog-configuration"; -import { DatadogTemplate } from "../models/integration-configuration-config/configuration-template/datadog-template"; -import { OrganizationIntegration } from "../models/organization-integration"; -import { OrganizationIntegrationConfiguration } from "../models/organization-integration-configuration"; -import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; -import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; -import { OrganizationIntegrationServiceType } from "../models/organization-integration-service-type"; -import { OrganizationIntegrationType } from "../models/organization-integration-type"; - -import { DatadogOrganizationIntegrationService } from "./datadog-organization-integration-service"; -import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; -import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; - -describe("DatadogOrganizationIntegrationService", () => { - let service: DatadogOrganizationIntegrationService; - const mockIntegrationApiService = mock(); - const mockIntegrationConfigurationApiService = - mock(); - const organizationId = "org-1" as OrganizationId; - const integrationId = "int-1" as OrganizationIntegrationId; - const configId = "conf-1" as OrganizationIntegrationConfigurationId; - const serviceType = OrganizationIntegrationServiceType.CrowdStrike; - const url = "https://example.com"; - const apiKey = "token"; - - beforeEach(() => { - service = new DatadogOrganizationIntegrationService( - mockIntegrationApiService, - mockIntegrationConfigurationApiService, - ); - - jest.resetAllMocks(); - }); - - it("should set organization integrations", (done) => { - mockIntegrationApiService.getOrganizationIntegrations.mockResolvedValue([]); - service.setOrganizationIntegrations(organizationId); - const subscription = service.integrations$.subscribe((integrations) => { - expect(integrations).toEqual([]); - subscription.unsubscribe(); - done(); - }); - }); - - it("should save a new Datadog integration", async () => { - service.setOrganizationIntegrations(organizationId); - - const integrationResponse = { - id: integrationId, - type: OrganizationIntegrationType.Datadog, - configuration: JSON.stringify({ url, apiKey, service: serviceType }), - } as OrganizationIntegrationResponse; - - const configResponse = { - id: configId, - template: JSON.stringify({ service: serviceType }), - } as OrganizationIntegrationConfigurationResponse; - - mockIntegrationApiService.createOrganizationIntegration.mockResolvedValue(integrationResponse); - mockIntegrationConfigurationApiService.createOrganizationIntegrationConfiguration.mockResolvedValue( - configResponse, - ); - - await service.saveDatadog(organizationId, serviceType, url, apiKey); - - const integrations = await firstValueFrom(service.integrations$); - expect(integrations.length).toBe(1); - expect(integrations[0].id).toBe(integrationId); - expect(integrations[0].serviceType).toBe(serviceType); - }); - - it("should throw error on organization ID mismatch in saveDatadog", async () => { - service.setOrganizationIntegrations("other-org" as OrganizationId); - await expect(service.saveDatadog(organizationId, serviceType, url, apiKey)).rejects.toThrow( - Error("Organization ID mismatch"), - ); - }); - - it("should update an existing Datadog integration", async () => { - service.setOrganizationIntegrations(organizationId); - - const integrationResponse = { - id: integrationId, - type: OrganizationIntegrationType.Datadog, - configuration: JSON.stringify({ url, apiKey, service: serviceType }), - } as OrganizationIntegrationResponse; - - const configResponse = { - id: configId, - template: JSON.stringify({ service: serviceType }), - } as OrganizationIntegrationConfigurationResponse; - - mockIntegrationApiService.updateOrganizationIntegration.mockResolvedValue(integrationResponse); - mockIntegrationConfigurationApiService.updateOrganizationIntegrationConfiguration.mockResolvedValue( - configResponse, - ); - - await service.updateDatadog(organizationId, integrationId, configId, serviceType, url, apiKey); - - const integrations = await firstValueFrom(service.integrations$); - expect(integrations.length).toBe(1); - expect(integrations[0].id).toBe(integrationId); - }); - - it("should throw error on organization ID mismatch in updateDatadog", async () => { - service.setOrganizationIntegrations("other-org" as OrganizationId); - await expect( - service.updateDatadog(organizationId, integrationId, configId, serviceType, url, apiKey), - ).rejects.toThrow(Error("Organization ID mismatch")); - }); - - it("should get integration by id", async () => { - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Datadog, - serviceType, - {} as DatadogConfiguration, - [], - ), - ]); - const integration = await service.getIntegrationById(integrationId); - expect(integration).not.toBeNull(); - expect(integration!.id).toBe(integrationId); - }); - - it("should get integration by service type", async () => { - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Datadog, - serviceType, - {} as DatadogConfiguration, - [], - ), - ]); - const integration = await service.getIntegrationByServiceType(serviceType); - expect(integration).not.toBeNull(); - expect(integration!.serviceType).toBe(serviceType); - }); - - it("should get integration configurations", async () => { - const config = new OrganizationIntegrationConfiguration( - configId, - integrationId, - null, - null, - "", - {} as DatadogTemplate, - ); - - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Datadog, - serviceType, - {} as DatadogConfiguration, - [config], - ), - ]); - const configs = await service.getIntegrationConfigurations(integrationId); - expect(configs).not.toBeNull(); - expect(configs![0].id).toBe(configId); - }); - - it("convertToJson should parse valid JSON", () => { - const obj = service.convertToJson<{ a: number }>('{"a":1}'); - expect(obj).toEqual({ a: 1 }); - }); - - it("convertToJson should return null for invalid JSON", () => { - const obj = service.convertToJson<{ a: number }>("invalid"); - expect(obj).toBeNull(); - }); -}); diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.ts deleted file mode 100644 index 1fd5e9f8c06..00000000000 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/datadog-organization-integration-service.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { BehaviorSubject, firstValueFrom, map, Subject, switchMap, takeUntil, zip } from "rxjs"; - -import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { - OrganizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, -} from "@bitwarden/common/types/guid"; - -import { DatadogConfiguration } from "../models/configuration/datadog-configuration"; -import { DatadogTemplate } from "../models/integration-configuration-config/configuration-template/datadog-template"; -import { OrganizationIntegration } from "../models/organization-integration"; -import { OrganizationIntegrationConfiguration } from "../models/organization-integration-configuration"; -import { OrganizationIntegrationConfigurationRequest } from "../models/organization-integration-configuration-request"; -import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; -import { OrganizationIntegrationRequest } from "../models/organization-integration-request"; -import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; -import { OrganizationIntegrationServiceType } from "../models/organization-integration-service-type"; -import { OrganizationIntegrationType } from "../models/organization-integration-type"; - -import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; -import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; - -export type DatadogModificationFailureReason = { - mustBeOwner: boolean; - success: boolean; -}; - -export class DatadogOrganizationIntegrationService { - private organizationId$ = new BehaviorSubject(null); - private _integrations$ = new BehaviorSubject([]); - private destroy$ = new Subject(); - - integrations$ = this._integrations$.asObservable(); - - private fetch$ = this.organizationId$ - .pipe( - switchMap(async (orgId) => { - if (orgId) { - const data$ = await this.setIntegrations(orgId); - return await firstValueFrom(data$); - } else { - return this._integrations$.getValue(); - } - }), - takeUntil(this.destroy$), - ) - .subscribe({ - next: (integrations) => { - this._integrations$.next(integrations); - }, - }); - - constructor( - private integrationApiService: OrganizationIntegrationApiService, - private integrationConfigurationApiService: OrganizationIntegrationConfigurationApiService, - ) {} - - /** - * Sets the organization Id and will trigger the retrieval of the - * integrations for a given org. - * @param orgId - */ - setOrganizationIntegrations(orgId: OrganizationId) { - this.organizationId$.next(orgId); - } - - /** - * Saves a new organization integration and updates the integrations$ observable - * @param organizationId id of the organization - * @param service service type of the integration - * @param url url of the service - * @param apiKey api token - */ - async saveDatadog( - organizationId: OrganizationId, - service: OrganizationIntegrationServiceType, - url: string, - apiKey: string, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - const datadogConfig = new DatadogConfiguration(url, apiKey, service); - const newIntegrationResponse = await this.integrationApiService.createOrganizationIntegration( - organizationId, - new OrganizationIntegrationRequest( - OrganizationIntegrationType.Datadog, - datadogConfig.toString(), - ), - ); - - const newTemplate = new DatadogTemplate(service); - const newIntegrationConfigResponse = - await this.integrationConfigurationApiService.createOrganizationIntegrationConfiguration( - organizationId, - newIntegrationResponse.id, - new OrganizationIntegrationConfigurationRequest(null, null, null, newTemplate.toString()), - ); - - const newIntegration = this.mapResponsesToOrganizationIntegration( - newIntegrationResponse, - newIntegrationConfigResponse, - ); - if (newIntegration !== null) { - this._integrations$.next([...this._integrations$.getValue(), newIntegration]); - } - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - /** - * Updates an existing organization integration and updates the integrations$ observable - * @param organizationId id of the organization - * @param OrganizationIntegrationId id of the organization integration - * @param OrganizationIntegrationConfigurationId id of the organization integration configuration - * @param service service type of the integration - * @param url url of the service - * @param apiKey api token - */ - async updateDatadog( - organizationId: OrganizationId, - OrganizationIntegrationId: OrganizationIntegrationId, - OrganizationIntegrationConfigurationId: OrganizationIntegrationConfigurationId, - service: OrganizationIntegrationServiceType, - url: string, - apiKey: string, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - const datadogConfig = new DatadogConfiguration(url, apiKey, service); - const updatedIntegrationResponse = - await this.integrationApiService.updateOrganizationIntegration( - organizationId, - OrganizationIntegrationId, - new OrganizationIntegrationRequest( - OrganizationIntegrationType.Datadog, - datadogConfig.toString(), - ), - ); - - const updatedTemplate = new DatadogTemplate(service); - const updatedIntegrationConfigResponse = - await this.integrationConfigurationApiService.updateOrganizationIntegrationConfiguration( - organizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, - new OrganizationIntegrationConfigurationRequest( - null, - null, - null, - updatedTemplate.toString(), - ), - ); - - const updatedIntegration = this.mapResponsesToOrganizationIntegration( - updatedIntegrationResponse, - updatedIntegrationConfigResponse, - ); - - if (updatedIntegration !== null) { - this._integrations$.next([...this._integrations$.getValue(), updatedIntegration]); - } - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - async deleteDatadog( - organizationId: OrganizationId, - OrganizationIntegrationId: OrganizationIntegrationId, - OrganizationIntegrationConfigurationId: OrganizationIntegrationConfigurationId, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - // delete the configuration first due to foreign key constraint - await this.integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration( - organizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, - ); - - // delete the integration - await this.integrationApiService.deleteOrganizationIntegration( - organizationId, - OrganizationIntegrationId, - ); - - // update the local observable - const updatedIntegrations = this._integrations$ - .getValue() - .filter((i) => i.id !== OrganizationIntegrationId); - this._integrations$.next(updatedIntegrations); - - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - /** - * Gets a OrganizationIntegration for an OrganizationIntegrationId - * @param integrationId id of the integration - * @returns OrganizationIntegration or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationById( - integrationId: OrganizationIntegrationId, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => integrations.find((i) => i.id === integrationId) || null), - ), - ); - } - - /** - * Gets a OrganizationIntegration for a service type - * @param serviceType type of the service - * @returns OrganizationIntegration or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationByServiceType( - serviceType: OrganizationIntegrationServiceType, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => integrations.find((i) => i.serviceType === serviceType) || null), - ), - ); - } - - /** - * Gets a OrganizationIntegrationConfigurations for an integration ID - * @param integrationId id of the integration - * @returns OrganizationIntegration array or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationConfigurations( - integrationId: OrganizationIntegrationId, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => { - const integration = integrations.find((i) => i.id === integrationId); - return integration ? integration.integrationConfiguration : null; - }), - ), - ); - } - - // TODO: Move to data models to be more explicit for future services - private mapResponsesToOrganizationIntegration( - integrationResponse: OrganizationIntegrationResponse, - configurationResponse: OrganizationIntegrationConfigurationResponse, - ): OrganizationIntegration | null { - const datadogConfig = this.convertToJson( - integrationResponse.configuration, - ); - const template = this.convertToJson(configurationResponse.template); - - if (!datadogConfig || !template) { - return null; - } - - const integrationConfig = new OrganizationIntegrationConfiguration( - configurationResponse.id, - integrationResponse.id, - null, - null, - "", - template, - ); - - return new OrganizationIntegration( - integrationResponse.id, - integrationResponse.type, - datadogConfig.service, - datadogConfig, - [integrationConfig], - ); - } - - // Could possibly be moved to a base service. All services would then assume that the - // integration configuration would always be an array and this datadog specific service - // would just assume a single entry. - private setIntegrations(orgId: OrganizationId) { - const results$ = zip(this.integrationApiService.getOrganizationIntegrations(orgId)).pipe( - switchMap(([responses]) => { - const integrations: OrganizationIntegration[] = []; - const promises: Promise[] = []; - - responses.forEach((integration) => { - if (integration.type === OrganizationIntegrationType.Datadog) { - const promise = this.integrationConfigurationApiService - .getOrganizationIntegrationConfigurations(orgId, integration.id) - .then((response) => { - // datadog events will only have one OrganizationIntegrationConfiguration - const config = response[0]; - - const orgIntegration = this.mapResponsesToOrganizationIntegration( - integration, - config, - ); - - if (orgIntegration !== null) { - integrations.push(orgIntegration); - } - }); - promises.push(promise); - } - }); - return Promise.all(promises).then(() => { - return integrations; - }); - }), - ); - - return results$; - } - - // TODO: Move to base service when necessary - convertToJson(jsonString?: string): T | null { - try { - return JSON.parse(jsonString || "") as T; - } catch { - return null; - } - } -} diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.spec.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.spec.ts deleted file mode 100644 index 556078ea862..00000000000 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.spec.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { mock } from "jest-mock-extended"; -import { firstValueFrom } from "rxjs"; - -import { - OrganizationId, - OrganizationIntegrationConfigurationId, - OrganizationIntegrationId, -} from "@bitwarden/common/types/guid"; - -import { HecConfiguration } from "../models/configuration/hec-configuration"; -import { HecTemplate } from "../models/integration-configuration-config/configuration-template/hec-template"; -import { OrganizationIntegration } from "../models/organization-integration"; -import { OrganizationIntegrationConfiguration } from "../models/organization-integration-configuration"; -import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; -import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; -import { OrganizationIntegrationServiceType } from "../models/organization-integration-service-type"; -import { OrganizationIntegrationType } from "../models/organization-integration-type"; - -import { HecOrganizationIntegrationService } from "./hec-organization-integration-service"; -import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; -import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; - -describe("HecOrganizationIntegrationService", () => { - let service: HecOrganizationIntegrationService; - const mockIntegrationApiService = mock(); - const mockIntegrationConfigurationApiService = - mock(); - const organizationId = "org-1" as OrganizationId; - const integrationId = "int-1" as OrganizationIntegrationId; - const configId = "conf-1" as OrganizationIntegrationConfigurationId; - const serviceType = OrganizationIntegrationServiceType.CrowdStrike; - const url = "https://example.com"; - const bearerToken = "token"; - const index = "main"; - - beforeEach(() => { - service = new HecOrganizationIntegrationService( - mockIntegrationApiService, - mockIntegrationConfigurationApiService, - ); - - jest.resetAllMocks(); - }); - - it("should set organization integrations", (done) => { - mockIntegrationApiService.getOrganizationIntegrations.mockResolvedValue([]); - service.setOrganizationIntegrations(organizationId); - const subscription = service.integrations$.subscribe((integrations) => { - expect(integrations).toEqual([]); - subscription.unsubscribe(); - done(); - }); - }); - - it("should save a new Hec integration", async () => { - service.setOrganizationIntegrations(organizationId); - - const integrationResponse = { - id: integrationId, - type: OrganizationIntegrationType.Hec, - configuration: JSON.stringify({ url, bearerToken, service: serviceType }), - } as OrganizationIntegrationResponse; - - const configResponse = { - id: configId, - template: JSON.stringify({ index, service: serviceType }), - } as OrganizationIntegrationConfigurationResponse; - - mockIntegrationApiService.createOrganizationIntegration.mockResolvedValue(integrationResponse); - mockIntegrationConfigurationApiService.createOrganizationIntegrationConfiguration.mockResolvedValue( - configResponse, - ); - - await service.saveHec(organizationId, serviceType, url, bearerToken, index); - - const integrations = await firstValueFrom(service.integrations$); - expect(integrations.length).toBe(1); - expect(integrations[0].id).toBe(integrationId); - expect(integrations[0].serviceType).toBe(serviceType); - }); - - it("should throw error on organization ID mismatch in saveHec", async () => { - service.setOrganizationIntegrations("other-org" as OrganizationId); - await expect( - service.saveHec(organizationId, serviceType, url, bearerToken, index), - ).rejects.toThrow(Error("Organization ID mismatch")); - }); - - it("should update an existing Hec integration", async () => { - service.setOrganizationIntegrations(organizationId); - - const integrationResponse = { - id: integrationId, - type: OrganizationIntegrationType.Hec, - configuration: JSON.stringify({ url, bearerToken, service: serviceType }), - } as OrganizationIntegrationResponse; - - const configResponse = { - id: configId, - template: JSON.stringify({ index, service: serviceType }), - } as OrganizationIntegrationConfigurationResponse; - - mockIntegrationApiService.updateOrganizationIntegration.mockResolvedValue(integrationResponse); - mockIntegrationConfigurationApiService.updateOrganizationIntegrationConfiguration.mockResolvedValue( - configResponse, - ); - - await service.updateHec( - organizationId, - integrationId, - configId, - serviceType, - url, - bearerToken, - index, - ); - - const integrations = await firstValueFrom(service.integrations$); - expect(integrations.length).toBe(1); - expect(integrations[0].id).toBe(integrationId); - }); - - it("should throw error on organization ID mismatch in updateHec", async () => { - service.setOrganizationIntegrations("other-org" as OrganizationId); - await expect( - service.updateHec( - organizationId, - integrationId, - configId, - serviceType, - url, - bearerToken, - index, - ), - ).rejects.toThrow(Error("Organization ID mismatch")); - }); - - it("should get integration by id", async () => { - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Hec, - serviceType, - {} as HecConfiguration, - [], - ), - ]); - const integration = await service.getIntegrationById(integrationId); - expect(integration).not.toBeNull(); - expect(integration!.id).toBe(integrationId); - }); - - it("should get integration by service type", async () => { - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Hec, - serviceType, - {} as HecConfiguration, - [], - ), - ]); - const integration = await service.getIntegrationByServiceType(serviceType); - expect(integration).not.toBeNull(); - expect(integration!.serviceType).toBe(serviceType); - }); - - it("should get integration configurations", async () => { - const config = new OrganizationIntegrationConfiguration( - configId, - integrationId, - null, - null, - "", - {} as HecTemplate, - ); - - service["_integrations$"].next([ - new OrganizationIntegration( - integrationId, - OrganizationIntegrationType.Hec, - serviceType, - {} as HecConfiguration, - [config], - ), - ]); - const configs = await service.getIntegrationConfigurations(integrationId); - expect(configs).not.toBeNull(); - expect(configs![0].id).toBe(configId); - }); - - it("convertToJson should parse valid JSON", () => { - const obj = service.convertToJson<{ a: number }>('{"a":1}'); - expect(obj).toEqual({ a: 1 }); - }); - - it("convertToJson should return null for invalid JSON", () => { - const obj = service.convertToJson<{ a: number }>("invalid"); - expect(obj).toBeNull(); - }); -}); diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.ts deleted file mode 100644 index b83ea26e166..00000000000 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/hec-organization-integration-service.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { BehaviorSubject, firstValueFrom, map, Subject, switchMap, takeUntil, zip } from "rxjs"; - -import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { - OrganizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, -} from "@bitwarden/common/types/guid"; - -import { HecConfiguration } from "../models/configuration/hec-configuration"; -import { HecTemplate } from "../models/integration-configuration-config/configuration-template/hec-template"; -import { OrganizationIntegration } from "../models/organization-integration"; -import { OrganizationIntegrationConfiguration } from "../models/organization-integration-configuration"; -import { OrganizationIntegrationConfigurationRequest } from "../models/organization-integration-configuration-request"; -import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; -import { OrganizationIntegrationRequest } from "../models/organization-integration-request"; -import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; -import { OrganizationIntegrationServiceType } from "../models/organization-integration-service-type"; -import { OrganizationIntegrationType } from "../models/organization-integration-type"; - -import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; -import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; - -export type HecModificationFailureReason = { - mustBeOwner: boolean; - success: boolean; -}; - -export class HecOrganizationIntegrationService { - private organizationId$ = new BehaviorSubject(null); - private _integrations$ = new BehaviorSubject([]); - private destroy$ = new Subject(); - - integrations$ = this._integrations$.asObservable(); - - private fetch$ = this.organizationId$ - .pipe( - switchMap(async (orgId) => { - if (orgId) { - const data$ = await this.setIntegrations(orgId); - return await firstValueFrom(data$); - } else { - return [] as OrganizationIntegration[]; - } - }), - takeUntil(this.destroy$), - ) - .subscribe({ - next: (integrations) => { - this._integrations$.next(integrations); - }, - }); - - constructor( - private integrationApiService: OrganizationIntegrationApiService, - private integrationConfigurationApiService: OrganizationIntegrationConfigurationApiService, - ) {} - - /** - * Sets the organization Id and will trigger the retrieval of the - * integrations for a given org. - * @param orgId - */ - setOrganizationIntegrations(orgId: OrganizationId) { - if (orgId == this.organizationId$.getValue()) { - return; - } - this._integrations$.next([]); - this.organizationId$.next(orgId); - } - - /** - * Saves a new organization integration and updates the integrations$ observable - * @param organizationId id of the organization - * @param service service type of the integration - * @param url url of the service - * @param bearerToken api token - * @param index index in service - */ - async saveHec( - organizationId: OrganizationId, - service: OrganizationIntegrationServiceType, - url: string, - bearerToken: string, - index: string, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - const hecConfig = new HecConfiguration(url, bearerToken, service); - const newIntegrationResponse = await this.integrationApiService.createOrganizationIntegration( - organizationId, - new OrganizationIntegrationRequest(OrganizationIntegrationType.Hec, hecConfig.toString()), - ); - - const newTemplate = new HecTemplate(index, service); - const newIntegrationConfigResponse = - await this.integrationConfigurationApiService.createOrganizationIntegrationConfiguration( - organizationId, - newIntegrationResponse.id, - new OrganizationIntegrationConfigurationRequest(null, null, null, newTemplate.toString()), - ); - - const newIntegration = this.mapResponsesToOrganizationIntegration( - newIntegrationResponse, - newIntegrationConfigResponse, - ); - if (newIntegration !== null) { - this._integrations$.next([...this._integrations$.getValue(), newIntegration]); - } - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - /** - * Updates an existing organization integration and updates the integrations$ observable - * @param organizationId id of the organization - * @param OrganizationIntegrationId id of the organization integration - * @param OrganizationIntegrationConfigurationId id of the organization integration configuration - * @param service service type of the integration - * @param url url of the service - * @param bearerToken api token - * @param index index in service - */ - async updateHec( - organizationId: OrganizationId, - OrganizationIntegrationId: OrganizationIntegrationId, - OrganizationIntegrationConfigurationId: OrganizationIntegrationConfigurationId, - service: OrganizationIntegrationServiceType, - url: string, - bearerToken: string, - index: string, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - const hecConfig = new HecConfiguration(url, bearerToken, service); - const updatedIntegrationResponse = - await this.integrationApiService.updateOrganizationIntegration( - organizationId, - OrganizationIntegrationId, - new OrganizationIntegrationRequest(OrganizationIntegrationType.Hec, hecConfig.toString()), - ); - - const updatedTemplate = new HecTemplate(index, service); - const updatedIntegrationConfigResponse = - await this.integrationConfigurationApiService.updateOrganizationIntegrationConfiguration( - organizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, - new OrganizationIntegrationConfigurationRequest( - null, - null, - null, - updatedTemplate.toString(), - ), - ); - - const updatedIntegration = this.mapResponsesToOrganizationIntegration( - updatedIntegrationResponse, - updatedIntegrationConfigResponse, - ); - - if (updatedIntegration !== null) { - const unchangedIntegrations = this._integrations$ - .getValue() - .filter((i) => i.id !== OrganizationIntegrationId); - this._integrations$.next([...unchangedIntegrations, updatedIntegration]); - } - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - async deleteHec( - organizationId: OrganizationId, - OrganizationIntegrationId: OrganizationIntegrationId, - OrganizationIntegrationConfigurationId: OrganizationIntegrationConfigurationId, - ): Promise { - if (organizationId != this.organizationId$.getValue()) { - throw new Error("Organization ID mismatch"); - } - - try { - // delete the configuration first due to foreign key constraint - await this.integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration( - organizationId, - OrganizationIntegrationId, - OrganizationIntegrationConfigurationId, - ); - - // delete the integration - await this.integrationApiService.deleteOrganizationIntegration( - organizationId, - OrganizationIntegrationId, - ); - - // update the local observable - const updatedIntegrations = this._integrations$ - .getValue() - .filter((i) => i.id !== OrganizationIntegrationId); - this._integrations$.next(updatedIntegrations); - - return { mustBeOwner: false, success: true }; - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === 404) { - return { mustBeOwner: true, success: false }; - } - throw error; - } - } - - /** - * Gets a OrganizationIntegration for an OrganizationIntegrationId - * @param integrationId id of the integration - * @returns OrganizationIntegration or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationById( - integrationId: OrganizationIntegrationId, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => integrations.find((i) => i.id === integrationId) || null), - ), - ); - } - - /** - * Gets a OrganizationIntegration for a service type - * @param serviceType type of the service - * @returns OrganizationIntegration or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationByServiceType( - serviceType: OrganizationIntegrationServiceType, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => integrations.find((i) => i.serviceType === serviceType) || null), - ), - ); - } - - /** - * Gets a OrganizationIntegrationConfigurations for an integration ID - * @param integrationId id of the integration - * @returns OrganizationIntegration array or null - */ - // TODO: Move to base class when another service integration type is implemented - async getIntegrationConfigurations( - integrationId: OrganizationIntegrationId, - ): Promise { - return await firstValueFrom( - this.integrations$.pipe( - map((integrations) => { - const integration = integrations.find((i) => i.id === integrationId); - return integration ? integration.integrationConfiguration : null; - }), - ), - ); - } - - // TODO: Move to data models to be more explicit for future services - private mapResponsesToOrganizationIntegration( - integrationResponse: OrganizationIntegrationResponse, - configurationResponse: OrganizationIntegrationConfigurationResponse, - ): OrganizationIntegration | null { - const hecConfig = this.convertToJson(integrationResponse.configuration); - const template = this.convertToJson(configurationResponse.template); - - if (!hecConfig || !template) { - return null; - } - - const integrationConfig = new OrganizationIntegrationConfiguration( - configurationResponse.id, - integrationResponse.id, - null, - null, - "", - template, - ); - - return new OrganizationIntegration( - integrationResponse.id, - integrationResponse.type, - hecConfig.service, - hecConfig, - [integrationConfig], - ); - } - - // Could possibly be moved to a base service. All services would then assume that the - // integration configuration would always be an array and this hec specific service - // would just assume a single entry. - private setIntegrations(orgId: OrganizationId) { - const results$ = zip(this.integrationApiService.getOrganizationIntegrations(orgId)).pipe( - switchMap(([responses]) => { - const integrations: OrganizationIntegration[] = []; - const promises: Promise[] = []; - - responses.forEach((integration) => { - if (integration.type === OrganizationIntegrationType.Hec) { - const promise = this.integrationConfigurationApiService - .getOrganizationIntegrationConfigurations(orgId, integration.id) - .then((response) => { - // Hec events will only have one OrganizationIntegrationConfiguration - const config = response[0]; - - const orgIntegration = this.mapResponsesToOrganizationIntegration( - integration, - config, - ); - - if (orgIntegration !== null) { - integrations.push(orgIntegration); - } - }); - promises.push(promise); - } - }); - return Promise.all(promises).then(() => { - return integrations; - }); - }), - ); - - return results$; - } - - // TODO: Move to base service when necessary - convertToJson(jsonString?: string): T | null { - try { - return JSON.parse(jsonString || "") as T; - } catch { - return null; - } - } -} diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-api.service.spec.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-api.service.spec.ts index 10ea87486b4..a03b675868d 100644 --- a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-api.service.spec.ts +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-api.service.spec.ts @@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationId, OrganizationIntegrationId } from "@bitwarden/common/types/guid"; import { OrganizationIntegrationRequest } from "../models/organization-integration-request"; -import { OrganizationIntegrationServiceType } from "../models/organization-integration-service-type"; +import { OrganizationIntegrationServiceName } from "../models/organization-integration-service-type"; import { OrganizationIntegrationType } from "../models/organization-integration-type"; import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; @@ -56,7 +56,7 @@ describe("OrganizationIntegrationApiService", () => { it("should call apiService.send with correct parameters for createOrganizationIntegration", async () => { const request = new OrganizationIntegrationRequest( OrganizationIntegrationType.Hec, - `{ 'uri:' 'test.com', 'scheme:' 'bearer', 'token:' '123456789', 'service:' '${OrganizationIntegrationServiceType.CrowdStrike}' }`, + `{ 'uri:' 'test.com', 'scheme:' 'bearer', 'token:' '123456789', 'service:' '${OrganizationIntegrationServiceName.CrowdStrike}' }`, ); const orgId = "org1" as OrganizationId; @@ -76,7 +76,7 @@ describe("OrganizationIntegrationApiService", () => { it("should call apiService.send with the correct parameters for updateOrganizationIntegration", async () => { const request = new OrganizationIntegrationRequest( OrganizationIntegrationType.Hec, - `{ 'uri:' 'test.com', 'scheme:' 'bearer', 'token:' '123456789', 'service:' '${OrganizationIntegrationServiceType.CrowdStrike}' }`, + `{ 'uri:' 'test.com', 'scheme:' 'bearer', 'token:' '123456789', 'service:' '${OrganizationIntegrationServiceName.CrowdStrike}' }`, ); const orgId = "org1" as OrganizationId; const integrationId = "integration1" as OrganizationIntegrationId; diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.spec.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.spec.ts new file mode 100644 index 00000000000..767c22e2014 --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.spec.ts @@ -0,0 +1,633 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { firstValueFrom } from "rxjs"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { + OrganizationId, + OrganizationIntegrationId, + OrganizationIntegrationConfigurationId, +} from "@bitwarden/common/types/guid"; + +import { OrgIntegrationBuilder } from "../models/integration-builder"; +import { OrganizationIntegrationConfigurationRequest } from "../models/organization-integration-configuration-request"; +import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; +import { OrganizationIntegrationRequest } from "../models/organization-integration-request"; +import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; +import { OrganizationIntegrationServiceName } from "../models/organization-integration-service-type"; +import { OrganizationIntegrationType } from "../models/organization-integration-type"; + +import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; +import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; +import { OrganizationIntegrationService } from "./organization-integration-service"; + +describe("OrganizationIntegrationService", () => { + let service: OrganizationIntegrationService; + let integrationApiService: MockProxy; + let integrationConfigurationApiService: MockProxy; + + const orgId = "org-123" as OrganizationId; + const integrationId = "integration-456" as OrganizationIntegrationId; + const configurationId = "config-789" as OrganizationIntegrationConfigurationId; + + const mockIntegrationResponse = new OrganizationIntegrationResponse({ + Id: integrationId, + Type: OrganizationIntegrationType.Hec, + Configuration: JSON.stringify({ + uri: "https://test.splunk.com", + token: "test-token", + service: OrganizationIntegrationServiceName.CrowdStrike, + }), + }); + + const mockConfigurationResponse = new OrganizationIntegrationConfigurationResponse({ + Id: configurationId, + Template: JSON.stringify({ + index: "main", + service: OrganizationIntegrationServiceName.CrowdStrike, + }), + }); + + beforeEach(() => { + integrationApiService = mock(); + integrationConfigurationApiService = mock(); + + service = new OrganizationIntegrationService( + integrationApiService, + integrationConfigurationApiService, + ); + }); + + describe("initialization", () => { + it("should be created", () => { + expect(service).toBeTruthy(); + }); + + it("should initialize with empty integrations", async () => { + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toEqual([]); + }); + }); + + describe("setOrganizationId", () => { + it("should fetch and set integrations for the organization", async () => { + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations.mockReturnValue( + Promise.resolve([mockConfigurationResponse]), + ); + + service.setOrganizationId(orgId).subscribe(); + + // Wait for the observable to emit + await new Promise((resolve) => setTimeout(resolve, 100)); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + expect(integrations[0].id).toBe(integrationId); + expect(integrations[0].type).toBe(OrganizationIntegrationType.Hec); + expect(integrationApiService.getOrganizationIntegrations).toHaveBeenCalledWith(orgId); + expect( + integrationConfigurationApiService.getOrganizationIntegrationConfigurations, + ).toHaveBeenCalledWith(orgId, integrationId); + }); + + it("should skip fetching if organization ID is the same", async () => { + integrationApiService.getOrganizationIntegrations.mockReturnValue(Promise.resolve([])); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 50)); + + integrationApiService.getOrganizationIntegrations.mockClear(); + + // Call again with the same org ID + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 50)); + + expect(integrationApiService.getOrganizationIntegrations).not.toHaveBeenCalled(); + }); + + it("should clear existing integrations when switching organizations", async () => { + const orgId2 = "org-456" as OrganizationId; + + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations.mockReturnValue( + Promise.resolve([mockConfigurationResponse]), + ); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + let integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + + // Switch to different org + integrationApiService.getOrganizationIntegrations.mockReturnValue(Promise.resolve([])); + service.setOrganizationId(orgId2).subscribe(); + + // Should immediately clear + integrations = await firstValueFrom(service.integrations$); + expect(integrations).toEqual([]); + }); + + it("should unsubscribe from previous fetch when setting new organization", async () => { + integrationApiService.getOrganizationIntegrations.mockReturnValue(Promise.resolve([])); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 50)); + + const orgId2 = "org-456" as OrganizationId; + service.setOrganizationId(orgId2).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 50)); + + // Should call the API for both organizations (no errors about duplicate subscriptions) + // The exact call count may vary based on observable behavior + expect(integrationApiService.getOrganizationIntegrations).toHaveBeenCalled(); + }); + + it("should handle multiple integrations", async () => { + const integration2Response = new OrganizationIntegrationResponse({ + Id: "integration-2" as OrganizationIntegrationId, + Type: OrganizationIntegrationType.Datadog, + Configuration: JSON.stringify({ + uri: "https://datadog.com", + apiKey: "test-api-key", + service: OrganizationIntegrationServiceName.Datadog, + }), + }); + + const configuration2Response = new OrganizationIntegrationConfigurationResponse({ + Id: "config-2" as OrganizationIntegrationConfigurationId, + Template: JSON.stringify({ + service: OrganizationIntegrationServiceName.Datadog, + }), + }); + + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse, integration2Response]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations + .mockReturnValueOnce(Promise.resolve([mockConfigurationResponse])) + .mockReturnValueOnce(Promise.resolve([configuration2Response])); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(2); + }); + }); + + describe("save", () => { + const config = OrgIntegrationBuilder.buildHecConfiguration( + "https://test.splunk.com", + "test-token", + OrganizationIntegrationServiceName.CrowdStrike, + ); + const template = OrgIntegrationBuilder.buildHecTemplate( + "main", + OrganizationIntegrationServiceName.CrowdStrike, + ); + + beforeEach(() => { + // Set the organization first + integrationApiService.getOrganizationIntegrations.mockReturnValue(Promise.resolve([])); + service.setOrganizationId(orgId).subscribe(); + }); + + it("should save a new integration successfully", async () => { + integrationApiService.createOrganizationIntegration.mockResolvedValue( + mockIntegrationResponse, + ); + integrationConfigurationApiService.createOrganizationIntegrationConfiguration.mockResolvedValue( + mockConfigurationResponse, + ); + + const result = await service.save(orgId, OrganizationIntegrationType.Hec, config, template); + + expect(result).toEqual({ mustBeOwner: false, success: true }); + expect(integrationApiService.createOrganizationIntegration).toHaveBeenCalledWith( + orgId, + expect.any(OrganizationIntegrationRequest), + ); + expect( + integrationConfigurationApiService.createOrganizationIntegrationConfiguration, + ).toHaveBeenCalledWith( + orgId, + integrationId, + expect.any(OrganizationIntegrationConfigurationRequest), + ); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + expect(integrations[0].id).toBe(integrationId); + }); + + it("should throw error when organization ID mismatch", async () => { + const differentOrgId = "different-org" as OrganizationId; + + await expect( + service.save(differentOrgId, OrganizationIntegrationType.Hec, config, template), + ).rejects.toThrow("Organization ID mismatch"); + }); + + it("should return mustBeOwner true when API returns 404", async () => { + const error = new ErrorResponse({}, 404); + integrationApiService.createOrganizationIntegration.mockRejectedValue(error); + + const result = await service.save(orgId, OrganizationIntegrationType.Hec, config, template); + + expect(result).toEqual({ mustBeOwner: true, success: false }); + }); + + it("should rethrow non-404 errors", async () => { + const error = new Error("Server error"); + integrationApiService.createOrganizationIntegration.mockRejectedValue(error); + + await expect( + service.save(orgId, OrganizationIntegrationType.Hec, config, template), + ).rejects.toThrow("Server error"); + }); + + it("should handle configuration creation failure with 404", async () => { + const error = new ErrorResponse({}, 404); + integrationApiService.createOrganizationIntegration.mockResolvedValue( + mockIntegrationResponse, + ); + integrationConfigurationApiService.createOrganizationIntegrationConfiguration.mockRejectedValue( + error, + ); + + const result = await service.save(orgId, OrganizationIntegrationType.Hec, config, template); + + expect(result).toEqual({ mustBeOwner: true, success: false }); + }); + }); + + describe("update", () => { + const config = OrgIntegrationBuilder.buildHecConfiguration( + "https://updated.splunk.com", + "updated-token", + OrganizationIntegrationServiceName.CrowdStrike, + ); + const template = OrgIntegrationBuilder.buildHecTemplate( + "updated-index", + OrganizationIntegrationServiceName.CrowdStrike, + ); + + beforeEach(() => { + // Set the organization and add an existing integration + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations.mockReturnValue( + Promise.resolve([mockConfigurationResponse]), + ); + service.setOrganizationId(orgId).subscribe(); + }); + + it("should update an integration successfully", async () => { + const updatedIntegrationResponse = new OrganizationIntegrationResponse({ + Id: integrationId, + Type: OrganizationIntegrationType.Hec, + Configuration: JSON.stringify({ + uri: "https://updated.splunk.com", + token: "updated-token", + service: OrganizationIntegrationServiceName.CrowdStrike, + }), + }); + + const updatedConfigurationResponse = new OrganizationIntegrationConfigurationResponse({ + Id: configurationId, + Template: JSON.stringify({ + index: "updated-index", + service: OrganizationIntegrationServiceName.CrowdStrike, + }), + }); + + integrationApiService.updateOrganizationIntegration.mockResolvedValue( + updatedIntegrationResponse, + ); + integrationConfigurationApiService.updateOrganizationIntegrationConfiguration.mockResolvedValue( + updatedConfigurationResponse, + ); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + const result = await service.update( + orgId, + integrationId, + OrganizationIntegrationType.Hec, + configurationId, + config, + template, + ); + + expect(result).toEqual({ mustBeOwner: false, success: true }); + expect(integrationApiService.updateOrganizationIntegration).toHaveBeenCalledWith( + orgId, + integrationId, + expect.any(OrganizationIntegrationRequest), + ); + expect( + integrationConfigurationApiService.updateOrganizationIntegrationConfiguration, + ).toHaveBeenCalledWith( + orgId, + integrationId, + configurationId, + expect.any(OrganizationIntegrationConfigurationRequest), + ); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + expect(integrations[0].id).toBe(integrationId); + }); + + it("should throw error when organization ID mismatch", async () => { + const differentOrgId = "different-org" as OrganizationId; + + await expect( + service.update( + differentOrgId, + integrationId, + OrganizationIntegrationType.Hec, + configurationId, + config, + template, + ), + ).rejects.toThrow("Organization ID mismatch"); + }); + + it("should return mustBeOwner true when API returns 404", async () => { + const error = new ErrorResponse({}, 404); + integrationApiService.updateOrganizationIntegration.mockRejectedValue(error); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + const result = await service.update( + orgId, + integrationId, + OrganizationIntegrationType.Hec, + configurationId, + config, + template, + ); + + expect(result).toEqual({ mustBeOwner: true, success: false }); + }); + + it("should rethrow non-404 errors", async () => { + const error = new Error("Server error"); + integrationApiService.updateOrganizationIntegration.mockRejectedValue(error); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + await expect( + service.update( + orgId, + integrationId, + OrganizationIntegrationType.Hec, + configurationId, + config, + template, + ), + ).rejects.toThrow("Server error"); + }); + + it("should replace old integration with updated one in the list", async () => { + // Add multiple integrations first + const integration2Response = new OrganizationIntegrationResponse({ + Id: "integration-2" as OrganizationIntegrationId, + Type: OrganizationIntegrationType.Hec, + Configuration: mockIntegrationResponse.configuration, + }); + const configuration2Response = new OrganizationIntegrationConfigurationResponse({ + Id: "config-2" as OrganizationIntegrationConfigurationId, + Template: mockConfigurationResponse.template, + }); + + const orgId2 = "org-456" as OrganizationId; + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse, integration2Response]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations + .mockReturnValue(Promise.resolve([mockConfigurationResponse])) + .mockReturnValueOnce(Promise.resolve([mockConfigurationResponse])) + .mockReturnValueOnce(Promise.resolve([configuration2Response])); + + service.setOrganizationId(orgId2).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + let integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(2); + + // Now update the first integration + integrationApiService.updateOrganizationIntegration.mockResolvedValue( + mockIntegrationResponse, + ); + integrationConfigurationApiService.updateOrganizationIntegrationConfiguration.mockResolvedValue( + mockConfigurationResponse, + ); + + await service.update( + orgId2, + integrationId, + OrganizationIntegrationType.Hec, + configurationId, + config, + template, + ); + + integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(2); + expect(integrations.find((i) => i.id === integrationId)).toBeDefined(); + expect(integrations.find((i) => i.id === "integration-2")).toBeDefined(); + }); + }); + + describe("delete", () => { + beforeEach(() => { + // Set the organization and add an existing integration + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([mockIntegrationResponse]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations.mockReturnValue( + Promise.resolve([mockConfigurationResponse]), + ); + service.setOrganizationId(orgId).subscribe(); + }); + + it("should delete an integration successfully", async () => { + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration.mockResolvedValue( + undefined, + ); + integrationApiService.deleteOrganizationIntegration.mockResolvedValue(undefined); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + let integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + + const result = await service.delete(orgId, integrationId, configurationId); + + expect(result).toEqual({ mustBeOwner: false, success: true }); + expect( + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration, + ).toHaveBeenCalledWith(orgId, integrationId, configurationId); + expect(integrationApiService.deleteOrganizationIntegration).toHaveBeenCalledWith( + orgId, + integrationId, + ); + + integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(0); + }); + + it("should delete configuration before integration", async () => { + const callOrder: string[] = []; + + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration.mockImplementation( + async () => { + callOrder.push("configuration"); + }, + ); + integrationApiService.deleteOrganizationIntegration.mockImplementation(async () => { + callOrder.push("integration"); + }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + await service.delete(orgId, integrationId, configurationId); + + expect(callOrder).toEqual(["configuration", "integration"]); + }); + + it("should throw error when organization ID mismatch", async () => { + const differentOrgId = "different-org" as OrganizationId; + + await expect(service.delete(differentOrgId, integrationId, configurationId)).rejects.toThrow( + "Organization ID mismatch", + ); + }); + + it("should return mustBeOwner true when API returns 404", async () => { + const error = new ErrorResponse({}, 404); + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration.mockRejectedValue( + error, + ); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + const result = await service.delete(orgId, integrationId, configurationId); + + expect(result).toEqual({ mustBeOwner: true, success: false }); + }); + + it("should rethrow non-404 errors", async () => { + const error = new Error("Server error"); + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration.mockRejectedValue( + error, + ); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + await expect(service.delete(orgId, integrationId, configurationId)).rejects.toThrow( + "Server error", + ); + }); + + it("should handle 404 error when deleting integration", async () => { + const error = new ErrorResponse({}, 404); + integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration.mockResolvedValue( + undefined, + ); + integrationApiService.deleteOrganizationIntegration.mockRejectedValue(error); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + const result = await service.delete(orgId, integrationId, configurationId); + + expect(result).toEqual({ mustBeOwner: true, success: false }); + }); + }); + + describe("mapResponsesToOrganizationIntegration", () => { + it("should return null if configuration cannot be built", () => { + const invalidIntegrationResponse = new OrganizationIntegrationResponse({ + Id: integrationId, + Type: 999 as OrganizationIntegrationType, // Invalid type + Configuration: "invalid-json", + }); + + // The buildConfiguration method throws for unsupported types + // In production, this error is caught in the setIntegrations pipeline + expect(() => + service["mapResponsesToOrganizationIntegration"]( + invalidIntegrationResponse, + mockConfigurationResponse, + ), + ).toThrow("Unsupported integration type: 999"); + }); + + it("should handle template with invalid data", () => { + const invalidConfigurationResponse = new OrganizationIntegrationConfigurationResponse({ + Id: configurationId, + Template: "{}", // Empty template, will have undefined values but won't return null + }); + + const result = service["mapResponsesToOrganizationIntegration"]( + mockIntegrationResponse, + invalidConfigurationResponse, + ); + + // The result won't be null, but will have a template with undefined/default values + expect(result).not.toBeNull(); + expect(result?.integrationConfiguration[0].template).toBeDefined(); + }); + + it("should successfully map valid responses to OrganizationIntegration", () => { + const result = service["mapResponsesToOrganizationIntegration"]( + mockIntegrationResponse, + mockConfigurationResponse, + ); + + expect(result).not.toBeNull(); + expect(result?.id).toBe(integrationId); + expect(result?.type).toBe(OrganizationIntegrationType.Hec); + expect(result?.integrationConfiguration).toHaveLength(1); + expect(result?.integrationConfiguration[0].id).toBe(configurationId); + }); + }); + + describe("edge cases", () => { + it("should handle empty integration list from API", async () => { + integrationApiService.getOrganizationIntegrations.mockReturnValue(Promise.resolve([])); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toEqual([]); + }); + + it("should handle errors when fetching integrations", async () => { + const validIntegration = mockIntegrationResponse; + + integrationApiService.getOrganizationIntegrations.mockReturnValue( + Promise.resolve([validIntegration]), + ); + integrationConfigurationApiService.getOrganizationIntegrationConfigurations.mockReturnValue( + Promise.resolve([mockConfigurationResponse]), + ); + + service.setOrganizationId(orgId).subscribe(); + await new Promise((resolve) => setTimeout(resolve, 100)); + + const integrations = await firstValueFrom(service.integrations$); + expect(integrations).toHaveLength(1); + expect(integrations[0].id).toBe(integrationId); + }); + }); +}); diff --git a/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.ts b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.ts new file mode 100644 index 00000000000..cd153bc1133 --- /dev/null +++ b/bitwarden_license/bit-common/src/dirt/organization-integrations/services/organization-integration-service.ts @@ -0,0 +1,313 @@ +import { BehaviorSubject, map, Observable, of, switchMap, tap, zip } from "rxjs"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { + OrganizationId, + OrganizationIntegrationId, + OrganizationIntegrationConfigurationId, +} from "@bitwarden/common/types/guid"; + +import { + OrgIntegrationBuilder, + OrgIntegrationConfiguration, + OrgIntegrationTemplate, +} from "../models/integration-builder"; +import { OrganizationIntegration } from "../models/organization-integration"; +import { OrganizationIntegrationConfiguration } from "../models/organization-integration-configuration"; +import { OrganizationIntegrationConfigurationRequest } from "../models/organization-integration-configuration-request"; +import { OrganizationIntegrationConfigurationResponse } from "../models/organization-integration-configuration-response"; +import { OrganizationIntegrationRequest } from "../models/organization-integration-request"; +import { OrganizationIntegrationResponse } from "../models/organization-integration-response"; +import { OrganizationIntegrationType } from "../models/organization-integration-type"; + +import { OrganizationIntegrationApiService } from "./organization-integration-api.service"; +import { OrganizationIntegrationConfigurationApiService } from "./organization-integration-configuration-api.service"; +/** + * Common result type for integration modification operations (save, update, delete). + * was the server side failure due to insufficient permissions (must be owner)? + */ +export type IntegrationModificationResult = { + mustBeOwner: boolean; + success: boolean; +}; + +/** + * Provides common functionality for managing integrations with different external services. + */ +export class OrganizationIntegrationService { + private organizationId$ = new BehaviorSubject(null); + private _integrations$ = new BehaviorSubject([]); + + integrations$: Observable = this._integrations$.asObservable(); + + constructor( + protected integrationApiService: OrganizationIntegrationApiService, + protected integrationConfigurationApiService: OrganizationIntegrationConfigurationApiService, + ) {} + + /** + * Sets the organization Id and triggers the retrieval of integrations for the given organization. + * The integrations will be available via the integrations$ observable. + * If the organization ID is the same as the current one, no action is taken. + * Use this method to kick off loading integrations for a specific organization. + * Use integrations$ to subscribe to the loaded integrations. + * + * @param orgId - The organization ID to set + * @returns Observable that completes when the operation is done. Subscribe to trigger the load. + */ + setOrganizationId(orgId: OrganizationId): Observable { + if (orgId === this.organizationId$.getValue()) { + return of(void 0); + } + this._integrations$.next([]); + this.organizationId$.next(orgId); + + // subscribe to load and set integrations + // use integrations$ to get the loaded integrations + return this.setIntegrations(orgId).pipe( + tap((integrations) => { + this._integrations$.next(integrations); + }), + map((): void => void 0), + ); + } + + /** + * Saves a new organization integration and updates the integrations$ observable. + * + * @param organizationId - ID of the organization + * @param integrationType - Type of the organization integration + * @param config - The configuration object for this integration + * @param template - The template object for this integration + * @returns Promise with the result indicating success or failure reason + */ + async save( + organizationId: OrganizationId, + integrationType: OrganizationIntegrationType, + config: OrgIntegrationConfiguration, + template: OrgIntegrationTemplate, + ): Promise { + if (organizationId !== this.organizationId$.getValue()) { + throw new Error("Organization ID mismatch"); + } + + try { + const configString = config.toString(); + const newIntegrationResponse = await this.integrationApiService.createOrganizationIntegration( + organizationId, + new OrganizationIntegrationRequest(integrationType, configString), + ); + + const templateString = template.toString(); + const newIntegrationConfigResponse = + await this.integrationConfigurationApiService.createOrganizationIntegrationConfiguration( + organizationId, + newIntegrationResponse.id, + new OrganizationIntegrationConfigurationRequest(null, null, null, templateString), + ); + + const newIntegration = this.mapResponsesToOrganizationIntegration( + newIntegrationResponse, + newIntegrationConfigResponse, + ); + if (newIntegration !== null) { + this._integrations$.next([...this._integrations$.getValue(), newIntegration]); + } + return { mustBeOwner: false, success: true }; + } catch (error) { + if (error instanceof ErrorResponse && error.statusCode === 404) { + return { mustBeOwner: true, success: false }; + } + throw error; + } + } + + /** + * Updates an existing organization integration and updates the integrations$ observable. + * + * @param organizationId - ID of the organization + * @param integrationId - ID of the organization integration + * @param integrationType - Type of the organization integration + * @param configurationId - ID of the organization integration configuration + * @param config - The updated configuration object + * @param template - The updated template object + * @returns Promise with the result indicating success or failure reason + */ + async update( + organizationId: OrganizationId, + integrationId: OrganizationIntegrationId, + integrationType: OrganizationIntegrationType, + configurationId: OrganizationIntegrationConfigurationId, + config: OrgIntegrationConfiguration, + template: OrgIntegrationTemplate, + ): Promise { + if (organizationId !== this.organizationId$.getValue()) { + throw new Error("Organization ID mismatch"); + } + + try { + const configString = config.toString(); + const updatedIntegrationResponse = + await this.integrationApiService.updateOrganizationIntegration( + organizationId, + integrationId, + new OrganizationIntegrationRequest(integrationType, configString), + ); + + const templateString = template.toString(); + const updatedIntegrationConfigResponse = + await this.integrationConfigurationApiService.updateOrganizationIntegrationConfiguration( + organizationId, + integrationId, + configurationId, + new OrganizationIntegrationConfigurationRequest(null, null, null, templateString), + ); + + const updatedIntegration = this.mapResponsesToOrganizationIntegration( + updatedIntegrationResponse, + updatedIntegrationConfigResponse, + ); + + if (updatedIntegration !== null) { + const integrations = this._integrations$.getValue(); + const index = integrations.findIndex((i) => i.id === integrationId); + if (index !== -1) { + integrations[index] = updatedIntegration; + } else { + integrations.push(updatedIntegration); + } + this._integrations$.next([...integrations]); + } + return { mustBeOwner: false, success: true }; + } catch (error) { + if (error instanceof ErrorResponse && error.statusCode === 404) { + return { mustBeOwner: true, success: false }; + } + throw error; + } + } + + /** + * Deletes an organization integration and updates the integrations$ observable. + * + * @param organizationId - ID of the organization + * @param integrationId - ID of the organization integration + * @param configurationId - ID of the organization integration configuration + * @returns Promise with the result indicating success or failure reason + */ + async delete( + organizationId: OrganizationId, + integrationId: OrganizationIntegrationId, + configurationId: OrganizationIntegrationConfigurationId, + ): Promise { + if (organizationId !== this.organizationId$.getValue()) { + throw new Error("Organization ID mismatch"); + } + + try { + // delete the configuration first due to foreign key constraint + await this.integrationConfigurationApiService.deleteOrganizationIntegrationConfiguration( + organizationId, + integrationId, + configurationId, + ); + + // delete the integration + await this.integrationApiService.deleteOrganizationIntegration(organizationId, integrationId); + + // update the local observable + const updatedIntegrations = this._integrations$ + .getValue() + .filter((i) => i.id !== integrationId); + this._integrations$.next(updatedIntegrations); + + return { mustBeOwner: false, success: true }; + } catch (error) { + if (error instanceof ErrorResponse && error.statusCode === 404) { + return { mustBeOwner: true, success: false }; + } + throw error; + } + } + + /** + * Maps API responses to an OrganizationIntegration domain model. + * + * @param integrationResponse - The integration response from the API + * @param configurationResponse - The configuration response from the API + * @returns OrganizationIntegration or null if mapping fails + */ + private mapResponsesToOrganizationIntegration( + integrationResponse: OrganizationIntegrationResponse, + configurationResponse: OrganizationIntegrationConfigurationResponse, + ): OrganizationIntegration | null { + const integrationType = integrationResponse.type; + const config = OrgIntegrationBuilder.buildConfiguration( + integrationType, + integrationResponse.configuration, + ); + const template = OrgIntegrationBuilder.buildTemplate( + integrationType, + configurationResponse.template ?? "{}", + ); + + if (!config || !template) { + return null; + } + + const integrationConfig = new OrganizationIntegrationConfiguration( + configurationResponse.id, + integrationResponse.id, + null, + "", + template, + ); + + return new OrganizationIntegration( + integrationResponse.id, + integrationResponse.type, + config.service, + config, + [integrationConfig], + ); + } + + /** + * Fetches integrations for the given organization from the API. + * + * @param orgId - Organization ID to fetch integrations for + * @returns Observable of OrganizationIntegration array + */ + private setIntegrations(orgId: OrganizationId): Observable { + const results$ = zip(this.integrationApiService.getOrganizationIntegrations(orgId)).pipe( + switchMap(([responses]) => { + const integrations: OrganizationIntegration[] = []; + const promises: Promise[] = []; + + responses.forEach((integration) => { + const promise = this.integrationConfigurationApiService + .getOrganizationIntegrationConfigurations(orgId, integration.id) + .then((response) => { + // Integration will only have one OrganizationIntegrationConfiguration + const config = response[0]; + + const orgIntegration = this.mapResponsesToOrganizationIntegration( + integration, + config, + ); + + if (orgIntegration !== null) { + integrations.push(orgIntegration); + } + }); + promises.push(promise); + }); + return Promise.all(promises).then(() => { + return integrations; + }); + }), + ); + + return results$; + } +} diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts index a0a881dbad7..99d54eedc29 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts @@ -10,6 +10,7 @@ import { ProviderUserType } from "@bitwarden/common/admin-console/enums"; import { Provider } from "@bitwarden/common/admin-console/models/domain/provider"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { ToastService } from "@bitwarden/components"; import { newGuid } from "@bitwarden/guid"; @@ -41,9 +42,10 @@ describe("Provider Permissions Guard", () => { accountService.activeAccount$ = of({ id: mockUserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); route = mock({ diff --git a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/all-applications/all-applications.component.ts b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/all-applications/all-applications.component.ts index 3a9159ad68c..95453ffa41a 100644 --- a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/all-applications/all-applications.component.ts +++ b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/all-applications/all-applications.component.ts @@ -143,16 +143,14 @@ export class AllApplicationsComponent implements OnInit { onCheckboxChange = (applicationName: string, event: Event) => { const isChecked = (event.target as HTMLInputElement).checked; - if (isChecked) { - this.selectedUrls.update((selectedUrls) => { - selectedUrls.add(applicationName); - return selectedUrls; - }); - } else { - this.selectedUrls.update((selectedUrls) => { - selectedUrls.delete(applicationName); - return selectedUrls; - }); - } + this.selectedUrls.update((selectedUrls) => { + const nextSelected = new Set(selectedUrls); + if (isChecked) { + nextSelected.add(applicationName); + } else { + nextSelected.delete(applicationName); + } + return nextSelected; + }); }; } diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.spec.ts b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.spec.ts index 8beaae7f10a..37bd504643c 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.spec.ts +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.spec.ts @@ -4,9 +4,10 @@ import { mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; -import { OrganizationIntegrationServiceType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; +import { OrgIntegrationBuilder } from "@bitwarden/bit-common/dirt/organization-integrations/models/integration-builder"; +import { OrganizationIntegrationServiceName } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; +import { OrganizationIntegrationType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-type"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; @@ -29,8 +30,7 @@ describe("IntegrationCardComponent", () => { let fixture: ComponentFixture; const mockI18nService = mock(); const activatedRoute = mock(); - const mockIntegrationService = mock(); - const mockDatadogIntegrationService = mock(); + const mockIntegrationService = mock(); const dialogService = mock(); const toastService = mock(); @@ -54,8 +54,7 @@ describe("IntegrationCardComponent", () => { { provide: I18nPipe, useValue: mock() }, { provide: I18nService, useValue: mockI18nService }, { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: HecOrganizationIntegrationService, useValue: mockIntegrationService }, - { provide: DatadogOrganizationIntegrationService, useValue: mockDatadogIntegrationService }, + { provide: OrganizationIntegrationService, useValue: mockIntegrationService }, { provide: ToastService, useValue: toastService }, { provide: DialogService, useValue: dialogService }, ], @@ -259,7 +258,7 @@ describe("IntegrationCardComponent", () => { configuration: {}, integrationConfiguration: [{ id: "config-id" }], }, - name: OrganizationIntegrationServiceType.CrowdStrike, + name: OrganizationIntegrationServiceName.CrowdStrike, } as any; component.organizationId = "org-id" as any; jest.resetAllMocks(); @@ -270,8 +269,8 @@ describe("IntegrationCardComponent", () => { closed: of({ success: false }), }); await component.setupConnection(); - expect(mockIntegrationService.updateHec).not.toHaveBeenCalled(); - expect(mockIntegrationService.saveHec).not.toHaveBeenCalled(); + expect(mockIntegrationService.update).not.toHaveBeenCalled(); + expect(mockIntegrationService.save).not.toHaveBeenCalled(); }); it("should call updateHec if isUpdateAvailable is true", async () => { @@ -284,26 +283,35 @@ describe("IntegrationCardComponent", () => { }), }); + const config = OrgIntegrationBuilder.buildHecConfiguration( + "test-url", + "token", + OrganizationIntegrationServiceName.CrowdStrike, + ); + const template = OrgIntegrationBuilder.buildHecTemplate( + "index", + OrganizationIntegrationServiceName.CrowdStrike, + ); + jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); await component.setupConnection(); - expect(mockIntegrationService.updateHec).toHaveBeenCalledWith( + expect(mockIntegrationService.update).toHaveBeenCalledWith( "org-id", "integration-id", + OrganizationIntegrationType.Hec, "config-id", - OrganizationIntegrationServiceType.CrowdStrike, - "test-url", - "token", - "index", + config, + template, ); - expect(mockIntegrationService.saveHec).not.toHaveBeenCalled(); + expect(mockIntegrationService.save).not.toHaveBeenCalled(); }); it("should call saveHec if isUpdateAvailable is false", async () => { component.integrationSettings = { organizationIntegration: null, - name: OrganizationIntegrationServiceType.CrowdStrike, + name: OrganizationIntegrationServiceName.CrowdStrike, } as any; component.organizationId = "org-id" as any; @@ -316,23 +324,32 @@ describe("IntegrationCardComponent", () => { }), }); + const config = OrgIntegrationBuilder.buildHecConfiguration( + "test-url", + "token", + OrganizationIntegrationServiceName.CrowdStrike, + ); + const template = OrgIntegrationBuilder.buildHecTemplate( + "index", + OrganizationIntegrationServiceName.CrowdStrike, + ); + jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(false); - mockIntegrationService.saveHec.mockResolvedValue({ mustBeOwner: false, success: true }); + mockIntegrationService.save.mockResolvedValue({ mustBeOwner: false, success: true }); await component.setupConnection(); - expect(mockIntegrationService.saveHec).toHaveBeenCalledWith( + expect(mockIntegrationService.save).toHaveBeenCalledWith( "org-id", - OrganizationIntegrationServiceType.CrowdStrike, - "test-url", - "token", - "index", + OrganizationIntegrationType.Hec, + config, + template, ); - expect(mockIntegrationService.updateHec).not.toHaveBeenCalled(); + expect(mockIntegrationService.update).not.toHaveBeenCalled(); }); - it("should call deleteHec when a delete is requested", async () => { + it("should call delete with Hec type when a delete is requested", async () => { component.organizationId = "org-id" as any; (openHecConnectDialog as jest.Mock).mockReturnValue({ @@ -344,22 +361,22 @@ describe("IntegrationCardComponent", () => { }), }); - mockIntegrationService.deleteHec.mockResolvedValue({ mustBeOwner: false, success: true }); + mockIntegrationService.delete.mockResolvedValue({ mustBeOwner: false, success: true }); await component.setupConnection(); - expect(mockIntegrationService.deleteHec).toHaveBeenCalledWith( + expect(mockIntegrationService.delete).toHaveBeenCalledWith( "org-id", "integration-id", "config-id", ); - expect(mockIntegrationService.saveHec).not.toHaveBeenCalled(); + expect(mockIntegrationService.save).not.toHaveBeenCalled(); }); - it("should not call deleteHec if no existing configuration", async () => { + it("should not call delete if no existing configuration", async () => { component.integrationSettings = { organizationIntegration: null, - name: OrganizationIntegrationServiceType.CrowdStrike, + name: OrganizationIntegrationServiceName.CrowdStrike, } as any; component.organizationId = "org-id" as any; @@ -372,20 +389,16 @@ describe("IntegrationCardComponent", () => { }), }); - mockIntegrationService.deleteHec.mockResolvedValue({ mustBeOwner: false, success: true }); + mockIntegrationService.delete.mockResolvedValue({ mustBeOwner: false, success: true }); await component.setupConnection(); - expect(mockIntegrationService.deleteHec).not.toHaveBeenCalledWith( + expect(mockIntegrationService.delete).not.toHaveBeenCalledWith( "org-id", "integration-id", "config-id", - OrganizationIntegrationServiceType.CrowdStrike, - "test-url", - "token", - "index", ); - expect(mockIntegrationService.updateHec).not.toHaveBeenCalled(); + expect(mockIntegrationService.update).not.toHaveBeenCalled(); }); it("should show toast on error while saving", async () => { @@ -399,11 +412,11 @@ describe("IntegrationCardComponent", () => { }); jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); - mockIntegrationService.updateHec.mockRejectedValue(new Error("fail")); + mockIntegrationService.update.mockRejectedValue(new Error("fail")); await component.setupConnection(); - expect(mockIntegrationService.updateHec).toHaveBeenCalled(); + expect(mockIntegrationService.update).toHaveBeenCalled(); expect(toastService.showToast).toHaveBeenCalledWith({ variant: "error", title: "", @@ -422,11 +435,11 @@ describe("IntegrationCardComponent", () => { }); jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); - mockIntegrationService.updateHec.mockRejectedValue(new ErrorResponse("Not Found", 404)); + mockIntegrationService.update.mockRejectedValue(new ErrorResponse("Not Found", 404)); await component.setupConnection(); - expect(mockIntegrationService.updateHec).toHaveBeenCalled(); + expect(mockIntegrationService.update).toHaveBeenCalled(); expect(toastService.showToast).toHaveBeenCalledWith({ variant: "error", title: "", @@ -445,11 +458,10 @@ describe("IntegrationCardComponent", () => { }); jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); - mockIntegrationService.updateHec.mockRejectedValue(new ErrorResponse("Not Found", 404)); - + mockIntegrationService.update.mockRejectedValue(new ErrorResponse("Not Found", 404)); await component.setupConnection(); - expect(mockIntegrationService.updateHec).toHaveBeenCalled(); + expect(mockIntegrationService.update).toHaveBeenCalled(); expect(toastService.showToast).toHaveBeenCalledWith({ variant: "error", title: "", @@ -468,11 +480,11 @@ describe("IntegrationCardComponent", () => { }); jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); - mockIntegrationService.deleteHec.mockRejectedValue(new Error("fail")); + mockIntegrationService.delete.mockRejectedValue(new Error("fail")); await component.setupConnection(); - expect(mockIntegrationService.deleteHec).toHaveBeenCalled(); + expect(mockIntegrationService.delete).toHaveBeenCalled(); expect(toastService.showToast).toHaveBeenCalledWith({ variant: "error", title: "", @@ -491,11 +503,10 @@ describe("IntegrationCardComponent", () => { }); jest.spyOn(component, "isUpdateAvailable", "get").mockReturnValue(true); - mockIntegrationService.deleteHec.mockRejectedValue(new ErrorResponse("Not Found", 404)); - + mockIntegrationService.delete.mockRejectedValue(new ErrorResponse("Not Found", 404)); await component.setupConnection(); - expect(mockIntegrationService.deleteHec).toHaveBeenCalled(); + expect(mockIntegrationService.delete).toHaveBeenCalled(); expect(toastService.showToast).toHaveBeenCalledWith({ variant: "error", title: "", diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.ts b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.ts index e6d4aff05fb..8026e14c2fc 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.ts +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-card/integration-card.component.ts @@ -12,10 +12,10 @@ import { Observable, Subject, combineLatest, lastValueFrom, takeUntil } from "rx import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; import { Integration } from "@bitwarden/bit-common/dirt/organization-integrations/models/integration"; -import { OrganizationIntegrationServiceType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; +import { OrgIntegrationBuilder } from "@bitwarden/bit-common/dirt/organization-integrations/models/integration-builder"; +import { OrganizationIntegrationServiceName } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; import { OrganizationIntegrationType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-type"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; @@ -96,8 +96,7 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { private systemTheme$: Observable, private dialogService: DialogService, private activatedRoute: ActivatedRoute, - private hecOrganizationIntegrationService: HecOrganizationIntegrationService, - private datadogOrganizationIntegrationService: DatadogOrganizationIntegrationService, + private organizationIntegrationService: OrganizationIntegrationService, private toastService: ToastService, private i18nService: I18nService, ) { @@ -250,7 +249,18 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { } async saveHec(result: HecConnectDialogResult) { - let saveResponse = { mustBeOwner: false, success: false }; + let response = { mustBeOwner: false, success: false }; + + const config = OrgIntegrationBuilder.buildHecConfiguration( + result.url, + result.bearerToken, + this.integrationSettings.name as OrganizationIntegrationServiceName, + ); + const template = OrgIntegrationBuilder.buildHecTemplate( + result.index, + this.integrationSettings.name as OrganizationIntegrationServiceName, + ); + if (this.isUpdateAvailable) { // retrieve org integration and configuration ids const orgIntegrationId = this.integrationSettings.organizationIntegration?.id; @@ -262,27 +272,25 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { } // update existing integration and configuration - saveResponse = await this.hecOrganizationIntegrationService.updateHec( + response = await this.organizationIntegrationService.update( this.organizationId, orgIntegrationId, + OrganizationIntegrationType.Hec, orgIntegrationConfigurationId, - this.integrationSettings.name as OrganizationIntegrationServiceType, - result.url, - result.bearerToken, - result.index, + config, + template, ); } else { // create new integration and configuration - saveResponse = await this.hecOrganizationIntegrationService.saveHec( + response = await this.organizationIntegrationService.save( this.organizationId, - this.integrationSettings.name as OrganizationIntegrationServiceType, - result.url, - result.bearerToken, - result.index, + OrganizationIntegrationType.Hec, + config, + template, ); } - if (saveResponse.mustBeOwner) { + if (response.mustBeOwner) { this.showMustBeOwnerToast(); return; } @@ -303,7 +311,7 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { throw Error("Organization Integration ID or Configuration ID is missing"); } - const response = await this.hecOrganizationIntegrationService.deleteHec( + const response = await this.organizationIntegrationService.delete( this.organizationId, orgIntegrationId, orgIntegrationConfigurationId, @@ -322,6 +330,13 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { } async saveDatadog(result: DatadogConnectDialogResult) { + let response = { mustBeOwner: false, success: false }; + + const config = OrgIntegrationBuilder.buildDataDogConfiguration(result.url, result.apiKey); + const template = OrgIntegrationBuilder.buildDataDogTemplate( + this.integrationSettings.name as OrganizationIntegrationServiceName, + ); + if (this.isUpdateAvailable) { // retrieve org integration and configuration ids const orgIntegrationId = this.integrationSettings.organizationIntegration?.id; @@ -333,23 +348,29 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { } // update existing integration and configuration - await this.datadogOrganizationIntegrationService.updateDatadog( + response = await this.organizationIntegrationService.update( this.organizationId, orgIntegrationId, + OrganizationIntegrationType.Datadog, orgIntegrationConfigurationId, - this.integrationSettings.name as OrganizationIntegrationServiceType, - result.url, - result.apiKey, + config, + template, ); } else { // create new integration and configuration - await this.datadogOrganizationIntegrationService.saveDatadog( + response = await this.organizationIntegrationService.save( this.organizationId, - this.integrationSettings.name as OrganizationIntegrationServiceType, - result.url, - result.apiKey, + OrganizationIntegrationType.Datadog, + config, + template, ); } + + if (response.mustBeOwner) { + this.showMustBeOwnerToast(); + return; + } + this.toastService.showToast({ variant: "success", title: "", @@ -366,7 +387,7 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { throw Error("Organization Integration ID or Configuration ID is missing"); } - const response = await this.datadogOrganizationIntegrationService.deleteDatadog( + const response = await this.organizationIntegrationService.delete( this.organizationId, orgIntegrationId, orgIntegrationConfigurationId, diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-grid/integration-grid.component.spec.ts b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-grid/integration-grid.component.spec.ts index 2908fe0c089..3560a32fb40 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-grid/integration-grid.component.spec.ts +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integration-grid/integration-grid.component.spec.ts @@ -6,8 +6,7 @@ import { of } from "rxjs"; import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; import { Integration } from "@bitwarden/bit-common/dirt/organization-integrations/models/integration"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { IntegrationType } from "@bitwarden/common/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ThemeTypes } from "@bitwarden/common/platform/enums"; @@ -24,8 +23,7 @@ describe("IntegrationGridComponent", () => { let component: IntegrationGridComponent; let fixture: ComponentFixture; const mockActivatedRoute = mock(); - const mockIntegrationService = mock(); - const mockDatadogIntegrationService = mock(); + const mockIntegrationService = mock(); const integrations: Integration[] = [ { name: "Integration 1", @@ -71,8 +69,7 @@ describe("IntegrationGridComponent", () => { provide: ActivatedRoute, useValue: mockActivatedRoute, }, - { provide: HecOrganizationIntegrationService, useValue: mockIntegrationService }, - { provide: DatadogOrganizationIntegrationService, useValue: mockDatadogIntegrationService }, + { provide: OrganizationIntegrationService, useValue: mockIntegrationService }, { provide: ToastService, useValue: mock(), diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.html b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.html index 58c52e4f40a..a35df3677bb 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.html +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.html @@ -1,69 +1,78 @@ - - -
-

{{ "singleSignOn" | i18n }}

-

- {{ "ssoDescStart" | i18n }} - {{ "singleSignOn" | i18n }} - {{ "ssoDescEnd" | i18n }} -

- -
-
+@let organization = organization$ | async; - -
-

- {{ "scimIntegration" | i18n }} -

-

- {{ "scimIntegrationDescStart" | i18n }} - {{ "scimIntegration" | i18n }} - {{ "scimIntegrationDescEnd" | i18n }} -

- -
-
-

- {{ "bwdc" | i18n }} -

-

{{ "bwdcDesc" | i18n }}

- -
-
+@if (organization) { + + @if (organization?.useSso) { + +
+

{{ "singleSignOn" | i18n }}

+

+ {{ "ssoDescStart" | i18n }} + {{ + "singleSignOn" | i18n + }} + {{ "ssoDescEnd" | i18n }} +

+ +
+
+ } - -
-

- {{ "eventManagement" | i18n }} -

-

{{ "eventManagementDesc" | i18n }}

- -
-
+ @if (organization?.useScim || organization?.useDirectory) { + +
+

+ {{ "scimIntegration" | i18n }} +

+

+ {{ "scimIntegrationDescStart" | i18n }} + {{ "scimIntegration" | i18n }} + {{ "scimIntegrationDescEnd" | i18n }} +

+ +
+
+

+ {{ "bwdc" | i18n }} +

+

{{ "bwdcDesc" | i18n }}

+ +
+
+ } - -
-

- {{ "deviceManagement" | i18n }} -

-

{{ "deviceManagementDesc" | i18n }}

- -
-
-
+ @if (organization?.useEvents) { + +
+

+ {{ "eventManagement" | i18n }} +

+

{{ "eventManagementDesc" | i18n }}

+ +
+
+ } + + +
+

+ {{ "deviceManagement" | i18n }} +

+

{{ "deviceManagementDesc" | i18n }}

+ +
+
+
+} diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.ts b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.ts index 894a8e9a25c..6517182b21e 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.ts +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/integrations.component.ts @@ -3,10 +3,9 @@ import { ActivatedRoute } from "@angular/router"; import { firstValueFrom, Observable, Subject, switchMap, takeUntil, takeWhile } from "rxjs"; import { Integration } from "@bitwarden/bit-common/dirt/organization-integrations/models/integration"; -import { OrganizationIntegrationServiceType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; +import { OrganizationIntegrationServiceName } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-service-type"; import { OrganizationIntegrationType } from "@bitwarden/bit-common/dirt/organization-integrations/models/organization-integration-type"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -21,6 +20,7 @@ import { SharedModule } from "@bitwarden/web-vault/app/shared"; import { IntegrationGridComponent } from "./integration-grid/integration-grid.component"; import { FilterIntegrationsPipe } from "./integrations.pipe"; +// attempted, but because bit-tab-group is not OnPush, caused more issues than it solved // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ @@ -236,10 +236,12 @@ export class AdminConsoleIntegrationsComponent implements OnInit, OnDestroy { ); // Sets the organization ID which also loads the integrations$ - this.organization$.pipe(takeUntil(this.destroy$)).subscribe((org) => { - this.hecOrganizationIntegrationService.setOrganizationIntegrations(org.id); - this.datadogOrganizationIntegrationService.setOrganizationIntegrations(org.id); - }); + this.organization$ + .pipe( + switchMap((org) => this.organizationIntegrationService.setOrganizationId(org.id)), + takeUntil(this.destroy$), + ) + .subscribe(); } constructor( @@ -247,8 +249,7 @@ export class AdminConsoleIntegrationsComponent implements OnInit, OnDestroy { private organizationService: OrganizationService, private accountService: AccountService, private configService: ConfigService, - private hecOrganizationIntegrationService: HecOrganizationIntegrationService, - private datadogOrganizationIntegrationService: DatadogOrganizationIntegrationService, + private organizationIntegrationService: OrganizationIntegrationService, ) { this.configService .getFeatureFlag$(FeatureFlag.EventManagementForDataDogAndCrowdStrike) @@ -260,7 +261,7 @@ export class AdminConsoleIntegrationsComponent implements OnInit, OnDestroy { // Add the new event based items to the list if (this.isEventManagementForDataDogAndCrowdStrikeEnabled) { const crowdstrikeIntegration: Integration = { - name: OrganizationIntegrationServiceType.CrowdStrike, + name: OrganizationIntegrationServiceName.CrowdStrike, linkURL: "https://bitwarden.com/help/crowdstrike-siem/", image: "../../../../../../../images/integrations/logo-crowdstrike-black.svg", type: IntegrationType.EVENT, @@ -272,7 +273,7 @@ export class AdminConsoleIntegrationsComponent implements OnInit, OnDestroy { this.integrationsList.push(crowdstrikeIntegration); const datadogIntegration: Integration = { - name: OrganizationIntegrationServiceType.Datadog, + name: OrganizationIntegrationServiceName.Datadog, linkURL: "https://bitwarden.com/help/datadog-siem/", image: "../../../../../../../images/integrations/logo-datadog-color.svg", type: IntegrationType.EVENT, @@ -286,42 +287,23 @@ export class AdminConsoleIntegrationsComponent implements OnInit, OnDestroy { // For all existing event based configurations loop through and assign the // organizationIntegration for the correct services. - this.hecOrganizationIntegrationService.integrations$ + this.organizationIntegrationService.integrations$ .pipe(takeUntil(this.destroy$)) .subscribe((integrations) => { - // reset all integrations to null first - in case one was deleted + // reset all event based integrations to null first - in case one was deleted this.integrationsList.forEach((i) => { - if (i.integrationType === OrganizationIntegrationType.Hec) { - i.organizationIntegration = null; - } + i.organizationIntegration = null; }); - integrations.map((integration) => { - const item = this.integrationsList.find((i) => i.name === integration.serviceType); - if (item) { - item.organizationIntegration = integration; - } - }); - }); - - this.datadogOrganizationIntegrationService.integrations$ - .pipe(takeUntil(this.destroy$)) - .subscribe((integrations) => { - // reset all integrations to null first - in case one was deleted - this.integrationsList.forEach((i) => { - if (i.integrationType === OrganizationIntegrationType.Datadog) { - i.organizationIntegration = null; - } - }); - - integrations.map((integration) => { - const item = this.integrationsList.find((i) => i.name === integration.serviceType); + integrations.forEach((integration) => { + const item = this.integrationsList.find((i) => i.name === integration.serviceName); if (item) { item.organizationIntegration = integration; } }); }); } + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); diff --git a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/organization-integrations.module.ts b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/organization-integrations.module.ts index e3c37b4a42b..789ae548521 100644 --- a/bitwarden_license/bit-web/src/app/dirt/organization-integrations/organization-integrations.module.ts +++ b/bitwarden_license/bit-web/src/app/dirt/organization-integrations/organization-integrations.module.ts @@ -1,9 +1,8 @@ import { NgModule } from "@angular/core"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; import { OrganizationIntegrationApiService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-api.service"; import { OrganizationIntegrationConfigurationApiService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-configuration-api.service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { safeProvider } from "@bitwarden/ui-common"; @@ -14,13 +13,8 @@ import { OrganizationIntegrationsRoutingModule } from "./organization-integratio imports: [AdminConsoleIntegrationsComponent, OrganizationIntegrationsRoutingModule], providers: [ safeProvider({ - provide: DatadogOrganizationIntegrationService, - useClass: DatadogOrganizationIntegrationService, - deps: [OrganizationIntegrationApiService, OrganizationIntegrationConfigurationApiService], - }), - safeProvider({ - provide: HecOrganizationIntegrationService, - useClass: HecOrganizationIntegrationService, + provide: OrganizationIntegrationService, + useClass: OrganizationIntegrationService, deps: [OrganizationIntegrationApiService, OrganizationIntegrationConfigurationApiService], }), safeProvider({ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts index 0e8c46c8864..7a02e3fb04e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts @@ -9,8 +9,7 @@ import {} from "@bitwarden/web-vault/app/shared"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; @@ -41,8 +40,7 @@ class MockNewMenuComponent {} describe("IntegrationsComponent", () => { let fixture: ComponentFixture; - const hecOrgIntegrationSvc = mock(); - const datadogOrgIntegrationSvc = mock(); + const orgIntegrationSvc = mock(); const activatedRouteMock = { snapshot: { paramMap: { get: jest.fn() } }, @@ -60,8 +58,7 @@ describe("IntegrationsComponent", () => { { provide: ActivatedRoute, useValue: activatedRouteMock }, { provide: I18nPipe, useValue: mock() }, { provide: I18nService, useValue: mockI18nService }, - { provide: HecOrganizationIntegrationService, useValue: hecOrgIntegrationSvc }, - { provide: DatadogOrganizationIntegrationService, useValue: datadogOrgIntegrationSvc }, + { provide: OrganizationIntegrationService, useValue: orgIntegrationSvc }, ], }).compileComponents(); fixture = TestBed.createComponent(IntegrationsComponent); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts index 04240da3176..bcfbb9b3f2c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts @@ -1,9 +1,8 @@ import { NgModule } from "@angular/core"; -import { DatadogOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/datadog-organization-integration-service"; -import { HecOrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/hec-organization-integration-service"; import { OrganizationIntegrationApiService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-api.service"; import { OrganizationIntegrationConfigurationApiService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-configuration-api.service"; +import { OrganizationIntegrationService } from "@bitwarden/bit-common/dirt/organization-integrations/services/organization-integration-service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { safeProvider } from "@bitwarden/ui-common"; @@ -23,13 +22,8 @@ import { IntegrationsComponent } from "./integrations.component"; ], providers: [ safeProvider({ - provide: DatadogOrganizationIntegrationService, - useClass: DatadogOrganizationIntegrationService, - deps: [OrganizationIntegrationApiService, OrganizationIntegrationConfigurationApiService], - }), - safeProvider({ - provide: HecOrganizationIntegrationService, - useClass: HecOrganizationIntegrationService, + provide: OrganizationIntegrationService, + useClass: OrganizationIntegrationService, deps: [OrganizationIntegrationApiService, OrganizationIntegrationConfigurationApiService], }), safeProvider({ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html index 0ea8caef4d6..ac70e1920ee 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html @@ -52,12 +52,12 @@ [relativeTo]="route.parent" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts index 056f7cfe255..606cb835ff1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts @@ -6,6 +6,7 @@ import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { OrgKey } from "@bitwarden/common/types/key"; @@ -37,9 +38,11 @@ describe("SecretService", () => { let accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + emailVerified: true, + }), }); beforeEach(() => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html index 9e1f2e01591..113c51327b2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html @@ -17,6 +17,6 @@ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts index e2b66d9ffa6..5e6f81d99d6 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts @@ -124,7 +124,7 @@ export class SecretsManagerExportComponent implements OnInit, OnDestroy { const ref = openUserVerificationPrompt(this.dialogService, { data: { confirmDescription: "exportSecretsWarningDesc", - confirmButtonText: "exportSecrets", + confirmButtonText: "export", modalTitle: "confirmSecretsExport", }, }); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html index 353d8d8c8ed..3a663dbcbe9 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html @@ -36,6 +36,6 @@ {{ "acceptedFormats" | i18n }} Bitwarden (json) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts index a4f77e6de0b..aa722e31681 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts @@ -7,6 +7,7 @@ import { EncryptService } from "@bitwarden/common/key-management/crypto/abstract import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { OrgKey } from "@bitwarden/common/types/key"; @@ -38,9 +39,11 @@ describe("SecretsManagerPortingApiService", () => { let accountService: MockProxy; const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + emailVerified: true, + }), }); beforeEach(() => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts index ddc9964060e..31029d134fa 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts @@ -12,7 +12,7 @@ const routes: Routes = [ component: SecretsManagerImportComponent, canActivate: [organizationPermissionsGuard((org) => org.isAdmin)], data: { - titleId: "importData", + titleId: "import", }, }, { @@ -20,7 +20,7 @@ const routes: Routes = [ component: SecretsManagerExportComponent, canActivate: [organizationPermissionsGuard((org) => org.isAdmin)], data: { - titleId: "exportData", + titleId: "export", }, }, ]; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts index 37a0dc06837..903bfd35122 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts @@ -31,7 +31,7 @@ import { PeopleAccessPoliciesRequest } from "./models/requests/people-access-pol import { ProjectServiceAccountsAccessPoliciesRequest } from "./models/requests/project-service-accounts-access-policies.request"; import { ServiceAccountGrantedPoliciesRequest } from "./models/requests/service-account-granted-policies.request"; -import { trackEmissions } from "@bitwarden/common/../spec"; +import { trackEmissions, mockAccountInfoWith } from "@bitwarden/common/../spec"; const SomeCsprngArray = new Uint8Array(64) as CsprngArray; const SomeOrganization = "some organization" as OrganizationId; @@ -52,9 +52,10 @@ describe("AccessPolicyService", () => { let accountService: MockProxy; const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(() => { diff --git a/libs/angular/src/auth/guards/auth.guard.spec.ts b/libs/angular/src/auth/guards/auth.guard.spec.ts index fccfcd58874..335e31ec4d8 100644 --- a/libs/angular/src/auth/guards/auth.guard.spec.ts +++ b/libs/angular/src/auth/guards/auth.guard.spec.ts @@ -5,11 +5,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; -import { - Account, - AccountInfo, - AccountService, -} from "@bitwarden/common/auth/abstractions/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; @@ -18,6 +14,7 @@ import { KeyConnectorService } from "@bitwarden/common/key-management/key-connec import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { authGuard } from "./auth.guard"; @@ -38,16 +35,13 @@ describe("AuthGuard", () => { const accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject(null); accountService.activeAccount$ = activeAccountSubject; - activeAccountSubject.next( - Object.assign( - { - name: "Test User 1", - email: "test@email.com", - emailVerified: true, - } as AccountInfo, - { id: "test-id" as UserId }, - ), - ); + activeAccountSubject.next({ + id: "test-id" as UserId, + ...mockAccountInfoWith({ + name: "Test User 1", + email: "test@email.com", + }), + }); if (featureFlag) { configService.getFeatureFlag.mockResolvedValue(true); diff --git a/libs/angular/src/auth/guards/lock.guard.spec.ts b/libs/angular/src/auth/guards/lock.guard.spec.ts index da89ee786b7..af36df06097 100644 --- a/libs/angular/src/auth/guards/lock.guard.spec.ts +++ b/libs/angular/src/auth/guards/lock.guard.spec.ts @@ -5,11 +5,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; -import { - Account, - AccountInfo, - AccountService, -} from "@bitwarden/common/auth/abstractions/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -20,6 +16,7 @@ import { KeyConnectorDomainConfirmation } from "@bitwarden/common/key-management import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -68,16 +65,13 @@ describe("lockGuard", () => { const accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject(null); accountService.activeAccount$ = activeAccountSubject; - activeAccountSubject.next( - Object.assign( - { - name: "Test User 1", - email: "test@email.com", - emailVerified: true, - } as AccountInfo, - { id: "test-id" as UserId }, - ), - ); + activeAccountSubject.next({ + id: "test-id" as UserId, + ...mockAccountInfoWith({ + name: "Test User 1", + email: "test@email.com", + }), + }); const testBed = TestBed.configureTestingModule({ imports: [ diff --git a/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts b/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts index 004499beede..6dc91fbb925 100644 --- a/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts +++ b/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts @@ -7,6 +7,7 @@ import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.g import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { redirectToVaultIfUnlockedGuard } from "./redirect-to-vault-if-unlocked.guard"; @@ -14,9 +15,10 @@ import { redirectToVaultIfUnlockedGuard } from "./redirect-to-vault-if-unlocked. describe("redirectToVaultIfUnlockedGuard", () => { const activeUser: Account = { id: "userId" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = (activeUser: Account | null, authStatus: AuthenticationStatus | null) => { diff --git a/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts b/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts index 4408452a2a2..17df6d1d76b 100644 --- a/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts +++ b/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts @@ -9,6 +9,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -17,9 +18,10 @@ import { tdeDecryptionRequiredGuard } from "./tde-decryption-required.guard"; describe("tdeDecryptionRequiredGuard", () => { const activeUser: Account = { id: "fake_user_id" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = ( diff --git a/libs/angular/src/auth/guards/unauth.guard.spec.ts b/libs/angular/src/auth/guards/unauth.guard.spec.ts index c696b849558..284f595f81a 100644 --- a/libs/angular/src/auth/guards/unauth.guard.spec.ts +++ b/libs/angular/src/auth/guards/unauth.guard.spec.ts @@ -10,6 +10,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -18,9 +19,10 @@ import { unauthGuardFn } from "./unauth.guard"; describe("UnauthGuard", () => { const activeUser: Account = { id: "fake_user_id" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = ( diff --git a/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts b/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts index b21264eb7c8..4dc7522c1b8 100644 --- a/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts +++ b/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts @@ -11,6 +11,7 @@ import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/d import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { DialogRef, DIALOG_DATA, ToastService } from "@bitwarden/components"; import { LogService } from "@bitwarden/logging"; @@ -48,10 +49,11 @@ describe("LoginApprovalDialogComponent", () => { validationService = mock(); accountService.activeAccount$ = of({ - email: testEmail, id: "test-user-id" as UserId, - emailVerified: true, - name: null, + ...mockAccountInfoWith({ + email: testEmail, + name: null, + }), }); await TestBed.configureTestingModule({ diff --git a/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts b/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts index d14e33c1fdc..5dfc5ffa245 100644 --- a/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts +++ b/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts @@ -8,6 +8,7 @@ import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/ma import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; import { KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management"; @@ -26,9 +27,11 @@ describe("DefaultChangePasswordService", () => { const user: Account = { id: userId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + emailVerified: false, + }), }; const passwordInputResult: PasswordInputResult = { diff --git a/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts b/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts index 76cfbc0bfdd..610ec5923eb 100644 --- a/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts +++ b/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts @@ -2,14 +2,13 @@ import { Router } from "@angular/router"; import { mock } from "jest-mock-extended"; import { of } from "rxjs"; -import { AccountInfo } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { EncryptedMigrator } from "@bitwarden/common/key-management/encrypted-migrator/encrypted-migrator.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SingleUserState, StateProvider } from "@bitwarden/common/platform/state"; import { SyncService } from "@bitwarden/common/platform/sync"; -import { FakeAccountService } from "@bitwarden/common/spec"; +import { mockAccountInfoWith, FakeAccountService } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { DialogService, ToastService } from "@bitwarden/components"; import { LogService } from "@bitwarden/logging"; @@ -22,17 +21,15 @@ import { PromptMigrationPasswordComponent } from "./prompt-migration-password.co const SomeUser = "SomeUser" as UserId; const AnotherUser = "SomeOtherUser" as UserId; -const accounts: Record = { - [SomeUser]: { +const accounts = { + [SomeUser]: mockAccountInfoWith({ name: "some user", email: "some.user@example.com", - emailVerified: true, - }, - [AnotherUser]: { + }), + [AnotherUser]: mockAccountInfoWith({ name: "some other user", email: "some.other.user@example.com", - emailVerified: true, - }, + }), }; describe("DefaultEncryptedMigrationsSchedulerService", () => { diff --git a/libs/angular/src/key-management/encrypted-migration/prompt-migration-password.component.ts b/libs/angular/src/key-management/encrypted-migration/prompt-migration-password.component.ts index 060901d68fb..59fec1a6f70 100644 --- a/libs/angular/src/key-management/encrypted-migration/prompt-migration-password.component.ts +++ b/libs/angular/src/key-management/encrypted-migration/prompt-migration-password.component.ts @@ -5,8 +5,7 @@ import { filter, firstValueFrom, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; -import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; +import { MasterPasswordUnlockService } from "@bitwarden/common/key-management/master-password/abstractions/master-password-unlock.service"; import { LinkModule, AsyncActionsModule, @@ -39,7 +38,7 @@ import { export class PromptMigrationPasswordComponent { private dialogRef = inject(DialogRef); private formBuilder = inject(FormBuilder); - private uvService = inject(UserVerificationService); + private masterPasswordUnlockService = inject(MasterPasswordUnlockService); private accountService = inject(AccountService); migrationPasswordForm = this.formBuilder.group({ @@ -57,23 +56,21 @@ export class PromptMigrationPasswordComponent { return; } - const { userId, email } = await firstValueFrom( + const { userId } = await firstValueFrom( this.accountService.activeAccount$.pipe( filter((account) => account != null), map((account) => { return { userId: account!.id, - email: account!.email, }; }), ), ); if ( - !(await this.uvService.verifyUserByMasterPassword( - { type: VerificationType.MasterPassword, secret: masterPasswordControl.value }, + !(await this.masterPasswordUnlockService.proofOfDecryption( + masterPasswordControl.value, userId, - email, )) ) { return; diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index ae375c8b2f5..acb32969f08 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -189,6 +189,7 @@ export abstract class LoginStrategy { name: accountInformation.name, email: accountInformation.email ?? "", emailVerified: accountInformation.email_verified ?? false, + creationDate: undefined, // We don't get a creation date in the token. See https://bitwarden.atlassian.net/browse/PM-29551 for consolidation plans. }); // User env must be seeded from currently set env before switching to the account diff --git a/libs/auth/src/common/services/accounts/lock.services.spec.ts b/libs/auth/src/common/services/accounts/lock.services.spec.ts index e22a6f71581..41e3768d80b 100644 --- a/libs/auth/src/common/services/accounts/lock.services.spec.ts +++ b/libs/auth/src/common/services/accounts/lock.services.spec.ts @@ -8,7 +8,7 @@ import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key- import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { SystemService } from "@bitwarden/common/platform/abstractions/system.service"; -import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { mockAccountServiceWith, mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -79,17 +79,21 @@ describe("DefaultLockService", () => { ); it("locks the active account last", async () => { - await accountService.addAccount(mockUser2, { - name: "name2", - email: "email2@example.com", - emailVerified: false, - }); + await accountService.addAccount( + mockUser2, + mockAccountInfoWith({ + name: "name2", + email: "email2@example.com", + }), + ); - await accountService.addAccount(mockUser3, { - name: "name3", - email: "name3@example.com", - emailVerified: false, - }); + await accountService.addAccount( + mockUser3, + mockAccountInfoWith({ + name: "name3", + email: "name3@example.com", + }), + ); const lockSpy = jest.spyOn(sut, "lock").mockResolvedValue(undefined); diff --git a/libs/common/spec/fake-account-service.ts b/libs/common/spec/fake-account-service.ts index 389975dc2e1..ed8b7796966 100644 --- a/libs/common/spec/fake-account-service.ts +++ b/libs/common/spec/fake-account-service.ts @@ -6,19 +6,26 @@ import { ReplaySubject, combineLatest, map, Observable } from "rxjs"; import { Account, AccountInfo, AccountService } from "../src/auth/abstractions/account.service"; import { UserId } from "../src/types/guid"; +/** + * Creates a mock AccountInfo object with sensible defaults that can be overridden. + * Use this when you need just an AccountInfo object in tests. + */ +export function mockAccountInfoWith(info: Partial = {}): AccountInfo { + return { + name: "name", + email: "email", + emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", + ...info, + }; +} + export function mockAccountServiceWith( userId: UserId, info: Partial = {}, activity: Record = {}, ): FakeAccountService { - const fullInfo: AccountInfo = { - ...info, - ...{ - name: "name", - email: "email", - emailVerified: true, - }, - }; + const fullInfo = mockAccountInfoWith(info); const fullActivity = { [userId]: new Date(), ...activity }; @@ -104,6 +111,10 @@ export class FakeAccountService implements AccountService { await this.mock.setAccountEmailVerified(userId, emailVerified); } + async setAccountCreationDate(userId: UserId, creationDate: string): Promise { + await this.mock.setAccountCreationDate(userId, creationDate); + } + async switchAccount(userId: UserId): Promise { const next = userId == null ? null : { id: userId, ...this.accountsSubject["_buffer"]?.[0]?.[userId] }; @@ -127,4 +138,5 @@ const loggedOutInfo: AccountInfo = { name: undefined, email: "", emailVerified: false, + creationDate: undefined, }; diff --git a/libs/common/src/auth/abstractions/account.service.ts b/libs/common/src/auth/abstractions/account.service.ts index 8b0280feb01..78822f3ebd5 100644 --- a/libs/common/src/auth/abstractions/account.service.ts +++ b/libs/common/src/auth/abstractions/account.service.ts @@ -2,14 +2,11 @@ import { Observable } from "rxjs"; import { UserId } from "../../types/guid"; -/** - * Holds information about an account for use in the AccountService - * if more information is added, be sure to update the equality method. - */ export type AccountInfo = { email: string; emailVerified: boolean; name: string | undefined; + creationDate: string | undefined; }; export type Account = { id: UserId } & AccountInfo; @@ -75,6 +72,12 @@ export abstract class AccountService { * @param emailVerified */ abstract setAccountEmailVerified(userId: UserId, emailVerified: boolean): Promise; + /** + * updates the `accounts$` observable with the creation date for the account. + * @param userId + * @param creationDate + */ + abstract setAccountCreationDate(userId: UserId, creationDate: string): Promise; /** * updates the `accounts$` observable with the new VerifyNewDeviceLogin property for the account. * @param userId diff --git a/libs/common/src/auth/services/account.service.spec.ts b/libs/common/src/auth/services/account.service.spec.ts index 3e3c878eaac..f517b61ffb6 100644 --- a/libs/common/src/auth/services/account.service.spec.ts +++ b/libs/common/src/auth/services/account.service.spec.ts @@ -6,6 +6,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { firstValueFrom } from "rxjs"; +import { mockAccountInfoWith } from "../../../spec/fake-account-service"; import { FakeGlobalState } from "../../../spec/fake-state"; import { FakeGlobalStateProvider, @@ -27,7 +28,7 @@ import { } from "./account.service"; describe("accountInfoEqual", () => { - const accountInfo: AccountInfo = { name: "name", email: "email", emailVerified: true }; + const accountInfo = mockAccountInfoWith(); it("compares nulls", () => { expect(accountInfoEqual(null, null)).toBe(true); @@ -64,6 +65,23 @@ describe("accountInfoEqual", () => { expect(accountInfoEqual(accountInfo, same)).toBe(true); expect(accountInfoEqual(accountInfo, different)).toBe(false); }); + + it("compares creationDate", () => { + const same = { ...accountInfo }; + const different = { ...accountInfo, creationDate: "2024-12-31T00:00:00.000Z" }; + + expect(accountInfoEqual(accountInfo, same)).toBe(true); + expect(accountInfoEqual(accountInfo, different)).toBe(false); + }); + + it("compares undefined creationDate", () => { + const accountWithoutCreationDate = mockAccountInfoWith({ creationDate: undefined }); + const same = { ...accountWithoutCreationDate }; + const different = { ...accountWithoutCreationDate, creationDate: "2024-01-01T00:00:00.000Z" }; + + expect(accountInfoEqual(accountWithoutCreationDate, same)).toBe(true); + expect(accountInfoEqual(accountWithoutCreationDate, different)).toBe(false); + }); }); describe("accountService", () => { @@ -76,7 +94,10 @@ describe("accountService", () => { let activeAccountIdState: FakeGlobalState; let accountActivityState: FakeGlobalState>; const userId = Utils.newGuid() as UserId; - const userInfo = { email: "email", name: "name", emailVerified: true }; + const userInfo = mockAccountInfoWith({ + email: "email", + name: "name", + }); beforeEach(() => { messagingService = mock(); @@ -253,6 +274,56 @@ describe("accountService", () => { }); }); + describe("setCreationDate", () => { + const initialState = { [userId]: userInfo }; + beforeEach(() => { + accountsState.stateSubject.next(initialState); + }); + + it("should update the account with a new creation date", async () => { + const newCreationDate = "2024-12-31T00:00:00.000Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...userInfo, creationDate: newCreationDate }, + }); + }); + + it("should not update if the creation date is the same", async () => { + await sut.setAccountCreationDate(userId, userInfo.creationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual(initialState); + }); + + it("should update from undefined to a defined creation date", async () => { + const accountWithoutCreationDate = mockAccountInfoWith({ + ...userInfo, + creationDate: undefined, + }); + accountsState.stateSubject.next({ [userId]: accountWithoutCreationDate }); + + const newCreationDate = "2024-06-15T12:30:00.000Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...accountWithoutCreationDate, creationDate: newCreationDate }, + }); + }); + + it("should update to a different creation date string format", async () => { + const newCreationDate = "2023-03-15T08:45:30.123Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...userInfo, creationDate: newCreationDate }, + }); + }); + }); + describe("setAccountVerifyNewDeviceLogin", () => { const initialState = true; beforeEach(() => { @@ -294,6 +365,7 @@ describe("accountService", () => { email: "", emailVerified: false, name: undefined, + creationDate: undefined, }, }); }); diff --git a/libs/common/src/auth/services/account.service.ts b/libs/common/src/auth/services/account.service.ts index fb4b590ce77..1b028d1eba9 100644 --- a/libs/common/src/auth/services/account.service.ts +++ b/libs/common/src/auth/services/account.service.ts @@ -62,6 +62,7 @@ const LOGGED_OUT_INFO: AccountInfo = { email: "", emailVerified: false, name: undefined, + creationDate: undefined, }; /** @@ -167,6 +168,10 @@ export class AccountServiceImplementation implements InternalAccountService { await this.setAccountInfo(userId, { emailVerified }); } + async setAccountCreationDate(userId: UserId, creationDate: string): Promise { + await this.setAccountInfo(userId, { creationDate }); + } + async clean(userId: UserId) { await this.setAccountInfo(userId, LOGGED_OUT_INFO); await this.removeAccountActivity(userId); diff --git a/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts b/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts index 0b12e1cb661..a44dde04f5f 100644 --- a/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts +++ b/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts @@ -15,6 +15,7 @@ import { SystemNotificationEvent, SystemNotificationsService, } from "@bitwarden/common/platform/system-notifications/system-notifications.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/user-core"; import { AuthRequestAnsweringService } from "./auth-request-answering.service"; @@ -48,14 +49,16 @@ describe("AuthRequestAnsweringService", () => { // Common defaults authService.activeAccountStatus$ = of(AuthenticationStatus.Locked); - accountService.activeAccount$ = of({ - id: userId, + const accountInfo = mockAccountInfoWith({ email: "user@example.com", - emailVerified: true, name: "User", }); + accountService.activeAccount$ = of({ + id: userId, + ...accountInfo, + }); accountService.accounts$ = of({ - [userId]: { email: "user@example.com", emailVerified: true, name: "User" }, + [userId]: accountInfo, }); (masterPasswordService.forceSetPasswordReason$ as jest.Mock).mockReturnValue( of(ForceSetPasswordReason.None), diff --git a/libs/common/src/auth/services/auth.service.spec.ts b/libs/common/src/auth/services/auth.service.spec.ts index 5dcb8c372e5..c7ff55e6bb1 100644 --- a/libs/common/src/auth/services/auth.service.spec.ts +++ b/libs/common/src/auth/services/auth.service.spec.ts @@ -10,6 +10,7 @@ import { makeStaticByteArray, mockAccountServiceWith, trackEmissions, + mockAccountInfoWith, } from "../../../spec"; import { ApiService } from "../../abstractions/api.service"; import { MessagingService } from "../../platform/abstractions/messaging.service"; @@ -58,9 +59,10 @@ describe("AuthService", () => { const accountInfo = { status: AuthenticationStatus.Unlocked, id: userId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + }), }; beforeEach(() => { @@ -112,9 +114,10 @@ describe("AuthService", () => { const accountInfo2 = { status: AuthenticationStatus.Unlocked, id: Utils.newGuid() as UserId, - email: "email2", - emailVerified: false, - name: "name2", + ...mockAccountInfoWith({ + email: "email2", + name: "name2", + }), }; const emissions = trackEmissions(sut.activeAccountStatus$); @@ -131,11 +134,13 @@ describe("AuthService", () => { it("requests auth status for all known users", async () => { const userId2 = Utils.newGuid() as UserId; - await accountService.addAccount(userId2, { - email: "email2", - emailVerified: false, - name: "name2", - }); + await accountService.addAccount( + userId2, + mockAccountInfoWith({ + email: "email2", + name: "name2", + }), + ); const mockFn = jest.fn().mockReturnValue(of(AuthenticationStatus.Locked)); sut.authStatusFor$ = mockFn; diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts index 7e6e0d53f57..693992d4c4a 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts @@ -8,12 +8,13 @@ import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; // eslint-disable-next-line no-restricted-imports import { KeyService } from "@bitwarden/key-management"; +import { mockAccountInfoWith } from "../../../spec/fake-account-service"; import { OrganizationApiServiceAbstraction } from "../../admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationAutoEnrollStatusResponse } from "../../admin-console/models/response/organization-auto-enroll-status.response"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { UserId } from "../../types/guid"; -import { Account, AccountInfo, AccountService } from "../abstractions/account.service"; +import { Account, AccountService } from "../abstractions/account.service"; import { PasswordResetEnrollmentServiceImplementation } from "./password-reset-enrollment.service.implementation"; @@ -96,11 +97,10 @@ describe("PasswordResetEnrollmentServiceImplementation", () => { const encryptedKey = { encryptedString: "encryptedString" }; organizationApiService.getKeys.mockResolvedValue(orgKeyResponse as any); - const user1AccountInfo: AccountInfo = { + const user1AccountInfo = mockAccountInfoWith({ name: "Test User 1", email: "test1@email.com", - emailVerified: true, - }; + }); activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "userId" as UserId })); keyService.userKey$.mockReturnValue(of({ key: "key" } as any)); diff --git a/libs/common/src/dirt/services/abstractions/phishing-detection-settings.service.abstraction.ts b/libs/common/src/dirt/services/abstractions/phishing-detection-settings.service.abstraction.ts new file mode 100644 index 00000000000..6c915c2dcbe --- /dev/null +++ b/libs/common/src/dirt/services/abstractions/phishing-detection-settings.service.abstraction.ts @@ -0,0 +1,37 @@ +import { Observable } from "rxjs"; + +import { UserId } from "@bitwarden/user-core"; + +/** + * Abstraction for phishing detection settings + */ +export abstract class PhishingDetectionSettingsServiceAbstraction { + /** + * An observable for whether phishing detection is available for the active user account. + * + * Access is granted only when the PhishingDetection feature flag is enabled and + * at least one of the following is true for the active account: + * - the user has a personal premium subscription + * - the user is a member of a Family org (ProductTierType.Families) + * - the user is a member of an Enterprise org with `usePhishingBlocker` enabled + * + * Note: Non-specified organization types (e.g., Team orgs) do not grant access. + */ + abstract readonly available$: Observable; + /** + * An observable for whether phishing detection is on for the active user account + * + * This is true when {@link available$} is true and when {@link enabled$} is true + */ + abstract readonly on$: Observable; + /** + * An observable for whether phishing detection is enabled + */ + abstract readonly enabled$: Observable; + /** + * Sets whether phishing detection is enabled + * + * @param enabled True to enable, false to disable + */ + abstract setEnabled: (userId: UserId, enabled: boolean) => Promise; +} diff --git a/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.spec.ts b/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.spec.ts new file mode 100644 index 00000000000..23e311d9445 --- /dev/null +++ b/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.spec.ts @@ -0,0 +1,203 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject, firstValueFrom, Subject } from "rxjs"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../../spec"; +import { UserId } from "../../../types/guid"; + +import { PhishingDetectionSettingsService } from "./phishing-detection-settings.service"; + +describe("PhishingDetectionSettingsService", () => { + // Mock services + let mockAccountService: MockProxy; + let mockBillingService: MockProxy; + let mockConfigService: MockProxy; + let mockOrganizationService: MockProxy; + + // RxJS Subjects we control in the tests + let activeAccountSubject: BehaviorSubject; + let featureFlagSubject: BehaviorSubject; + let premiumStatusSubject: BehaviorSubject; + let organizationsSubject: BehaviorSubject; + + let service: PhishingDetectionSettingsService; + let stateProvider: FakeStateProvider; + + // Constant mock data + const familyOrg = mock({ + canAccess: true, + isMember: true, + usersGetPremium: true, + productTierType: ProductTierType.Families, + usePhishingBlocker: true, + }); + const teamOrg = mock({ + canAccess: true, + isMember: true, + usersGetPremium: true, + productTierType: ProductTierType.Teams, + usePhishingBlocker: true, + }); + const enterpriseOrg = mock({ + canAccess: true, + isMember: true, + usersGetPremium: true, + productTierType: ProductTierType.Enterprise, + usePhishingBlocker: true, + }); + + const mockUserId = "mock-user-id" as UserId; + const account = mock({ id: mockUserId }); + const accountService: FakeAccountService = mockAccountServiceWith(mockUserId); + + beforeEach(() => { + // Initialize subjects + activeAccountSubject = new BehaviorSubject(null); + featureFlagSubject = new BehaviorSubject(false); + premiumStatusSubject = new BehaviorSubject(false); + organizationsSubject = new BehaviorSubject([]); + + // Default implementations for required functions + mockAccountService = mock(); + mockAccountService.activeAccount$ = activeAccountSubject.asObservable(); + + mockBillingService = mock(); + mockBillingService.hasPremiumPersonally$.mockReturnValue(premiumStatusSubject.asObservable()); + + mockConfigService = mock(); + mockConfigService.getFeatureFlag$.mockReturnValue(featureFlagSubject.asObservable()); + + mockOrganizationService = mock(); + mockOrganizationService.organizations$.mockReturnValue(organizationsSubject.asObservable()); + + stateProvider = new FakeStateProvider(accountService); + service = new PhishingDetectionSettingsService( + mockAccountService, + mockBillingService, + mockConfigService, + mockOrganizationService, + stateProvider, + ); + }); + + // Helper to easily get the result of the observable we are testing + const getAccess = () => firstValueFrom(service.available$); + + describe("enabled$", () => { + it("should default to true if an account is logged in", async () => { + activeAccountSubject.next(account); + const result = await firstValueFrom(service.enabled$); + expect(result).toBe(true); + }); + + it("should return the stored value", async () => { + activeAccountSubject.next(account); + + await service.setEnabled(mockUserId, false); + const resultDisabled = await firstValueFrom(service.enabled$); + expect(resultDisabled).toBe(false); + + await service.setEnabled(mockUserId, true); + const resultEnabled = await firstValueFrom(service.enabled$); + expect(resultEnabled).toBe(true); + }); + }); + + describe("setEnabled", () => { + it("should update the stored value", async () => { + activeAccountSubject.next(account); + await service.setEnabled(mockUserId, false); + let result = await firstValueFrom(service.enabled$); + expect(result).toBe(false); + + await service.setEnabled(mockUserId, true); + result = await firstValueFrom(service.enabled$); + expect(result).toBe(true); + }); + }); + + it("returns false immediately when the feature flag is disabled, regardless of other conditions", async () => { + activeAccountSubject.next(account); + premiumStatusSubject.next(true); + organizationsSubject.next([familyOrg]); + + featureFlagSubject.next(false); + + await expect(getAccess()).resolves.toBe(false); + }); + + it("returns false if there is no active account present yet", async () => { + activeAccountSubject.next(null); // No active account + featureFlagSubject.next(true); // Flag is on + + await expect(getAccess()).resolves.toBe(false); + }); + + it("returns true when feature flag is enabled and user has premium personally", async () => { + activeAccountSubject.next(account); + featureFlagSubject.next(true); + organizationsSubject.next([]); + premiumStatusSubject.next(true); + + await expect(getAccess()).resolves.toBe(true); + }); + + it("returns true when feature flag is enabled and user is in a Family Organization", async () => { + activeAccountSubject.next(account); + featureFlagSubject.next(true); + premiumStatusSubject.next(false); // User has no personal premium + + organizationsSubject.next([familyOrg]); + + await expect(getAccess()).resolves.toBe(true); + }); + + it("returns true when feature flag is enabled and user is in an Enterprise org with phishing blocker enabled", async () => { + activeAccountSubject.next(account); + featureFlagSubject.next(true); + premiumStatusSubject.next(false); + organizationsSubject.next([enterpriseOrg]); + + await expect(getAccess()).resolves.toBe(true); + }); + + it("returns false when user has no access through personal premium or organizations", async () => { + activeAccountSubject.next(account); + featureFlagSubject.next(true); + premiumStatusSubject.next(false); + organizationsSubject.next([teamOrg]); // Team org does not give access + + await expect(getAccess()).resolves.toBe(false); + }); + + it("shares/caches the available$ result between multiple subscribers", async () => { + // Use a plain Subject for this test so we control when the premium observable emits + // and avoid the BehaviorSubject's initial emission which can race with subscriptions. + // Provide the Subject directly as the mock return value for the billing service + const oneTimePremium = new Subject(); + mockBillingService.hasPremiumPersonally$.mockReturnValueOnce(oneTimePremium.asObservable()); + + activeAccountSubject.next(account); + featureFlagSubject.next(true); + organizationsSubject.next([]); + + const p1 = firstValueFrom(service.available$); + const p2 = firstValueFrom(service.available$); + + // Trigger the pipeline + oneTimePremium.next(true); + + const [first, second] = await Promise.all([p1, p2]); + + expect(first).toBe(true); + expect(second).toBe(true); + // The billing function should have been called at most once due to caching + expect(mockBillingService.hasPremiumPersonally$).toHaveBeenCalledTimes(1); + }); +}); diff --git a/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.ts b/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.ts new file mode 100644 index 00000000000..36d50f60de7 --- /dev/null +++ b/libs/common/src/dirt/services/phishing-detection/phishing-detection-settings.service.ts @@ -0,0 +1,116 @@ +import { combineLatest, Observable, of, switchMap } from "rxjs"; +import { catchError, distinctUntilChanged, map, shareReplay } from "rxjs/operators"; + +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { UserId } from "@bitwarden/user-core"; + +import { PHISHING_DETECTION_DISK, StateProvider, UserKeyDefinition } from "../../../platform/state"; +import { PhishingDetectionSettingsServiceAbstraction } from "../abstractions/phishing-detection-settings.service.abstraction"; + +const ENABLE_PHISHING_DETECTION = new UserKeyDefinition( + PHISHING_DETECTION_DISK, + "enablePhishingDetection", + { + deserializer: (value: boolean) => value ?? true, // Default: enabled + clearOn: [], + }, +); + +export class PhishingDetectionSettingsService implements PhishingDetectionSettingsServiceAbstraction { + readonly available$: Observable; + readonly enabled$: Observable; + readonly on$: Observable; + + constructor( + private accountService: AccountService, + private billingService: BillingAccountProfileStateService, + private configService: ConfigService, + private organizationService: OrganizationService, + private stateProvider: StateProvider, + ) { + this.available$ = this.buildAvailablePipeline$().pipe( + distinctUntilChanged(), + shareReplay({ bufferSize: 1, refCount: true }), + ); + this.enabled$ = this.buildEnabledPipeline$().pipe( + distinctUntilChanged(), + shareReplay({ bufferSize: 1, refCount: true }), + ); + + this.on$ = combineLatest([this.available$, this.enabled$]).pipe( + map(([available, enabled]) => available && enabled), + distinctUntilChanged(), + shareReplay({ bufferSize: 1, refCount: true }), + ); + } + + async setEnabled(userId: UserId, enabled: boolean): Promise { + await this.stateProvider.getUser(userId, ENABLE_PHISHING_DETECTION).update(() => enabled); + } + + /** + * Builds the observable pipeline to determine if phishing detection is available to the user + * + * @returns An observable pipeline that determines if phishing detection is available + */ + private buildAvailablePipeline$(): Observable { + return combineLatest([ + this.accountService.activeAccount$, + this.configService.getFeatureFlag$(FeatureFlag.PhishingDetection), + ]).pipe( + switchMap(([account, featureEnabled]) => { + if (!account || !featureEnabled) { + return of(false); + } + return combineLatest([ + this.billingService.hasPremiumPersonally$(account.id).pipe(catchError(() => of(false))), + this.organizationService.organizations$(account.id).pipe(catchError(() => of([]))), + ]).pipe( + map(([hasPremium, organizations]) => hasPremium || this.orgGrantsAccess(organizations)), + catchError(() => of(false)), + ); + }), + ); + } + + /** + * Builds the observable pipeline to determine if phishing detection is enabled by the user + * + * @returns True if phishing detection is enabled for the active user + */ + private buildEnabledPipeline$(): Observable { + return this.accountService.activeAccount$.pipe( + switchMap((account) => { + if (!account) { + return of(false); + } + return this.stateProvider.getUserState$(ENABLE_PHISHING_DETECTION, account.id); + }), + map((enabled) => enabled ?? true), + ); + } + + /** + * Determines if any of the user's organizations grant access to phishing detection + * + * @param organizations The organizations the user is a member of + * @returns True if any organization grants access to phishing detection + */ + private orgGrantsAccess(organizations: Organization[]): boolean { + return organizations.some((org) => { + if (!org.canAccess || !org.isMember || !org.usersGetPremium) { + return false; + } + return ( + org.productTierType === ProductTierType.Families || + (org.productTierType === ProductTierType.Enterprise && org.usePhishingBlocker) + ); + }); + } +} diff --git a/libs/common/src/key-management/vault-timeout/index.ts b/libs/common/src/key-management/vault-timeout/index.ts index ba32c12c9fb..1879de5353c 100644 --- a/libs/common/src/key-management/vault-timeout/index.ts +++ b/libs/common/src/key-management/vault-timeout/index.ts @@ -10,3 +10,5 @@ export { VaultTimeoutNumberType, VaultTimeoutStringType, } from "./types/vault-timeout.type"; +// Only used by desktop's electron-key.service.spec.ts test +export { VAULT_TIMEOUT } from "./services/vault-timeout-settings.state"; diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts index dc0c5620518..b8bc859d11c 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout-settings.service.ts @@ -13,6 +13,7 @@ import { shareReplay, switchMap, tap, + concatMap, } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. @@ -150,7 +151,7 @@ export class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceA return from( this.determineVaultTimeout(currentVaultTimeout, maxSessionTimeoutPolicyData), ).pipe( - tap((vaultTimeout: VaultTimeout) => { + concatMap(async (vaultTimeout: VaultTimeout) => { this.logService.debug( "[VaultTimeoutSettingsService] Determined vault timeout is %o for user id %s", vaultTimeout, @@ -159,8 +160,9 @@ export class VaultTimeoutSettingsService implements VaultTimeoutSettingsServiceA // As a side effect, set the new value determined by determineVaultTimeout into state if it's different from the current if (vaultTimeout !== currentVaultTimeout) { - return this.stateProvider.setUserState(VAULT_TIMEOUT, vaultTimeout, userId); + await this.stateProvider.setUserState(VAULT_TIMEOUT, vaultTimeout, userId); } + return vaultTimeout; }), catchError((error: unknown) => { // Protect outer observable from canceling on error by catching and returning EMPTY diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts index 51eec18f173..8f7f93f368c 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts @@ -7,7 +7,7 @@ import { BehaviorSubject, from, of } from "rxjs"; // eslint-disable-next-line no-restricted-imports import { LockService, LogoutService } from "@bitwarden/auth/common"; -import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; +import { FakeAccountService, mockAccountServiceWith, mockAccountInfoWith } from "../../../../spec"; import { AccountInfo } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; @@ -109,19 +109,19 @@ describe("VaultTimeoutService", () => { if (globalSetups?.userId) { accountService.activeAccountSubject.next({ id: globalSetups.userId as UserId, - email: null, - emailVerified: false, - name: null, + ...mockAccountInfoWith({ + email: null, + name: null, + }), }); } accountService.accounts$ = of( Object.entries(accounts).reduce( (agg, [id]) => { - agg[id] = { + agg[id] = mockAccountInfoWith({ email: "", - emailVerified: true, name: "", - }; + }); return agg; }, {} as Record, diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts index cd1bf97150c..46178f62a07 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts @@ -7,6 +7,7 @@ import { InternalPolicyService } from "@bitwarden/common/admin-console/abstracti import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { mockAccountInfoWith } from "../../../../spec"; import { AccountService } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; @@ -163,9 +164,10 @@ describe("DefaultServerNotificationsService (multi-user)", () => { } else { activeUserAccount$.next({ id: userId, - email: "email", - name: "Test Name", - emailVerified: true, + ...mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), }); } } @@ -174,7 +176,10 @@ describe("DefaultServerNotificationsService (multi-user)", () => { const currentAccounts = (userAccounts$.getValue() as Record) ?? {}; userAccounts$.next({ ...currentAccounts, - [userId]: { email: "email", name: "Test Name", emailVerified: true }, + [userId]: mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), } as any); } diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts index 4a9b0809ac9..9c84981b7f9 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts @@ -8,7 +8,7 @@ import { InternalPolicyService } from "@bitwarden/common/admin-console/abstracti import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; -import { awaitAsync } from "../../../../spec"; +import { awaitAsync, mockAccountInfoWith } from "../../../../spec"; import { Matrix } from "../../../../spec/matrix"; import { AccountService } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; @@ -139,11 +139,18 @@ describe("NotificationsService", () => { activeAccount.next(null); accounts.next({} as any); } else { - activeAccount.next({ id: userId, email: "email", name: "Test Name", emailVerified: true }); + const accountInfo = mockAccountInfoWith({ + email: "email", + name: "Test Name", + }); + activeAccount.next({ + id: userId, + ...accountInfo, + }); const current = (accounts.getValue() as Record) ?? {}; accounts.next({ ...current, - [userId]: { email: "email", name: "Test Name", emailVerified: true }, + [userId]: accountInfo, } as any); } } @@ -349,7 +356,13 @@ describe("NotificationsService", () => { describe("processNotification", () => { beforeEach(async () => { appIdService.getAppId.mockResolvedValue("test-app-id"); - activeAccount.next({ id: mockUser1, email: "email", name: "Test Name", emailVerified: true }); + activeAccount.next({ + id: mockUser1, + ...mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), + }); }); describe("NotificationType.LogOut", () => { diff --git a/libs/common/src/platform/services/default-environment.service.spec.ts b/libs/common/src/platform/services/default-environment.service.spec.ts index 553f80f83b8..9e8a41616a3 100644 --- a/libs/common/src/platform/services/default-environment.service.spec.ts +++ b/libs/common/src/platform/services/default-environment.service.spec.ts @@ -1,6 +1,6 @@ import { firstValueFrom } from "rxjs"; -import { FakeStateProvider, awaitAsync } from "../../../spec"; +import { FakeStateProvider, awaitAsync, mockAccountInfoWith } from "../../../spec"; import { FakeAccountService } from "../../../spec/fake-account-service"; import { UserId } from "../../types/guid"; import { CloudRegion, Region } from "../abstractions/environment.service"; @@ -28,16 +28,14 @@ describe("EnvironmentService", () => { beforeEach(async () => { accountService = new FakeAccountService({ - [testUser]: { + [testUser]: mockAccountInfoWith({ name: "name", email: "email", - emailVerified: false, - }, - [alternateTestUser]: { + }), + [alternateTestUser]: mockAccountInfoWith({ name: "name", email: "email", - emailVerified: false, - }, + }), }); stateProvider = new FakeStateProvider(accountService); @@ -47,9 +45,10 @@ describe("EnvironmentService", () => { const switchUser = async (userId: UserId) => { accountService.activeAccountSubject.next({ id: userId, - email: "test@example.com", - name: `Test Name ${userId}`, - emailVerified: false, + ...mockAccountInfoWith({ + email: "test@example.com", + name: `Test Name ${userId}`, + }), }); await awaitAsync(); }; diff --git a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts index fef64399b40..9c50bd1ab65 100644 --- a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts +++ b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts @@ -3,7 +3,7 @@ import { TextEncoder } from "util"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; -import { mockAccountServiceWith } from "../../../../spec"; +import { mockAccountServiceWith, mockAccountInfoWith } from "../../../../spec"; import { Account } from "../../../auth/abstractions/account.service"; import { CipherId, UserId } from "../../../types/guid"; import { CipherService, EncryptionContext } from "../../../vault/abstractions/cipher.service"; @@ -40,9 +40,10 @@ describe("FidoAuthenticatorService", () => { const userId = "testId" as UserId; const activeAccountSubject = new BehaviorSubject({ id: userId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); let cipherService!: MockProxy; diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts index 1286ea7b7f9..fb9c1fae77e 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts @@ -12,9 +12,9 @@ import { FakeAccountService, FakeStateProvider, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { ApiService } from "../../../abstractions/api.service"; -import { AccountInfo } from "../../../auth/abstractions/account.service"; import { EncryptedString } from "../../../key-management/crypto/models/enc-string"; import { UserId } from "../../../types/guid"; import { UserKey } from "../../../types/key"; @@ -92,7 +92,10 @@ describe("DefaultSdkService", () => { .calledWith(userId) .mockReturnValue(new BehaviorSubject(mock())); accountService.accounts$ = of({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); kdfConfigService.getKdfConfig$ .calledWith(userId) diff --git a/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts index 0a05ac8dbf4..1f4d086f729 100644 --- a/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts @@ -8,9 +8,9 @@ import { FakeAccountService, FakeStateProvider, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { ApiService } from "../../../abstractions/api.service"; -import { AccountInfo } from "../../../auth/abstractions/account.service"; import { UserId } from "../../../types/guid"; import { ConfigService } from "../../abstractions/config/config.service"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; @@ -76,7 +76,10 @@ describe("DefaultRegisterSdkService", () => { .calledWith(userId) .mockReturnValue(new BehaviorSubject(mock())); accountService.accounts$ = of({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); }); @@ -125,7 +128,10 @@ describe("DefaultRegisterSdkService", () => { it("destroys the internal SDK client when the account is removed (logout)", async () => { const accounts$ = new BehaviorSubject({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); accountService.accounts$ = accounts$; diff --git a/libs/common/src/platform/sync/default-sync.service.ts b/libs/common/src/platform/sync/default-sync.service.ts index 910702bddd0..8d2ccaffa18 100644 --- a/libs/common/src/platform/sync/default-sync.service.ts +++ b/libs/common/src/platform/sync/default-sync.service.ts @@ -272,6 +272,7 @@ export class DefaultSyncService extends CoreSyncService { await this.tokenService.setSecurityStamp(response.securityStamp, response.id); await this.accountService.setAccountEmailVerified(response.id, response.emailVerified); await this.accountService.setAccountVerifyNewDeviceLogin(response.id, response.verifyDevices); + await this.accountService.setAccountCreationDate(response.id, response.creationDate); await this.billingAccountProfileStateService.setHasPremium( response.premiumPersonally, diff --git a/libs/common/src/services/api.service.spec.ts b/libs/common/src/services/api.service.spec.ts index 1fb8f86697f..9ab84ecb16b 100644 --- a/libs/common/src/services/api.service.spec.ts +++ b/libs/common/src/services/api.service.spec.ts @@ -6,6 +6,7 @@ import { ObservedValueOf, of } from "rxjs"; import { LogoutReason } from "@bitwarden/auth/common"; import { UserId } from "@bitwarden/user-core"; +import { mockAccountInfoWith } from "../../spec"; import { AccountService } from "../auth/abstractions/account.service"; import { TokenService } from "../auth/abstractions/token.service"; import { DeviceType } from "../enums"; @@ -55,9 +56,10 @@ describe("ApiService", () => { accountService.activeAccount$ = of({ id: testActiveUser, - email: "user1@example.com", - emailVerified: true, - name: "Test Name", + ...mockAccountInfoWith({ + email: "user1@example.com", + name: "Test Name", + }), } satisfies ObservedValueOf); httpOperations = mock(); diff --git a/libs/common/src/tools/extension/extension.service.spec.ts b/libs/common/src/tools/extension/extension.service.spec.ts index 9959488feca..c0dec8728fe 100644 --- a/libs/common/src/tools/extension/extension.service.spec.ts +++ b/libs/common/src/tools/extension/extension.service.spec.ts @@ -1,7 +1,12 @@ import { mock } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom } from "rxjs"; -import { FakeAccountService, FakeStateProvider, awaitAsync } from "../../../spec"; +import { + FakeAccountService, + FakeStateProvider, + awaitAsync, + mockAccountInfoWith, +} from "../../../spec"; import { Account } from "../../auth/abstractions/account.service"; import { EXTENSION_DISK, UserKeyDefinition } from "../../platform/state"; import { UserId } from "../../types/guid"; @@ -21,9 +26,10 @@ import { SimpleLogin } from "./vendor/simplelogin"; const SomeUser = "some user" as UserId; const SomeAccount = { id: SomeUser, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; const SomeAccount$ = new BehaviorSubject(SomeAccount); diff --git a/libs/common/src/tools/integration/README.md b/libs/common/src/tools/integration/README.md index 9d7edb2d360..1dc74f729e6 100644 --- a/libs/common/src/tools/integration/README.md +++ b/libs/common/src/tools/integration/README.md @@ -1,3 +1,5 @@ +# Tools Vendor Integration + This module defines interfaces and helpers for creating vendor integration sites. ## RPC diff --git a/libs/common/src/tools/send/services/send.service.spec.ts b/libs/common/src/tools/send/services/send.service.spec.ts index 96fb2f43c88..397ae905e31 100644 --- a/libs/common/src/tools/send/services/send.service.spec.ts +++ b/libs/common/src/tools/send/services/send.service.spec.ts @@ -11,6 +11,7 @@ import { FakeStateProvider, awaitAsync, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { KeyGenerationService } from "../../../key-management/crypto"; import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; @@ -71,9 +72,10 @@ describe("SendService", () => { accountService.activeAccountSubject.next({ id: mockUserId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + }), }); // Initial encrypted state diff --git a/libs/common/src/tools/state/user-state-subject.spec.ts b/libs/common/src/tools/state/user-state-subject.spec.ts index a6d452d37fd..b88c358b6ab 100644 --- a/libs/common/src/tools/state/user-state-subject.spec.ts +++ b/libs/common/src/tools/state/user-state-subject.spec.ts @@ -6,6 +6,7 @@ import { awaitAsync, FakeAccountService, FakeStateProvider, + mockAccountInfoWith, ObservableTracker, } from "../../../spec"; import { Account } from "../../auth/abstractions/account.service"; @@ -23,17 +24,19 @@ import { UserStateSubject } from "./user-state-subject"; const SomeUser = "some user" as UserId; const SomeAccount = { id: SomeUser, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; const SomeAccount$ = new BehaviorSubject(SomeAccount); const SomeOtherAccount = { id: "some other user" as UserId, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; type TestType = { foo: string }; diff --git a/libs/components/src/avatar/avatar.component.ts b/libs/components/src/avatar/avatar.component.ts index 2ba85e32772..f50807dd506 100644 --- a/libs/components/src/avatar/avatar.component.ts +++ b/libs/components/src/avatar/avatar.component.ts @@ -1,5 +1,5 @@ import { NgClass } from "@angular/common"; -import { Component, computed, input } from "@angular/core"; +import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -14,13 +14,11 @@ const SizeClasses: Record = { }; /** - * Avatars display a unique color that helps a user visually recognize their logged in account. - - * A variance in color across the avatar component is important as it is used in Account Switching as a - * visual indicator to recognize which of a personal or work account a user is logged into. -*/ -// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection + * Avatars display a unique color that helps a user visually recognize their logged in account. + * + * A variance in color across the avatar component is important as it is used in Account Switching as a + * visual indicator to recognize which of a personal or work account a user is logged into. + */ @Component({ selector: "bit-avatar", template: ` @@ -49,13 +47,38 @@ const SizeClasses: Record = { `, imports: [NgClass], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AvatarComponent { + /** + * Whether to display a border around the avatar. + */ readonly border = input(false); + + /** + * Custom background color for the avatar. If not provided, a color will be generated based on the id or text. + */ readonly color = input(); + + /** + * Unique identifier used to generate a consistent background color. Takes precedence over text for color generation. + */ readonly id = input(); + + /** + * Text to display in the avatar. The first letters of words (up to 2 characters) will be shown. + * Also used to generate background color if id is not provided. + */ readonly text = input(); + + /** + * Title attribute for the avatar. If not provided, falls back to the text value. + */ readonly title = input(); + + /** + * Size of the avatar. + */ readonly size = input("default"); protected readonly svgCharCount = 2; diff --git a/libs/components/src/dialog/dialog/dialog.component.html b/libs/components/src/dialog/dialog/dialog.component.html index be946c76a57..22aa99c44cb 100644 --- a/libs/components/src/dialog/dialog/dialog.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -34,16 +34,21 @@ } - @if (!this.dialogRef?.disableClose) { - - } + +
+ + + @if (!this.dialogRef?.disableClose) { + + } +
Foobar + Dialog body text goes here. @@ -292,3 +293,42 @@ export const WithCards: Story = { disableAnimations: true, }, }; + +export const HeaderEnd: Story = { + render: (args) => ({ + props: args, + template: /*html*/ ` + + + + Archived + + + Dialog body text goes here. + + + + + + + `, + }), + args: { + dialogSize: "small", + title: "Very Long Title That Should Be Truncated After Two Lines To Test Header End Slot", + subtitle: "Subtitle", + }, +}; diff --git a/libs/dirt/card/README.md b/libs/dirt/card/README.md index b97bfd56590..5d21a045658 100644 --- a/libs/dirt/card/README.md +++ b/libs/dirt/card/README.md @@ -1,4 +1,4 @@ -## DIRT Card +# DIRT Card Package name: `@bitwarden/dirt-card` diff --git a/libs/importer/src/components/dialog/file-password-prompt.component.html b/libs/importer/src/components/dialog/file-password-prompt.component.html index d663ec0f4d3..1c0bcdca31d 100644 --- a/libs/importer/src/components/dialog/file-password-prompt.component.html +++ b/libs/importer/src/components/dialog/file-password-prompt.component.html @@ -21,7 +21,7 @@