From e2cb0cf11a924b4c591f0da5f82c8010d154234e Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 2 Sep 2022 06:08:47 +1000 Subject: [PATCH 01/17] [EC-473] Add feature flag config and environment loaders to Desktop (#3389) --- apps/desktop/config/base.json | 4 ++++ apps/desktop/config/config.js | 33 ++++++++++++++++++++++++++++ apps/desktop/config/development.json | 4 ++++ apps/desktop/config/production.json | 3 +++ apps/desktop/webpack.main.js | 10 +++++++++ apps/desktop/webpack.renderer.js | 9 ++++++++ 6 files changed, 63 insertions(+) create mode 100644 apps/desktop/config/base.json create mode 100644 apps/desktop/config/config.js create mode 100644 apps/desktop/config/development.json create mode 100644 apps/desktop/config/production.json diff --git a/apps/desktop/config/base.json b/apps/desktop/config/base.json new file mode 100644 index 00000000000..6df6c2cfdb1 --- /dev/null +++ b/apps/desktop/config/base.json @@ -0,0 +1,4 @@ +{ + "dev_flags": {}, + "flags": {} +} diff --git a/apps/desktop/config/config.js b/apps/desktop/config/config.js new file mode 100644 index 00000000000..2e3347321d7 --- /dev/null +++ b/apps/desktop/config/config.js @@ -0,0 +1,33 @@ +function load(envName) { + return { + ...loadConfig(envName), + ...loadConfig("local"), + }; +} + +function log(configObj) { + const repeatNum = 50; + // eslint-disable-next-line + console.log(`${"=".repeat(repeatNum)}\nenvConfig`); + // eslint-disable-next-line + console.log(JSON.stringify(configObj, null, 2)); + // eslint-disable-next-line + console.log(`${"=".repeat(repeatNum)}`); +} + +function loadConfig(configName) { + try { + return require(`./${configName}.json`); + } catch (e) { + if (e instanceof Error && e.code === "MODULE_NOT_FOUND") { + return {}; + } else { + throw e; + } + } +} + +module.exports = { + load, + log, +}; diff --git a/apps/desktop/config/development.json b/apps/desktop/config/development.json new file mode 100644 index 00000000000..3c93018e65f --- /dev/null +++ b/apps/desktop/config/development.json @@ -0,0 +1,4 @@ +{ + "devFlags": {}, + "flags": {} +} diff --git a/apps/desktop/config/production.json b/apps/desktop/config/production.json new file mode 100644 index 00000000000..b04d1531a2f --- /dev/null +++ b/apps/desktop/config/production.json @@ -0,0 +1,3 @@ +{ + "flags": {} +} diff --git a/apps/desktop/webpack.main.js b/apps/desktop/webpack.main.js index 5f9ec164b22..2563e7d1ede 100644 --- a/apps/desktop/webpack.main.js +++ b/apps/desktop/webpack.main.js @@ -3,9 +3,15 @@ const { merge } = require("webpack-merge"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); +const configurator = require("./config/config"); +const { EnvironmentPlugin } = require("webpack"); const NODE_ENV = process.env.NODE_ENV == null ? "development" : process.env.NODE_ENV; +console.log("Main process config"); +const envConfig = configurator.load(NODE_ENV); +configurator.log(envConfig); + const common = { module: { rules: [ @@ -69,6 +75,10 @@ const main = { { from: "./src/locales", to: "locales" }, ], }), + new EnvironmentPlugin({ + FLAGS: envConfig.flags, + DEV_FLAGS: NODE_ENV === "development" ? envConfig.devFlags : {}, + }), ], externals: { "electron-reload": "commonjs2 electron-reload", diff --git a/apps/desktop/webpack.renderer.js b/apps/desktop/webpack.renderer.js index 934e9691124..f6b81f50b9b 100644 --- a/apps/desktop/webpack.renderer.js +++ b/apps/desktop/webpack.renderer.js @@ -5,9 +5,14 @@ const HtmlWebpackPlugin = require("html-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const { AngularWebpackPlugin } = require("@ngtools/webpack"); const TerserPlugin = require("terser-webpack-plugin"); +const configurator = require("./config/config"); const NODE_ENV = process.env.NODE_ENV == null ? "development" : process.env.NODE_ENV; +console.log("Renderer process config"); +const envConfig = configurator.load(NODE_ENV); +configurator.log(envConfig); + const common = { module: { rules: [ @@ -142,6 +147,10 @@ const renderer = { filename: "[name].[contenthash].css", chunkFilename: "[id].[contenthash].css", }), + new webpack.EnvironmentPlugin({ + FLAGS: envConfig.flags, + DEV_FLAGS: NODE_ENV === "development" ? envConfig.devFlags : {}, + }), ], }; From 063acfef404b9a97b11b16d9a34c09db12522ab7 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 2 Sep 2022 06:09:06 +1000 Subject: [PATCH 02/17] Add typing to localData object (#3368) --- libs/common/src/abstractions/state.service.ts | 8 ++++++-- libs/common/src/models/data/localData.ts | 4 ++++ libs/common/src/models/domain/cipher.ts | 5 +++-- libs/common/src/models/view/cipherView.ts | 3 ++- libs/common/src/services/state.service.ts | 9 +++++++-- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 libs/common/src/models/data/localData.ts diff --git a/libs/common/src/abstractions/state.service.ts b/libs/common/src/abstractions/state.service.ts index 737a51c10b9..b976a6195a0 100644 --- a/libs/common/src/abstractions/state.service.ts +++ b/libs/common/src/abstractions/state.service.ts @@ -8,6 +8,7 @@ import { CollectionData } from "../models/data/collectionData"; import { EncryptedOrganizationKeyData } from "../models/data/encryptedOrganizationKeyData"; import { EventData } from "../models/data/eventData"; import { FolderData } from "../models/data/folderData"; +import { LocalData } from "../models/data/localData"; import { OrganizationData } from "../models/data/organizationData"; import { PolicyData } from "../models/data/policyData"; import { ProviderData } from "../models/data/providerData"; @@ -245,8 +246,11 @@ export abstract class StateService { setLastActive: (value: number, options?: StorageOptions) => Promise; getLastSync: (options?: StorageOptions) => Promise; setLastSync: (value: string, options?: StorageOptions) => Promise; - getLocalData: (options?: StorageOptions) => Promise; - setLocalData: (value: string, options?: StorageOptions) => Promise; + getLocalData: (options?: StorageOptions) => Promise<{ [cipherId: string]: LocalData }>; + setLocalData: ( + value: { [cipherId: string]: LocalData }, + options?: StorageOptions + ) => Promise; getLocale: (options?: StorageOptions) => Promise; setLocale: (value: string, options?: StorageOptions) => Promise; getMainWindowSize: (options?: StorageOptions) => Promise; diff --git a/libs/common/src/models/data/localData.ts b/libs/common/src/models/data/localData.ts new file mode 100644 index 00000000000..9ba820a58a2 --- /dev/null +++ b/libs/common/src/models/data/localData.ts @@ -0,0 +1,4 @@ +export type LocalData = { + lastUsedDate?: number; + lastLaunched?: number; +}; diff --git a/libs/common/src/models/domain/cipher.ts b/libs/common/src/models/domain/cipher.ts index b25be355201..132bcaf3bd6 100644 --- a/libs/common/src/models/domain/cipher.ts +++ b/libs/common/src/models/domain/cipher.ts @@ -1,6 +1,7 @@ import { CipherRepromptType } from "../../enums/cipherRepromptType"; import { CipherType } from "../../enums/cipherType"; import { CipherData } from "../data/cipherData"; +import { LocalData } from "../data/localData"; import { CipherView } from "../view/cipherView"; import { Attachment } from "./attachment"; @@ -26,7 +27,7 @@ export class Cipher extends Domain { edit: boolean; viewPassword: boolean; revisionDate: Date; - localData: any; + localData: LocalData; login: Login; identity: Identity; card: Card; @@ -38,7 +39,7 @@ export class Cipher extends Domain { deletedDate: Date; reprompt: CipherRepromptType; - constructor(obj?: CipherData, localData: any = null) { + constructor(obj?: CipherData, localData: LocalData = null) { super(); if (obj == null) { return; diff --git a/libs/common/src/models/view/cipherView.ts b/libs/common/src/models/view/cipherView.ts index 7471be89b6d..4181c11d358 100644 --- a/libs/common/src/models/view/cipherView.ts +++ b/libs/common/src/models/view/cipherView.ts @@ -3,6 +3,7 @@ import { Jsonify } from "type-fest"; import { CipherRepromptType } from "../../enums/cipherRepromptType"; import { CipherType } from "../../enums/cipherType"; import { LinkedIdType } from "../../enums/linkedIdType"; +import { LocalData } from "../data/localData"; import { Cipher } from "../domain/cipher"; import { AttachmentView } from "./attachmentView"; @@ -25,7 +26,7 @@ export class CipherView implements View { organizationUseTotp = false; edit = false; viewPassword = true; - localData: any; + localData: LocalData; login = new LoginView(); identity = new IdentityView(); card = new CardView(); diff --git a/libs/common/src/services/state.service.ts b/libs/common/src/services/state.service.ts index f2c5a5618dd..6dd6187cc97 100644 --- a/libs/common/src/services/state.service.ts +++ b/libs/common/src/services/state.service.ts @@ -16,6 +16,7 @@ import { CollectionData } from "../models/data/collectionData"; import { EncryptedOrganizationKeyData } from "../models/data/encryptedOrganizationKeyData"; import { EventData } from "../models/data/eventData"; import { FolderData } from "../models/data/folderData"; +import { LocalData } from "../models/data/localData"; import { OrganizationData } from "../models/data/organizationData"; import { PolicyData } from "../models/data/policyData"; import { ProviderData } from "../models/data/providerData"; @@ -1747,12 +1748,16 @@ export class StateService< ); } - async getLocalData(options?: StorageOptions): Promise { + async getLocalData(options?: StorageOptions): Promise<{ [cipherId: string]: LocalData }> { return ( await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions())) )?.data?.localData; } - async setLocalData(value: string, options?: StorageOptions): Promise { + + async setLocalData( + value: { [cipherId: string]: LocalData }, + options?: StorageOptions + ): Promise { const account = await this.getAccount( this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()) ); From cff2422d7f9e93424b01999064514a700d640b1d Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:15:19 +1000 Subject: [PATCH 03/17] [EC-499] Add encryptService to domain model decryption (#3385) Co-authored-by: Matt Gibson --- .../browser/src/background/main.background.ts | 2 +- apps/cli/src/bw.ts | 2 +- apps/desktop/src/app/services/init.service.ts | 6 +- apps/web/src/app/core/init.service.ts | 6 +- .../spec/models/domain/attachment.spec.ts | 93 ++++++++++++++----- .../spec/models/domain/encString.spec.ts | 79 ++++++++++------ libs/common/spec/models/domain/send.spec.ts | 5 +- .../spec/services/folder.service.spec.ts | 5 +- .../spec/services/settings.service.spec.ts | 5 +- libs/common/src/misc/utils.ts | 12 +++ libs/common/src/models/domain/attachment.ts | 38 ++++---- libs/common/src/models/domain/encString.ts | 53 ++++++----- libs/common/src/models/domain/send.ts | 9 +- libs/common/src/services/container.service.ts | 22 ++++- 14 files changed, 231 insertions(+), 106 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index cab48c0bc59..99114bc007f 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -413,7 +413,7 @@ export default class MainBackground { this.eventService, this.logService ); - this.containerService = new ContainerService(this.cryptoService); + this.containerService = new ContainerService(this.cryptoService, this.encryptService); this.auditService = new AuditService(this.cryptoFunctionService, this.apiService); this.exportService = new ExportService( this.folderService, diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts index a168182ddc5..734a030943d 100644 --- a/apps/cli/src/bw.ts +++ b/apps/cli/src/bw.ts @@ -193,7 +193,7 @@ export class Main { this.organizationApiService = new OrganizationApiService(this.apiService); - this.containerService = new ContainerService(this.cryptoService); + this.containerService = new ContainerService(this.cryptoService, this.encryptService); this.settingsService = new SettingsService(this.stateService); diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts index 41e6c6a1da9..722ae013fc1 100644 --- a/apps/desktop/src/app/services/init.service.ts +++ b/apps/desktop/src/app/services/init.service.ts @@ -2,6 +2,7 @@ import { Inject, Injectable } from "@angular/core"; import { WINDOW } from "@bitwarden/angular/services/jslib-services.module"; import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service"; import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/abstractions/environment.service"; import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service"; @@ -34,7 +35,8 @@ export class InitService { private stateService: StateServiceAbstraction, private cryptoService: CryptoServiceAbstraction, private nativeMessagingService: NativeMessagingService, - private themingService: AbstractThemingService + private themingService: AbstractThemingService, + private encryptService: AbstractEncryptService ) {} init() { @@ -65,7 +67,7 @@ export class InitService { await this.stateService.setInstalledVersion(currentVersion); } - const containerService = new ContainerService(this.cryptoService); + const containerService = new ContainerService(this.cryptoService, this.encryptService); containerService.attachToGlobal(this.win); }; } diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts index 4915b0a088b..03f4d99f3ad 100644 --- a/apps/web/src/app/core/init.service.ts +++ b/apps/web/src/app/core/init.service.ts @@ -2,6 +2,7 @@ import { Inject, Injectable } from "@angular/core"; import { WINDOW } from "@bitwarden/angular/services/jslib-services.module"; import { AbstractThemingService } from "@bitwarden/angular/services/theming/theming.service.abstraction"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service"; import { EnvironmentService as EnvironmentServiceAbstraction, @@ -31,7 +32,8 @@ export class InitService { private twoFactorService: TwoFactorServiceAbstraction, private stateService: StateServiceAbstraction, private cryptoService: CryptoServiceAbstraction, - private themingService: AbstractThemingService + private themingService: AbstractThemingService, + private encryptService: AbstractEncryptService ) {} init() { @@ -51,7 +53,7 @@ export class InitService { const htmlEl = this.win.document.documentElement; htmlEl.classList.add("locale_" + this.i18nService.translationLocale); await this.themingService.monitorThemeChanges(); - const containerService = new ContainerService(this.cryptoService); + const containerService = new ContainerService(this.cryptoService, this.encryptService); containerService.attachToGlobal(this.win); }; } diff --git a/libs/common/spec/models/domain/attachment.spec.ts b/libs/common/spec/models/domain/attachment.spec.ts index 4a608c3a4a7..835628d47d2 100644 --- a/libs/common/spec/models/domain/attachment.spec.ts +++ b/libs/common/spec/models/domain/attachment.spec.ts @@ -1,8 +1,10 @@ -import Substitute, { Arg } from "@fluffy-spoon/substitute"; +import { mock, MockProxy } from "jest-mock-extended"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { AttachmentData } from "@bitwarden/common/models/data/attachmentData"; import { Attachment } from "@bitwarden/common/models/domain/attachment"; +import { EncString } from "@bitwarden/common/models/domain/encString"; import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; import { ContainerService } from "@bitwarden/common/services/container.service"; @@ -54,30 +56,79 @@ describe("Attachment", () => { expect(attachment.toAttachmentData()).toEqual(data); }); - it("Decrypt", async () => { - const attachment = new Attachment(); - attachment.id = "id"; - attachment.url = "url"; - attachment.size = "1100"; - attachment.sizeName = "1.1 KB"; - attachment.key = mockEnc("key"); - attachment.fileName = mockEnc("fileName"); + describe("decrypt", () => { + let cryptoService: MockProxy; + let encryptService: MockProxy; - const cryptoService = Substitute.for(); - cryptoService.getOrgKey(null).resolves(null); - cryptoService.decryptToBytes(Arg.any(), Arg.any()).resolves(makeStaticByteArray(32)); + beforeEach(() => { + cryptoService = mock(); + encryptService = mock(); - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + (window as any).bitwardenContainerService = new ContainerService( + cryptoService, + encryptService + ); + }); - const view = await attachment.decrypt(null); + it("expected output", async () => { + const attachment = new Attachment(); + attachment.id = "id"; + attachment.url = "url"; + attachment.size = "1100"; + attachment.sizeName = "1.1 KB"; + attachment.key = mockEnc("key"); + attachment.fileName = mockEnc("fileName"); - expect(view).toEqual({ - id: "id", - url: "url", - size: "1100", - sizeName: "1.1 KB", - fileName: "fileName", - key: expect.any(SymmetricCryptoKey), + encryptService.decryptToBytes.mockResolvedValue(makeStaticByteArray(32)); + + const view = await attachment.decrypt(null); + + expect(view).toEqual({ + id: "id", + url: "url", + size: "1100", + sizeName: "1.1 KB", + fileName: "fileName", + key: expect.any(SymmetricCryptoKey), + }); + }); + + describe("decrypts attachment.key", () => { + let attachment: Attachment; + + beforeEach(() => { + attachment = new Attachment(); + attachment.key = mock(); + }); + + it("uses the provided key without depending on CryptoService", async () => { + const providedKey = mock(); + + await attachment.decrypt(null, providedKey); + + expect(cryptoService.getKeyForUserEncryption).not.toHaveBeenCalled(); + expect(encryptService.decryptToBytes).toHaveBeenCalledWith(attachment.key, providedKey); + }); + + it("gets an organization key if required", async () => { + const orgKey = mock(); + cryptoService.getOrgKey.calledWith("orgId").mockResolvedValue(orgKey); + + await attachment.decrypt("orgId", null); + + expect(cryptoService.getOrgKey).toHaveBeenCalledWith("orgId"); + expect(encryptService.decryptToBytes).toHaveBeenCalledWith(attachment.key, orgKey); + }); + + it("gets the user's decryption key if required", async () => { + const userKey = mock(); + cryptoService.getKeyForUserEncryption.mockResolvedValue(userKey); + + await attachment.decrypt(null, null); + + expect(cryptoService.getKeyForUserEncryption).toHaveBeenCalled(); + expect(encryptService.decryptToBytes).toHaveBeenCalledWith(attachment.key, userKey); + }); }); }); }); diff --git a/libs/common/spec/models/domain/encString.spec.ts b/libs/common/spec/models/domain/encString.spec.ts index aa59d645745..adcfaf0706e 100644 --- a/libs/common/spec/models/domain/encString.spec.ts +++ b/libs/common/spec/models/domain/encString.spec.ts @@ -1,5 +1,7 @@ import Substitute, { Arg } from "@fluffy-spoon/substitute"; +import { mock, MockProxy } from "jest-mock-extended"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EncryptionType } from "@bitwarden/common/enums/encryptionType"; import { EncString } from "@bitwarden/common/models/domain/encString"; @@ -48,10 +50,15 @@ describe("EncString", () => { const cryptoService = Substitute.for(); cryptoService.getOrgKey(null).resolves(null); - cryptoService.decryptToUtf8(encString, Arg.any()).resolves("decrypted"); + + const encryptService = Substitute.for(); + encryptService.decryptToUtf8(encString, Arg.any()).resolves("decrypted"); beforeEach(() => { - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + (window as any).bitwardenContainerService = new ContainerService( + cryptoService, + encryptService + ); }); it("decrypts correctly", async () => { @@ -62,7 +69,7 @@ describe("EncString", () => { it("result should be cached", async () => { const decrypted = await encString.decrypt(null); - cryptoService.received(1).decryptToUtf8(Arg.any(), Arg.any()); + encryptService.received(1).decryptToUtf8(Arg.any(), Arg.any()); expect(decrypted).toBe("decrypted"); }); @@ -148,25 +155,28 @@ describe("EncString", () => { }); describe("decrypt", () => { - it("throws exception when bitwarden container not initialized", async () => { - const encString = new EncString(null); + let cryptoService: MockProxy; + let encryptService: MockProxy; + let encString: EncString; - expect.assertions(1); - try { - await encString.decrypt(null); - } catch (e) { - expect(e.message).toEqual("global bitwardenContainerService not initialized."); - } + beforeEach(() => { + cryptoService = mock(); + encryptService = mock(); + encString = new EncString(null); + + (window as any).bitwardenContainerService = new ContainerService( + cryptoService, + encryptService + ); }); it("handles value it can't decrypt", async () => { - const encString = new EncString(null); + encryptService.decryptToUtf8.mockRejectedValue("error"); - const cryptoService = Substitute.for(); - cryptoService.getOrgKey(null).resolves(null); - cryptoService.decryptToUtf8(encString, Arg.any()).throws("error"); - - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + (window as any).bitwardenContainerService = new ContainerService( + cryptoService, + encryptService + ); const decrypted = await encString.decrypt(null); @@ -178,18 +188,35 @@ describe("EncString", () => { }); }); - it("passes along key", async () => { - const encString = new EncString(null); - const key = Substitute.for(); - - const cryptoService = Substitute.for(); - cryptoService.getOrgKey(null).resolves(null); - - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + it("uses provided key without depending on CryptoService", async () => { + const key = mock(); await encString.decrypt(null, key); - cryptoService.received().decryptToUtf8(encString, key); + expect(cryptoService.getKeyForUserEncryption).not.toHaveBeenCalled(); + expect(encryptService.decryptToUtf8).toHaveBeenCalledWith(encString, key); + }); + + it("gets an organization key if required", async () => { + const orgKey = mock(); + + cryptoService.getOrgKey.calledWith("orgId").mockResolvedValue(orgKey); + + await encString.decrypt("orgId", null); + + expect(cryptoService.getOrgKey).toHaveBeenCalledWith("orgId"); + expect(encryptService.decryptToUtf8).toHaveBeenCalledWith(encString, orgKey); + }); + + it("gets the user's decryption key if required", async () => { + const userKey = mock(); + + cryptoService.getKeyForUserEncryption.mockResolvedValue(userKey); + + await encString.decrypt(null, null); + + expect(cryptoService.getKeyForUserEncryption).toHaveBeenCalledWith(); + expect(encryptService.decryptToUtf8).toHaveBeenCalledWith(encString, userKey); }); }); diff --git a/libs/common/spec/models/domain/send.spec.ts b/libs/common/spec/models/domain/send.spec.ts index 92a3a5ed2da..575821abc96 100644 --- a/libs/common/spec/models/domain/send.spec.ts +++ b/libs/common/spec/models/domain/send.spec.ts @@ -1,5 +1,6 @@ import Substitute, { Arg, SubstituteOf } from "@fluffy-spoon/substitute"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { SendType } from "@bitwarden/common/enums/sendType"; import { SendData } from "@bitwarden/common/models/data/sendData"; @@ -110,7 +111,9 @@ describe("Send", () => { cryptoService.decryptToBytes(send.key, null).resolves(makeStaticByteArray(32)); cryptoService.makeSendKey(Arg.any()).resolves("cryptoKey" as any); - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + const encryptService = Substitute.for(); + + (window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService); const view = await send.decrypt(); diff --git a/libs/common/spec/services/folder.service.spec.ts b/libs/common/spec/services/folder.service.spec.ts index 31b1aad7184..211c1f788e3 100644 --- a/libs/common/spec/services/folder.service.spec.ts +++ b/libs/common/spec/services/folder.service.spec.ts @@ -1,6 +1,7 @@ import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; import { BehaviorSubject, firstValueFrom } from "rxjs"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -15,6 +16,7 @@ describe("Folder Service", () => { let folderService: FolderService; let cryptoService: SubstituteOf; + let encryptService: SubstituteOf; let i18nService: SubstituteOf; let cipherService: SubstituteOf; let stateService: SubstituteOf; @@ -23,6 +25,7 @@ describe("Folder Service", () => { beforeEach(() => { cryptoService = Substitute.for(); + encryptService = Substitute.for(); i18nService = Substitute.for(); cipherService = Substitute.for(); stateService = Substitute.for(); @@ -34,7 +37,7 @@ describe("Folder Service", () => { }); stateService.activeAccount$.returns(activeAccount); stateService.activeAccountUnlocked$.returns(activeAccountUnlocked); - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + (window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService); folderService = new FolderService(cryptoService, i18nService, cipherService, stateService); }); diff --git a/libs/common/spec/services/settings.service.spec.ts b/libs/common/spec/services/settings.service.spec.ts index f3733a14258..f81e4d341ca 100644 --- a/libs/common/spec/services/settings.service.spec.ts +++ b/libs/common/spec/services/settings.service.spec.ts @@ -1,6 +1,7 @@ import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; import { BehaviorSubject, firstValueFrom } from "rxjs"; +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { ContainerService } from "@bitwarden/common/services/container.service"; import { SettingsService } from "@bitwarden/common/services/settings.service"; @@ -10,12 +11,14 @@ describe("SettingsService", () => { let settingsService: SettingsService; let cryptoService: SubstituteOf; + let encryptService: SubstituteOf; let stateService: SubstituteOf; let activeAccount: BehaviorSubject; let activeAccountUnlocked: BehaviorSubject; beforeEach(() => { cryptoService = Substitute.for(); + encryptService = Substitute.for(); stateService = Substitute.for(); activeAccount = new BehaviorSubject("123"); activeAccountUnlocked = new BehaviorSubject(true); @@ -23,7 +26,7 @@ describe("SettingsService", () => { stateService.getSettings().resolves({ equivalentDomains: [["test"], ["domains"]] }); stateService.activeAccount$.returns(activeAccount); stateService.activeAccountUnlocked$.returns(activeAccountUnlocked); - (window as any).bitwardenContainerService = new ContainerService(cryptoService); + (window as any).bitwardenContainerService = new ContainerService(cryptoService, encryptService); settingsService = new SettingsService(stateService); }); diff --git a/libs/common/src/misc/utils.ts b/libs/common/src/misc/utils.ts index 524c4384703..0aebd9d728d 100644 --- a/libs/common/src/misc/utils.ts +++ b/libs/common/src/misc/utils.ts @@ -3,6 +3,7 @@ import * as tldjs from "tldjs"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { AbstractEncryptService } from "../abstractions/abstractEncrypt.service"; import { I18nService } from "../abstractions/i18n.service"; const nodeURL = typeof window === "undefined" ? require("url") : null; @@ -14,6 +15,7 @@ declare global { interface BitwardenContainerService { getCryptoService: () => CryptoService; + getEncryptService: () => AbstractEncryptService; } export class Utils { @@ -368,6 +370,16 @@ export class Utils { return s.charAt(0).toUpperCase() + s.slice(1); } + /** + * @throws Will throw an error if the ContainerService has not been attached to the window object + */ + static getContainerService(): BitwardenContainerService { + if (this.global.bitwardenContainerService == null) { + throw new Error("global bitwardenContainerService not initialized."); + } + return this.global.bitwardenContainerService; + } + private static validIpAddress(ipString: string): boolean { const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; diff --git a/libs/common/src/models/domain/attachment.ts b/libs/common/src/models/domain/attachment.ts index 053438390da..6696a0f7533 100644 --- a/libs/common/src/models/domain/attachment.ts +++ b/libs/common/src/models/domain/attachment.ts @@ -1,4 +1,3 @@ -import { CryptoService } from "../../abstractions/crypto.service"; import { Utils } from "../../misc/utils"; import { AttachmentData } from "../data/attachmentData"; import { AttachmentView } from "../view/attachmentView"; @@ -47,26 +46,33 @@ export class Attachment extends Domain { ); if (this.key != null) { - let cryptoService: CryptoService; - const containerService = Utils.global.bitwardenContainerService; - if (containerService) { - cryptoService = containerService.getCryptoService(); - } else { - throw new Error("global bitwardenContainerService not initialized."); - } - - try { - const orgKey = await cryptoService.getOrgKey(orgId); - const decValue = await cryptoService.decryptToBytes(this.key, orgKey ?? encKey); - view.key = new SymmetricCryptoKey(decValue); - } catch (e) { - // TODO: error? - } + view.key = await this.decryptAttachmentKey(orgId, encKey); } return view; } + private async decryptAttachmentKey(orgId: string, encKey?: SymmetricCryptoKey) { + try { + if (encKey == null) { + encKey = await this.getKeyForDecryption(orgId); + } + + const encryptService = Utils.getContainerService().getEncryptService(); + const decValue = await encryptService.decryptToBytes(this.key, encKey); + return new SymmetricCryptoKey(decValue); + } catch (e) { + // TODO: error? + } + } + + private async getKeyForDecryption(orgId: string) { + const cryptoService = Utils.getContainerService().getCryptoService(); + return orgId != null + ? await cryptoService.getOrgKey(orgId) + : await cryptoService.getKeyForUserEncryption(); + } + toAttachmentData(): AttachmentData { const a = new AttachmentData(); a.size = this.size; diff --git a/libs/common/src/models/domain/encString.ts b/libs/common/src/models/domain/encString.ts index 46c267bb042..01376c90936 100644 --- a/libs/common/src/models/domain/encString.ts +++ b/libs/common/src/models/domain/encString.ts @@ -2,7 +2,6 @@ import { Jsonify } from "type-fest"; import { IEncrypted } from "@bitwarden/common/interfaces/IEncrypted"; -import { CryptoService } from "../../abstractions/crypto.service"; import { EncryptionType } from "../../enums/encryptionType"; import { Utils } from "../../misc/utils"; @@ -29,30 +28,6 @@ export class EncString implements IEncrypted { } } - async decrypt(orgId: string, key: SymmetricCryptoKey = null): Promise { - if (this.decryptedValue != null) { - return this.decryptedValue; - } - - let cryptoService: CryptoService; - const containerService = Utils.global.bitwardenContainerService; - if (containerService) { - cryptoService = containerService.getCryptoService(); - } else { - throw new Error("global bitwardenContainerService not initialized."); - } - - try { - if (key == null) { - key = await cryptoService.getOrgKey(orgId); - } - this.decryptedValue = await cryptoService.decryptToUtf8(this, key); - } catch (e) { - this.decryptedValue = "[error: cannot decrypt]"; - } - return this.decryptedValue; - } - get ivBytes(): ArrayBuffer { return this.iv == null ? null : Utils.fromB64ToArray(this.iv).buffer; } @@ -160,4 +135,32 @@ export class EncString implements IEncrypted { encPieces, }; } + + async decrypt(orgId: string, key: SymmetricCryptoKey = null): Promise { + if (this.decryptedValue != null) { + return this.decryptedValue; + } + + try { + if (key == null) { + key = await this.getKeyForDecryption(orgId); + } + if (key == null) { + throw new Error("No key to decrypt EncString with orgId " + orgId); + } + + const encryptService = Utils.getContainerService().getEncryptService(); + this.decryptedValue = await encryptService.decryptToUtf8(this, key); + } catch (e) { + this.decryptedValue = "[error: cannot decrypt]"; + } + return this.decryptedValue; + } + + private async getKeyForDecryption(orgId: string) { + const cryptoService = Utils.getContainerService().getCryptoService(); + return orgId != null + ? await cryptoService.getOrgKey(orgId) + : await cryptoService.getKeyForUserEncryption(); + } } diff --git a/libs/common/src/models/domain/send.ts b/libs/common/src/models/domain/send.ts index 8bf56acbeef..43ca31a7154 100644 --- a/libs/common/src/models/domain/send.ts +++ b/libs/common/src/models/domain/send.ts @@ -1,4 +1,3 @@ -import { CryptoService } from "../../abstractions/crypto.service"; import { SendType } from "../../enums/sendType"; import { Utils } from "../../misc/utils"; import { SendData } from "../data/sendData"; @@ -71,13 +70,7 @@ export class Send extends Domain { async decrypt(): Promise { const model = new SendView(this); - let cryptoService: CryptoService; - const containerService = Utils.global.bitwardenContainerService; - if (containerService) { - cryptoService = containerService.getCryptoService(); - } else { - throw new Error("global bitwardenContainerService not initialized."); - } + const cryptoService = Utils.getContainerService().getCryptoService(); try { model.key = await cryptoService.decryptToBytes(this.key, null); diff --git a/libs/common/src/services/container.service.ts b/libs/common/src/services/container.service.ts index 848a8b0389d..9e50705d6aa 100644 --- a/libs/common/src/services/container.service.ts +++ b/libs/common/src/services/container.service.ts @@ -1,7 +1,11 @@ +import { AbstractEncryptService } from "../abstractions/abstractEncrypt.service"; import { CryptoService } from "../abstractions/crypto.service"; export class ContainerService { - constructor(private cryptoService: CryptoService) {} + constructor( + private cryptoService: CryptoService, + private encryptService: AbstractEncryptService + ) {} attachToGlobal(global: any) { if (!global.bitwardenContainerService) { @@ -9,7 +13,23 @@ export class ContainerService { } } + /** + * @throws Will throw if CryptoService was not instantiated and provided to the ContainerService constructor + */ getCryptoService(): CryptoService { + if (this.cryptoService == null) { + throw new Error("ContainerService.cryptoService not initialized."); + } return this.cryptoService; } + + /** + * @throws Will throw if EncryptService was not instantiated and provided to the ContainerService constructor + */ + getEncryptService(): AbstractEncryptService { + if (this.encryptService == null) { + throw new Error("ContainerService.encryptService not initialized."); + } + return this.encryptService; + } } From 49f45e1e631b30729eeab125f87d6260c2f4b7ba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:11:54 +0200 Subject: [PATCH 04/17] Autosync the updated translations (#3433) Co-authored-by: github-actions <> --- apps/browser/src/_locales/ar/messages.json | 412 +++++++++--------- apps/browser/src/_locales/az/messages.json | 90 ++-- apps/browser/src/_locales/be/messages.json | 406 ++++++++--------- apps/browser/src/_locales/fi/messages.json | 8 +- apps/browser/src/_locales/ru/messages.json | 14 +- apps/browser/src/_locales/sr/messages.json | 2 +- apps/browser/src/_locales/sv/messages.json | 2 +- apps/browser/src/_locales/uk/messages.json | 2 +- apps/browser/src/_locales/zh_TW/messages.json | 4 +- apps/browser/store/locales/ar/copy.resx | 49 ++- apps/browser/store/locales/az/copy.resx | 15 +- apps/browser/store/locales/ru/copy.resx | 6 +- 12 files changed, 506 insertions(+), 504 deletions(-) diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 3fd3fe8875d..600a596cd01 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3,352 +3,352 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden - مدير كلمات مرور مجاني", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "A secure and free password manager for all of your devices.", + "message": "مدير كلمات مرور مجاني وآمن لجميع أجهزتك.", "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Log in or create a new account to access your secure vault." + "message": "قم بالتسجيل أو إنشاء حساب جديد للوصول إلى خزنتك الآمنة." }, "createAccount": { - "message": "Create Account" + "message": "إنشاء حساب" }, "login": { - "message": "Log In" + "message": "تسجيل الدخول" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "تسجيل الدخول الأُحادي للمؤسسات – SSO" }, "cancel": { - "message": "Cancel" + "message": "إلغاء" }, "close": { - "message": "Close" + "message": "إغلاق" }, "submit": { - "message": "Submit" + "message": "إرسال" }, "emailAddress": { - "message": "Email Address" + "message": "عنوان البريد الإلكتروني" }, "masterPass": { - "message": "Master Password" + "message": "كلمة المرور الرئيسية" }, "masterPassDesc": { - "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + "message": "كلمة المرور الرئيسية هي كلمة المرور التي تستخدمها للوصول إلى خزنتك. من المهم جدا ألا تنسى كلمة المرور الرئيسية. لا توجد طريقة لاسترداد كلمة المرور في حال نسيتها." }, "masterPassHintDesc": { - "message": "A master password hint can help you remember your password if you forget it." + "message": "يمكن أن يساعدك تلميح كلمة المرور الرئيسية في تذكر كلمة المرور الخاصة بك في حال نسيتها." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "أعِد إدخال كلمة المرور الرئيسية" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "تلميح كلمة المرور الرئيسية (إختياري)" }, "tab": { - "message": "Tab" + "message": "علامة تبويب" }, "vault": { - "message": "Vault" + "message": "الخزنة" }, "myVault": { - "message": "My Vault" + "message": "خزنتي" }, "allVaults": { - "message": "All Vaults" + "message": "جميع الخزنات" }, "tools": { - "message": "Tools" + "message": "الأدوات" }, "settings": { - "message": "Settings" + "message": "الإعدادات" }, "currentTab": { - "message": "Current Tab" + "message": "علامة التبويب الحالية" }, "copyPassword": { - "message": "Copy Password" + "message": "نسخ كلمة المرور" }, "copyNote": { - "message": "Copy Note" + "message": "نسخ الملاحظة" }, "copyUri": { - "message": "Copy URI" + "message": "نسخ الرابط" }, "copyUsername": { - "message": "Copy Username" + "message": "نسخ اسم المستخدم" }, "copyNumber": { - "message": "Copy Number" + "message": "نسخ الرقم" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "نسخ رمز الأمان" }, "autoFill": { - "message": "Auto-fill" + "message": "التعبئة التلقائية" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "إنشاء كلمة مرور (تم النسخ)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "نسخ اسم الحقل المخصص" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "لا توجد تسجيلات دخول مطابقة." }, "unlockVaultMenu": { - "message": "Unlock your vault" + "message": "افتح خزنتك" }, "loginToVaultMenu": { - "message": "Log in to your vault" + "message": "تسجيل الدخول إلى خزنتك" }, "autoFillInfo": { - "message": "There are no logins available to auto-fill for the current browser tab." + "message": "لا توجد تسجيلات دخول متاحة للملء التلقائي في علامة تبويب المتصفح الحالية." }, "addLogin": { - "message": "Add a Login" + "message": "إضافة تسجيل دخول جديد" }, "addItem": { - "message": "Add Item" + "message": "إضافة عنصر" }, "passwordHint": { - "message": "Password Hint" + "message": "تلميح كلمة المرور" }, "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." + "message": "أدخل عنوان البريد الإلكتروني لحسابك للحصول على تلميح كلمة المرور الرئيسية." }, "getMasterPasswordHint": { - "message": "Get master password hint" + "message": "احصل على تلميح كلمة المرور الرئيسية" }, "continue": { - "message": "Continue" + "message": "متابعة" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "إرسال رمز التحقق إلى بريدك الإلكتروني" }, "sendCode": { - "message": "Send Code" + "message": "إرسال الرمز" }, "codeSent": { - "message": "Code Sent" + "message": "تم إرسال الرمز" }, "verificationCode": { - "message": "Verification Code" + "message": "رمز التحقق" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "قم بتأكيد هويتك للمتابعة." }, "account": { - "message": "Account" + "message": "الحساب" }, "changeMasterPassword": { - "message": "Change master password" + "message": "تغيير كلمة المرور الرئيسية" }, "fingerprintPhrase": { - "message": "Fingerprint phrase", + "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." }, "yourAccountsFingerprint": { - "message": "Your account's fingerprint phrase", + "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." }, "twoStepLogin": { "message": "Two-step login" }, "logOut": { - "message": "Log out" + "message": "تسجيل الخروج" }, "about": { - "message": "About" + "message": "عن التطبيق" }, "version": { - "message": "Version" + "message": "الإصدار" }, "save": { - "message": "Save" + "message": "حفظ" }, "move": { - "message": "Move" + "message": "نقل" }, "addFolder": { - "message": "Add Folder" + "message": "إضافة مجلّد" }, "name": { - "message": "Name" + "message": "الاسم" }, "editFolder": { - "message": "Edit Folder" + "message": "تحرير المجلّد" }, "deleteFolder": { - "message": "Delete Folder" + "message": "حذف المجلّد" }, "folders": { - "message": "Folders" + "message": "المجلّدات" }, "noFolders": { - "message": "There are no folders to list." + "message": "لا توجد مجلّدات لعرضها." }, "helpFeedback": { - "message": "Help & feedback" + "message": "المساعدة والتعليقات" }, "sync": { - "message": "Sync" + "message": "المزامنة" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "مزامنة الخزنة الآن" }, "lastSync": { - "message": "Last Sync:" + "message": "آخر مزامنة:" }, "passGen": { - "message": "Password Generator" + "message": "مولّد كلمات المرور" }, "generator": { - "message": "Generator", + "message": "المولّد", "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Automatically generate strong, unique passwords for your logins." + "message": "قم بإنشاء كلمات مرور قوية وفريدة لتسجيلات الدخول الخاصة بك." }, "bitWebVault": { - "message": "Bitwarden web vault" + "message": "خزنة الويب Bitwarden" }, "importItems": { - "message": "Import items" + "message": "استيراد العناصر" }, "select": { - "message": "Select" + "message": "تحديد" }, "generatePassword": { - "message": "Generate Password" + "message": "توليد كلمة مرور" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "إعادة توليد كلمة المرور" }, "options": { - "message": "Options" + "message": "الخيارات" }, "length": { - "message": "Length" + "message": "الطول" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "أحرف كبيرة (من A إلى Z)" }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "أحرف كبيرة (من a إلى z)" }, "numbers": { - "message": "Numbers (0-9)" + "message": "الأرقام (من 0 الى 9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "الأحرف الخاصة (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "عدد الكلمات" }, "wordSeparator": { - "message": "Word Separator" + "message": "فاصل الكلمات" }, "capitalize": { - "message": "Capitalize", + "message": "كبِّر الحروف", "description": "Make the first letter of a work uppercase." }, "includeNumber": { "message": "Include Number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "الحد الأدنى من الأرقام" }, "minSpecial": { - "message": "Minimum Special" + "message": "الحد الأدنى من الأحرف الخاصة" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "تجنب الأحرف الغامضة" }, "searchVault": { - "message": "Search vault" + "message": "البحث في الخزنة" }, "edit": { - "message": "Edit" + "message": "تعديل" }, "view": { - "message": "View" + "message": "عرض" }, "noItemsInList": { - "message": "There are no items to list." + "message": "لا توجد عناصر لعرضها." }, "itemInformation": { - "message": "Item Information" + "message": "معلومات العنصر" }, "username": { - "message": "Username" + "message": "اسم المستخدم" }, "password": { - "message": "Password" + "message": "كلمة المرور" }, "passphrase": { - "message": "Passphrase" + "message": "العبارة السرية" }, "favorite": { - "message": "Favorite" + "message": "المفضلات" }, "notes": { - "message": "Notes" + "message": "الملاحظات" }, "note": { - "message": "Note" + "message": "الملاحظة" }, "editItem": { - "message": "Edit Item" + "message": "تعديل العنصر" }, "folder": { - "message": "Folder" + "message": "المجلّد" }, "deleteItem": { - "message": "Delete Item" + "message": "حذف العنصر" }, "viewItem": { - "message": "View Item" + "message": "عرض العنصر" }, "launch": { "message": "Launch" }, "website": { - "message": "Website" + "message": "الموقع الإلكتروني" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "إظهار / إخفاء" }, "manage": { - "message": "Manage" + "message": "إدارة" }, "other": { "message": "Other" }, "rateExtension": { - "message": "Rate the extension" + "message": "قيِّم هذه الإضافة" }, "rateExtensionDesc": { - "message": "Please consider helping us out with a good review!" + "message": "يرجى النظر في مساعدتنا بكتابة تعليق إيجابي!" }, "browserNotSupportClipboard": { - "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + "message": "متصفح الويب الخاص بك لا يدعم خاصية النسخ السهل. يرجى استخدام النسخ اليدوي." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "قم بتأكيد هويتك" }, "yourVaultIsLocked": { - "message": "Your vault is locked. Verify your identity to continue." + "message": "خزنتك مقفلة. قم بتأكيد هويتك للمتابعة." }, "unlock": { - "message": "Unlock" + "message": "إلغاء القفل" }, "loggedInAsOn": { - "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "message": "تم تسجيل الدخول كـ $EMAIL$ في $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -361,94 +361,94 @@ } }, "invalidMasterPassword": { - "message": "Invalid master password" + "message": "كلمة المرور الرئيسية غير صالحة" }, "vaultTimeout": { - "message": "Vault timeout" + "message": "نفذ وقت الخزنة" }, "lockNow": { - "message": "Lock now" + "message": "إقفل الآن" }, "immediately": { - "message": "Immediately" + "message": "حالاً" }, "tenSeconds": { - "message": "10 seconds" + "message": "10 ثوانِ" }, "twentySeconds": { - "message": "20 seconds" + "message": "20 ثانية" }, "thirtySeconds": { - "message": "30 seconds" + "message": "30 ثانية" }, "oneMinute": { - "message": "1 minute" + "message": "دقيقة واحدة" }, "twoMinutes": { - "message": "2 minutes" + "message": "دقيقتان" }, "fiveMinutes": { - "message": "5 minutes" + "message": "5 دقائق" }, "fifteenMinutes": { - "message": "15 minutes" + "message": "15 دقيقة" }, "thirtyMinutes": { - "message": "30 minutes" + "message": "30 دقيقة" }, "oneHour": { - "message": "1 hour" + "message": "ساعة واحدة" }, "fourHours": { - "message": "4 hours" + "message": "4 ساعات" }, "onLocked": { - "message": "On system lock" + "message": "عند قفل النظام" }, "onRestart": { - "message": "On browser restart" + "message": "عند إعادة تشغيل المتصفح" }, "never": { - "message": "Never" + "message": "مطلقاً" }, "security": { "message": "Security" }, "errorOccurred": { - "message": "An error has occurred" + "message": "لقد حدث خطأ ما" }, "emailRequired": { - "message": "Email address is required." + "message": "عنوان البريد الإلكتروني مطلوب." }, "invalidEmail": { - "message": "Invalid email address." + "message": "عنوان البريد الإلكتروني غير صالح." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "مطلوب كتابة كلمة المرور الرئيسية." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "مطلوب إعادة كتابة كلمة المرور الرئيسية." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "يجب أن يكون طول كلمة المرور الرئيسية 8 أحرف على الأقل." }, "masterPassDoesntMatch": { - "message": "Master password confirmation does not match." + "message": "لا يتطابق تأكيد كلمة المرور مع كلمة المرور." }, "newAccountCreated": { - "message": "Your new account has been created! You may now log in." + "message": "تم إنشاء حسابك الجديد! يمكنك الآن تسجيل الدخول." }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "لقد أرسلنا لك رسالة بريد إلكتروني تحتوي على تلميح كلمة المرور الرئيسية." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "رمز التحقق مطلوب." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "رمز التحقق غير صالح" }, "valueCopied": { - "message": "$VALUE$ copied", + "message": "تم نسخ $VALUE$", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -458,34 +458,34 @@ } }, "autofillError": { - "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + "message": "غير قادر على ملء العنصر المحدد تلقائياً في هذه الصفحة. يرجى نسخ ولصق المعلومات يدوياً." }, "loggedOut": { - "message": "Logged out" + "message": "تم تسجيل الخروج" }, "loginExpired": { - "message": "Your login session has expired." + "message": "انتهت صلاحية جلسة تسجيل الدخول الخاصة بك." }, "logOutConfirmation": { - "message": "Are you sure you want to log out?" + "message": "هل أنت متأكد من أنك تريد تسجيل الخروج؟" }, "yes": { - "message": "Yes" + "message": "نعم" }, "no": { - "message": "No" + "message": "لا" }, "unexpectedError": { - "message": "An unexpected error has occurred." + "message": "حدث خطأ غير متوقع." }, "nameRequired": { - "message": "Name is required." + "message": "الاسم مطلوب." }, "addedFolder": { "message": "Added folder" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "تغيير كلمة المرور الرئيسية" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" @@ -497,7 +497,7 @@ "message": "Edited folder" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "هل أنت متأكد من حذف هذا المجلّد؟" }, "deletedFolder": { "message": "Deleted folder" @@ -509,16 +509,16 @@ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." }, "syncingComplete": { - "message": "Syncing complete" + "message": "تم إكمال المزامنة" }, "syncingFailed": { - "message": "Syncing failed" + "message": "فشلت المزامنة" }, "passwordCopied": { - "message": "Password copied" + "message": "تم نسخ كلمة المرور" }, "uri": { - "message": "URI" + "message": "عنوان الـ URI" }, "uriPosition": { "message": "URI $POSITION$", @@ -543,7 +543,7 @@ "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "تم إرسال العنصر إلى سلة المهملات" }, "overwritePassword": { "message": "Overwrite Password" @@ -558,16 +558,16 @@ "message": "Are you sure you want to overwrite the current username?" }, "searchFolder": { - "message": "Search folder" + "message": "إبحث في المجلّد" }, "searchCollection": { - "message": "Search collection" + "message": "إبحث في المجموعة" }, "searchType": { - "message": "Search type" + "message": "نوع البحث" }, "noneFolder": { - "message": "No Folder", + "message": "لا يوجد مجلّد", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -600,19 +600,19 @@ "message": "Should Bitwarden remember this password for you?" }, "notificationAddSave": { - "message": "Save" + "message": "حفظ" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "اسأل عن تحديث تسجيل الدخول الحالي" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "اسأل عن تحديث كلمة السر عند اكتشاف تغيير على الموقع الإلكتروني." }, "notificationChangeDesc": { - "message": "Do you want to update this password in Bitwarden?" + "message": "هل تريد تحديث كلمة المرور هذه في Bitwarden؟" }, "notificationChangeSave": { - "message": "Update" + "message": "تحديث" }, "enableContextMenuItem": { "message": "Show context menu options" @@ -634,29 +634,29 @@ "message": "Change the application's color theme." }, "dark": { - "message": "Dark", + "message": "داكن", "description": "Dark color" }, "light": { - "message": "Light", + "message": "فاتح", "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "داكن مُشمس", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Export vault" + "message": "تصدير الخزنة" }, "fileFormat": { - "message": "File Format" + "message": "صيغة الملف" }, "warning": { - "message": "WARNING", + "message": "تحذير", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "تأكيد تصدير الخزنة" }, "exportWarningDesc": { "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." @@ -1396,23 +1396,23 @@ "description": "Verb form: to make secure or inaccesible by" }, "trash": { - "message": "Trash", + "message": "سلة المهملات", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "حذف العنصر بشكل دائم" }, "permanentlyDeleteItemConfirmation": { - "message": "Are you sure you want to permanently delete this item?" + "message": "هل أنت متأكد من أنك تريد حذف هذا العنصر بشكل دائم؟" }, "permanentlyDeletedItem": { "message": "Permanently Deleted item" }, "restoreItem": { - "message": "Restore Item" + "message": "استعادة العنصر" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" @@ -1496,7 +1496,7 @@ "message": "Your password hint cannot be the same as your password." }, "ok": { - "message": "Ok" + "message": "موافق" }, "desktopSyncVerificationTitle": { "message": "Desktop sync verification" @@ -1580,7 +1580,7 @@ } }, "send": { - "message": "Send", + "message": "إرسال", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { @@ -1622,7 +1622,7 @@ "message": "Remove Password" }, "delete": { - "message": "Delete" + "message": "حذف" }, "removedPassword": { "message": "Removed Password" @@ -1831,10 +1831,10 @@ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." }, "hours": { - "message": "Hours" + "message": "ساعات" }, "minutes": { - "message": "Minutes" + "message": "دقائق" }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", @@ -1874,31 +1874,31 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "مغادرة المؤسسة" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "إزالة كلمة المرور الرئيسية" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "تمت إزالة كلمة المرور الرئيسية." }, "leaveOrganizationConfirmation": { - "message": "Are you sure you want to leave this organization?" + "message": "هل أنت متأكد من أنك تريد مغادرة هذه المؤسسة؟" }, "leftOrganization": { - "message": "You have left the organization." + "message": "لقد غادرت المؤسسة." }, "toggleCharacterCount": { "message": "Toggle character count" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "انتهت مدة جلستك. يرجى العودة ومحاولة تسجيل الدخول مرة أخرى." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "جاري تصدير الخزنة الشخصية" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "سيتم تصدير فقط عناصر الخزنة الشخصية المرتبطة بـ $EMAIL$. لن يتم إدراج عناصر خزنة المؤسسة.", "placeholders": { "email": { "content": "$1", @@ -1907,16 +1907,16 @@ } }, "error": { - "message": "Error" + "message": "خطأ" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "إعادة إنشاء اسم المستخدم" }, "generateUsername": { - "message": "Generate Username" + "message": "إنشاء اسم المستخدم" }, "usernameType": { - "message": "Username Type" + "message": "نوع اسم المستخدم" }, "plusAddressedEmail": { "message": "Plus Addressed Email", @@ -1932,22 +1932,22 @@ "message": "Use your domain's configured catch-all inbox." }, "random": { - "message": "Random" + "message": "عشوائي" }, "randomWord": { - "message": "Random Word" + "message": "كلمات عشوائية" }, "websiteName": { - "message": "Website Name" + "message": "اسم الموقع الإلكتروني" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "ما الذي ترغب في توليده؟" }, "passwordType": { - "message": "Password Type" + "message": "نوع كلمة المرور" }, "service": { - "message": "Service" + "message": "الخدمة" }, "forwardedEmail": { "message": "Forwarded Email Alias" @@ -1956,32 +1956,32 @@ "message": "Generate an email alias with an external forwarding service." }, "hostname": { - "message": "Hostname", + "message": "اسم المضيف", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "رمز الوصول للـ API" }, "apiKey": { - "message": "API Key" + "message": "مفتاح الـ API" }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "الاشتراك المميز مطلوب" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "تم تعطيل المؤسسة." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "لا يمكن الوصول للعناصر في المؤسسات المعطلة. اتصل بمدير مؤسستك للحصول على المساعدة." }, "cardBrandMir": { "message": "Mir" }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "جاري تسجيل الدخول إلى $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -1990,12 +1990,12 @@ } }, "settingsEdited": { - "message": "Settings have been edited" + "message": "تم تعديل الإعدادات" }, "environmentEditedClick": { "message": "Click here" }, "environmentEditedReset": { - "message": "to reset to pre-configured settings" + "message": "لإعادة تعيين الإعدادات المُعدة مسبقاً" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 914d56862c3..b6c8b93db04 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -7,11 +7,11 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Bütün cihazlarınız üçün təhlükəsiz və ödənişsiz bir parol meneceri.", + "message": "Bütün cihazlarınız üçün güvənli və ödənişsiz bir parol meneceri.", "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Təhlükəsiz anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." }, "createAccount": { "message": "Hesab yarat" @@ -86,7 +86,7 @@ "message": "Nömrəni kopyala" }, "copySecurityCode": { - "message": "Təhlükəsizlik kodunu kopyala" + "message": "Güvənlik kodunu kopyala" }, "autoFill": { "message": "Avto-doldurma" @@ -107,7 +107,7 @@ "message": "Anbarınıza giriş edin" }, "autoFillInfo": { - "message": "Hazırkı səyyah vərəqi üçün avto-doldurulacaq giriş məlumatları yoxdur." + "message": "Hazırkı brauzer vərəqi üçün avto-doldurulacaq giriş məlumatları yoxdur." }, "addLogin": { "message": "Hesab əlavə et" @@ -336,7 +336,7 @@ "message": "Gözəl bir rəy ilə bizə dəstək ola bilərsiniz!" }, "browserNotSupportClipboard": { - "message": "Veb səyyahınız lövhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayın." + "message": "Veb brauzeriniz lövhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayın." }, "verifyIdentity": { "message": "Kimliyi təsdiqləyin" @@ -361,7 +361,7 @@ } }, "invalidMasterPassword": { - "message": "Etibarsız ana parol" + "message": "Yararsız ana parol" }, "vaultTimeout": { "message": "Anbara müraciət bitəcək" @@ -406,13 +406,13 @@ "message": "Sistem kilidlənəndə" }, "onRestart": { - "message": "Səyyah yenidən başladılanda" + "message": "Brauzer yenidən başladılanda" }, "never": { "message": "Heç vaxt" }, "security": { - "message": "Təhlükəsizlik" + "message": "Güvənlik" }, "errorOccurred": { "message": "Bir xəta baş verdi" @@ -421,7 +421,7 @@ "message": "E-poçt ünvanı lazımdır." }, "invalidEmail": { - "message": "Etibarsız e-poçt ünvanı." + "message": "Yararsız e-poçt ünvanı." }, "masterPasswordRequired": { "message": "Ana parol lazımdır." @@ -445,7 +445,7 @@ "message": "Təsdiq kodu lazımdır." }, "invalidVerificationCode": { - "message": "Etibarsız təsdiqləmə kodu" + "message": "Yararsız təsdiqləmə kodu" }, "valueCopied": { "message": "$VALUE$ kopyalandı", @@ -491,7 +491,7 @@ "message": "Ana parolunuzu bitwarden.com veb anbarında dəyişdirə bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?" }, "twoStepLoginConfirmation": { - "message": "İki mərhələli giriş, təhlükəsizlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da təhlükəsiz edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" + "message": "İki mərhələli giriş, güvənlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da güvənli edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" }, "editedFolder": { "message": "Qovluğa düzəliş edildi" @@ -506,7 +506,7 @@ "message": "Başlanğıc təlimatı" }, "gettingStartedTutorialVideo": { - "message": "Səyyah genişləndirməsindən necə daha yaxşı faydalanmağı öyrənmək üçün başlanğıc təlimatına baxa bilərsiniz." + "message": "Brauzer genişləndirməsindən necə daha yaxşı faydalanmağı öyrənmək üçün başlanğıc təlimatına baxa bilərsiniz." }, "syncingComplete": { "message": "Eyniləşdirmə tamamlandı" @@ -609,10 +609,10 @@ "message": "Bir veb saytda dəyişiklik aşkarlananda giriş parolunun güncəllənməsini soruşun." }, "notificationChangeDesc": { - "message": "Bu parolu \"Bitwarden\"də yeniləmək istəyirsiniz?" + "message": "Bu parolu \"Bitwarden\"də güncəlləmək istəyirsiniz?" }, "notificationChangeSave": { - "message": "Bəli, indi yenilə" + "message": "Güncəllə" }, "enableContextMenuItem": { "message": "Konteks menyu seçimlərini göstər" @@ -659,7 +659,7 @@ "message": "Anbarın ixracını təsdiqləyin" }, "exportWarningDesc": { - "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı saxlamamalı və etibarsız yollarla (e-poçt kimi) göndərməməlisiniz. Bu faylı işiniz bitdikdən sonra dərhal silin." + "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı, güvənli olmayan kanallar üzərində saxlamamalı və ya göndərməməlisiniz (e-poçt kimi). Bu faylı işiniz bitdikdən sonra dərhal silin." }, "encExportKeyWarningDesc": { "message": "Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız." @@ -747,7 +747,7 @@ "message": "Özəllik əlçatmazdır" }, "updateKey": { - "message": "Şifrələmə açarınızı yeniləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." + "message": "Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." }, "premiumMembership": { "message": "Premium üzvlük" @@ -858,7 +858,7 @@ "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, "insertU2f": { - "message": "Təhlükəsizlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." + "message": "Güvənlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." }, "webAuthnNewTab": { "message": "WebAuthn 2FA təsdiqləməsini başladın. Yeni bir vərəq açmaq üçün aşağıdakı düyməyə klikləyin və yeni vərəqdəki təlimatları izləyin." @@ -873,16 +873,16 @@ "message": "Giriş edilə bilmir" }, "noTwoStepProviders": { - "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu səyyah tərəfindən dəstəklənmir." + "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli provayderlərin heç biri bu brauzer tərəfindən dəstəklənmir." }, "noTwoStepProviders2": { - "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb səyyah istifadə edin və/və ya veb səyyahlara (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən təchizatçılar əlavə edin." + "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb brauzer istifadə edin və/və ya veb brauzerlərə (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən provayderlər əlavə edin." }, "twoStepOptions": { "message": "İki mərhələli giriş seçimləri" }, "recoveryCodeDesc": { - "message": "İki mərhələli təsdiqləmə təchizatçılarına müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxara bilərsiniz." + "message": "İki mərhələli təsdiqləmə provayderlərinə müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli provayderləri sıradan çıxara bilərsiniz." }, "recoveryCodeTitle": { "message": "Bərpa kodu" @@ -895,24 +895,24 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP təhlükəsizlik açarı" + "message": "YubiKey OTP güvənlik açarı" }, "yubiKeyDesc": { "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." }, "duoDesc": { - "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan təhlükəsizlik açarı istifadə edin." + "message": "Hesabınıza müraciət etmək üçün istənilən bir WebAuthn fəallaşdırılmış güvənlik açarı istifadə edin." }, "emailTitle": { "message": "E-poçt" @@ -1034,7 +1034,7 @@ "message": "Təsdiqləmə kodunu alacağınız e-poçtu yoxlamaq üçün bu pəncərə xaricində bir yerə klikləsəniz bu pəncərə bağlanacaq. Bu pəncərənin bağlanmaması üçün yeni bir pəncərədə açmaq istəyirsiniz?" }, "popupU2fCloseMessage": { - "message": "Bu səyyah bu açılan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək üçün bu açılan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?" + "message": "Bu brauzer bu açılan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək üçün bu açılan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?" }, "enableFavicon": { "message": "Veb sayt nişanlarını göstər" @@ -1103,7 +1103,7 @@ "message": "Dekabr" }, "securityCode": { - "message": "Təhlükəsizlik kodu" + "message": "Güvənlik kodu" }, "ex": { "message": "məs." @@ -1142,7 +1142,7 @@ "message": "Şirkət" }, "ssn": { - "message": "Sosial təhlükəsizlik nömrəsi" + "message": "Sosial güvənlik nömrəsi" }, "passportNumber": { "message": "Pasport nömrəsi" @@ -1190,7 +1190,7 @@ "message": "Girişlər" }, "typeSecureNote": { - "message": "Təhlükəsizlik qeydi" + "message": "Güvənli qeyd" }, "typeCard": { "message": "Kart" @@ -1226,7 +1226,7 @@ "message": "Girişlər" }, "secureNotes": { - "message": "Təhlükəsizlik qeydləri" + "message": "Güvənli qeydlər" }, "clear": { "message": "Təmizlə", @@ -1308,18 +1308,18 @@ "message": "İlkin" }, "dateUpdated": { - "message": "Yeniləndi", + "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, "datePasswordUpdated": { - "message": "Parol yeniləndi", + "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" }, "neverLockWarning": { "message": "\"Heç vaxt\" seçimini istifadə etmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq tənzimləsəniz, anbarınızın şifrələmə açarı cihazınızda saxlanılacaq. Bu seçimi istifadə etsəniz, cihazınızı daha yaxşı mühafizə etməlisiniz." }, "noOrganizationsList": { - "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə təhlükəsiz şəkildə paylaşmağınızı təmin edir." + "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə güvənli şəkildə paylaşmağınızı təmin edir." }, "noCollectionsInList": { "message": "Siyahılanacaq heç bir kolleksiya yoxdur." @@ -1362,7 +1362,7 @@ "message": "PIN kod lazımdır." }, "invalidPin": { - "message": "Etibarsız PIN kod." + "message": "Yararsız PIN kod." }, "unlockWithBiometrics": { "message": "Biometriklərlə kilidi açın" @@ -1371,10 +1371,10 @@ "message": "Masaüstündən təsdiq gözlənilir" }, "awaitDesktopDesc": { - "message": "Səyyah üçün biometrikləri fəallaşdırmaq üçün zəhmət olmasa Bitwarden masaüstü tətbiqində biometrik istifadəsini təsdiqləyin." + "message": "Brauzer üçün biometrikləri fəallaşdırmaq üçün zəhmət olmasa Bitwarden masaüstü tətbiqində biometrik istifadəsini təsdiqləyin." }, "lockWithMasterPassOnRestart": { - "message": "Səyyah yenidən başladılanda ana parol ilə kilidlə" + "message": "Brauzer yenidən başladılanda ana parolla kilidlə" }, "selectOneCollection": { "message": "Ən azı bir kolleksiya seçməlisiniz." @@ -1505,10 +1505,10 @@ "message": "Zəhmət olmasa masaüstü tətbiqin bu barmaq izini gördüyünü təsdiqləyin:" }, "desktopIntegrationDisabledTitle": { - "message": "Səyyah inteqrasiyası fəal deyil" + "message": "Brauzer inteqrasiyası fəal deyil" }, "desktopIntegrationDisabledDesc": { - "message": "Səyyah inteqrasiyası Bitwarden masaüstü tətbiqində fəal deyil. Zəhmət olmasa masaüstü tətbiqinin tənzimləmələrində fəallaşdırın." + "message": "Brauzer inteqrasiyası Bitwarden masaüstü tətbiqində fəal deyil. Zəhmət olmasa masaüstü tətbiqinin tənzimləmələrində fəallaşdırın." }, "startDesktopTitle": { "message": "Bitwarden masaüstü tətbiqini başlat" @@ -1523,7 +1523,7 @@ "message": "Əməliyyat, masaüstü tətbiqi tərəfindən ləğv edildi" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Masaüstü tətbiqi, təhlükəsiz rabitə kanalını qüvvədən saldı. Bu əməliyyatı yenidən icra edin" + "message": "Masaüstü tətbiqi, güvənli rabitə kanalını yararsız etdi. Bu əməliyyatı yenidən icra edin" }, "nativeMessagingInvalidEncryptionTitle": { "message": "Masaüstü rabitə əlaqəsi kəsildi" @@ -1538,19 +1538,19 @@ "message": "Biometriklə fəal deyil" }, "biometricsNotEnabledDesc": { - "message": "Səyyah biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir." + "message": "Brauzer biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir." }, "biometricsNotSupportedTitle": { "message": "Biometriklər dəstəklənmir" }, "biometricsNotSupportedDesc": { - "message": "Səyyah biometrikləri bu cihazda dəstəklənmir" + "message": "Brauzer biometrikləri bu cihazda dəstəklənmir." }, "nativeMessaginPermissionErrorTitle": { "message": "İcazə verilmədi" }, "nativeMessaginPermissionErrorDesc": { - "message": "Bitwarden masaüstü tətbiqi ilə əlaqə qurma icazəsi olmadan, səyyah genişləndirməsində biometrikləri təmin edə bilmərik. Zəhmət olmasa yenidən sınayın." + "message": "Bitwarden masaüstü tətbiqi ilə əlaqə qurma icazəsi olmadan, brauzer genişləndirməsində biometrikləri təmin edə bilmərik. Zəhmət olmasa yenidən sınayın." }, "nativeMessaginPermissionSidebarTitle": { "message": "İcazə tələb xətası" @@ -1810,13 +1810,13 @@ "message": "Bu özəlliyi istifadə etmək üçün e-poçtunuzu təsdiqləməlisiniz. E-poçtunuzu veb anbarında təsdiqləyə bilərsiniz." }, "updatedMasterPassword": { - "message": "Yenilənmiş ana parol" + "message": "Güncəllənmiş ana parol" }, "updateMasterPassword": { - "message": "Ana parolu yenilə" + "message": "Ana parolu güncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "resetPasswordPolicyAutoEnroll": { "message": "Avtomatik qeydiyyat" @@ -1923,7 +1923,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "E-poçt təchizatçınızın alt ünvan özəlliklərini istifadə et." + "message": "E-poçt provayderinizin alt ünvan özəlliklərini istifadə et." }, "catchallEmail": { "message": "Catch-all E-poçt" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index f8ba6238b8f..8c2d1907aac 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -53,13 +53,13 @@ "message": "Укладка" }, "vault": { - "message": "Vault" + "message": "Сховішча" }, "myVault": { "message": "Маё сховішча" }, "allVaults": { - "message": "All Vaults" + "message": "Усе сховішчы" }, "tools": { "message": "Інструменты" @@ -95,16 +95,16 @@ "message": "Стварыць пароль (з капіяваннем)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Скапіяваць назву карыстальніцкага пароля" }, "noMatchingLogins": { "message": "Няма падыходных уліковых даных." }, "unlockVaultMenu": { - "message": "Unlock your vault" + "message": "Разблакіраваць сховішча" }, "loginToVaultMenu": { - "message": "Log in to your vault" + "message": "Увайсці ў сховішча" }, "autoFillInfo": { "message": "Няма ўліковых даных, даступных для аўтазапаўнення ў бягучую ўкладку браўзера." @@ -128,19 +128,19 @@ "message": "Працягнуць" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "Адправіць праверачны код на электронную пошту" }, "sendCode": { - "message": "Send Code" + "message": "Адправіць код" }, "codeSent": { - "message": "Code Sent" + "message": "Код адпраўлены" }, "verificationCode": { "message": "Код праверкі" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "Пацвердзіце сваю асобу для працягу." }, "account": { "message": "Уліковы запіс" @@ -236,16 +236,16 @@ "message": "Даўжыня" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Вялікія літары (A-Z)" }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Маленькія літары (a-z)" }, "numbers": { - "message": "Numbers (0-9)" + "message": "Лічбы (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Спецыяльныя сімвалы (!@#$%^&*)" }, "numWords": { "message": "Колькасць слоў" @@ -339,7 +339,7 @@ "message": "Ваш вэб-браўзер не падтрымлівае капіяванне даных у буфер абмену. Скапіюйце іх уручную." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Праверыць асобу" }, "yourVaultIsLocked": { "message": "Ваша сховішча заблакіравана. Каб працягнуць, увядзіце асноўны пароль." @@ -424,13 +424,13 @@ "message": "Памылковы адрас электроннай пошты." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "Патрабуецца асноўны пароль." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Неабходна паўторна ўвесці асноўны пароль." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў." }, "masterPassDoesntMatch": { "message": "Асноўныя паролі не супадаюць." @@ -445,7 +445,7 @@ "message": "Патрабуецца код праверкі." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "Памылковы праверачны код" }, "valueCopied": { "message": "$VALUE$ скапіяваны(-а)", @@ -552,10 +552,10 @@ "message": "Вы ўпэўнены, што хочаце перазапісаць бягучы пароль?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Перазапісаць імя карыстальніка" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "Вы ўпэўнены, што хочаце перазапісаць бягучае імя карыстальніка?" }, "searchFolder": { "message": "Пошук у папцы" @@ -571,22 +571,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Пытацца пры дадаванні лагіна" }, "addLoginNotificationDesc": { "message": "Апавяшчэнне аб даданні ўліковых даных аўтаматычна прапануе вам захаваць новыя ўліковыя даныя ў сховішчы." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Паказваць карткі на старонцы з укладкамі" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Паказваць спіс элементаў на старонцы з укладкамі для лёгкага аўтазапаўнення." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Паказваць пасведчанні на старонцы з укладкамі" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Паказваць пасведчанні элементаў на старонцы з укладкамі для лёгкага аўтазапаўнення." }, "clearClipboard": { "message": "Ачыстка буфера абмену", @@ -603,10 +603,10 @@ "message": "Так, захаваць зараз" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Пытацца пра абнаўленні існуючых даных уваходу" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Пытаць пра абнаўленне пароля ўваходу пры выяўленні змяненняў на вэб-сайце." }, "notificationChangeDesc": { "message": "Вы хочаце абнавіць гэты пароль у Bitwarden?" @@ -615,10 +615,10 @@ "message": "Так, абнавіць зараз" }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Паказваць параметры кантэкстнага меню" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Выкарыстоўваць падвоены націск для доступу да генератара пароля і супастаўлення лагінаў для вэб-сайтаў. " }, "defaultUriMatchDetection": { "message": "Выяўленне супадзення URI па змаўчанні", @@ -662,10 +662,10 @@ "message": "Экспартуемы файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць ці адпраўляць па небяспечным каналам (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "Падчас экспартавання даныя шыфруюцца з дапамогай ключа шыфравання ўліковага запісу. Калі вы калі-небудзь зменіце ключ шыфравання ўліковага запісу, вам неабходна будзе экспартаваць даныя паўторна, паколькі вы не зможаце расшыфраваць гэты файл экспартавання." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "Ключы шыфравання з'яўляюцца ўнікальнымі для кожнага ўліковага запісу Bitwarden, таму нельга імпартаваць зашыфраванае сховішча ў іншы ўліковы запіс." }, "exportMasterPassword": { "message": "Увядзіце ваш асноўны пароль для экспарту даных са сховішча." @@ -674,19 +674,19 @@ "message": "Абагуленыя" }, "learnOrg": { - "message": "Learn about organizations" + "message": "Даведацца пра арганізацыі" }, "learnOrgConfirmation": { - "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + "message": "Bitwarden дазваляе абагуліць элементы вашага сховішча з іншымі карыстальнікамі, выкарыстоўваючы арганізацыю. Хочаце наведаць сайт bitwarden.com, каб даведацца больш?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Перамясціць у арганізацыю" }, "share": { "message": "Абагуліць" }, "movedItemToOrg": { - "message": "$ITEMNAME$ moved to $ORGNAME$", + "message": "$ITEMNAME$ перамешчана ў $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -699,7 +699,7 @@ } }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + "message": "Выберыце арганізацыю, у якую вы хочаце перамясціць гэты элемент. Пры перамяшчэнні ў арганізацыю ўсе правы ўласнасці на дадзены элемент пяройдуць да гэтай арганізацыі. Вы больш не будзеце адзіным уласнікам гэтага элемента пасля яго перамяшчэння." }, "learnMore": { "message": "Даведацца больш" @@ -810,13 +810,13 @@ "message": "Абнаўленне завершана" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Капіяваць TOTP аўтаматычна" }, "disableAutoTotpCopyDesc": { "message": "Калі да вашых уліковых даных прымацаваны ключ праверкі сапраўднасці, то код пацвярджэння TOTP будзе скапіяваны пры аўтазапаўненні ўліковых даных." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Запытваць біяметрыю пры запуску" }, "premiumRequired": { "message": "Патрабуецца прэміяльны статус" @@ -861,13 +861,13 @@ "message": "Устаўце ваш ключ бяспекі ў порт USB вашага камп'ютара. Калі на ім ёсць кнопка, націсніце на яе." }, "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + "message": "Каб пачаць праверку WebAuthn 2FA, націсніце кнопку знізу для адкрыцця новай укладкі і прытрымлівайцеся інструкцый, якія паказаны ў новай укладцы." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Адкрыць новую ўкладку" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Аўтэнтыфікацыя WebAuthn" }, "loginUnavailable": { "message": "Уваход недаступны" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Выкарыстоўвайце любы ключ з падтрымкай WebAuthn для доступу да свайго ўліковага запісу." }, "emailTitle": { "message": "Электронная пошта" @@ -963,22 +963,22 @@ "message": "Гэта эксперыментальная функцыя. Выкарыстоўвайце на свой страх і рызыку." }, "defaultAutoFillOnPageLoad": { - "message": "Default autofill setting for login items" + "message": "Прадвызначана налада аўтазапаўнення для элементаў уваходу" }, "defaultAutoFillOnPageLoadDesc": { - "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + "message": "Вы можаце выключыць аўтазапаўненне на старонцы загрузцы для асобных элементаў уваходу ў меню \"Рэдагаваць\"." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Аўтазапаўненне пры загрузцы (калі ўключана ў параметрах праграмы)" }, "autoFillOnPageLoadUseDefault": { - "message": "Use default setting" + "message": "Выкарыстоўваць прадвызначаныя налады" }, "autoFillOnPageLoadYes": { - "message": "Auto-fill on page load" + "message": "Аўтазапаўненне пры загрузцы старонкі" }, "autoFillOnPageLoadNo": { - "message": "Do not auto-fill on page load" + "message": "Не аўтазапаўняць пры загрузцы старонкі" }, "commandOpenPopup": { "message": "Адкрыць сховішча ва ўсплывальным акне" @@ -996,7 +996,7 @@ "message": "Заблакіраваць сховішча" }, "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." + "message": "Прыватны рэжым - гэта эксперыментальная функцыя і некаторыя магчымасці ў ім абмежаваны." }, "customFields": { "message": "Карыстальніцкія палі" @@ -1023,11 +1023,11 @@ "message": "Лагічнае" }, "cfTypeLinked": { - "message": "Linked", + "message": "Звязана", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Звязанае значэнне", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { @@ -1037,16 +1037,16 @@ "message": "Гэты браўзар не можа апрацоўваць запыты U2F у гэтым усплывальным акне. Вы хочаце адкрыць гэта ўсплывальнае акно ў новым акне, каб мець магчымасць увайсці ў сістэму, выкарыстоўваючы U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Паказваць значкі вэб-сайтаў" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Паказваць распазнавальны відарыс побач з кожным з кожным лагінам." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Паказваць лічыльнік на значку" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Паказвае колькасць уваходаў для бягучай вэб-старонкі." }, "cardholderName": { "message": "Імя ўладальніка карткі" @@ -1133,7 +1133,7 @@ "message": "Прозвішча" }, "fullName": { - "message": "Full Name" + "message": "Поўнае імя" }, "identityName": { "message": "Імя" @@ -1252,7 +1252,7 @@ "description": "Domain name. Ex. website.com" }, "domainName": { - "message": "Domain name", + "message": "Імя дамена", "description": "Domain name. Ex. website.com" }, "host": { @@ -1365,13 +1365,13 @@ "message": "Памылковы PIN-код." }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Разблакіраваць з дапамогай біяметрыі" }, "awaitDesktop": { - "message": "Awaiting confirmation from desktop" + "message": "Чаканне пацвярджэння з камп'ютара" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Для ўключэння біяметрыі ў браўзеры, пацвердзіце гэта ў праграме Bitwarden на сваім камп'ютары." }, "lockWithMasterPassOnRestart": { "message": "Блакіраваць асноўным паролем пры перазапуску браўзера" @@ -1484,7 +1484,7 @@ "message": "Ставіўшы гэты сцяжок вы пагаджаецеся з наступным:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Умовы выкарыстання і Палітыка прыватнасці не былі пацверджаны." }, "termsOfService": { "message": "Умовы выкарыстання" @@ -1493,85 +1493,85 @@ "message": "Палітыка прыватнасці" }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "Падказка для пароля не можа супадаць з паролем." }, "ok": { "message": "ОК" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Праверка сінхранізацыі на камп'ютары" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Праверце, ці паказвае праграма на камп'ютары гэты адбітак: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Інтэграцыя з браўзерам не ўключана" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Інтэграцыя з браўзерам не ўключана ў праграме Bitwarden для камп'ютара. Уключыце гэты параметр у наладах праграмы." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Запусціць праграму Bitwarden на камп'ютары" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "Для разблакіроўкі па біяметрыі неабходна запусціць праграму Bitwarden на камп'ютары." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Не атрымалася ўключыць біяметрыю" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "Дзеянне было скасавана праграмай на камп'ютары" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "Праграма для камп'ютара не змагла стварыць бяспечны канал сувязі. Паспрабуйце паўтарыць гэту аперацыю яшчэ раз" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Сувязь з камп'ютарам перарвана" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "Праграма для камп'ютара выкарыстоўвае іншы ўліковы запіс. Пераканайцеся, што гэтыя праграмы выкарыстоўваюць аднолькавы ўліковы запіс." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "Неадпаведнасць уліковых запісаў" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Біяметрыя не ўключана" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Для актывацыі біяметрыі ў браўзеры спачатку неабходна ўключыць біяметрыю ў праграме на камп'ютары." }, "biometricsNotSupportedTitle": { - "message": "Biometrics not supported" + "message": "Біяметрыя не падтрымліваецца" }, "biometricsNotSupportedDesc": { - "message": "Browser biometrics is not supported on this device." + "message": "Біяметрыя ў браўзеры не падтрымліваецца на гэтай прыладзе." }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Дазволы не прадастаўлены" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Без дазволу на злучэнне з праграмай Bitwarden на камп'ютары немагчыма будзе выкарыстоўваць біяметрыю ў пашырэнні браўзера. Калі ласка, паспрабуйце яшчэ раз." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "Памылка пры запыце дазволу" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Гэта дзеянне немагчыма выканаць у бакавой панэлі. Паспрабуйце паўтарыць гэта дзеянне ва ўсплывальным або асобным акне." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." + "message": "У адпаведнасці з карпаратыўнай палітыкай вам забаронена захоўваць элементы ў асабістым сховішчы. Змяніце параметры ўласнасці на арганізацыю і выберыце з даступных калекцый." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Палітыка арганізацыі ўплывае на вашы параметры ўласнасці." }, "excludedDomains": { - "message": "Excluded domains" + "message": "Выключаныя дамены" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Праграма не будзе прапаноўваць захаваць падрабязнасці ўваходу для гэтых даменаў. Вы павінны абнавіць старонку, каб змяненні пачалі дзейнічаць." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ не з'яўляецца правільным даменам", "placeholders": { "domain": { "content": "$1", @@ -1584,105 +1584,105 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Пошук Send'аў", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Дадаць Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Тэкст" }, "sendTypeFile": { - "message": "File" + "message": "Файл" }, "allSends": { - "message": "All Sends", + "message": "Усе Send’ы", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Дасягнута максімальная колькасць доступаў", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "expired": { - "message": "Expired" + "message": "Пратэрмінавана" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "Чакаецца выдаленне" }, "passwordProtected": { - "message": "Password protected" + "message": "Абаронена паролем" }, "copySendLink": { - "message": "Copy Send link", + "message": "Капіяваць спасылку Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "Выдаліць пароль" }, "delete": { - "message": "Delete" + "message": "Выдаліць" }, "removedPassword": { - "message": "Removed Password" + "message": "Пароль выдалены" }, "deletedSend": { - "message": "Deleted Send", + "message": "Выдалены Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Send link", + "message": "Спасылка Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Disabled" + "message": "Адключана" }, "removePasswordConfirmation": { - "message": "Are you sure you want to remove the password?" + "message": "Вы ўпэўнены, што хочаце выдаліць пароль?" }, "deleteSend": { - "message": "Delete Send", + "message": "Выдаліць Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "Вы ўпэўнены, што хочаце выдаліць гэты Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Edit Send", + "message": "Рэдагаваць Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeHeader": { - "message": "What type of Send is this?", + "message": "Які гэта тып Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNameDesc": { - "message": "A friendly name to describe this Send.", + "message": "Зразумелая назва для апісання гэтага Send'a.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "Файл, які вы хочаце адправіць." }, "deletionDate": { - "message": "Deletion Date" + "message": "Дата выдалення" }, "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "message": "Send будзе незваротна выдалены ў азначаныя дату і час.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Дата завяршэння" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Калі зададзена, то доступ да гэтага Send міне ў азначаную дату і час.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "1 дзень" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ дзён", "placeholders": { "days": { "content": "$1", @@ -1691,153 +1691,153 @@ } }, "custom": { - "message": "Custom" + "message": "Карыстальніцкі" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Максімальная колькасць доступаў" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Калі зададзена, то карыстальнікі больш не змогуць атрымаць доступ да гэтага Send пасля таго, як будзе дасягнута максімальная колькасць зваротаў.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Па магчымасці запытваць у карыстальнікаў пароль для доступу да гэтага Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "message": "Прыватныя нататкі пра гэты Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Disable this Send so that no one can access it.", + "message": "Адключыць гэты Send, каб ніхто не змог атрымаць да яго доступ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copy this Send's link to clipboard upon save.", + "message": "Скапіяваць спасылку на гэты Send у буфер абмену пасля захавання.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "Тэкст, які вы хочаце адправіць." }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Прадвызначана хаваць тэкст гэтага Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current Access Count" + "message": "Бягучая колькасць доступаў" }, "createSend": { - "message": "Create New Send", + "message": "Стварыць новы Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "New Password" + "message": "Новы пароль" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send адключаны", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "У адпаведнасці з карпаратыўнай палітыкай, вы можаце выдаліць толькі бягучы Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Created Send", + "message": "Створаны Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Edited Send", + "message": "Адрэдагаваны Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "Для выбару файла неабходна адкрыць пашырэнне на бакавой панэлі (калі ёсць такая магчымасць) або перайсці ў новае акно, націснуўшы на гэты банэр." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "Для выбару файла з выкарыстаннем Firefox неабходна адкрыць пашырэнне на бакавой панэлі або перайсці ў новае акно, націснуўшы на гэты банэр." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Для выбару файла з выкарыстаннем Safari неабходна перайсці ў асобнае акно, націснуўшы на гэты банэр." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Перад тым, як пачаць" }, "sendFirefoxCustomDatePopoutMessage1": { - "message": "To use a calendar style date picker", + "message": "Для выкарыстання каляндарнага стылю выбару даты", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage2": { - "message": "click here", + "message": "націсніце тут", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" }, "sendFirefoxCustomDatePopoutMessage3": { - "message": "to pop out your window.", + "message": "для адкрыцця ў асобным акне.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "Азначаная дата завяршэння тэрміну дзеяння з'яўляецца няправільнай." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Азначаная дата выдалення з'яўляецца няправільнай." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Неабходна азначыць дату і час завяршэння тэрміну дзеяння." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Патрабуюцца дата і час выдалення." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "Адбылася памылка пры захаванні дат выдалення і завяршэння тэрміну дзеяння." }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Схаваць мой адрас электроннай пошты ад атрымальнікаў." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Адна або больш палітык арганізацыі ўплываюць на параметры Send." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Паўторны запыт галоўнага пароля" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "Пацвярджэнне асноўнага пароля" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "Гэта дзеянне абаронена. Для працягу, калі ласка, паўторна ўвядзіце свой пароль, каб пацвердзіць вашу асобу." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Патрабуецца праверка электроннай пошты" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Вы павінны праверыць свой адрас электроннай пошты, каб выкарыстоўваць гэту функцыю. Вы можаце гэта зрабіць з дапамогай вэб-сховішча." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Галоўны пароль абноўлены" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Абнавіць галоўны пароль" }, "updateMasterPasswordWarning": { - "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Ваш галоўны пароль не так даўно быў зменены адміністратарам вашай арганізацыі. Для таго, каб атрымаць доступ да вашага сховішча, вы павінны абнавіць яго зараз. У выніку бягучы сеанс будзе завершаны і вам неабходна будзе паўторна ўвайсці. Сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Аўтаматычная рэгістрацыя" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Гэта арганізацыя мае карпаратыўную палітыку, якая будзе аўтаматычна зарэгіструе ваша скіданне пароля. Рэгістрацыя дазволіць адміністратарам арганізацыі змяняць ваш асноўны пароль." }, "selectFolder": { - "message": "Select folder..." + "message": "Выбраць папку..." }, "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "message": "Для завяршэння ўваходу праз SSO, задайце асноўны пароль для доступу і абароны вашаго сховішча." }, "hours": { - "message": "Hours" + "message": "Гадзіны" }, "minutes": { - "message": "Minutes" + "message": "Хвіліны" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча $HOURS$ гадз. і $MINUTES$ хв.", "placeholders": { "hours": { "content": "$1", @@ -1850,22 +1850,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Экспартаванне сховішча адключана" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "Адна або больш палітык арганізацыі не дазваляюць вам экспартаваць асабістае сховішча." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Не атрымалася ідэнтыфікаваць дзеючы элемент формы. Паспрабуйце замест гэтага праверыць HTML." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Не знойдзены ўнікальны ідэнтыфікатар." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ выкарыстоўвае SSO з уласным серверам ключоў. Для аўтарызацыі ўдзельнікам гэтай арганізацыі больш няма неабходнасці выкарыстоўваць асноўны пароль.", "placeholders": { "organization": { "content": "$1", @@ -1874,31 +1874,31 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Пакінуць арганізацыю" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Выдаліць асноўны пароль" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Асноўны пароль выдалены." }, "leaveOrganizationConfirmation": { - "message": "Are you sure you want to leave this organization?" + "message": "Вы ўпэўнены, што хочаце пакінуць гэту арганізацыю?" }, "leftOrganization": { - "message": "You have left the organization." + "message": "Вы пакінулі арганізацыю." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Пераключыць колькасць сімвалаў" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Час вашага сеанса завяршыўся. Аўтарызуйцеся паўторна." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Экспартаванне асабістага сховішча" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Толькі элементы асабістага сховішча, якія звязаны з $EMAIL$ будуць экспартаваныя. Элементы сховішча арганізацыі не будуць уключаны.", "placeholders": { "email": { "content": "$1", @@ -1907,81 +1907,81 @@ } }, "error": { - "message": "Error" + "message": "Памылка" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Паўторна згенерыраваць імя карыстастальніка" }, "generateUsername": { - "message": "Generate Username" + "message": "Генерыраваць імя карыстальніка" }, "usernameType": { - "message": "Username Type" + "message": "Тып імя карыстальніка" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Адрасы электроннай пошты з плюсам", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Выкарыстоўваць магчымасці пададрасацыі вашага пастаўшчыка паслуг электроннай пошты." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Адрас для ўсёй пошты дамена" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Выкарыстоўвайце сваю сканфігураваную скрыню для ўсё пошты дамена." }, "random": { - "message": "Random" + "message": "Выпадкова" }, "randomWord": { - "message": "Random Word" + "message": "Выпадковае слова" }, "websiteName": { - "message": "Website Name" + "message": "Назва вэб-сайта" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Што вы хочаце генерыраваць?" }, "passwordType": { - "message": "Password Type" + "message": "Тып пароля" }, "service": { - "message": "Service" + "message": "Сэрвіс" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Псеўданім электроннай пошты для перасылкі" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Генерыраваць псеўданім электроннай пошты са знешнім сэрвісам перасылкі." }, "hostname": { - "message": "Hostname", + "message": "Назва вузла", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Токен доступу да API" }, "apiKey": { - "message": "API Key" + "message": "Ключ API" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Памылка Key Connector: пераканайцеся, што Key Connector даступны і карэктна працуе." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Патрабуецца прэміяльная падпіска" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Арганізацыя адключана." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Элементы ў адключаных арганізацыя недаступны. Звяжыцеся з уладальнікам вашай арганізацыі для атрымання дапамогі." }, "cardBrandMir": { "message": "Mir" }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "Уваход у $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -1990,12 +1990,12 @@ } }, "settingsEdited": { - "message": "Settings have been edited" + "message": "Налады былі адрэдагаваныя" }, "environmentEditedClick": { - "message": "Click here" + "message": "Націсніце тут" }, "environmentEditedReset": { - "message": "to reset to pre-configured settings" + "message": "для скіду да прадвызначаных наладаў" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index a7bc7aecdc4..b1e0361e082 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -1919,17 +1919,17 @@ "message": "Käyttäjätunnuksen tyyppi" }, "plusAddressedEmail": { - "message": "Plus-osoitteinen sähköposti", + "message": "Plus+merkkinen sähköposti", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Käytä sähköpostipalvelusi aliosoiteominaisuuksia." }, "catchallEmail": { - "message": "Catch-all-sähköpostiosoite" + "message": "Catch-all-sähköposti" }, "catchallEmailDesc": { - "message": "Käytä verkkotunnuksellesi määritettyä catch-all-postilaatikkoa." + "message": "Käytä verkkotunnuksesi catch-all-postilaatikkoa." }, "random": { "message": "Satunnainen" @@ -1950,7 +1950,7 @@ "message": "Palvelu" }, "forwardedEmail": { - "message": "Välitykseen käytetty sähköpostialias" + "message": "Sähköpostialias välitykseen" }, "forwardedEmailDesc": { "message": "Luo sähköpostialias ulkoisella ohjauspalvelulla." diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 34aeddd6294..9178bc577dc 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -318,7 +318,7 @@ "message": "Перейти" }, "website": { - "message": "Веб-сайт" + "message": "Сайт" }, "toggleVisibility": { "message": "Вкл/выкл видимость" @@ -606,7 +606,7 @@ "message": "Спрашивать при обновлении существующего логина" }, "changedPasswordNotificationDesc": { - "message": "Спрашивать обновление пароля логина при обнаружении изменения на веб-сайте." + "message": "Спрашивать обновление пароля логина при обнаружении изменения на сайте." }, "notificationChangeDesc": { "message": "Обновить этот пароль в Bitwarden?" @@ -618,7 +618,7 @@ "message": "Показать опции контекстного меню" }, "contextMenuItemDesc": { - "message": "С помощью двойного щелчка можно получить доступ к генерации паролей и сопоставлению логинов для веб-сайта." + "message": "С помощью двойного щелчка можно получить доступ к генерации паролей и сопоставлению логинов для сайта." }, "defaultUriMatchDetection": { "message": "Обнаружение совпадения URI по умолчанию", @@ -987,7 +987,7 @@ "message": "Открыть хранилище в боковой панели" }, "commandAutofillDesc": { - "message": "Автозаполнение последнего использованного логина для текущего веб-сайта." + "message": "Автозаполнение последнего использованного логина для текущего сайта." }, "commandGeneratePasswordDesc": { "message": "Сгенерировать и скопировать новый случайный пароль в буфер обмена." @@ -1037,7 +1037,7 @@ "message": "Этот браузер не может обрабатывать запросы U2F в этом всплывающем окне. Вы хотите открыть это всплывающее окно в новом окне, чтобы иметь возможность войти в систему, используя U2F?" }, "enableFavicon": { - "message": "Показать значки веб-сайтов" + "message": "Показать значки сайтов" }, "faviconDesc": { "message": "Отображать узнаваемое изображение рядом с каждым логином." @@ -1919,11 +1919,11 @@ "message": "Тип имени пользователя" }, "plusAddressedEmail": { - "message": "Плюс-адресованные email", + "message": "Субадресованные email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Использовать возможности суб-адресации вашего провайдера электронной почты." + "message": "Используйте возможности субадресации вашей электронной почты." }, "catchallEmail": { "message": "Catch-all-адрес электронной почты" diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 8de1c306b0f..183c5503ef2 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -1969,7 +1969,7 @@ "message": "Key Connector грешка: будите сигурни да је Key Connector доступан и да ради." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Premium претплата је потребна" }, "organizationIsDisabled": { "message": "Организација је онемогућена." diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index a8157d03714..69a32d73d7f 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -677,7 +677,7 @@ "message": "Lär dig om organisationer" }, "learnOrgConfirmation": { - "message": "Bitwarden gör det möjligt för dig att objekt i valvet med andra genom att använda en organisation. Vill du besöka bitwarden.com för att lära dig mer?" + "message": "Bitwarden gör det möjligt för dig att dela objekt i valvet med andra genom att använda en organisation. Vill du besöka bitwarden.com för att lära dig mer?" }, "moveToOrganization": { "message": "Flytta till organisation" diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 7f723394e1a..5048d64028c 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -1919,7 +1919,7 @@ "message": "Тип імені користувача" }, "plusAddressedEmail": { - "message": "Плюс адреса електронної пошти", + "message": "Адреса е-пошти з плюсом", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 861b3137725..053d38cd58e 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -424,7 +424,7 @@ "message": "無效的電子郵件地址。" }, "masterPasswordRequired": { - "message": "必須填寫主密碼。" + "message": "必須填入主密碼。" }, "confirmMasterPasswordRequired": { "message": "必須再次輸入主密碼。" @@ -1929,7 +1929,7 @@ "message": "Catch-all 電子郵件" }, "catchallEmailDesc": { - "message": "使用您網域設定的 Catch-all 收件匣。" + "message": "使用您的網域設定的 Catch-all 收件匣。" }, "random": { "message": "隨機" diff --git a/apps/browser/store/locales/ar/copy.resx b/apps/browser/store/locales/ar/copy.resx index cfb4c5df101..e74606ff15d 100644 --- a/apps/browser/store/locales/ar/copy.resx +++ b/apps/browser/store/locales/ar/copy.resx @@ -118,58 +118,59 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden – Free Password Manager + Bitwarden - مدير كلمات مرور مجاني - A secure and free password manager for all of your devices + مدير كلمات مرور مجاني وآمن لجميع أجهزتك - Bitwarden, Inc. is the parent company of 8bit Solutions LLC. + شركة Bitwarden, Inc هي الشركة الأم لشركة 8bit Solutions LLC. -NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS & WORLD REPORT, CNET, AND MORE. +تم تصنيف Bitwarden كأفصل مدير كلمات مرور بواسطة كل من The Verge، U.S News & World Report، CNET، وغيرهم. -Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go. +قم بادراة وحفظ وتأمين كلمات المرور الخاصة بك، ومشاركتها بين اجهزتك من اي مكان. +يوفر Bitwarden حل مفتوح المصدر لادارة كلمات المرور للجميع، سواء في المنزل، في العمل او في اي مكان. -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +قم بانشاء كلمات مرور قوية وفريدة وعشوائية حسب متطلبات الأمان للصفحات التي تزورها. -Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone. +يوفر Bitwarden Send امكانية ارسال البيانات --- النصوص والملفات --- بطريقة مشفرة وسريعة لأي شخص. -Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues. +يوفر Bitwarden خطط خاصة للفرق والشركات والمؤسسات لتمكنك من مشاركة كلمات المرور مع زملائك في العمل. -Why Choose Bitwarden: +لماذا قد تختار Bitwarden: -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +تشفير على مستوى عالمي +كلمات المرور محمية بتشفير متقدم تام (end-to-end encryption) من نوعية AES-256 bit، مع salted hashing، و PBKDF2 SHA-256. كل هذا لابقاء بياناتك محمية وخاصة. -Built-in Password Generator -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +مولد كلمات المرور المدمج +قم بانشاء كلمات مرور قوية وفريدة وعشوائية حسب متطلبات الأمان للصفحات التي تزورها. -Global Translations -Bitwarden translations exist in 40 languages and are growing, thanks to our global community. +الترجمات العالمية +يتوفر Bitwarden باكثر من 40 لغة، وتتنامى الترجمات بفضل مجتمعنا العالمي. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +تطبيقات متعددة المنصات +قم بحماية ومشاركة بياناتاك الحساسة عبر خزنة Bitwarden من اي متصفح ويب، او هاتف ذكي، او جهاز كمبيوتر، وغيرها. - A secure and free password manager for all of your devices + مدير كلمات مرور مجاني وآمن لجميع أجهزتك - Sync and access your vault from multiple devices + مزامنة خزنتك والوصول إليها من عدة أجهزة - Manage all your logins and passwords from a secure vault + إدارة جميع تسجيلات الدخول وكلمات المرور الخاصة بك من خزنة آمنة - Quickly auto-fill your login credentials into any website that you visit + قم بملء بيانات تسجيل الدخول تلقائياً وبسرعة في أي موقع تزوره - Your vault is also conveniently accessible from the right-click menu + يمكنك الوصول الى خزنتك بسهولة من قائمة النقر بالزر الأيمن - Automatically generate strong, random, and secure passwords + إنشاء كلمات مرور قوية، وعشوائية، وآمنة، تلقائيًا - Your information is managed securely using AES-256 bit encryption + تتم إدارة معلوماتك بشكل آمن باستخدام تشفير AES-256 bit diff --git a/apps/browser/store/locales/az/copy.resx b/apps/browser/store/locales/az/copy.resx index c6ae1c74cc1..677ad41b6bc 100644 --- a/apps/browser/store/locales/az/copy.resx +++ b/apps/browser/store/locales/az/copy.resx @@ -121,7 +121,7 @@ Bitwarden – Ödənişsiz Parol Meneceri - Bütün cihazlarınız üçün təhlükəsiz və ödənişsiz bir parol meneceri + Bütün cihazlarınız üçün güvənli və ödənişsiz bir parol meneceri Bitwarden, Inc., 8bit Solutions LLC-nin ana şirkətidir. @@ -139,7 +139,7 @@ Bitwarden, parolları iş yoldaşlarınızla təhlükəsiz paylaşa bilməyiniz Nəyə görə Bitwarden-i seçməliyik: Yüksək səviyyə şifrələmə -Parollarınız qabaqcıl ucdan-uca şifrələmə (AES-256 bit, salted hashtag və PBKDF2 SHA-256) ilə qorunur, beləcə verilənlərinizin təhlükəsiz və gizli qalmasını təmin edir. +Parollarınız qabaqcıl bir ucdan digərinə kimi şifrələmə (AES-256 bit, salted hashtag və PBKDF2 SHA-256) ilə qorunur, beləcə verilənlərinizin güvənli və gizli qalmasını təmin edir. Daxili parol yaradıcı Çox istifadə etdiyiniz hər veb sayt üçün təhlükəsizlik tələblərinə görə güclü, unikal və təsadüfi şifrələr yaradın. @@ -148,16 +148,17 @@ Qlobal tərcümələr Bitwarden tərcümələri 40 dildə mövcuddur və qlobal cəmiyyətimiz sayəsində böyüməyə davam edir. Çarpaz platform tətbiqləri -Bitwarden anbarındakı həssas verilənləri, istənilən səyyahdan, mobil cihazdan və ya masaüstü əməliyyat sistemindən və daha çoxundan qoruyub paylaşın. +Bitwarden anbarındakı həssas verilənləri, istənilən brauzerdən, mobil cihazdan və ya masaüstü əməliyyat sistemindən və daha çoxundan qoruyub paylaşın. + - Bütün cihazlarınız üçün təhlükəsiz və ödənişsiz bir parol meneceri + Bütün cihazlarınız üçün güvənli və ödənişsiz bir parol meneceri Anbarınıza bir neçə cihazdan eyniləşdirərək müraciət edin - Bütün giriş məlumatlarınızı və parollarınızı təhlükəsiz bir anbardan idarə edin + Bütün giriş məlumatlarınızı və parollarınızı güvənli bir anbardan idarə edin Giriş kimlik məlumatlarınızı ziyarət etdiyiniz istənilən veb sayta dərhal avtomatik doldurun @@ -166,9 +167,9 @@ Bitwarden anbarındakı həssas verilənləri, istənilən səyyahdan, mobil cih Anbarınıza sağ klikləmə menyusundan da asanlıqla müraciət edə bilərsiniz - Güclü, təsadüfi və etibarlı parolların avtomatik yaradılması + Güclü, təsadüfi və güvənli parolların avtomatik yaradılması - Məlumatlarınız AES-256 bit şifrələmə istifadə edilərək təhlükəsiz şəkildə idarə olunur + Məlumatlarınız AES-256 bit şifrələmə istifadə edilərək güvənli şəkildə idarə olunur diff --git a/apps/browser/store/locales/ru/copy.resx b/apps/browser/store/locales/ru/copy.resx index 6932fab16d4..4e48ecbc88a 100644 --- a/apps/browser/store/locales/ru/copy.resx +++ b/apps/browser/store/locales/ru/copy.resx @@ -130,7 +130,7 @@ Управляйте, храните, защищайте и делитесь неограниченным количеством паролей на неограниченном количестве устройств из любого места. Bitwarden предоставляет решения с открытым исходным кодом по управлению паролями для всех, дома, на работе или в дороге. -Создавайте надежные, уникальные и случайные пароли на основе требований безопасности для каждого посещаемого вами веб-сайта. +Создавайте надежные, уникальные и случайные пароли на основе требований безопасности для каждого посещаемого вами сайта. Bitwarden Send быстро передает зашифрованную информацию - файлы и простой текст - напрямую кому угодно. @@ -142,7 +142,7 @@ Bitwarden предлагает для компаний планы Teams и Enter Пароли защищены передовым сквозным шифрованием (AES-256 bit, соленый хэштег и PBKDF2 SHA-256), поэтому ваши данные остаются в безопасности и конфиденциальности. Встроенный генератор паролей -Создавайте надежные, уникальные и случайные пароли на основе требований безопасности для каждого посещаемого вами веб-сайта. +Создавайте надежные, уникальные и случайные пароли на основе требований безопасности для каждого посещаемого вами сайта. Глобальные переводы Переводы Bitwarden существуют на 40 языках и постоянно растут благодаря нашему глобальному сообществу. @@ -160,7 +160,7 @@ Bitwarden предлагает для компаний планы Teams и Enter Управляйте всеми своими логинами и паролями из защищенного хранилища - Быстро и автоматически заполняйте свои учетные данные на любом веб-сайте + Быстро и автоматически заполняйте свои учетные данные на любом сайте Предусмотрен удобный доступ к хранилищу из контекстного меню From 59633cec6e7268159ced93d77befbf4f12a263e6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:13:06 +0200 Subject: [PATCH 05/17] Autosync the updated translations (#3434) Co-authored-by: github-actions <> --- apps/desktop/src/locales/az/messages.json | 94 ++++----- apps/desktop/src/locales/be/messages.json | 206 +++++++++---------- apps/desktop/src/locales/fi/messages.json | 8 +- apps/desktop/src/locales/it/messages.json | 2 +- apps/desktop/src/locales/ru/messages.json | 8 +- apps/desktop/src/locales/uk/messages.json | 2 +- apps/desktop/src/locales/zh_TW/messages.json | 2 +- 7 files changed, 161 insertions(+), 161 deletions(-) diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index dfcf7a2583a..612937f5d18 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -24,7 +24,7 @@ "message": "Kimlik" }, "typeSecureNote": { - "message": "Təhlükəsizlik qeydi" + "message": "Güvənli qeyd" }, "folders": { "message": "Qovluqlar" @@ -148,7 +148,7 @@ "message": "Bitmə vaxtı" }, "securityCode": { - "message": "Təhlükəsizlik kodu" + "message": "Güvənlik kodu" }, "identityName": { "message": "Kimlik adı" @@ -157,7 +157,7 @@ "message": "Şirkət" }, "ssn": { - "message": "Sosial təhlükəsizlik nömrəsi" + "message": "Sosial güvənlik nömrəsi" }, "passportNumber": { "message": "Pasport nömrəsi" @@ -473,7 +473,7 @@ "message": "Maksimal fayl həcmi 500 MB-dır." }, "updateKey": { - "message": "Şifrələmə açarınızı yeniləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." + "message": "Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." }, "editedFolder": { "message": "Qovluğa düzəliş edildi" @@ -488,7 +488,7 @@ "message": "Qovluq silindi" }, "loginOrCreateNewAccount": { - "message": "Təhlükəsiz anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." }, "createAccount": { "message": "Hesab yarat" @@ -530,7 +530,7 @@ "message": "E-poçt ünvanı lazımdır." }, "invalidEmail": { - "message": "Etibarsız e-poçt ünvanı." + "message": "Yararsız e-poçt ünvanı." }, "masterPasswordRequired": { "message": "Ana parol lazımdır." @@ -578,7 +578,7 @@ "message": "Təsdiq kodu lazımdır." }, "invalidVerificationCode": { - "message": "Etibarsız təsdiqləmə kodu" + "message": "Yararsız təsdiqləmə kodu" }, "continue": { "message": "Davam" @@ -617,10 +617,10 @@ "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, "insertU2f": { - "message": "Təhlükəsizlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." + "message": "Güvənlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." }, "recoveryCodeDesc": { - "message": "İki mərhələli təsdiqləmə təchizatçılarına müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxara bilərsiniz." + "message": "İki mərhələli təsdiqləmə provayderlərinə müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli provayderləri sıradan çıxara bilərsiniz." }, "recoveryCodeTitle": { "message": "Bərpa kodu" @@ -633,24 +633,24 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP təhlükəsizlik açarı" + "message": "YubiKey OTP güvənlik açarı" }, "yubiKeyDesc": { "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." }, "duoDesc": { - "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan təhlükəsizlik açarı istifadə edin." + "message": "Hesabınıza müraciət etmək üçün istənilən bir WebAuthn fəallaşdırılmış güvənlik açarı istifadə edin." }, "emailTitle": { "message": "E-poçt" @@ -662,10 +662,10 @@ "message": "Giriş edilə bilmir" }, "noTwoStepProviders": { - "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu cihaz tərəfindən dəstəklənmir." + "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli provayderlərin heç biri bu cihaz tərəfindən dəstəklənmir." }, "noTwoStepProviders2": { - "message": "Zəhmət olmasa daha yaxşı cihazlar (tətbiq təsdiqləyici tətbiqi) arasında dəstəklənən əlavə təchizatçıları əlavə edin." + "message": "Zəhmət olmasa daha yaxşı cihazlar (tətbiq təsdiqləyici tətbiqi) arasında dəstəklənən əlavə provayderləri əlavə edin." }, "twoStepOptions": { "message": "İki mərhələli giriş seçimləri" @@ -796,7 +796,7 @@ "message": "Mobil tətbiqə get" }, "getBrowserExtension": { - "message": "Səyyah genişləndirməsini əldə et" + "message": "Brauzer genişləndirməsini al" }, "syncingComplete": { "message": "Eyniləşdirmə tamamlandı" @@ -824,10 +824,10 @@ } }, "invalidMasterPassword": { - "message": "Etibarsız ana parol" + "message": "Yararsız ana parol" }, "twoStepLoginConfirmation": { - "message": "İki mərhələli giriş, təhlükəsizlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da təhlükəsiz edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" + "message": "İki mərhələli giriş, güvənlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da güvənli edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?" }, "twoStepLogin": { "message": "İki mərhələli giriş" @@ -887,7 +887,7 @@ "message": "Heç vaxt" }, "security": { - "message": "Təhlükəsizlik" + "message": "Güvənlik" }, "clearClipboard": { "message": "Lövhəni təmizlə", @@ -988,7 +988,7 @@ "description": "Copy to clipboard" }, "checkForUpdates": { - "message": "Yeniləmələri yoxla" + "message": "Güncəlləmələri yoxla…" }, "version": { "message": "Versiya $VERSION_NUM$", @@ -1000,10 +1000,10 @@ } }, "restartToUpdate": { - "message": "Yeniləmək üçün yenidən başlat" + "message": "Güncəlləmək üçün yenidən başlat" }, "restartToUpdateDesc": { - "message": "$VERSION_NUM$ versiyası quraşdırılmağa hazırdır. Quraşdırmanı tamamlamaq üçün tətbiqi yenidən başlatmalısınız. Yenidən başladıb indi yeniləmək istəyirsiniz?", + "message": "$VERSION_NUM$ versiyası quraşdırılmağa hazırdır. Quraşdırmanı tamamlamaq üçün tətbiqi yenidən başlatmalısınız. Yenidən başladıb indi güncəlləmək istəyirsiniz?", "placeholders": { "version_num": { "content": "$1", @@ -1012,10 +1012,10 @@ } }, "updateAvailable": { - "message": "Yeniləmə mövcuddur" + "message": "Güncəlləmə mövcuddur" }, "updateAvailableDesc": { - "message": "Bir yeniləmə tapıldı. İndi endirmək istəyirsiniz?" + "message": "Bir güncəlləmə tapıldı. İndi endirmək istəyirsiniz?" }, "restart": { "message": "Yenidən başlat" @@ -1024,10 +1024,10 @@ "message": "Sonra" }, "noUpdatesAvailable": { - "message": "Hazırda heç bir yeniləmə yoxdur. Ən son versiyanı istifadə edirsiniz." + "message": "Hazırda heç bir güncəlləmə yoxdur. Ən son versiyanı istifadə edirsiniz." }, "updateError": { - "message": "Yeniləmə xətası" + "message": "Güncəlləmə xətası" }, "unknown": { "message": "Bilinməyən" @@ -1040,7 +1040,7 @@ "description": "Copy credit card number" }, "copySecurityCode": { - "message": "Təhlükəsizlik kodunu kopyala", + "message": "Güvənlik kodunu kopyala", "description": "Copy credit card security code (CVV)" }, "premiumMembership": { @@ -1263,11 +1263,11 @@ "description": "Application window should always stay on top of other windows" }, "dateUpdated": { - "message": "Yeniləndi", + "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, "datePasswordUpdated": { - "message": "Parol yeniləndi", + "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" }, "exportVault": { @@ -1318,7 +1318,7 @@ "message": "Anbarın ixracını təsdiqləyin" }, "exportWarningDesc": { - "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı saxlamamalı və etibarsız yollarla (e-poçt kimi) göndərməməlisiniz. Bu faylı işiniz bitdikdən sonra dərhal silin." + "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı, güvənli olmayan kanallar üzərində saxlamamalı və ya göndərməməlisiniz (e-poçt kimi). Bu faylı işiniz bitdikdən sonra dərhal silin." }, "encExportKeyWarningDesc": { "message": "Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız." @@ -1327,7 +1327,7 @@ "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir ixracı, fərqli bir hesaba idxal edə bilməzsiniz." }, "noOrganizationsList": { - "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə təhlükəsiz şəkildə paylaşmağınızı təmin edir." + "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə güvənli şəkildə paylaşmağınızı təmin edir." }, "noCollectionsInList": { "message": "Siyahılanacaq heç bir kolleksiya yoxdur." @@ -1370,7 +1370,7 @@ "message": "PIN kod lazımdır." }, "invalidPin": { - "message": "Etibarsız PIN kod." + "message": "Yararsız PIN kod." }, "unlockWithWindowsHello": { "message": "Windows Hello ilə kilidi aç" @@ -1565,43 +1565,43 @@ "message": "Xidmət Şərtləri və Gizlilik Siyasəti qəbul edilməyib." }, "enableBrowserIntegration": { - "message": "Səyyah inteqrasiyasını fəallaşdır" + "message": "Brauzer inteqrasiyasını fəallaşdır" }, "enableBrowserIntegrationDesc": { - "message": "Səyyah inteqrasiyası səyyahda biometrik təsdiqləmə üçün istifadə olunur." + "message": "Brauzer inteqrasiyası, brauzerdə biometrik təsdiqləmə üçün istifadə olunur." }, "browserIntegrationUnsupportedTitle": { - "message": "Səyyah inteqrasiyası dəstəklənmir" + "message": "Brauzer inteqrasiyası dəstəklənmir" }, "browserIntegrationMasOnlyDesc": { - "message": "Təəssüf ki, səyyah inteqrasiyası indilik yalnız Mac App Store versiyasında dəstəklənir." + "message": "Təəssüf ki, brauzer inteqrasiyası indilik yalnız Mac App Store versiyasında dəstəklənir." }, "browserIntegrationWindowsStoreDesc": { - "message": "Təəssüf ki, səyyah inteqrasiyası hal-hazırda Windows Store versiyasında dəstəklənmir." + "message": "Təəssüf ki, brauzer inteqrasiyası hal-hazırda Windows Store versiyasında dəstəklənmir." }, "browserIntegrationLinuxDesc": { - "message": "Təəssüf ki, səyyah inteqrasiyası hal-hazırda Linux versiyasında dəstəklənmir." + "message": "Təəssüf ki, brauzer inteqrasiyası hal-hazırda Linux versiyasında dəstəklənmir." }, "enableBrowserIntegrationFingerprint": { - "message": "Səyyah inteqrasiyası üçün təsdiqləmə tələb et" + "message": "Brauzer inteqrasiyası üçün təsdiqləmə tələb et" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Masaüstü tətbiqlə səyyah arasında bağlantı qurularkən barmaq izi ifadəsinin təsdiqlənməsini tələb edərək əlavə bir təhlükəsizlik qatını fəallaşdıra bilərsiniz. Fəal olanda, bu, hər bağlantı qurulanda istifadəçi müdaxiləsi və təsdiqləməsini tələb edir." + "message": "Masaüstü tətbiqlə brauzer arasında bağlantı qurularkən barmaq izi ifadəsinin təsdiqlənməsini tələb edərək əlavə bir güvənlik qatını fəallaşdıra bilərsiniz. Fəal olanda, bu, hər bağlantı qurulanda istifadəçi müdaxiləsi və təsdiqləməsini tələb edir." }, "approve": { "message": "Təsdiqlə" }, "verifyBrowserTitle": { - "message": "Səyyah bağlantısını təsdiqlə" + "message": "Brauzer bağlantısını təsdiqlə" }, "verifyBrowserDesc": { - "message": "Zəhmət olmasa göstərilən barmaq izinin səyyah genişləndirməsində göstərilən barmaq izi ilə eyni olduğuna əmin olun." + "message": "Zəhmət olmasa göstərilən barmaq izinin brauzer genişləndirməsində göstərilən barmaq izi ilə eyni olduğuna əmin olun." }, "biometricsNotEnabledTitle": { "message": "Biometriklə fəal deyil" }, "biometricsNotEnabledDesc": { - "message": "Səyyah biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir." + "message": "Brauzer biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir." }, "personalOwnershipSubmitError": { "message": "Müəssisə Siyasətinə görə, elementləri şəxsi anbarınızda saxlamağınız məhdudlaşdırılıb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mövcud kolleksiyalar arasından seçim edin." @@ -1788,13 +1788,13 @@ "message": "Bu əməliyyat qorumalıdır, davam etmək üçün zəhmət olmasa kimliyinizi təsdiqləmək üçün ana parolunuzu təkrar daxil edin." }, "updatedMasterPassword": { - "message": "Yenilənmiş ana parol" + "message": "Güncəllənmiş ana parol" }, "updateMasterPassword": { - "message": "Ana parolu yenilə" + "message": "Ana parolu güncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "hours": { "message": "Saat" @@ -1934,7 +1934,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "E-poçt təchizatçınızın alt ünvan özəlliklərini istifadə et." + "message": "E-poçt provayderinizin alt ünvan özəlliklərini istifadə et." }, "catchallEmail": { "message": "Catch-all E-poçt" diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 42f68a95699..2f2e0ce134d 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -901,7 +901,7 @@ "message": "Паказваць значкі вэб-сайтаў" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Паказваць распазнавальны відарыс побач з кожным з кожным лагінам." }, "enableMinToTray": { "message": "Згарунць у вобласць апавяшчэнняў" @@ -1397,16 +1397,16 @@ "message": "Выдаліць уліковы запіс" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all vault data." + "message": "Працягніце ніжэй для выдалення вашага ўліковага запісу і ўсіх даных сховішча." }, "deleteAccountWarning": { - "message": "Deleting your account is permanent. It cannot be undone." + "message": "Выдаленне вашага ўліковага запісу з'яўляецца незваротным дзеяннем. Яго нельга будзе адрабіць." }, "accountDeleted": { - "message": "Account deleted" + "message": "Уліковы запіс выдалены" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Ваш уліковы запіс быў закрыты і ўсе звязаныя даныя былі выдалены." }, "preferences": { "message": "Налады" @@ -1562,55 +1562,55 @@ "message": "Ставячы гэты сцяжок вы пагаджаецеся з наступным:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Умовы выкарыстання і Палітыка прыватнасці не былі пацверджаны." }, "enableBrowserIntegration": { - "message": "Allow browser integration" + "message": "Дазволіць інтэграцыю з браўзерам" }, "enableBrowserIntegrationDesc": { - "message": "Used for biometrics in browser." + "message": "Выкарыстоўваецца для біяметрыі ў браўзеры." }, "browserIntegrationUnsupportedTitle": { - "message": "Browser integration not supported" + "message": "Інтэграцыя з браўзерам не падтрымліваецца" }, "browserIntegrationMasOnlyDesc": { - "message": "Unfortunately browser integration is only supported in the Mac App Store version for now." + "message": "На жаль, інтэграцыя з браўзерам зараз падтрымліваецца толькі ў версіі Mac App Store." }, "browserIntegrationWindowsStoreDesc": { - "message": "Unfortunately browser integration is currently not supported in the Windows Store version." + "message": "На жаль, інтэграцыя з браўзерам у цяперашні час не падтрымліваецца ў версіі Windows Store." }, "browserIntegrationLinuxDesc": { - "message": "Unfortunately browser integration is currently not supported in the linux version." + "message": "На жаль, інтэграцыя з браўзерам у цяперашні час не падтрымліваецца ў версіі Linux." }, "enableBrowserIntegrationFingerprint": { - "message": "Require verification for browser integration" + "message": "Патрабаваць праверку для інтэграцыі з браўзерам" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Add an additional layer of security by requiring fingerprint phrase confirmation when establishing a link between your desktop and browser. This requires user action and verification each time a connection is created." + "message": "Дадайце дадатковы слой бяспекі, патрабуючы пацвярджэнне адбітка фразы пры ўсталяванні сувязі паміж камп'ютарам і браўзерам. Гэта запатрабуе дзеянняў карыстальніка і праверкі пры кожным стварэнні злучэння." }, "approve": { - "message": "Approve" + "message": "Зацвердзіць" }, "verifyBrowserTitle": { - "message": "Verify browser connection" + "message": "Праверка злучэння з браўзерам" }, "verifyBrowserDesc": { - "message": "Please ensure the shown fingerprint is identical to the fingerprint showed in the browser extension." + "message": "Пераканайцеся, што паказаны адбітак супадае з адбіткам, які паказаны ў пашырэнні браўзера." }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Біяметрыя не ўключана" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometrics to be enabled in the settings first." + "message": "Для актывацыі біяметрыі ў браўзеры неабходна спачатку ўключыць яе ў наладах праграмы для камп'ютара." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections." + "message": "У адпаведнасці з карпаратыўнай палітыкай вам забаронена захоўваць элементы ў асабістым сховішчы. Змяніце параметры ўласнасці на арганізацыю і выберыце з даступных калекцый." }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "Падказка для пароля не можа супадаць з паролем." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Палітыка арганізацыі ўплывае на вашы параметры ўласнасці." }, "allSends": { "message": "Усе Send'ы", @@ -1647,7 +1647,7 @@ "message": "Дата завяршэння" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "Калі зададзена, то доступ да гэтага Send міне ў азначаную дату і час.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { @@ -1655,22 +1655,22 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Калі зададзена, то карыстальнікі больш не змогуць атрымаць доступ да гэтага Send пасля таго, як будзе дасягнута максімальная колькасць зваротаў.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current Access Count" + "message": "Бягучая колькасць доступаў" }, "disableSend": { - "message": "Disable this Send so that no one can access it.", + "message": "Адключыць гэты Send, каб ніхто не змог атрымаць да яго доступ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Па магчымасці запытваць у карыстальнікаў пароль для доступу да гэтага Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "message": "Прыватныя нататкі пра гэты Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1701,7 +1701,7 @@ "message": "Новы пароль" }, "whatTypeOfSend": { - "message": "What type of Send is this?", + "message": "Які гэта тып Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -1715,7 +1715,7 @@ "message": "Файл, які вы хочаце адправіць." }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ дзён", "placeholders": { "days": { "content": "$1", @@ -1724,13 +1724,13 @@ } }, "oneDay": { - "message": "1 day" + "message": "1 дзень" }, "custom": { "message": "Адвольны" }, "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", + "message": "Вы ўпэўнены, што хочаце выдаліць гэты Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLinkToClipboard": { @@ -1738,14 +1738,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." + "message": "Скапіяваць спасылку ў буфер абмену пасля захавання, каб абагуліць гэты Send." }, "sendDisabled": { - "message": "Send disabled", + "message": "Send адключаны", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "У адпаведнасці з карпаратыўнай палітыкай, вы можаце выдаліць толькі бягучы Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { @@ -1755,55 +1755,55 @@ "message": "Адключана" }, "maxAccessCountReached": { - "message": "Max access count reached" + "message": "Дасягнута максімальная колькасць зваротаў" }, "expired": { - "message": "Expired" + "message": "Пратэрмінавана" }, "pendingDeletion": { - "message": "Pending deletion" + "message": "Чаканне выдалення" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Аўтэнтыфікацыя WebAuthn" }, "hideEmail": { - "message": "Hide my email address from recipients." + "message": "Схаваць маю электронную пошту ад атрымальнікаў." }, "sendOptionsPolicyInEffect": { - "message": "One or more organization policies are affecting your Send options." + "message": "Адна або больш палітык арганізацыі ўплываюць на параметры Send." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Патрабуецца праверка электроннай пошты" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature." + "message": "Для выкарыстання гэтай функцыі патрабуецца праверыць электронную пошту." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Паўторны запыт галоўнага пароля" }, "passwordConfirmation": { "message": "Пацвярджэнне асноўнага пароля" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "Гэта дзеянне абаронена. Для працягу, калі ласка, паўторная ўвядзіце свой пароль, каб пацвердзіць вашу асобу." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Галоўны пароль абноўлены" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Абнавіць галоўны пароль" }, "updateMasterPasswordWarning": { - "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Ваш галоўны пароль не так даўно быў зменены адміністратарам вашай арганізацыі. Для таго, каб атрымаць доступ да вашага сховішча, вы павінны абнавіць яго зараз. У выніку бягучы сеанс будзе завершаны і вам неабходна будзе паўторна ўвайсці. Сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны." }, "hours": { - "message": "Hours" + "message": "Гадзіны" }, "minutes": { - "message": "Minutes" + "message": "Хвіліны" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча $HOURS$ гадз. і $MINUTES$ хв.", "placeholders": { "hours": { "content": "$1", @@ -1816,31 +1816,31 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Аўтаматычная рэгістрацыя" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Гэта арганізацыя мае карпаратыўную палітыку, якая будзе аўтаматычна зарэгіструе ваша скіданне пароля. Рэгістрацыя дазволіць адміністратарам арганізацыі змяняць ваш асноўны пароль." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Экспартаванне сховішча адключана" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "Адна або больш палітык арганізацыі не дазваляюць вам экспартаваць асабістае сховішча." }, "addAccount": { - "message": "Add Account" + "message": "Дадаць уліковы запіс" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Выдаліць асноўны пароль" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Асноўны пароль выдалены." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ выкарыстоўвае SSO з уласным серверам ключоў. Для аўтарызацыі ўдзельнікам гэтай арганізацыі больш няма неабходнасці выкарыстоўваць асноўны пароль.", "placeholders": { "organization": { "content": "$1", @@ -1849,34 +1849,34 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Пакінуць арганізацыю" }, "leaveOrganizationConfirmation": { - "message": "Are you sure you want to leave this organization?" + "message": "Вы сапраўды хочаце пакінуць гэту арганізацыю?" }, "leftOrganization": { - "message": "You have left the organization." + "message": "Вы пакінулі арганізацыю." }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Памылка Key Connector: пераканайцеся, што Key Connector даступны і карэктна працуе." }, "lockAllVaults": { - "message": "Lock All Vaults" + "message": "Заблакіраваць усе сховішчы" }, "accountLimitReached": { - "message": "No more than 5 accounts may be logged in at the same time." + "message": "Можна ўвайсці не больш, як у 5 уліковых запісаў адначасова." }, "accountPreferences": { - "message": "Preferences" + "message": "Параметры" }, "appPreferences": { - "message": "App Settings (All Accounts)" + "message": "Налады праграмы (усе ўліковы запісы)" }, "accountSwitcherLimitReached": { - "message": "Account limit reached. Log out of an account to add another." + "message": "Дасягнута абмежаванне ўліковага запісу. Выйдзіце, каб дадаць іншы ўліковы запіс." }, "settingsTitle": { - "message": "App settings for $EMAIL$", + "message": "Налады праграмы для $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -1885,19 +1885,19 @@ } }, "switchAccount": { - "message": "Switch Account" + "message": "Пераключыць уліковы запіс" }, "options": { - "message": "Options" + "message": "Опцыі" }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "Час вашай сесіі выйшаў. Калі ласка, увайдзіце паўторна." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Экспартаванне асабістага сховішча" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Толькі элементы асабістага сховішча, якія звязаны з $EMAIL$ будуць экспартаваныя. Элементы сховішча арганізацыі не будуць уключаны.", "placeholders": { "email": { "content": "$1", @@ -1906,90 +1906,90 @@ } }, "locked": { - "message": "Locked" + "message": "Заблакіравана" }, "unlocked": { - "message": "Unlocked" + "message": "Разблакіравана" }, "generator": { - "message": "Generator" + "message": "Генератар" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Што вы хочаце генерыраваць?" }, "passwordType": { - "message": "Password Type" + "message": "Тып пароля" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Паўторна згенерыраваць імя карыстастальніка" }, "generateUsername": { - "message": "Generate Username" + "message": "Генерыраваць імя карыстальніка" }, "usernameType": { - "message": "Username Type" + "message": "Тып імя карыстальніка" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Адрасы электроннай пошты з плюсам", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Выкарыстоўваць магчымасці пададрасацыі вашага пастаўшчыка паслуг электроннай пошты." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Адрас для ўсёй пошты дамена" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Выкарыстоўвайце сваю сканфігураваную скрыню для ўсё пошты дамена." }, "random": { - "message": "Random" + "message": "Выпадкова" }, "randomWord": { - "message": "Random Word" + "message": "Выпадковае слова" }, "websiteName": { - "message": "Website Name" + "message": "Назва вэб-сайта" }, "service": { - "message": "Service" + "message": "Сэрвіс" }, "allVaults": { - "message": "All Vaults" + "message": "Усе сховішчы" }, "searchOrganization": { - "message": "Search Organization" + "message": "Пошук арганізацыі" }, "searchMyVault": { - "message": "Search My Vault" + "message": "Пошук у маім сховішчы" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Псеўданім электроннай пошты для перасылкі" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Генерыраваць псеўданім электроннай пошты са знешнім сэрвісам перасылкі." }, "hostname": { - "message": "Hostname", + "message": "Назва вузла", "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "Токен доступу да API" }, "apiKey": { - "message": "API Key" + "message": "Ключ API" }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Патрабуецца прэміяльная падпіска" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Арганізацыя адключана." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "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": "Вы ўпэўнены, што хочаце адключыць блакіроўку сховішча? Прызначыўшы параметр блакіравання \"Ніколі\", ключ шыфравання будзе захоўвацца на вашай прыладзе. Калі вы выкарыстоўваеце гэты параметр, вы павінны быць упэўнены ў тым, што ваша прылада надзейна абаронена." }, "cardBrandMir": { "message": "Mir" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index c3bcfa61b0d..61cab6fc23f 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -1930,17 +1930,17 @@ "message": "Käyttäjätunnuksen tyyppi" }, "plusAddressedEmail": { - "message": "Plus-osoitteinen sähköposti", + "message": "Plus+merkkinen sähköposti", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Käytä sähköpostipalvelusi aliosoiteominaisuuksia." }, "catchallEmail": { - "message": "Catch-all-sähköpostiosoite" + "message": "Catch-all-sähköposti" }, "catchallEmailDesc": { - "message": "Käytä verkkotunnuksellesi määritettyä catch-all-postilaatikkoa." + "message": "Käytä verkkotunnuksesi catch-all-postilaatikkoa." }, "random": { "message": "Satunnainen" @@ -1964,7 +1964,7 @@ "message": "Hae omasta holvista" }, "forwardedEmail": { - "message": "Välitykseen käytetty sähköpostialias" + "message": "Sähköpostialias välitykseen" }, "forwardedEmailDesc": { "message": "Luo sähköpostialias ulkoisella ohjauspalvelulla." diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index ed3b93fd3e6..b648195b596 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -1964,7 +1964,7 @@ "message": "Cerca nella cassaforte" }, "forwardedEmail": { - "message": "Alias email inoltrate" + "message": "Alias email inoltrata" }, "forwardedEmailDesc": { "message": "Genera un alias email con un servizio di inoltro esterno." diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 6da8c2ac569..62085f40a8d 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -107,7 +107,7 @@ "message": "Код подтверждения (TOTP)" }, "website": { - "message": "Веб-сайт" + "message": "Сайт" }, "notes": { "message": "Заметки" @@ -898,7 +898,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "enableFavicon": { - "message": "Показать значки веб-сайтов" + "message": "Показать значки сайтов" }, "faviconDesc": { "message": "Отображать узнаваемое изображение рядом с каждым логином." @@ -1930,11 +1930,11 @@ "message": "Тип имени пользователя" }, "plusAddressedEmail": { - "message": "Плюс-адресованные email", + "message": "Субадресованные email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Использовать возможности суб-адресации вашего провайдера электронной почты." + "message": "Используйте возможности субадресации вашей электронной почты." }, "catchallEmail": { "message": "Catch-all-адрес электронной почты" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index a840594b06e..8856f724ebf 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -1930,7 +1930,7 @@ "message": "Тип імені користувача" }, "plusAddressedEmail": { - "message": "Плюс адреса електронної пошти", + "message": "Адреса е-пошти з плюсом", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 5f5d5e8caf6..cc982c35180 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -1940,7 +1940,7 @@ "message": "Catch-all 電子郵件" }, "catchallEmailDesc": { - "message": "使用您的網域配置的 Catch-all 收件匣。" + "message": "使用您的網域設定的 Catch-all 收件匣。" }, "random": { "message": "隨機" From 39700b5db356ead44a19b6096e4388a7a20e6e74 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:20:47 +0200 Subject: [PATCH 06/17] Autosync the updated translations (#3435) Co-authored-by: github-actions <> --- apps/web/src/locales/af/messages.json | 45 ++++ apps/web/src/locales/ar/messages.json | 45 ++++ apps/web/src/locales/az/messages.json | 281 +++++++++++++---------- apps/web/src/locales/be/messages.json | 45 ++++ apps/web/src/locales/bg/messages.json | 45 ++++ apps/web/src/locales/bn/messages.json | 45 ++++ apps/web/src/locales/bs/messages.json | 45 ++++ apps/web/src/locales/ca/messages.json | 45 ++++ apps/web/src/locales/cs/messages.json | 45 ++++ apps/web/src/locales/da/messages.json | 45 ++++ apps/web/src/locales/de/messages.json | 45 ++++ apps/web/src/locales/el/messages.json | 45 ++++ apps/web/src/locales/en_GB/messages.json | 45 ++++ apps/web/src/locales/en_IN/messages.json | 45 ++++ apps/web/src/locales/eo/messages.json | 45 ++++ apps/web/src/locales/es/messages.json | 45 ++++ apps/web/src/locales/et/messages.json | 45 ++++ apps/web/src/locales/eu/messages.json | 45 ++++ apps/web/src/locales/fi/messages.json | 53 ++++- apps/web/src/locales/fil/messages.json | 45 ++++ apps/web/src/locales/fr/messages.json | 45 ++++ apps/web/src/locales/he/messages.json | 45 ++++ apps/web/src/locales/hi/messages.json | 45 ++++ apps/web/src/locales/hr/messages.json | 45 ++++ apps/web/src/locales/hu/messages.json | 45 ++++ apps/web/src/locales/id/messages.json | 45 ++++ apps/web/src/locales/it/messages.json | 45 ++++ apps/web/src/locales/ja/messages.json | 45 ++++ apps/web/src/locales/ka/messages.json | 45 ++++ apps/web/src/locales/km/messages.json | 45 ++++ apps/web/src/locales/kn/messages.json | 45 ++++ apps/web/src/locales/ko/messages.json | 45 ++++ apps/web/src/locales/lv/messages.json | 45 ++++ apps/web/src/locales/ml/messages.json | 45 ++++ apps/web/src/locales/nb/messages.json | 45 ++++ apps/web/src/locales/nl/messages.json | 45 ++++ apps/web/src/locales/nn/messages.json | 45 ++++ apps/web/src/locales/pl/messages.json | 45 ++++ apps/web/src/locales/pt_BR/messages.json | 45 ++++ apps/web/src/locales/pt_PT/messages.json | 47 +++- apps/web/src/locales/ro/messages.json | 45 ++++ apps/web/src/locales/ru/messages.json | 55 ++++- apps/web/src/locales/si/messages.json | 45 ++++ apps/web/src/locales/sk/messages.json | 45 ++++ apps/web/src/locales/sl/messages.json | 45 ++++ apps/web/src/locales/sr/messages.json | 45 ++++ apps/web/src/locales/sr_CS/messages.json | 45 ++++ apps/web/src/locales/sv/messages.json | 45 ++++ apps/web/src/locales/tr/messages.json | 45 ++++ apps/web/src/locales/uk/messages.json | 69 +++++- apps/web/src/locales/vi/messages.json | 45 ++++ apps/web/src/locales/zh_CN/messages.json | 45 ++++ apps/web/src/locales/zh_TW/messages.json | 45 ++++ 53 files changed, 2525 insertions(+), 140 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 5ae5f2c3ee0..3ab3434cfb3 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ongeldige hoofwagwoord" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Vergrendel nou" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Lêerformaat" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "U kluisdata is uitgestuur." }, diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 4913df7077a..2b3457e9bde 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "كلمة المرور الرئيسية غير صالحة" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "قفل الآن" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "صيغة الملف" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "تم تصدير بيانات الخزنة الخاصة بك." }, diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 02c75991dd8..1bd2459880a 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -62,7 +62,7 @@ "message": "Bitmə vaxtı" }, "securityCode": { - "message": "Təhlükəsizlik kodu (CVV)" + "message": "Güvənlik kodu (CVV)" }, "identityName": { "message": "Kimlik adı" @@ -71,7 +71,7 @@ "message": "Şirkət" }, "ssn": { - "message": "Sosial təhlükəsizlik nömrəsi" + "message": "Sosial güvənlik nömrəsi" }, "passportNumber": { "message": "Pasport nömrəsi" @@ -303,7 +303,7 @@ "message": "Kimlik" }, "typeSecureNote": { - "message": "Təhlükəsizlik qeydi" + "message": "Güvənli qeyd" }, "typeLoginPlural": { "message": "Girişlər" @@ -315,7 +315,7 @@ "message": "Kimliklər" }, "typeSecureNotePlural": { - "message": "Təhlükəsizlik qeydləri" + "message": "Güvənli qeydlər" }, "folders": { "message": "Qovluqlar" @@ -414,7 +414,7 @@ "description": "Copy credit card number" }, "copySecurityCode": { - "message": "Təhlükəsizlik kodunu kopyala", + "message": "Güvənlik kodunu kopyala", "description": "Copy credit card security code (CVV)" }, "copyUri": { @@ -479,7 +479,7 @@ "message": "Maksimal fayl həcmi 500 MB-dır." }, "updateKey": { - "message": "Şifrələmə açarınızı yeniləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." + "message": "Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz." }, "addedItem": { "message": "Element əlavə edildi" @@ -567,7 +567,7 @@ "message": "Xeyr" }, "loginOrCreateNewAccount": { - "message": "Təhlükəsiz anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." }, "createAccount": { "message": "Hesab yarat" @@ -627,7 +627,7 @@ "message": "E-poçt ünvanı lazımdır." }, "invalidEmail": { - "message": "Etibarsız e-poçt ünvanı." + "message": "Yararsız e-poçt ünvanı." }, "masterPasswordRequired": { "message": "Ana parol lazımdır." @@ -676,7 +676,10 @@ } }, "invalidMasterPassword": { - "message": "Etibarsız ana parol" + "message": "Yararsız ana parol" + }, + "invalidFilePassword": { + "message": "Yararsız fayl parolu, zəhmət olmasa xaricə köçürmə faylını yaradarkən daxil etdiyiniz parolu istifadə edin." }, "lockNow": { "message": "İndi kilidlə" @@ -700,7 +703,7 @@ "message": "Yeni təşkilat" }, "noOrganizationsList": { - "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə təhlükəsiz şəkildə paylaşmağınızı təmin edir." + "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə güvənli şəkildə paylaşmağınızı təmin edir." }, "versionNumber": { "message": "Versiya $VERSION_NUMBER$", @@ -745,22 +748,22 @@ "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun." }, "insertU2f": { - "message": "Təhlükəsizlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." + "message": "Güvənlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun." }, "loginUnavailable": { "message": "Giriş edilə bilmir" }, "noTwoStepProviders": { - "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu səyyah tərəfindən dəstəklənmir." + "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli provayderlərin heç biri bu brauzer tərəfindən dəstəklənmir." }, "noTwoStepProviders2": { - "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb səyyah istifadə edin və/və ya veb səyyahlara (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən təchizatçılar əlavə edin." + "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb brauzer istifadə edin və/və ya veb brauzerlərə (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən provayderlər əlavə edin." }, "twoStepOptions": { "message": "İki mərhələli giriş seçimləri" }, "recoveryCodeDesc": { - "message": "İki mərhələli təsdiqləmə təchizatçılarına müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxara bilərsiniz." + "message": "İki mərhələli təsdiqləmə provayderlərinə müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli provayderləri sıradan çıxara bilərsiniz." }, "recoveryCodeTitle": { "message": "Bərpa kodu" @@ -773,30 +776,30 @@ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP təhlükəsizlik açarı" + "message": "YubiKey OTP güvənlik açarı" }, "yubiKeyDesc": { "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4 seriyası, 5 seriyası və NEO cihazları ilə işləyir." }, "duoDesc": { - "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.", + "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir FIDO U2F fəallaşdırılan təhlükəsizlik açarı istifadə edin." + "message": "Hesabınıza müraciət etmək üçün hər hansısa bir FIDO U2F fəallaşdırılan güvənlik açarı istifadə edin." }, "u2fTitle": { - "message": "FIDO U2F Təhlükəsizlik açarı" + "message": "FIDO U2F Güvənlik açarı" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan təhlükəsizlik açarı istifadə edin." + "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan güvənlik açarı istifadə edin." }, "webAuthnMigrated": { "message": "(FIDO-dan köçürüldü)" @@ -873,7 +876,7 @@ "message": "Anbarın ixracını təsdiqləyin" }, "exportWarningDesc": { - "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı saxlamamalı və etibarsız yollarla (e-poçt kimi) göndərməməlisiniz. Bu faylı işiniz bitdikdən sonra dərhal silin." + "message": "Bu xaricə köçürmə, anbar verilənlərinizi şifrələnməmiş formatda ehtiva. Xaricə köçürülən faylı, güvənli olmayan kanallar üzərində saxlamamalı və ya göndərməməlisiniz (e-poçt kimi). Bu faylı işiniz bitdikdən sonra dərhal silin." }, "encExportKeyWarningDesc": { "message": "Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız." @@ -890,6 +893,48 @@ "fileFormat": { "message": "Fayl formatı" }, + "fileEncryptedExportWarningDesc": { + "message": "Bu faylın xaricə köçürülməsi, parolla qorunacaq və şifrəsini açmaq üçün fayl parolu tələb olunacaq." + }, + "exportPasswordDescription": { + "message": "Bu parol, bu faylı daxilə və xaricə köçürmək üçün istifadə olunacaq" + }, + "confirmMasterPassword": { + "message": "Ana parolu təsdiqlə" + }, + "confirmFormat": { + "message": "Formatı təsdiqlə" + }, + "filePassword": { + "message": "Fayl parolu" + }, + "confirmFilePassword": { + "message": "Fayl parolunu təsdiqlə" + }, + "accountBackupOptionDescription": { + "message": "Xaricə köçürməni qorumaq üçün ana parolu yox, Bitwarden hesab şifrələməsini istifadə edir. Bu xaricə köçürmə, yalnız hazırkı hesaba köçürülə bilər. Başqa yerdə istifadə edilə bilməyəcək bir nüsxə yaratmaq üçün bunu istifadə edin." + }, + "passwordProtectedOptionDescription": { + "message": "Xaricə köçürməni qorumaq üçün istifadəçi tərəfindən yaradılan bir parol yaradın. Digər hesablarda istifadə ediləcək bir xaricə köçürmə yaratmaq üçün bunu istifadə edin." + }, + "fileTypeHeading": { + "message": "Fayl növü" + }, + "accountBackup": { + "message": "Hesab nüsxələmə" + }, + "passwordProtected": { + "message": "Parolla qorunur" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Fayl parolu\" və \"Fayl parolunu təsdiqlə\" uyğunlaşmır." + }, + "confirmVaultImport": { + "message": "Anbarın daxilə köçürülməsini təsdiqlə" + }, + "confirmVaultImportDesc": { + "message": "Bu fayl parolla qorunur. Məlumatları daxilə köçürmək üçün fayl parolunu daxil edin." + }, "exportSuccess": { "message": "Anbar verilənləriniz ixrac edildi." }, @@ -953,7 +998,7 @@ "description": "To clear something out. example: To clear browser history." }, "accountUpdated": { - "message": "Hesab yeniləndi" + "message": "Hesab güncəlləndi" }, "changeEmail": { "message": "E-poçtu dəyişdir" @@ -1046,7 +1091,7 @@ "message": "Seansların səlahiyyətlərini götür" }, "deauthorizeSessionsDesc": { - "message": "Hesabınıza başqa cihazdan giriş edildiyi ilə bağlı şübhələnirsiniz? Daha əvvəl istifadə etdiyiniz bütün cihazların və ya kompüterlərin səlahiyyətini götürmək üçün aşağıdan davam edin. Əvvəllər ictimai bir kompüter istifadə etmisinizsə və ya sizin olmayan bir cihazda səhvən parolunuzu saxlamısınızsa, bu təhlükəsizlik addımını məsləhət görürük. Bu addım həmçinin daha əvvəl xatırlanan iki mərhələli giriş seanslarını da təmizləyəcək." + "message": "Hesabınıza başqa cihazdan giriş edildiyi ilə bağlı şübhələnirsiniz? Daha əvvəl istifadə etdiyiniz bütün cihazların və ya kompüterlərin səlahiyyətini götürmək üçün aşağıdan davam edin. Əvvəllər ictimai bir kompüter istifadə etmisinizsə və ya sizin olmayan bir cihazda səhvən parolunuzu saxlamısınızsa, bu güvənlik addımını məsləhət görürük. Bu addım həmçinin daha əvvəl xatırlanan iki mərhələli giriş seanslarını da təmizləyəcək." }, "deauthorizeSessionsWarning": { "message": "Davam etsəniz, hazırkı seansınız bitəcək, təkrar giriş etməyiniz tələb olunacaq. Fəallaşdırılıbsa, iki mərhələli giriş üçün yenidən soruşulacaq. Digər cihazlardakı aktiv seanslar, bir saata qədər aktiv qalmağa davam edə bilər." @@ -1061,7 +1106,7 @@ "message": "Təşkilat anbarı təmizləndi." }, "vaultAccessedByProvider": { - "message": "Təchizatçı tərəfindən müraciət edilən anbar." + "message": "Provayder tərəfindən müraciət edilən anbar." }, "purgeVaultDesc": { "message": "Anbarınızdakı bütün element və qovluqları silmək üçün aşağıdan davam edin. Paylaşdığınız bir təşkilata aid olan elementlər silinməyəcək." @@ -1155,7 +1200,7 @@ "message": "Veb anbar təcrübənizi özəlləşdirin." }, "preferencesUpdated": { - "message": "Tərcihlər yeniləndi" + "message": "Tərcihlər güncəlləndi" }, "language": { "message": "Dil" @@ -1181,7 +1226,7 @@ "description": "Allows scaling the web vault UI's width" }, "enableFullWidthDesc": { - "message": "Veb anbara, səyyah pəncərəsinin eninin tamamını istifadə etməsinə icazə ver." + "message": "Veb anbara, brauzer pəncərəsinin eninin tamamını istifadə etməsinə icazə ver." }, "default": { "message": "İlkin" @@ -1223,7 +1268,7 @@ } }, "domainsUpdated": { - "message": "Domenlər yeniləndi" + "message": "Domenlər güncəlləndi" }, "twoStepLogin": { "message": "İki mərhələli giriş" @@ -1232,16 +1277,16 @@ "message": "Giriş edərkən əlavə bir addım tələb edərək hesabınızı qoruyun." }, "twoStepLoginOrganizationDesc": { - "message": "Təchizatçıları təşkilat səviyyəsində konfiqurasiya edərək təşkilatınızın istifadəçiləri üçün iki mərhələli girişi məcburi edin." + "message": "Provayderləri təşkilat səviyyəsində konfiqurasiya edərək təşkilatınızın istifadəçiləri üçün iki mərhələli girişi məcburi edin." }, "twoStepLoginRecoveryWarning": { - "message": "İki mərhələli girişi fəallaşdırmaq, Bitwarden hesabınızı birdəfəlik kilidləyə bilər. Bərpa kodları, iki mərhələli giriş təchizatçınızı istifadə edə bilmədiyiniz hallarda (məs. cihazınızı itirəndə) hesabınıza müraciət etməyinizə icazə verər. Hesabınıza müraciəti itirsəniz, Bitwarden dəstəyi sizə kömək edə bilməyəcək. Bərpa kodunuzu bir yerə yazmağınızı və ya çap etməyinizi və onu etibarlı bir yerdə saxlamağı məsləhət görürük." + "message": "İki mərhələli girişi fəallaşdırmaq, Bitwarden hesabınızı birdəfəlik kilidləyə bilər. Bərpa kodları, iki mərhələli giriş provayderinizi istifadə edə bilmədiyiniz hallarda (məs. cihazınızı itirəndə) hesabınıza müraciət etməyinizə icazə verər. Hesabınıza müraciəti itirsəniz, Bitwarden dəstəyi sizə kömək edə bilməyəcək. Bərpa kodunuzu bir yerə yazmağınızı və ya çap etməyinizi və onu etibarlı bir yerdə saxlamağı məsləhət görürük." }, "viewRecoveryCode": { "message": "Bərpa koduna bax" }, "providers": { - "message": "Təchizatçılar", + "message": "Provayderlər", "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { @@ -1282,7 +1327,7 @@ "message": "Müraciəti ləğv et" }, "twoStepLoginProviderEnabled": { - "message": "Bu iki mərhələli giriş təchizatçısı hesabınızda fəallaşdırılıb." + "message": "Bu iki mərhələli giriş provayderi hesabınızda fəallaşdırılıb." }, "twoStepLoginAuthDesc": { "message": "İki mərhələli giriş tənzimləmələrini dəyişdirmək üçün ana parolu daxil edin." @@ -1321,10 +1366,10 @@ "message": "Başqa bir cihaza əlavə etmək lazım olsa, aşağıda kimlik təsdiqləmə tətbiqinizin tələb etdiyi QR kod (və ya açar) verilib." }, "twoStepDisableDesc": { - "message": "Bu iki mərhələli giriş təchizatçısını sıradan çıxartmaq istədiyinizə əminsiniz?" + "message": "Bu iki mərhələli giriş provayderini sıradan çıxartmaq istədiyinizə əminsiniz?" }, "twoStepDisabled": { - "message": "İki mərhələli giriş təchizatçısı sıradan çıxarıldı." + "message": "İki mərhələli giriş provayderi sıradan çıxarıldı." }, "twoFactorYubikeyAdd": { "message": "Hesabınıza yeni bir YubiKey əlavə edin" @@ -1342,10 +1387,10 @@ "message": "Formu saxla." }, "twoFactorYubikeyWarning": { - "message": "Platforma məhdudiyyətlərinə görə, YubiKeys bütün Bitwarden tətbiqlərində istifadə edilə bilmir. YubiKeys istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş təchizatçısını fəallaşdırmalısınız. Dəstəklənən platformalar:" + "message": "Platforma məhdudiyyətlərinə görə, YubiKeys bütün Bitwarden tətbiqlərində istifadə edilə bilmir. YubiKeys istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" }, "twoFactorYubikeySupportUsb": { - "message": "Veb anbar, masaüstü tətbiqi, CLI və \"YubiKey\"inizi qəbul edə biləcək USB portuna sahib bir cihazdakı bütün səyyah genişləndirmələri." + "message": "Veb anbar, masaüstü tətbiqi, CLI və \"YubiKey\"inizi qəbul edə biləcək USB portuna sahib bir cihazdakı bütün brauzer genişləndirmələri." }, "twoFactorYubikeySupportMobile": { "message": "Bir cihazda NFC özəlliyi olan mobil tətbiqlər və ya \"YubiKey\"inizi qəbul edə bilən data portu." @@ -1387,7 +1432,7 @@ "message": "\"YubiKey\"lərinizdən biri (YubiKey NEO kimi) NFC dəstəkləyirsə, mobil cihazlarda NFC əlçatımlılığı aşkarlananda bildiriş göndəriləcək." }, "yubikeysUpdated": { - "message": "\"YubiKey\"lər yeniləndi" + "message": "\"YubiKey\"lər güncəlləndi" }, "disableAllKeys": { "message": "Bütün açarları sıradan çıxart" @@ -1417,13 +1462,13 @@ "message": "E-poçt göndər" }, "twoFactorU2fAdd": { - "message": "FIDO U2F təhlükəsizlik açarını hesabınıza əlavə edin" + "message": "FIDO U2F güvənlik açarını hesabınıza əlavə edin" }, "removeU2fConfirmation": { - "message": "Bu təhlükəsizlik açarını çıxartmaq istədiyinizə əminsiniz?" + "message": "Bu güvənlik açarını çıxartmaq istədiyinizə əminsiniz?" }, "twoFactorWebAuthnAdd": { - "message": "Hesabınzıa WebAuthn təhlükəsizlik açarı əlavə edin" + "message": "Hesabınıza WebAuthn güvənlik açarı əlavə edin" }, "readKey": { "message": "Açarı oxu" @@ -1432,43 +1477,43 @@ "message": "Açar təhlükədədir." }, "twoFactorU2fGiveName": { - "message": "Təhlükəsizlik açarını müəyyənləşdirmək üçün açıqlayıcı bir ad verin." + "message": "Güvənlik açarını müəyyənləşdirmək üçün açıqlayıcı bir ad verin." }, "twoFactorU2fPlugInReadKey": { - "message": "Təhlükəsizlik açarını kompüterinizin USB portuna taxıb \"Açarı oxu\" düyməsinə klikləyin." + "message": "Güvənlik açarını kompüterinizin USB portuna taxıb \"Açarı oxu\" düyməsinə klikləyin." }, "twoFactorU2fTouchButton": { - "message": "Əgər təhlükəsizlik açarının düyməsi varsa, basın." + "message": "Əgər güvənlik açarının düyməsi varsa, basın." }, "twoFactorU2fSaveForm": { "message": "Formu saxla." }, "twoFactorU2fWarning": { - "message": "Platforma məhdudiyyətlərinə görə, FIDO U2F bütün Bitwarden tətbiqlərində istifadə edilə bilmir. FIDO U2F istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş təchizatçısını fəallaşdırmalısınız. Dəstəklənən platformalar:" + "message": "Platforma məhdudiyyətlərinə görə, FIDO U2F bütün Bitwarden tətbiqlərində istifadə edilə bilmir. FIDO U2F istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" }, "twoFactorU2fSupportWeb": { - "message": "U2F özəlliyə sahib bir səyyah ilə masaüstü/dizüstü kompüterdə veb anbar və səyyah genişləndirmələri (FIDO U2F özəlliyinə sahib Chrome, Opera, Vivaldi və ya Firefox)." + "message": "U2F özəlliyə sahib bir brauzer ilə masaüstü/dizüstü kompüterdə veb anbar və brauzer genişləndirmələri (FIDO U2F özəlliyinə sahib Chrome, Opera, Vivaldi və ya Firefox)." }, "twoFactorU2fWaiting": { - "message": "Təhlükəsizlik açarındakı düyməyə toxunmağınız gözlənilir" + "message": "Güvənlik açarındakı düyməyə toxunmağınız gözlənilir" }, "twoFactorU2fClickSave": { - "message": "İki mərhələli giriş üçün bu təhlükəsizlik açarını fəallaşdırmaq üçün \"Saxla\" düyməsinə klikləyin." + "message": "İki mərhələli giriş üçün bu güvənlik açarını fəallaşdırmaq üçün \"Saxla\" düyməsinə klikləyin." }, "twoFactorU2fProblemReadingTryAgain": { - "message": "Təhlükəsizlik açarı oxunarkən problem yarandı. Yenidən sınayın." + "message": "Güvənlik açarı oxunarkən problem yarandı. Yenidən sınayın." }, "twoFactorWebAuthnWarning": { - "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş təchizatçısını fəallaşdırmalısınız. Dəstəklənən platformalar:" + "message": "Platforma məhdudiyyətlərinə görə, WebAuthn bütün Bitwarden tətbiqlərində istifadə edilə bilmir. WebAuthn istifadə edilə bilməyəndə, hesabınıza müraciət edə bilməyiniz üçün başqa bir iki mərhələli giriş provayderini fəallaşdırmalısınız. Dəstəklənən platformalar:" }, "twoFactorWebAuthnSupportWeb": { - "message": "WebAuthn özəlliyə sahib bir səyyah ilə masaüstü/dizüstü kompüterdə veb anbar və səyyah genişləndirmələri (FIDO U2F özəlliyinə sahib Chrome, Opera, Vivaldi və ya Firefox)." + "message": "WebAuthn özəlliyə sahib bir brauzer ilə masaüstü/dizüstü kompüterdə veb anbar və brauzer genişləndirmələri (FIDO U2F özəlliyinə sahib Chrome, Opera, Vivaldi və ya Firefox)." }, "twoFactorRecoveryYourCode": { "message": "Bitwarden iki mərhələli giriş bərpa kodunuz" }, "twoFactorRecoveryNoCode": { - "message": "Hələ ki, iki mərhələli griş təchizatçısını fəallaşdırmadınız. İki mərhələli giriş təchizatçısını faəllaşdırdıqdan sonra, bərpa kodunuz üçün buranı yoxlaya bilərsiniz." + "message": "Hələ ki, iki mərhələli griş provayderini fəallaşdırmadınız. İki mərhələli giriş provayderini faəllaşdırdıqdan sonra, bərpa kodunuz üçün buranı yoxlaya bilərsiniz." }, "printCode": { "message": "Kodu çap et", @@ -1569,7 +1614,7 @@ "message": "Zəif parol tapıldı" }, "weakPasswordsFoundDesc": { - "message": "Anbarınızda, şifrələri güclü olmayan $COUNT$ element tapdıq. Güclü şifrələr istifadə etmək üçün onları yeniləməlisiniz.", + "message": "Anbarınızda, şifrələri güclü olmayan $COUNT$ element tapdıq. Güclü şifrələr istifadə etmək üçün onları güncəlləməlisiniz.", "placeholders": { "count": { "content": "$1", @@ -1877,10 +1922,10 @@ "message": "Lisenziyanı endir" }, "updateLicense": { - "message": "Lisenziyanı yenilə" + "message": "Lisenziyanı güncəllə" }, "updatedLicense": { - "message": "Lisenziyanı yeniləndi" + "message": "Lisenziyanı güncəlləndi" }, "manageSubscription": { "message": "Abunəliyi idarə et" @@ -1982,7 +2027,7 @@ "message": "Müştəri dəstəyi ilə əlaqə" }, "updatedPaymentMethod": { - "message": "Ödəniş metodu yeniləndi." + "message": "Ödəniş metodu güncəlləndi." }, "purchasePremium": { "message": "Premium satın al" @@ -2368,7 +2413,7 @@ "message": "Təşkilatınızın bütün aspektlərini idarə edə bilər yüksək müraciətə malik istifadəçi." }, "clientOwnerDesc": { - "message": "Bu istifadəçi, təchizatçıdan müstəqil olmalıdır. Təchizatçının təşkilatla əlaqəsi kəsilsə, bu istifadəçi, təşkilatının sahibliyini davam etdirəcək." + "message": "Bu istifadəçi, provayderdən müstəqil olmalıdır. Provayderin təşkilatla əlaqəsi kəsilsə, bu istifadəçi, təşkilata sahibliyi davam etdirəcək." }, "admin": { "message": "Admin" @@ -2428,7 +2473,7 @@ "message": "Hesab parolu dəyişdirildi." }, "enabledUpdated2fa": { - "message": "İki mərhələli giriş fəallaşdırıldı/yeniləndi." + "message": "Fəal/güncəllənmiş iki mərhələli giriş." }, "disabled2fa": { "message": "İki mərhələli giriş sıradan çıxarıldı." @@ -2515,7 +2560,7 @@ } }, "viewedSecurityCodeItemId": { - "message": "$ID$ elementi üçün təhlükəsizlik koduna baxıldı.", + "message": "$ID$ elementi üçün güvənlik koduna baxıldı.", "placeholders": { "id": { "content": "$1", @@ -2542,7 +2587,7 @@ } }, "copiedSecurityCodeItemId": { - "message": "$ID$ elementi üçün təhlükəsizlik kodu kopyalandı.", + "message": "$ID$ elementi üçün güvənlik kodu kopyalandı.", "placeholders": { "id": { "content": "$1", @@ -2782,7 +2827,7 @@ "message": "Bax" }, "invalidDateRange": { - "message": "Etibarsız vaxt aralığı." + "message": "Yararsız vaxt aralığı." }, "errorOccurred": { "message": "Bir xəta baş verdi." @@ -2869,10 +2914,10 @@ "message": "Bu özəlliyi istifadə etmək üçün e-poçtunuzu təsdiqləməlisiniz." }, "updateBrowser": { - "message": "Səyyahı yenilə" + "message": "Brauzeri güncəllə" }, "updateBrowserDesc": { - "message": "Dəstəklənməyən bir veb səyyah istifadə edirsiniz. Veb anbar düzgün işləməyə bilər." + "message": "Dəstəklənməyən bir veb brauzer istifadə edirsiniz. Veb anbar düzgün işləməyə bilər." }, "joinOrganization": { "message": "Təşkilata qoşul" @@ -2902,7 +2947,7 @@ "message": "E-poçtu xatırla" }, "recoverAccountTwoStepDesc": { - "message": "Hesabınıza normal iki mərhələli giriş metodları ilə müraciət edə bilmirsinizsə, hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxartmaq üçün iki mərhələli giriş bərpa kodunuzu istifadə edə bilərsiniz." + "message": "Hesabınıza normal iki mərhələli giriş metodları ilə müraciət edə bilmirsinizsə, hesabınızdakı bütün iki mərhələli provayderlərini sıradan çıxartmaq üçün iki mərhələli giriş bərpa kodunuzu istifadə edə bilərsiniz." }, "recoverAccountTwoStep": { "message": "İki mərhələli giriş ilə hesabı bərpa edin" @@ -2956,7 +3001,7 @@ "message": "Təşkilat və əlaqəli bütün verilənləri silindi." }, "organizationUpdated": { - "message": "Təşkilat yeniləndi" + "message": "Təşkilat güncəlləndi" }, "taxInformation": { "message": "Vergi məlumatı" @@ -3079,7 +3124,7 @@ "message": "Abunəlik yerləri" }, "subscriptionUpdated": { - "message": "Abunəlik yeniləndi" + "message": "Abunəlik güncəlləndi" }, "additionalOptions": { "message": "Əlavə seçimlər" @@ -3157,25 +3202,25 @@ } }, "keyUpdated": { - "message": "Açar yeniləndi" + "message": "Açar güncəlləndi" }, "updateKeyTitle": { - "message": "Açarı yenilə" + "message": "Açarı güncəllə" }, "updateEncryptionKey": { - "message": "Şifrələmə açarını yenilə" + "message": "Şifrələmə açarını güncəllə" }, "updateEncryptionKeyShortDesc": { "message": "Hal-hazırda köhnə bir şifrələmə sxemi istifadə edirsiniz." }, "updateEncryptionKeyDesc": { - "message": "Daha yaxşı təhlükəsizlik və daha yeni özəlliklərə müraciəti təmin edən daha böyük şifrələmə açarlarına keçdik. Şifrələmə açarınızı yeniləmək sürətli və asandır. Sadəcə aşağıda ana parolunuzu yazın. Bu yeniləmə, nəticədə məcburi olacaq." + "message": "Daha yaxşı güvənlik və daha yeni özəlliklərə müraciəti təmin edən daha böyük şifrələmə açarlarına keçdik. Şifrələmə açarınızı güncəlləmək sürətli və asandır. Sadəcə aşağıda ana parolunuzu yazın. Bu güncəlləmə, nəticədə məcburi olacaq." }, "updateEncryptionKeyWarning": { - "message": "Şifrələmə açarını yenilədikdən sonra, hazırda istifadə etdiyiniz (mobil tətbiq və ya səyyah genişləndirmələri kimi) bütün Bitwarden tətbiqlərində çıxış edib yenidən giriş etməlisiniz. Çıxış edib təkrar giriş etməmək (yeni şifrələmə açarının endirilməsi prosesi) verilənlərin zədələnməsi ilə nəticələnə bilər. Avtomatik olaraq çıxış etməyə çalışacağıq, bu gecikə bilər." + "message": "Şifrələmə açarını güncəllədikdən sonra, hazırda istifadə etdiyiniz (mobil tətbiq və ya brauzer genişləndirmələri kimi) bütün Bitwarden tətbiqlərində çıxış edib yenidən giriş etməlisiniz. Çıxış edib təkrar giriş etməmək (yeni şifrələmə açarının endirilməsi prosesi) verilənlərin zədələnməsi ilə nəticələnə bilər. Avtomatik olaraq çıxış etməyə çalışacağıq, bu gecikə bilər." }, "updateEncryptionKeyExportWarning": { - "message": "Saxladığınız bütün şifrələmə ixracları da etibarsız olacaq." + "message": "Saxladığınız bütün şifrələmə ixracları da yararsız olacaq." }, "subscription": { "message": "Abunəlik" @@ -3244,14 +3289,14 @@ "message": "4 saat" }, "onRefresh": { - "message": "Səyyah təzələnəndə" + "message": "Brauzer təzələnəndə" }, "dateUpdated": { - "message": "Yeniləndi", + "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, "datePasswordUpdated": { - "message": "Parol yeniləndi", + "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" }, "organizationIsDisabled": { @@ -3264,7 +3309,7 @@ "message": "Lisenziyanın vaxtı bitib." }, "updatedUsers": { - "message": "İstifadəçilər yeniləndi" + "message": "İstifadəçilər güncəlləndi" }, "selected": { "message": "Seçildi" @@ -3342,7 +3387,7 @@ "message": "API açarınız Bitwarden ictimai API-sini təsdiqləmək üçün istifadə edilə bilər." }, "apiKeyRotateDesc": { - "message": "API açarı döndərmək, əvvəlki açarı etibarsız edəcək. Hazırkı açarın artıq təhlükəsiz olmadığına inanırsınızsa, API açarınızı döndərə bilərsiniz." + "message": "API açarı döndərmək, əvvəlki açarı yararsız edəcək. Hazırkı açarın artıq təhlükəsiz olmadığına inanırsınızsa, API açarınızı döndərə bilərsiniz." }, "apiKeyWarning": { "message": "API açarınızın təşkilata tam müraciəti var. Gizli saxlanılmalıdır." @@ -3400,7 +3445,7 @@ "message": "Sahib və ya Administrator olmayan və fərdi hesablarında \"iki mərhələli giriş\"i fəallaşdırmayan təşkilat üzvləri təşkilatdan çıxarılacaq və dəyişiklik haqqında onları məlumatlandıran e-poçt göndəriləcək." }, "twoStepLoginPolicyUserWarning": { - "message": "İstifadəçi hesabında \"iki mərhələli giriş\"in fəallaşdırılmasını tələb edən təşkilatın üzvüsünüz. İki mərhələli giriş təchizatçılarının hamısını sıradan çıxartsanız, bu təşkilatdan avtomatik olaraq çıxarılacaqsınız." + "message": "İstifadəçi hesabında \"iki mərhələli giriş\"in fəallaşdırılmasını tələb edən təşkilatın üzvüsünüz. İki mərhələli giriş provayderlərinin hamısını sıradan çıxartsanız, bu təşkilatdan avtomatik olaraq çıxarılacaqsınız." }, "passwordGeneratorPolicyDesc": { "message": "Parol yaradıcı konfiqurasiyası üçün minimum tələbləri tənzimləyin." @@ -3573,7 +3618,7 @@ "message": "ƏDV vergi kimlik nömrəsi" }, "taxInfoUpdated": { - "message": "Vergi məlumatlarınız yeniləndi." + "message": "Vergi məlumatlarınız güncəlləndi." }, "setMasterPassword": { "message": "Ana parolu tənzimlə" @@ -4104,7 +4149,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineProductDesc": { - "message": "\"Bitwarden Send\" həssas, müvəqqəti məlumatlarına başqa şəxslərə asan və təhlükəsiz göndərilməsini təmin edir.", + "message": "\"Bitwarden Send\" həssas, müvəqqəti məlumatlarına başqa şəxslərə asan və güvənli göndərilməsini təmin edir.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineLearnMore": { @@ -4181,7 +4226,7 @@ "message": "WebAuthn təsdiqləmə" }, "webAuthnNotSupported": { - "message": "WebAuthn bu səyyahda dəstəklənmir." + "message": "WebAuthn bu brauzerdə dəstəklənmir." }, "webAuthnSuccess": { "message": "WebAuthn uğurla təsdiqləndi! Bu vərəqi bağlaya bilərsiniz." @@ -4391,28 +4436,28 @@ "message": "\"İstifadəçiləri idarə et\", \"Parol sıfırlanmasını idarə et\" icazəsi ilə də fəallaşdırılmalıdır" }, "setupProvider": { - "message": "Təchizatçı quraşdırması" + "message": "Provayder quraşdırması" }, "setupProviderLoginDesc": { - "message": "Yeni bir təchizatçı quraşdırılması üçün dəvət edildiniz. Davam etmək üçün yeni bir Bitwarden hesabı açın və ya mövcud hesaba giriş edin." + "message": "Yeni bir provayder quraşdırılması üçün dəvət edildiniz. Davam etmək üçün yeni bir Bitwarden hesabı açın və ya mövcud hesaba giriş edin." }, "setupProviderDesc": { - "message": "Təchizatçının quraşdırılmasını tamamlamaq üçün zəhmət olmasa aşağıdakı məlumatları daxil edin. Sual yaranarsa, müştəri dəstəyi ilə əlaqə saxlayın." + "message": "Provayderin quraşdırılmasını tamamlamaq üçün zəhmət olmasa aşağıdakı məlumatları daxil edin. Sual yaranarsa, müştəri dəstəyi ilə əlaqə saxlayın." }, "providerName": { - "message": "Təchizatçı adı" + "message": "Provayder adı" }, "providerSetup": { - "message": "Təchizatçı quraşdırıldı." + "message": "Provayder quraşdırıldı." }, "clients": { "message": "Müştərilər" }, "providerAdmin": { - "message": "Təchizatçı admini" + "message": "Provayder admini" }, "providerAdminDesc": { - "message": "Təchizatçınızın bütün aspektlərini idarə edə bilən, həmçinin müştəri təşkilatlarına müraciət edə və onları idarə edə bilən ən yüksək müraciətə sahib istifadəçi." + "message": "Provayderinizin bütün aspektlərini idarə edə bilən, həmçinin müştəri təşkilatlarına müraciət edə və onları idarə edə bilən ən yüksək müraciətə sahib istifadəçi." }, "serviceUser": { "message": "Xidmət istifadəçisi" @@ -4421,40 +4466,40 @@ "message": "Xidmət istifadəçisi, bütün müştəri təşkilatlarına müraciət edə və onları idarə edə bilər." }, "providerInviteUserDesc": { - "message": "Aşağıda Bitwarden hesabının e-poçt ünvanını daxil edərək təchizatçınıza yeni bir istifadəçi dəvət edə bilərsiniz. Əgər Bitwarden hesabı yoxdursa, yeni bir hesab yaratmaları üçün istək göndəriləcək." + "message": "Aşağıda Bitwarden hesabının e-poçt ünvanını daxil edərək provayderinizə yeni bir istifadəçi dəvət edə bilərsiniz. Əgər Bitwarden hesabı yoxdursa, yeni bir hesab yaratmaları üçün istək göndəriləcək." }, "joinProvider": { - "message": "Təchizatçıya qoşul" + "message": "Provayderə qoşul" }, "joinProviderDesc": { - "message": "Yuxarıdakı təchizatçıya qoşulmaq üçün dəvət edildiniz. Dəvəti qəbul etmək üçün Bitwarden hesabına giriş etməli və ya yeni bir hesab yaratmalısınız." + "message": "Yuxarıdakı provayderə qoşulmaq üçün dəvət edildiniz. Dəvəti qəbul etmək üçün Bitwarden hesabına giriş etməli və ya yeni bir hesab yaratmalısınız." }, "providerInviteAcceptFailed": { - "message": "Dəvət qəbul edilə bilmədi. Təchizatçı adminindən yeni bir dəvət göndərməsini xahiş edin." + "message": "Dəvət qəbul edilə bilmədi. Provayder adminindən yeni bir dəvət göndərməsini xahiş edin." }, "providerInviteAcceptedDesc": { - "message": "Administrator üzvlüyünüzü təsdiqlədikdən sonra bu təchizatçıya müraciət edə bilərsiniz. Bu baş verəndə sizə bir e-poçt göndərəcəyik." + "message": "Administrator üzvlüyünüzü təsdiqlədikdən sonra bu provayderə müraciət edə bilərsiniz. Bu baş verəndə sizə bir e-poçt göndərəcəyik." }, "providerUsersNeedConfirmed": { - "message": "Onların dəvətini qəbul edən istifadəçiləriniz var, ancaq hələ də təsdiqlənməlidir. İstifadəçilər, təsdiqlənənə qədər təchizatçıya müraciət edə bilməz." + "message": "Onların dəvətini qəbul edən istifadəçiləriniz var, ancaq hələ də təsdiqlənməlidir. İstifadəçilər, təsdiqlənənə qədər provayderə müraciət edə bilməz." }, "provider": { - "message": "Təchizatçı" + "message": "Provayder" }, "newClientOrganization": { "message": "Yeni müştəri təşkilatı" }, "newClientOrganizationDesc": { - "message": "Təchizatçı kimi sizinlə əlaqə yaradılacaq yeni bir müştəri təşkilatı yaradın. Bu təşkilata müraciət edə və onu idarə edə biləcəksiniz." + "message": "Provayder kimi sizinlə əlaqə yaradılacaq yeni bir müştəri təşkilatı yaradın. Bu təşkilata müraciət edə və onu idarə edə biləcəksiniz." }, "addExistingOrganization": { "message": "Mövcud təşkilatı əlavə et" }, "myProvider": { - "message": "Təchizatçım" + "message": "Provayderim" }, "addOrganizationConfirmation": { - "message": "$ORGANIZATION$ təşkilatını müştəri olaraq $PROVIDER$ təchizatçısına əlavə etmək istədiyinizə əminsiniz?", + "message": "$ORGANIZATION$ təşkilatını müştəri olaraq $PROVIDER$ provayderinə əlavə etmək istədiyinizə əminsiniz?", "placeholders": { "organization": { "content": "$1", @@ -4467,10 +4512,10 @@ } }, "organizationJoinedProvider": { - "message": "Təşkilat, uğurla təchizatçıya əlavə edildi" + "message": "Təşkilat, uğurla provayderə əlavə edildi" }, "accessingUsingProvider": { - "message": "$PROVIDER$ təchizatçısını istifadə edən təşkilata müraciət edilir", + "message": "$PROVIDER$ provayderini istifadə edən təşkilata müraciət edilir", "placeholders": { "provider": { "content": "$1", @@ -4479,13 +4524,13 @@ } }, "providerIsDisabled": { - "message": "Təchizatçı sıradan çıxarıldı." + "message": "Provayder sıradan çıxarıldı." }, "providerUpdated": { - "message": "Təchizatçı yeniləndi" + "message": "Provayder güncəlləndi" }, "yourProviderIs": { - "message": "Təchizatçınız: $PROVIDER$. Təşkilatınız üçün inzibati və faktura səlahiyyətlərinə sahibdir.", + "message": "Provayderiniz: $PROVIDER$. Təşkilatınız üçün inzibati və faktura səlahiyyətlərinə sahibdir.", "placeholders": { "provider": { "content": "$1", @@ -4494,7 +4539,7 @@ } }, "detachedOrganization": { - "message": "$ORGANIZATION$ təşkilatı təchizatçınızdan ayrıldı.", + "message": "$ORGANIZATION$ təşkilatı provayderinizdən ayrıldı.", "placeholders": { "organization": { "content": "$1", @@ -4503,22 +4548,22 @@ } }, "detachOrganizationConfirmation": { - "message": "Bu təşkilatı ayırmaq istədiyinizə əminsiniz? Təşkilat, mövcudluğunu davam etdirəcək, ancaq təchizatçı tərəfindən idarə edilməyəcək." + "message": "Bu təşkilatı ayırmaq istədiyinizə əminsiniz? Təşkilat, mövcudluğunu davam etdirəcək, ancaq provayder tərəfindən idarə edilməyəcək." }, "add": { "message": "Əlavə et" }, "updatedMasterPassword": { - "message": "Yenilənmiş ana parol" + "message": "Güncəllənmiş ana parol" }, "updateMasterPassword": { - "message": "Ana parolu yenilə" + "message": "Ana parolu güncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün Ana parolunuzu indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün Ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "masterPasswordInvalidWarning": { - "message": "Ana parolunuz bu təşkilatın siyasət tələblərinə cavab vermir. Təşkilata qoşulmaq üçün Ana parolunuzu indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz bu təşkilatın siyasət tələblərinə cavab vermir. Təşkilata qoşulmaq üçün Ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "maximumVaultTimeout": { "message": "Anbara müraciət bitəcək" @@ -4530,7 +4575,7 @@ "message": "Anbara müraciət üzrə maksimum vaxt" }, "invalidMaximumVaultTimeout": { - "message": "Etibarsız vaxt." + "message": "Yararsız maksimum anbar bitmə vaxtı." }, "hours": { "message": "Saat" @@ -4585,10 +4630,10 @@ "message": "OpenID Bağlantı Konfiqurasiyası" }, "samlSpConfig": { - "message": "SAML Servis Təchizatçı Konfiqurasiyası" + "message": "SAML Servis Provayder Konfiqurasiyası" }, "samlIdpConfig": { - "message": "SAML Kimlik Təchizatçı Konfiqurasiyası" + "message": "SAML Kimlik Provayder Konfiqurasiyası" }, "callbackPath": { "message": "Geri zəng yolu" @@ -4828,7 +4873,7 @@ "message": "Təsdiq kodu lazımdır." }, "invalidVerificationCode": { - "message": "Etibarsız təsdiqləmə kodu" + "message": "Yararsız təsdiqləmə kodu" }, "convertOrganizationEncryptionDesc": { "message": "$ORGANIZATION$, öz-özünə sahiblik edən açar serveri ilə SSO istifadə edir. Bu təşkilatın üzvlərinin giriş etməsi üçün artıq ana parol tələb edilməyəcək.", @@ -4852,7 +4897,7 @@ "message": "SSO kimlik təsdiqləməsinə icazə ver" }, "allowSsoDesc": { - "message": "Qurulduqdan sonra, konfiqurasiyanız saxlanılacaq və üzvləriniz, Kimlik Təchizatçısı üçün kimlik məlumatlarını istifadə edərək kimliklərini təsdiqləyə biləcək." + "message": "Qurulduqdan sonra, konfiqurasiyanız saxlanılacaq və üzvləriniz, Kimlik Provayderi üçün kimlik məlumatlarını istifadə edərək kimliklərini təsdiqləyə biləcək." }, "ssoPolicyHelpStart": { "message": "Bütün üzvlərin SSO ilə", @@ -4960,7 +5005,7 @@ "message": "Davam etsəniz, öz-özünə sahiblik edən serverinizdəki faktura eyniləşdirməni təkrar quraşdırmalı olacaqsınız." }, "rotateBillingSyncTokenTitle": { - "message": "Faktura eyniləşdirmə tokenini döndərmək, əvvəlki tokeni etibarsız edəcək." + "message": "Faktura eyniləşdirmə tokenini döndərmək, əvvəlki tokeni yararsız edəcək." }, "selfHostingTitle": { "message": "Öz-özünə sahiblik etmə" @@ -5071,7 +5116,7 @@ "message": "Ana parol" }, "security": { - "message": "Təhlükəsizlik" + "message": "Güvənlik" }, "keys": { "message": "Açarlar" @@ -5115,7 +5160,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "E-poçt təchizatçınızın alt ünvan özəlliklərini istifadə et." + "message": "E-poçt provayderinizin alt ünvan özəlliklərini istifadə et." }, "catchallEmail": { "message": "Catch-all E-poçt" @@ -5149,7 +5194,7 @@ } }, "awaitingSyncSingular": { - "message": "Token $DAYS$ gün əvvəl döndərildi. Öz-özünə sahiblik edən təşkilat tənzimləmələrinizdə faktura eyniləşdirmə tokenini yeniləyin.", + "message": "Token $DAYS$ gün əvvəl döndərildi. Öz-özünə sahiblik edən təşkilat tənzimləmələrinizdə faktura eyniləşdirmə tokenini güncəlləyin.", "placeholders": { "days": { "content": "$1", @@ -5158,7 +5203,7 @@ } }, "awaitingSyncPlural": { - "message": "Token $DAYS$ gün əvvəl döndərildi. Öz-özünə sahiblik edən təşkilat tənzimləmələrinizdə faktura eyniləşdirmə tokenini yeniləyin.", + "message": "Token $DAYS$ gün əvvəl döndərildi. Öz-özünə sahiblik edən təşkilat tənzimləmələrinizdə faktura eyniləşdirmə tokenini güncəlləyin.", "placeholders": { "days": { "content": "$1", @@ -5209,7 +5254,7 @@ "message": "Fəal olduqda, tanınmayan bir cihazdan giriş edərkən e-poçt ünvanınıza təsdiqləmə kodları göndərilir" }, "updatedDeviceVerification": { - "message": "Cihaz təsdiqləməsi yeniləndi" + "message": "Cihaz təsdiqləməsi güncəlləndi" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { "message": "Cihaz təsdiqləməsini fəallaşdırmaq istədiyinizə əminsiniz? Təsdiqləmə kodları $EMAIL$ ünvanına göndəriləcək", diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 022f1143c10..3d40976b187 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Памылковы асноўны пароль" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Заблакіраваць" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Фармат файла" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Даныя вашага сховішча былі экспартаваныя." }, diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index f41b0713fb4..419ace835ea 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Грешна главна парола" }, + "invalidFilePassword": { + "message": "Неправилна парола за файла. Използвайте паролата, която сте въвели при създаването на изнесения файл." + }, "lockNow": { "message": "Заключване сега" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Формат на файла" }, + "fileEncryptedExportWarningDesc": { + "message": "Изнесеният файл ще бъде защитен с парола, която ще бъде необходима за дешифриране на файла." + }, + "exportPasswordDescription": { + "message": "Парола ще се използва при изнасянето и при внасянето на този файл" + }, + "confirmMasterPassword": { + "message": "Потвърждаване на главната парола" + }, + "confirmFormat": { + "message": "Потвърждаване на формата" + }, + "filePassword": { + "message": "Парола на файла" + }, + "confirmFilePassword": { + "message": "Потвърждаване на паролата на файла" + }, + "accountBackupOptionDescription": { + "message": "Използва шифроването на Вашата регистрация в Битуорден, а не главната Ви парола, като защита на изнесения файл. Той може да бъде внесен само в текущата регистрация. Използвайте тази възможност, за да направите резервно копие, което не може да се ползва другаде." + }, + "passwordProtectedOptionDescription": { + "message": "Създайте потребителска парола за защита на изнесения файл. Използвайте тази възможност, за да изнесете информацията във файл, който да може да се ползва и в други регистрации." + }, + "fileTypeHeading": { + "message": "Тип на файла" + }, + "accountBackup": { + "message": "Резервно копие на регистрацията" + }, + "passwordProtected": { + "message": "Защитен с парола" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Дънните в полетата „Парола на файла“ и „Потвърждаване на паролата на файла“ не съвпадат." + }, + "confirmVaultImport": { + "message": "Потвърждаване на внасянето на трезора" + }, + "confirmVaultImportDesc": { + "message": "Този файл е защитен с парола. Трябва да въведете паролата, за да могат данните да бъдат внесени." + }, "exportSuccess": { "message": "Данните от трезора ви са изнесени." }, diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 1c1f6c3a3a3..d3e7a5f6a1d 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "অবৈধ মূল পাসওয়ার্ড" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "এখনই লক করুন" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index c8a1e5e3297..fbc629ef7fe 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 6a75f410bfa..08cc2b165f2 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Contrasenya mestra no vàlida" }, + "invalidFilePassword": { + "message": "La contrasenya del fitxer no és vàlida. Utilitzeu la contrasenya que vau introduir quan vau crear el fitxer d'exportació." + }, "lockNow": { "message": "Bloqueja ara" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format de fitxer" }, + "fileEncryptedExportWarningDesc": { + "message": "Aquesta exportació de fitxers estarà protegida amb contrasenya i requerirà la contrasenya del fitxer per desxifrar-la." + }, + "exportPasswordDescription": { + "message": "Aquesta contrasenya s'utilitzarà per exportar i importar aquest fitxer" + }, + "confirmMasterPassword": { + "message": "Confirma la contrasenya mestra" + }, + "confirmFormat": { + "message": "Confirma el format" + }, + "filePassword": { + "message": "Contrasenya del fitxer" + }, + "confirmFilePassword": { + "message": "Confirma la contrasenya del fitxer" + }, + "accountBackupOptionDescription": { + "message": "Utilitzeu la clau de xifratge del vostre compte per xifrar l'exportació i restringir la importació només al compte de Bitwarden actual." + }, + "passwordProtectedOptionDescription": { + "message": "Establiu una contrasenya per xifrar l'exportació i importeu-la a qualsevol compte de Bitwarden mitjançant aquesta contrasenya." + }, + "fileTypeHeading": { + "message": "Tipus de fitxer" + }, + "accountBackup": { + "message": "Còpia de seguretat del compte" + }, + "passwordProtected": { + "message": "Protegit amb contrasenya" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Contrasenya del fitxer\" i \"Confirma contrasenya del fitxer\" no coincideixen." + }, + "confirmVaultImport": { + "message": "Confirma la importació de la Caixa forta" + }, + "confirmVaultImportDesc": { + "message": "Aquest fitxer està protegit amb contrasenya. Introduïu-la per importar dades." + }, "exportSuccess": { "message": "S'han exportat les dades de la vostra caixa forta." }, diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 2f28e22ba36..2e18e2c5923 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Chybné hlavní heslo" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Zamknout nyní" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formát souboru" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Data trezoru byla exportována" }, diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 96148639ed9..c2a64d74c91 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ugyldig hovedadgangskode" }, + "invalidFilePassword": { + "message": "Ugyldig filadgangskode. Brug venligst den adgangskode, du indtastede, da du oprettede eksportfilen." + }, "lockNow": { "message": "Lås nu" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "Denne fileksport vil være adgangskodebeskyttet og kræve filadgangskoden ved dekryptering." + }, + "exportPasswordDescription": { + "message": "Denne adgangskode vil blive brugt til at eksportere og importere denne fil" + }, + "confirmMasterPassword": { + "message": "Bekræft hovedadgangskode" + }, + "confirmFormat": { + "message": "Bekræft format" + }, + "filePassword": { + "message": "Filadgangskode" + }, + "confirmFilePassword": { + "message": "Bekræft filadgangskode" + }, + "accountBackupOptionDescription": { + "message": "Udnytter din Bitwarden-kontokryptering, ikke hovedadgangskode, for at beskytte eksporten. Denne eksport kan kun importeres til den aktuelle konto. Brug denne til at oprette en sikkerhedskopi, der ikke kan bruges andre steder." + }, + "passwordProtectedOptionDescription": { + "message": "Opret en brugergenereret adgangskode for at beskytte eksporten. Brug denne til at oprette en eksport, der kan bruges via andre konti." + }, + "fileTypeHeading": { + "message": "Filtype" + }, + "accountBackup": { + "message": "Kontosikkerhedskopi" + }, + "passwordProtected": { + "message": "Kodeordsbeskyttet" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“Filadgangskode” og “Bekræft filadgangskode“ matcher ikke." + }, + "confirmVaultImport": { + "message": "Bekræft boks-import" + }, + "confirmVaultImportDesc": { + "message": "Denne fil er adgangskodebeskyttet. Angiv filadgangskoden for at importere data." + }, "exportSuccess": { "message": "Dine boksdata er blevet eksporteret." }, diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 1fb2b0f3f9e..a31fb03b2f2 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ungültiges Master-Passwort" }, + "invalidFilePassword": { + "message": "Ungültiges Dateipasswort, bitte verwende das Passwort, das du beim Erstellen der Exportdatei eingegeben hast." + }, "lockNow": { "message": "Jetzt sperren" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Dateiformat" }, + "fileEncryptedExportWarningDesc": { + "message": "Dieser Datei-Export ist passwortgeschützt und erfordert das Dateipasswort zum Entschlüsseln." + }, + "exportPasswordDescription": { + "message": "Dieses Passwort wird verwendet, um diese Datei zu exportieren und zu importieren" + }, + "confirmMasterPassword": { + "message": "Master-Passwort bestätigen" + }, + "confirmFormat": { + "message": "Format bestätigen" + }, + "filePassword": { + "message": "Dateipasswort" + }, + "confirmFilePassword": { + "message": "Dateipasswort bestätigen" + }, + "accountBackupOptionDescription": { + "message": "Nutzt die Verschlüsselung Ihres Bitwarden-Kontos, nicht das Master-Passwort, zum Schutz des Exports. Dieser Export kann nur in das aktuelle Konto importiert werden. Hiermit kannst du ein Backup erstellen, das nicht anderweitig verwendet werden kann." + }, + "passwordProtectedOptionDescription": { + "message": "Erstelle ein benutzergeneriertes Passwort, um den Export zu schützen. Verwende dies, um einen Export zu erstellen, der in anderen Konten verwendet werden kann." + }, + "fileTypeHeading": { + "message": "Dateityp" + }, + "accountBackup": { + "message": "Konto-Sicherung" + }, + "passwordProtected": { + "message": "Passwortgeschützt" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "„Dateipasswort“ und „Dateipasswort bestätigen“ stimmen nicht überein." + }, + "confirmVaultImport": { + "message": "Tresor-Import bestätigen" + }, + "confirmVaultImportDesc": { + "message": "Diese Datei ist passwortgeschützt. Bitte gebe das Dateipasswort ein, um Daten zu importieren." + }, "exportSuccess": { "message": "Ihre Daten wurden exportiert." }, diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index b3e1aa83c94..a8324937f85 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Μη έγκυρος κύριος κωδικός πρόσβασης" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Κλείδωμα Τώρα" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Μορφή Αρχείου" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Τα δεδομένα του vault σας έχουν εξαχθεί." }, diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index cd3a3f89b1e..b9a10e569b0 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Leverages your Bitwarden account encryption, not master password, to protect the export. This export can only be imported into the current account. Use this to create a backup that cannot be used elsewhere." + }, + "passwordProtectedOptionDescription": { + "message": "Create a user-generated password to protect the export. Use this to create an export that can be used in other accounts." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index ac8fdd50fb0..14a07c48e2d 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 2a6e2df5bd9..327bc12f086 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Nevalida majstra pasvorto" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Ŝlosi Nun" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Dosierformato" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Viaj volbaj datumoj estis eksportitaj." }, diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 56bfa3f01de..2ec91552fd3 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Contraseña maestra no válida" }, + "invalidFilePassword": { + "message": "Contraseña de archivo no válida, por favor utilice la contraseña que introdujo cuando creó el archivo de exportación." + }, "lockNow": { "message": "Bloquear ahora" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formato de archivo" }, + "fileEncryptedExportWarningDesc": { + "message": "Este archivo de exportación estará protegido por contraseña y requerirá la contraseña del archivo para descifrar." + }, + "exportPasswordDescription": { + "message": "Esta contraseña se utilizará para exportar e importar este archivo" + }, + "confirmMasterPassword": { + "message": "Confirmar contraseña maestra" + }, + "confirmFormat": { + "message": "Confirmar formato" + }, + "filePassword": { + "message": "Contraseña del archivo" + }, + "confirmFilePassword": { + "message": "Confirmar contraseña del archivo" + }, + "accountBackupOptionDescription": { + "message": "Aproveche el cifrado de su cuenta de Bitwarden, no la contraseña maestra, para proteger la exportación. Esta exportación sólo puede importarse a la cuenta actual. Utilice esto para crear una copia de seguridad que no se puede utilizar en otro lugar." + }, + "passwordProtectedOptionDescription": { + "message": "Crear una contraseña generada por el usuario para proteger la exportación. Utilice esto para crear una exportación que pueda ser usada en otras cuentas." + }, + "fileTypeHeading": { + "message": "Tipo de archivo" + }, + "accountBackup": { + "message": "Copia de seguridad de la cuenta" + }, + "passwordProtected": { + "message": "Protegida con contraseña" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“Contraseña del archivo” y “Confirmar contraseña del archivo” no coinciden." + }, + "confirmVaultImport": { + "message": "Confirmar importación de la bóveda" + }, + "confirmVaultImportDesc": { + "message": "Este archivo está protegido por contraseña. Introduzca la contraseña del archivo para importar datos." + }, "exportSuccess": { "message": "El contenido de tu caja fuerte ha sido exportado." }, diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index c9be9eaae43..542914b221d 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Vale ülemparool" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lukusta paroolihoidla" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Failivorming" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Hoidla on eksporditud." }, diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index bb7856aad26..03fe2d2e010 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Master pasahitz baliogabea" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Blokeatu orain" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Fitxategiaren formatua" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "Fitxategi mota" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Zure kutxa gotorra esportatu da." }, diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index fcab4b0aa62..9b2b92289c4 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Virheellinen pääsalasana" }, + "invalidFilePassword": { + "message": "Tiedoston salasana on virheellinen. Käytä vientitiedoston luonnin yhteydessä käytettyä salasanaa." + }, "lockNow": { "message": "Lukitse nyt" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Tiedostomuoto" }, + "fileEncryptedExportWarningDesc": { + "message": "Tämä vientitiedosto on suojattu salasanalla, joka on syötettävä ja salauksen purkamiseksi." + }, + "exportPasswordDescription": { + "message": "Tätä salasanaa käytetään tämän tiedoston viennissä ja tuonnissa" + }, + "confirmMasterPassword": { + "message": "Vahvista pääsalasana" + }, + "confirmFormat": { + "message": "Vahvista muoto" + }, + "filePassword": { + "message": "Tiedoston salasana" + }, + "confirmFilePassword": { + "message": "Vahvista tiedoston salasana" + }, + "accountBackupOptionDescription": { + "message": "Hyödyntää viennin suojauksessa Bitwarden-tilisi salausta sen pääsalasanan sijaan. Tällainen vienti voidaan tuoda vain nykyiselle käyttäjätilille. Tämän avulla voidaan luoda varmuuskopio, jota ei ole mahdollista käyttää muilla tileillä." + }, + "passwordProtectedOptionDescription": { + "message": "Suojaa vienti omavalintaisella salasanalla. Tämän avulla voidaan luoda vienti, jota on mahdollista käyttää myös muilla käyttäjätileillä." + }, + "fileTypeHeading": { + "message": "Tiedostotyyppi" + }, + "accountBackup": { + "message": "Tilin varmuuskopiointi" + }, + "passwordProtected": { + "message": "Salasanasuojattu" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Tiedoston salasana\" ja \"Vahvista tiedoston salasana\" eivät täsmää." + }, + "confirmVaultImport": { + "message": "Vahvista holvin tuonti" + }, + "confirmVaultImportDesc": { + "message": "Tiedosto on salasanasuojattu. Syötä tiedoston salasana tuodaksesi tiedot." + }, "exportSuccess": { "message": "Holvisi tiedot on viety." }, @@ -5111,17 +5156,17 @@ "message": "Käyttäjätunnuksen tyyppi" }, "plusAddressedEmail": { - "message": "Plus-osoitteinen sähköposti", + "message": "Plus+merkkinen sähköposti", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Käytä sähköpostipalvelusi aliosoiteominaisuuksia." }, "catchallEmail": { - "message": "Catch-all-sähköpostiosoite" + "message": "Catch-all-sähköposti" }, "catchallEmailDesc": { - "message": "Käytä verkkotunnuksellesi määritettyä catch-all-postilaatikkoa." + "message": "Käytä verkkotunnuksesi catch-all-postilaatikkoa." }, "random": { "message": "Satunnainen", @@ -5187,7 +5232,7 @@ "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { - "message": "Välitykseen käytetty sähköpostialias" + "message": "Sähköpostialias välitykseen" }, "forwardedEmailDesc": { "message": "Luo sähköpostialias ulkoisella ohjauspalvelulla." diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 2a7985c998c..37f65c83d49 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index aaf012d69cb..51dd966dea1 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Mot de passe maître invalide" }, + "invalidFilePassword": { + "message": "Mot de passe de fichier invalide, veuillez utiliser le mot de passe que vous avez entré lorsque vous avez créé le fichier d'exportation." + }, "lockNow": { "message": "Verrouiller maintenant" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format de fichier" }, + "fileEncryptedExportWarningDesc": { + "message": "Ce fichier d'exportation sera protégé par mot de passe et nécessitera le mot de passe pour que le fichier soit déchiffré." + }, + "exportPasswordDescription": { + "message": "Ce mot de passe sera utilisé pour exporter et importer ce fichier" + }, + "confirmMasterPassword": { + "message": "Confirmer le Mot de Passe Maître" + }, + "confirmFormat": { + "message": "Confirmer le Format" + }, + "filePassword": { + "message": "Mot de Passe du Fichier" + }, + "confirmFilePassword": { + "message": "Confirmer le Mot de Passe du Fichier" + }, + "accountBackupOptionDescription": { + "message": "Utilise le chiffrement de votre compte Bitwarden pour protéger l'exportation, pas celui du mot de passe maître. Cette exportation ne peut être importée que dans le compte actuel. Utilisez ceci pour créer une sauvegarde qui ne peut pas être utilisée ailleurs." + }, + "passwordProtectedOptionDescription": { + "message": "Créez un mot de passe généré par l'utilisateur pour protéger l'exportation. Utilisez ceci pour créer une exportation qui peut être utilisée dans d'autres comptes." + }, + "fileTypeHeading": { + "message": "Types de Fichier" + }, + "accountBackup": { + "message": "Sauvegarde du Compte" + }, + "passwordProtected": { + "message": "Protégé par Mot de Passe" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Le \"Mot de Passe\" et le \"Mot de Passe Confirmé\" ne correspondent pas." + }, + "confirmVaultImport": { + "message": "Confirmer l'Importation du Coffre" + }, + "confirmVaultImportDesc": { + "message": "Ce fichier est protégé par mot de passe. Veuillez entrer le mot de passe du fichier pour importer des données." + }, "exportSuccess": { "message": "Les données de votre coffre ont été exportées." }, diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 15f87343b3f..fce1aa9d41e 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "סיסמה ראשית שגויה" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "נעל עכשיו" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "פורמט קובץ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "הוצאת המידע מהכספת שלך הסתיימה." }, diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 733cc4f3c17..63abb103a71 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 92ef50abce3..0207bb4e595 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Neispravna glavna lozinka" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Zaključaj sada" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format datoteke" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Tvoji podaci iz trezora su izvezeni." }, diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index bcbbfefdb3a..e97ce8698b7 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "A mesterjelszó érvénytelen." }, + "invalidFilePassword": { + "message": "Érvénytelen a fájl jelszó. Használjuk az exportálás fájl létrehozásakor megadott jelszót." + }, "lockNow": { "message": "Zárolás most" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Fájlformátum" }, + "fileEncryptedExportWarningDesc": { + "message": "Ez a fájl exportálás jelszóval védett és a visszafejtéshez a fájl jelszó megadása szükséges." + }, + "exportPasswordDescription": { + "message": "Ezt a jelszó kerül használatba a fájl exportálására és importálására." + }, + "confirmMasterPassword": { + "message": "Mesterjelszó megerősítése" + }, + "confirmFormat": { + "message": "Formátum megerősítése" + }, + "filePassword": { + "message": "Fájl jelszó" + }, + "confirmFilePassword": { + "message": "Fájl jelszó megerősítés" + }, + "accountBackupOptionDescription": { + "message": "Az exportálás védelme érdekében a Bitwarden fiók titkosítását használjuk, nem a mesterjelszót. Ez az exportálás csak az aktuális fiókba importálható. Ezzel máshol nem használható biztonsági másolatot hozhatunk létre." + }, + "passwordProtectedOptionDescription": { + "message": "Hozzunk létre egy felhasználó által generált jelszót az exportálás védelme érdekében. Ezzel más fiókokban is használható exportálást hozhatunk létre." + }, + "fileTypeHeading": { + "message": "Fájltípus" + }, + "accountBackup": { + "message": "Fiók biztonsági másolat" + }, + "passwordProtected": { + "message": "Jelszóval védett" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "A “Fájl jelszó” és a “Fájl jelszó megerősítés“ nem egyezik." + }, + "confirmVaultImport": { + "message": "Széf importálás megerősítése" + }, + "confirmVaultImportDesc": { + "message": "Ez a fájl jelszóval védett. Adjuk meg a fájl jelszót az adatok importálásához." + }, "exportSuccess": { "message": "A széfadatok exportálásra kerültek." }, diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 353dd5f0732..46f191e077b 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Sandi utama tidak valid" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Kunci Sekarang" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format Berkas" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Data brankas Anda telah diekspor." }, diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index c323591a690..95d88164705 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Password principale errata" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Blocca" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formato file" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "I dati della tua cassaforte sono stati esportati." }, diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index e8e5dfbb46f..9345261bc3c 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "マスターパスワードが間違っています" }, + "invalidFilePassword": { + "message": "無効なファイルパスワードです。エクスポートファイルを作成したときに入力したパスワードを使用してください。" + }, "lockNow": { "message": "今すぐロック" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "ファイル形式" }, + "fileEncryptedExportWarningDesc": { + "message": "エクスポートするファイルはパスワードで保護され、復号するにはファイルパスワードが必要になります。" + }, + "exportPasswordDescription": { + "message": "このパスワードはこのファイルのエクスポートとインポート時に使用します" + }, + "confirmMasterPassword": { + "message": "マスターパスワードの確認" + }, + "confirmFormat": { + "message": "フォーマットの確認" + }, + "filePassword": { + "message": "ファイルパスワード" + }, + "confirmFilePassword": { + "message": "ファイルパスワードの確認" + }, + "accountBackupOptionDescription": { + "message": "アカウントの暗号化キーを使用してエクスポートを暗号化し、インポートを現在の Bitwarden アカウントのみに制限します。" + }, + "passwordProtectedOptionDescription": { + "message": "エクスポートを暗号化するためのパスワードを設定します。そのパスワードを使用して、任意の Bitwarden アカウントにインポートします。" + }, + "fileTypeHeading": { + "message": "ファイル形式" + }, + "accountBackup": { + "message": "アカウントのバックアップ" + }, + "passwordProtected": { + "message": "パスワード保護あり" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "「ファイルパスワード」と「ファイルパスワードの確認」が一致しません。" + }, + "confirmVaultImport": { + "message": "保管庫のエクスポートの確認" + }, + "confirmVaultImportDesc": { + "message": "このファイルはパスワードで保護されています。インポートするファイルのパスワードを入力してください。" + }, "exportSuccess": { "message": "エクスポートされました。" }, diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 0e711752773..5ca96affb7a 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 0e711752773..5ca96affb7a 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index d88dd908061..e49c178c6be 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "ಅಮಾನ್ಯ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "ಈಗ ಲಾಕ್ ಮಾಡಿ" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "ಫೈಲ್ ಮಾದರಿ" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಡೇಟಾವನ್ನು ರಫ್ತು ಮಾಡಲಾಗಿದೆ." }, diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index ed27d11b8b7..5e9ec49e03a 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "잘못된 마스터 비밀번호" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "지금 잠그기" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "파일 형식" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "보관함 데이터를 내보냈습니다." }, diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index c78a0c648c4..f1d428388a6 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Nederīga galvenā parole" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Aizslēgt" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Datnes veids" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Glabātavas saturs ir izgūts." }, diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 6efc527ed56..3daff3c6492 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "അസാധുവായ പ്രാഥമിക പാസ്‌വേഡ്" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "ഇപ്പോൾ പൂട്ടുക" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "ഫയൽ ഫോർമാറ്റ്" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "നിങ്ങളുടെ വാൾട് ഡാറ്റ എക്‌സ്‌പോർട്ടുചെയ്‌തു." }, diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 02b68215695..3f8bec3fd68 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ugyldig superpassord" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lås nå" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Ditt hvelvs data har blitt eksportert." }, diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 06817dd35f2..4459abac692 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ongeldig hoofdwachtwoord" }, + "invalidFilePassword": { + "message": "Onjuist bestandswachtwoord, gebruik het wachtwoord dat je hebt ingevoerd bij het aanmaken van het exportbestand." + }, "lockNow": { "message": "Nu vergrendelen" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Bestandsindeling" }, + "fileEncryptedExportWarningDesc": { + "message": "Deze bestandsexport wordt met een wachtwoord beveiligd en vereist het bestandswachtwoord om te decoderen." + }, + "exportPasswordDescription": { + "message": "Dit wachtwoord wordt gebruikt om dit bestand te exporteren en te importeren" + }, + "confirmMasterPassword": { + "message": "Nieuw hoofdwachtwoord bevestigen" + }, + "confirmFormat": { + "message": "Formaat bevestigen" + }, + "filePassword": { + "message": "Bestandswachtwoord" + }, + "confirmFilePassword": { + "message": "Bestandswachtwoord bevestigen" + }, + "accountBackupOptionDescription": { + "message": "Maakt gebruik van Bitwarden-accountversleuteling, niet het hoofdwachtwoord, om de export te beveiligen. Je kunt deze export alleen importeren in het huidige account. Gebruik dit om een back-up te maken die je elders niet kunt gebruiken." + }, + "passwordProtectedOptionDescription": { + "message": "Maak een door de gebruiker gegenereerd wachtwoord aan om de export te beschermen. Gebruik dit om een export te maken die je in andere accounts kunt gebruiken." + }, + "fileTypeHeading": { + "message": "Bestandstype" + }, + "accountBackup": { + "message": "Account back-up" + }, + "passwordProtected": { + "message": "Beveiligd met wachtwoord" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Bestandswachtwoord\" en \"Bestandswachtwoord bevestigen\" komen niet overeen." + }, + "confirmVaultImport": { + "message": "Kluisimport bevestigen" + }, + "confirmVaultImportDesc": { + "message": "Dit bestand is beveiligd met een wachtwoord. Voer het bestandswachtwoord in om gegevens te importeren." + }, "exportSuccess": { "message": "Je kluisgegevens zijn geëxporteerd." }, diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 8e3ec769619..1b27527fc3a 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ugild hovudpassord" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lås no" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index c73c7d1bc99..fc3f0ff1b83 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Hasło główne jest nieprawidłowe" }, + "invalidFilePassword": { + "message": "Nieprawidłowe hasło, użyj hasła, które wprowadziłeś podczas tworzenia pliku eksportu." + }, "lockNow": { "message": "Zablokuj" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format pliku" }, + "fileEncryptedExportWarningDesc": { + "message": "Ten plik będzie chroniony hasłem i będzie wymagał tego hasła do odszyfrowania." + }, + "exportPasswordDescription": { + "message": "To hasło będzie używane do eksportu i importu tego pliku" + }, + "confirmMasterPassword": { + "message": "Potwierdź hasło główne" + }, + "confirmFormat": { + "message": "Potwierdź format" + }, + "filePassword": { + "message": "Hasło do pliku" + }, + "confirmFilePassword": { + "message": "Potwierdź hasło do pliku" + }, + "accountBackupOptionDescription": { + "message": "Wykorzystuje szyfrowanie konta Bitwarden, a nie hasło główne, aby chronić eksport. Ten eksport może być zaimportowany tylko na tym koncie. Użyj tego, aby utworzyć kopię zapasową, której nie można użyć nigdzie indziej." + }, + "passwordProtectedOptionDescription": { + "message": "Utwórz hasło wygenerowane przez użytkownika, aby chronić eksport. Użyj tego, aby utworzyć eksport, który może być używany na innych kontach." + }, + "fileTypeHeading": { + "message": "Typ Pliku" + }, + "accountBackup": { + "message": "Kopia zapasowa konta" + }, + "passwordProtected": { + "message": "Zabezpieczone hasłem" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Hasło do pliku\" i \"Potwierdź hasło do pliku\" nie pasują do siebie." + }, + "confirmVaultImport": { + "message": "Potwierdź import sejfu" + }, + "confirmVaultImportDesc": { + "message": "Ten plik jest chroniony hasłem. Wprowadź hasło pliku, aby zaimportować dane." + }, "exportSuccess": { "message": "Dane z sejfu zostały wyeksportowane." }, diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 99ea06d91de..6944ffec979 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Senha mestra inválida" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Bloquear Agora" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formato do arquivo" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Os dados do seu cofre foram exportados." }, diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 8b7aa2750dd..bdf34e78aec 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Palavra-passe mestra inválida" }, + "invalidFilePassword": { + "message": "Senha do ficheiro inválida, por favor use a senha que definiu quando criou o arquivo de exportação." + }, "lockNow": { "message": "Bloquear agora" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formato do ficheiro" }, + "fileEncryptedExportWarningDesc": { + "message": "Esta exportação de arquivo será protegida por senha e exigirá a senha do arquivo para descriptografar." + }, + "exportPasswordDescription": { + "message": "Esta senha será usada para exportar e importar este arquivo" + }, + "confirmMasterPassword": { + "message": "Confirme a Senha Mestra" + }, + "confirmFormat": { + "message": "Confirmar Formato" + }, + "filePassword": { + "message": "Senha do Arquivo" + }, + "confirmFilePassword": { + "message": "Confirmar senha do arquivo" + }, + "accountBackupOptionDescription": { + "message": "Aproveite a criptografia da sua conta Bitwarden, não a senha mestra, para proteger a exportação. Esta exportação só pode ser importada para a conta atual. Use-a para criar um backup que não pode ser usado em outro lugar." + }, + "passwordProtectedOptionDescription": { + "message": "Crie uma senha gerada pelo utilizador para proteger a exportação. Use isto para criar uma exportação que pode ser usada em outras contas." + }, + "fileTypeHeading": { + "message": "Tipo de ficheiro" + }, + "accountBackup": { + "message": "Backup da Conta" + }, + "passwordProtected": { + "message": "Protegido por senha" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Senha do ficheiro\" e \"Confirmação da senha do ficheiro\" não correspondem." + }, + "confirmVaultImport": { + "message": "Confirmar Importação do Cofre" + }, + "confirmVaultImportDesc": { + "message": "Este ficheiro é protegido por senha. Por favor, digite a senha do ficheiro para importar os dados." + }, "exportSuccess": { "message": "Os dados do seu cofre foram exportados." }, @@ -4147,7 +4192,7 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendCreatorIdentifier": { - "message": "O utilizaador do Bitwarden $USER_IDENTIFIER$ compartilhou o seguinte consigo", + "message": "O utilizador do Bitwarden $USER_IDENTIFIER$ compartilhou o seguinte consigo", "placeholders": { "user_identifier": { "content": "$1", diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index a9fd656bb7d..ac5b652a525 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Parolă principală incorectă" }, + "invalidFilePassword": { + "message": "Parola fișierului nu este validă, utilizați parola introdusă atunci când ați creat fișierul de export." + }, "lockNow": { "message": "Blocare acum" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format fișier" }, + "fileEncryptedExportWarningDesc": { + "message": "Exportul acestui fișier va fi protejat prin parolă și necesită parola fișierului pentru decriptare." + }, + "exportPasswordDescription": { + "message": "Această parolă se va folosi pentru exportul și importul acestui fișier" + }, + "confirmMasterPassword": { + "message": "Confirmați parola principală" + }, + "confirmFormat": { + "message": "Confirmați formatul" + }, + "filePassword": { + "message": "Parola fișierului" + }, + "confirmFilePassword": { + "message": "Confirmați parola fișierului" + }, + "accountBackupOptionDescription": { + "message": "Utilizați cheia de criptare a contului pentru a cripta exportul și a restricționa importul numai la contul curent Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Setați o parolă pentru criptarea exportului și importați-l în orice cont Bitwarden folosind parola pentru decriptare." + }, + "fileTypeHeading": { + "message": "Tip de fișier" + }, + "accountBackup": { + "message": "Backup de cont" + }, + "passwordProtected": { + "message": "Protejat cu parolă" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "„Parola fișierului” și „Confirmați parolă fișierului” nu se potrivesc." + }, + "confirmVaultImport": { + "message": "Confirmați importul seifului" + }, + "confirmVaultImportDesc": { + "message": "Acest fișier este protejat prin parolă. Introduceți parola fișierului pentru a importa datele." + }, "exportSuccess": { "message": "Datele seifului dvs. au fost exportate." }, diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 4cdeeb05263..9039b0e70c8 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Неверный мастер-пароль" }, + "invalidFilePassword": { + "message": "Неверный пароль к файлу. Используйте пароль, введенный при создании файла экспорта." + }, "lockNow": { "message": "Заблокировать сейчас" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Формат файла" }, + "fileEncryptedExportWarningDesc": { + "message": "Экспорт этого файла будет защищен паролем, и для расшифровки потребуется пароль файла." + }, + "exportPasswordDescription": { + "message": "Этот пароль будет использоваться для экспорта и импорта этого файла" + }, + "confirmMasterPassword": { + "message": "Подтвердите мастер-пароль" + }, + "confirmFormat": { + "message": "Подтвердить формат" + }, + "filePassword": { + "message": "Пароль к файлу" + }, + "confirmFilePassword": { + "message": "Подтвердить пароль к файлу" + }, + "accountBackupOptionDescription": { + "message": "Используйте ключ шифрования своей учетной записи, чтобы зашифровать экспорт и ограничить импорт только текущей учетной записью Bitwarden." + }, + "passwordProtectedOptionDescription": { + "message": "Установите пароль для шифрования экспорта и импортируйте его в любую учетную запись Bitwarden, используя пароль для расшифровки." + }, + "fileTypeHeading": { + "message": "Тип файла" + }, + "accountBackup": { + "message": "Резервное копирование аккаунта" + }, + "passwordProtected": { + "message": "Пароль защищен" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Пароль к файлу\" и \"Подтверждение пароля к файлу\" не совпадают." + }, + "confirmVaultImport": { + "message": "Подтвердить импорт хранилища" + }, + "confirmVaultImportDesc": { + "message": "Этот файл защищен паролем. Пожалуйста, введите пароль файла для импорта данных." + }, "exportSuccess": { "message": "Данные вашего хранилища экспортированы." }, @@ -1190,7 +1235,7 @@ "message": "Доменные правила" }, "domainRulesDesc": { - "message": "Если у вас есть тот же логин на нескольких разных доменах веб-сайта, вы можете отметить веб-сайт как \"эквивалентный\". \"Глобальные\" - это домены, созданные для вас Bitwarden." + "message": "Если у вас есть тот же логин на нескольких разных доменах сайта, вы можете отметить сайт как \"эквивалентный\". \"Глобальные\" - это домены, созданные для вас Bitwarden." }, "globalEqDomains": { "message": "Глобальные эквивалентные домены" @@ -1211,7 +1256,7 @@ "message": "Новый пользовательский домен" }, "newCustomDomainDesc": { - "message": "Введите список доменов, разделенных запятыми. Допускаются только базовые домены. Не вводите субдомены. Например, вводите \"google.com\" вместо \"www.google.com\". Также вы можете ввести \"androidapp://package.name\", чтобы связать приложение Android с другими доменами веб-сайта." + "message": "Введите список доменов, разделенных запятыми. Допускаются только базовые домены. Не вводите субдомены. Например, вводите \"google.com\" вместо \"www.google.com\". Также вы можете ввести \"androidapp://package.name\", чтобы связать приложение Android с другими доменами сайта." }, "customDomainX": { "message": "Пользовательский домен $INDEX$", @@ -1655,7 +1700,7 @@ "message": "Скомпрометированные данные" }, "website": { - "message": "Веб-сайт" + "message": "Сайт" }, "affectedUsers": { "message": "Затронутых пользователей" @@ -5111,11 +5156,11 @@ "message": "Тип имени пользователя" }, "plusAddressedEmail": { - "message": "Плюс-адресованные email", + "message": "Субадресованные email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Использовать возможности суб-адресации вашего провайдера электронной почты." + "message": "Используйте возможности субадресации вашей электронной почты." }, "catchallEmail": { "message": "Catch-all-адрес электронной почты" diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index e729544ae9a..ae91788759d 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "දැන් අගුලුදමන්න" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 2877ce65edd..add48f608c5 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Neplatné hlavné heslo" }, + "invalidFilePassword": { + "message": "Neplatné heslo súboru, použite heslo, ktoré ste zadali pri vytváraní exportného súboru." + }, "lockNow": { "message": "Uzamknúť teraz" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Formát Súboru" }, + "fileEncryptedExportWarningDesc": { + "message": "Tento export súborov bude chránený heslom a na dešifrovanie bude potrebné heslo súboru." + }, + "exportPasswordDescription": { + "message": "Toto heslo sa použije na export a import tohto súboru" + }, + "confirmMasterPassword": { + "message": "Potvrdiť hlavné heslo" + }, + "confirmFormat": { + "message": "Potvrdiť formát" + }, + "filePassword": { + "message": "Heslo súboru" + }, + "confirmFilePassword": { + "message": "Potvrdiť heslo súboru" + }, + "accountBackupOptionDescription": { + "message": "Na ochranu exportu využíva šifrovanie vášho účtu Bitwarden, nie hlavné heslo. Tento export je možné importovať len do aktuálneho účtu. Použite ho na vytvorenie zálohy, ktorú nie je možné použiť inde." + }, + "passwordProtectedOptionDescription": { + "message": "Na ochranu exportu vytvorte heslo vygenerované používateľom. Použite ho na vytvorenie exportu, ktorý možno použiť v iných účtoch." + }, + "fileTypeHeading": { + "message": "Typ súboru" + }, + "accountBackup": { + "message": "Zálohovanie účtu" + }, + "passwordProtected": { + "message": "Chránené heslom" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "\"Heslo súboru\" a \"Potvrdiť heslo súboru\" sa nezhodujú." + }, + "confirmVaultImport": { + "message": "Potvrdiť importu trezoru" + }, + "confirmVaultImportDesc": { + "message": "Tento súbor je chránený heslom. Ak chcete importovať údaje, zadajte heslo súboru." + }, "exportSuccess": { "message": "Dáta z vášho trezora boli exportované." }, diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 1327d411728..b98db470a0c 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Napačno glavno geslo" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Zakleni zdaj" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Format datoteke" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Podatki vašega sefa so bili izvoženi." }, diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index 02c76f9d262..53726c7c596 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Погрешна главна лозинка" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Закључај одмах" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Формат датотеке" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Податци сефа су извежени." }, diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index a23dc931e44..ad332f42106 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Invalid master password" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lock Now" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "File Format" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Your vault data has been exported." }, diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index fb480542de2..b08424cb977 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Ogiltigt huvudlösenord" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Lås nu" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Filformat" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Ditt valv har exporterats." }, diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 751c2cf0a06..5b7da9a8422 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Geçersiz ana parola" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Şimdi kilitle" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Dosya biçimi" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Kasadaki verileriniz dışa aktarıldı." }, diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 035fc841220..464af5736fa 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Неправильний головний пароль" }, + "invalidFilePassword": { + "message": "Неправильний пароль файлу. Використайте пароль, який ви вводили під час створення експортованого файлу." + }, "lockNow": { "message": "Заблокувати зараз" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Формат файлу" }, + "fileEncryptedExportWarningDesc": { + "message": "Цей експортований файл буде захищений паролем, який необхідно ввести для його розшифрування." + }, + "exportPasswordDescription": { + "message": "Цей пароль буде використано для експортування та імпортування цього файлу" + }, + "confirmMasterPassword": { + "message": "Підтвердьте головний пароль" + }, + "confirmFormat": { + "message": "Підтвердьте формат" + }, + "filePassword": { + "message": "Пароль файлу" + }, + "confirmFilePassword": { + "message": "Підтвердьте пароль файлу" + }, + "accountBackupOptionDescription": { + "message": "Завжди використовує шифрування облікового запису Bitwarden, а не головний пароль для захисту експорту. Цей експорт можна імпортувати лише в поточний обліковий запис. Використовуйте його для створення резервної копії, яку не можна використовувати в іншому місці." + }, + "passwordProtectedOptionDescription": { + "message": "Створити користувацький пароль для захисту експорту. Використовуйте це для створення експорту, який може бути використаний в інших облікових записах." + }, + "fileTypeHeading": { + "message": "Тип файлу" + }, + "accountBackup": { + "message": "Резервне копіювання облікового запису" + }, + "passwordProtected": { + "message": "Захищено паролем" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "Пароль файлу та підтвердження пароля відрізняються." + }, + "confirmVaultImport": { + "message": "Підтвердити імпорт сховища" + }, + "confirmVaultImportDesc": { + "message": "Цей файл захищений паролем. Будь ласка, введіть пароль для імпортування даних." + }, "exportSuccess": { "message": "Дані сховища експортовано." }, @@ -3298,13 +3343,13 @@ "message": "Обраний вами головний пароль є слабким. Для належного захисту свого облікового запису Bitwarden, вам слід використовувати надійний головний пароль (або парольну фразу). Ви впевнені, що хочете використати цей пароль?" }, "rotateAccountEncKey": { - "message": "Також повернути ключ шифрування мого облікового запису" + "message": "Також оновити ключ шифрування мого облікового запису" }, "rotateEncKeyTitle": { - "message": "Повернути ключ шифрування" + "message": "Оновити ключ шифрування" }, "rotateEncKeyConfirmation": { - "message": "Ви справді хочете повернути ключ шифрування облікового запису?" + "message": "Ви справді хочете оновити ключ шифрування облікового запису?" }, "attachmentsNeedFix": { "message": "Цей елемент має старі вкладені файли, які необхідно виправити." @@ -3317,7 +3362,7 @@ "description": "This is a verb. ex. 'Fix The Car'" }, "oldAttachmentsNeedFixDesc": { - "message": "У вашому сховищі є старі вкладені файли, які необхідно виправити перед тим, як повертати ключ шифрування облікового запису." + "message": "У вашому сховищі є старі вкладені файли, які необхідно виправити перед тим, як оновлювати ключ шифрування облікового запису." }, "yourAccountsFingerprint": { "message": "Фраза відбитку вашого облікового запису", @@ -3342,7 +3387,7 @@ "message": "Ваш ключ API може бути використаний для авторизації публічного API Bitwarden." }, "apiKeyRotateDesc": { - "message": "Поворот ключа API спричинить анулювання попереднього ключа. Ви можете повернути свій ключ API, якщо вважаєте, що поточний ключ більше не є безпечним для використання." + "message": "Оновлення ключа API спричинить анулювання попереднього ключа. Ви можете оновити свій ключ API, якщо вважаєте, що поточний ключ більше не є безпечним для використання." }, "apiKeyWarning": { "message": "Ваш ключ API має повний доступ до організації. Його необхідно надійно зберігати." @@ -3361,7 +3406,7 @@ "message": "Переглянути ключ API" }, "rotateApiKey": { - "message": "Повернути ключ API" + "message": "Оновити ключ API" }, "selectOneCollection": { "message": "Необхідно вибрати принаймні одну збірку." @@ -4954,13 +4999,13 @@ "message": "Генерувати токен" }, "rotateToken": { - "message": "Замінити токен" + "message": "Оновити токен" }, "rotateBillingSyncTokenWarning": { "message": "Якщо ви продовжите, вам потрібно буде повторно налаштувати платіжну синхронізацію на вашому власному розміщеному сервері." }, "rotateBillingSyncTokenTitle": { - "message": "Заміна токена платіжної синхронізації призведе до скасування попереднього токена." + "message": "Оновлення токена платіжної синхронізації призведе до скасування попереднього токена." }, "selfHostingTitle": { "message": "Власне розміщення" @@ -4969,7 +5014,7 @@ "message": "Щоб налаштувати свою організацію на власному сервері, вам необхідно вивантажити файл ліцензії. Для підтримки безплатних сімейних тарифних планів та розширених можливостей власної розміщеної організації, вам необхідно налаштувати платіжну синхронізацію." }, "billingSyncApiKeyRotated": { - "message": "Токен замінено." + "message": "Токен оновлено." }, "billingSync": { "message": "Платіжна синхронізація" @@ -5111,7 +5156,7 @@ "message": "Тип імені користувача" }, "plusAddressedEmail": { - "message": "Плюс адреса електронної пошти", + "message": "Адреса е-пошти з плюсом", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -5149,7 +5194,7 @@ } }, "awaitingSyncSingular": { - "message": "Токен замінено $DAYS$ день тому. Оновіть токен платіжної синхронізації у налаштуваннях власної розміщеної організації.", + "message": "Токен оновлено $DAYS$ день тому. Оновіть токен платіжної синхронізації у налаштуваннях власної розміщеної організації.", "placeholders": { "days": { "content": "$1", @@ -5158,7 +5203,7 @@ } }, "awaitingSyncPlural": { - "message": "Токен замінено $DAYS$ днів тому. Оновіть токен платіжної синхронізації у налаштуваннях власної розміщеної організації.", + "message": "Токен оновлено $DAYS$ днів тому. Оновіть токен платіжної синхронізації у налаштуваннях власної розміщеної організації.", "placeholders": { "days": { "content": "$1", diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 62ca418c349..7842e65b5fe 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "Mật khẩu chính không hợp lệ" }, + "invalidFilePassword": { + "message": "Invalid file password, please use the password you entered when you created the export file." + }, "lockNow": { "message": "Khóa ngay" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "Định dạng tập tin" }, + "fileEncryptedExportWarningDesc": { + "message": "This file export will be password protected and require the file password to decrypt." + }, + "exportPasswordDescription": { + "message": "This password will be used to export and import this file" + }, + "confirmMasterPassword": { + "message": "Confirm Master Password" + }, + "confirmFormat": { + "message": "Confirm Format" + }, + "filePassword": { + "message": "File Password" + }, + "confirmFilePassword": { + "message": "Confirm File Password" + }, + "accountBackupOptionDescription": { + "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + }, + "passwordProtectedOptionDescription": { + "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + }, + "fileTypeHeading": { + "message": "File Type" + }, + "accountBackup": { + "message": "Account Backup" + }, + "passwordProtected": { + "message": "Password Protected" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "“File password” and “Confirm File Password“ do not match." + }, + "confirmVaultImport": { + "message": "Confirm Vault Import" + }, + "confirmVaultImportDesc": { + "message": "This file is password-protected. Please enter the file password to import data." + }, "exportSuccess": { "message": "Dữ liệu kho cảu bạn đã được trích xuất." }, diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 9f5cb07b05b..0e7c56669d3 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "无效的主密码" }, + "invalidFilePassword": { + "message": "无效的文件密码,请使用您创建导出文件时输入的密码。" + }, "lockNow": { "message": "立即锁定" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "文件格式" }, + "fileEncryptedExportWarningDesc": { + "message": "此文件导出将受密码保护,需要文件密码才能解密。" + }, + "exportPasswordDescription": { + "message": "此密码将用于导出和导入此文件" + }, + "confirmMasterPassword": { + "message": "确认主密码" + }, + "confirmFormat": { + "message": "确认格式" + }, + "filePassword": { + "message": "文件密码" + }, + "confirmFilePassword": { + "message": "确认文件密码" + }, + "accountBackupOptionDescription": { + "message": "使用您的账户加密密钥来加密导出的数据,并且限制只能导入到当前的 Bitwarden 账户。" + }, + "passwordProtectedOptionDescription": { + "message": "设置一个密码来加密导出的数据,并使用密码解密以导入到任何 Bitwarden 账户。" + }, + "fileTypeHeading": { + "message": "文件类型" + }, + "accountBackup": { + "message": "帐户备份" + }, + "passwordProtected": { + "message": "密码保护" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "「文件密码」与「确认文件密码」不一致。" + }, + "confirmVaultImport": { + "message": "确认密码库导入" + }, + "confirmVaultImportDesc": { + "message": "此文件受密码保护。请输入文件密码以导入数据。" + }, "exportSuccess": { "message": "已经导出您的密码库数据。" }, diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 58c2f2a7f2b..943adfc0918 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -678,6 +678,9 @@ "invalidMasterPassword": { "message": "無效的主密碼" }, + "invalidFilePassword": { + "message": "檔案密碼無效,請使用創建匯出檔案時輸入的密碼。" + }, "lockNow": { "message": "立即鎖定" }, @@ -890,6 +893,48 @@ "fileFormat": { "message": "檔案格式" }, + "fileEncryptedExportWarningDesc": { + "message": "此檔案匯出將受密碼保護,需要檔案密碼才能解密。" + }, + "exportPasswordDescription": { + "message": "此密碼將用於匯出和匯入此檔案" + }, + "confirmMasterPassword": { + "message": "確認主密碼" + }, + "confirmFormat": { + "message": "確認格式" + }, + "filePassword": { + "message": "檔案密碼" + }, + "confirmFilePassword": { + "message": "確認檔案密碼" + }, + "accountBackupOptionDescription": { + "message": "使用您的帳戶加密金鑰來加密匯出的資料,並限制只能匯入到目前的 Bitwarden 帳戶。" + }, + "passwordProtectedOptionDescription": { + "message": "設定一个密碼來加密匯出的資料,並使用密碼解密以匯入到任何 Bitwarden 帳戶。" + }, + "fileTypeHeading": { + "message": "檔案類型" + }, + "accountBackup": { + "message": "帳戶備份" + }, + "passwordProtected": { + "message": "密碼保護" + }, + "filePasswordAndConfirmFilePasswordDoNotMatch": { + "message": "「檔案密碼」與「確認檔案密碼」不一致。" + }, + "confirmVaultImport": { + "message": "確認密碼庫匯入" + }, + "confirmVaultImportDesc": { + "message": "此檔案受密碼保護,請輸入檔案密碼以匯入資料。" + }, "exportSuccess": { "message": "已匯出您的密碼庫資料。" }, From ef50055e32b8bf929126eedacda13455cc956519 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 2 Sep 2022 14:57:00 +0200 Subject: [PATCH 07/17] [SG-646] [SG-647] Fix mac biometrics not working (#3436) --- apps/desktop/src/main/biometric/biometric.darwin.main.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/main/biometric/biometric.darwin.main.ts b/apps/desktop/src/main/biometric/biometric.darwin.main.ts index 5851d39889d..49638425b7b 100644 --- a/apps/desktop/src/main/biometric/biometric.darwin.main.ts +++ b/apps/desktop/src/main/biometric/biometric.darwin.main.ts @@ -13,9 +13,8 @@ export default class BiometricDarwinMain implements BiometricMain { await this.stateService.setBiometricText("unlockWithTouchId"); await this.stateService.setNoAutoPromptBiometricsText("autoPromptTouchId"); - // eslint-disable-next-line - ipcMain.on("biometric", async (event: any, message: any) => { - event.returnValue = await this.authenticateBiometric(); + ipcMain.handle("biometric", async () => { + return await this.authenticateBiometric(); }); } From 123db002dc3b8f6562887ce0194f962a14aa48b8 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 2 Sep 2022 21:42:52 -0600 Subject: [PATCH 08/17] Handle special serialization case for native messaging. (#3442) It would be nice to fix this by processing the encString properly in Desktop, but that wouldn't be backwards compatible with existing installs. --- .../src/background/nativeMessaging.background.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 44b4f400fdb..2e410b8e6ce 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -238,7 +238,18 @@ export class NativeMessagingBackground { private postMessage(message: OuterMessage) { // Wrap in try-catch to when the port disconnected without triggering `onDisconnect`. try { - this.port.postMessage(message); + const msg: any = message; + if (message.message instanceof EncString) { + // Alternative, backwards-compatible serialization of EncString + msg.message = { + encryptedString: message.message.encryptedString, + encryptionType: message.message.encryptionType, + data: message.message.data, + iv: message.message.iv, + mac: message.message.mac, + }; + } + this.port.postMessage(msg); } catch (e) { this.logService.error("NativeMessaging port disconnected, disconnecting."); From d1243c97a4140dc665cb647268e703b60ab13ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ch=C4=99ci=C5=84ski?= Date: Mon, 5 Sep 2022 11:39:27 +0200 Subject: [PATCH 09/17] Update deprecated Azure Key Vault action in workflows (#3438) * Update deprecated Azure Key Vault in workflows * Try without colons * Specify bash as shell runner --- .github/workflows/brew-bump-cli.yml | 15 ++++-- .github/workflows/brew-bump-desktop.yml | 15 ++++-- .github/workflows/build-browser.yml | 45 +++++++++++++----- .github/workflows/build-cli.yml | 15 ++++-- .github/workflows/build-desktop.yml | 54 +++++++++++++++------- .github/workflows/build-web.yml | 30 ++++++++---- .github/workflows/crowdin-pull.yml | 15 ++++-- .github/workflows/release-cli.yml | 45 +++++++++++++----- .github/workflows/release-desktop-beta.yml | 40 +++++++++++----- .github/workflows/release-desktop.yml | 47 ++++++++++++++----- .github/workflows/release-qa-web.yml | 15 ++++-- 11 files changed, 244 insertions(+), 92 deletions(-) diff --git a/.github/workflows/brew-bump-cli.yml b/.github/workflows/brew-bump-cli.yml index 8c77f601a51..5487095bf75 100644 --- a/.github/workflows/brew-bump-cli.yml +++ b/.github/workflows/brew-bump-cli.yml @@ -23,10 +23,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "brew-bump-workflow-pat" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + brew-bump-workflow-pat + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Update Homebrew formula uses: dawidd6/action-homebrew-bump-formula@dd221ff435f42fa8102b5871bb1929af9d76476c diff --git a/.github/workflows/brew-bump-desktop.yml b/.github/workflows/brew-bump-desktop.yml index 4b62b1213c7..fba2685f234 100644 --- a/.github/workflows/brew-bump-desktop.yml +++ b/.github/workflows/brew-bump-desktop.yml @@ -23,10 +23,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "brew-bump-workflow-pat" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + brew-bump-workflow-pat + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Update Homebrew cask uses: macauley/action-homebrew-bump-cask@445c42390d790569d938f9068d01af39ca030feb diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 0320dbee331..91134cbab65 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -338,10 +338,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "crowdin-api-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + crowdin-api-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Upload Sources uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 @@ -371,10 +378,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "github-pat-bitwarden-devops-bot-repo-scope" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + github-pat-bitwarden-devops-bot-repo-scope + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Extract branch name id: extract_branch @@ -444,11 +458,18 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f if: failure() - with: - keyvault: "bitwarden-prod-kv" - secrets: "devops-alerts-slack-webhook-url" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + devops-alerts-slack-webhook-url + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.0 diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 4dd90efb2a4..9147ed1b7eb 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -360,11 +360,18 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f if: failure() - with: - keyvault: "bitwarden-prod-kv" - secrets: "devops-alerts-slack-webhook-url" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + devops-alerts-slack-webhook-url + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 16579580b55..fe8df982c26 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -297,14 +297,22 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "code-signing-vault-url, - code-signing-client-id, - code-signing-tenant-id, - code-signing-client-secret, - code-signing-cert-name" + shell: bash + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + code-signing-vault-url, + code-signing-client-id, + code-signing-tenant-id, + code-signing-client-secret, + code-signing-cert-name + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Install Node dependencies run: npm ci @@ -1234,10 +1242,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "crowdin-api-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + crowdin-api-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Upload Sources uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 @@ -1308,11 +1323,18 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f if: failure() - with: - keyvault: "bitwarden-prod-kv" - secrets: "devops-alerts-slack-webhook-url" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + devops-alerts-slack-webhook-url + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index ef3853933ce..6c0f000bad8 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -406,10 +406,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1.0.0 - with: - keyvault: "bitwarden-prod-kv" - secrets: "crowdin-api-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + crowdin-api-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Upload Sources uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 @@ -472,11 +479,18 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1.0.0 if: failure() - with: - keyvault: "bitwarden-prod-kv" - secrets: "devops-alerts-slack-webhook-url" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + devops-alerts-slack-webhook-url + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.1 diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index bb32e62ca7f..9aca46ebd69 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -32,10 +32,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@80ccd3fafe5662407cc2e55f202ee34bfff8c403 - with: - keyvault: "bitwarden-prod-kv" - secrets: "crowdin-api-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + crowdin-api-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Download translations uses: bitwarden/gh-actions/crowdin@05052c5c575ceb09ceea397fe241879e199ed44b diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 78d645e8a26..c3ddbb98144 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -148,10 +148,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "snapcraft-store-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + snapcraft-store-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Install Snap uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 @@ -202,10 +209,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "cli-choco-api-key" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + cli-choco-api-key + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Setup Chocolatey run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ @@ -261,10 +275,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "cli-npm-api-key" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + cli-npm-api-key + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index 0d98b26ec4d..2d34ab257e9 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -249,14 +249,21 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "code-signing-vault-url, - code-signing-client-id, - code-signing-tenant-id, - code-signing-client-secret, - code-signing-cert-name" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + code-signing-vault-url, + code-signing-client-id, + code-signing-tenant-id, + code-signing-client-secret, + code-signing-cert-name + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Install Node dependencies run: npm ci @@ -932,10 +939,19 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + aws-electron-access-id, + aws-electron-access-key, + aws-electron-bucket-name + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Download all artifacts uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 84cbdf17f23..9a51a3b0bea 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -93,10 +93,19 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + aws-electron-access-id, + aws-electron-access-key, + aws-electron-bucket-name + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -208,10 +217,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@80ccd3fafe5662407cc2e55f202ee34bfff8c403 - with: - keyvault: "bitwarden-prod-kv" - secrets: "snapcraft-store-token" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + snapcraft-store-token + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Install Snap uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 @@ -272,10 +288,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f - with: - keyvault: "bitwarden-prod-kv" - secrets: "cli-choco-api-key" + env: + KEYVAULT: bitwarden-prod-kv + SECRETS: | + cli-choco-api-key + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Setup Chocolatey shell: pwsh diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml index fc0cd5231eb..ed15f49f984 100644 --- a/.github/workflows/release-qa-web.yml +++ b/.github/workflows/release-qa-web.yml @@ -32,10 +32,17 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1 - with: - keyvault: "bitwarden-qa-kv" - secrets: "qa-aks-kubectl-credentials" + env: + KEYVAULT: bitwarden-qa-kv + SECRETS: | + qa-aks-kubectl-credentials + run: | + for i in ${SECRETS//,/ } + do + VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) + echo "::add-mask::$VALUE" + echo "::set-output name=$i::$VALUE" + done - name: Login with qa-aks-kubectl-credentials SP uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 From b1f48aa06524f70179f3a86b1e3c32d5243314bd Mon Sep 17 00:00:00 2001 From: Ali Alkeldi <3756017+alkeldi@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:46:38 -0500 Subject: [PATCH 10/17] fix typo: 'salted hashtag' to 'salted hashing' (#3402) --- apps/browser/store/locales/en/copy.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/browser/store/locales/en/copy.resx b/apps/browser/store/locales/en/copy.resx index cfb4c5df101..191198691d4 100644 --- a/apps/browser/store/locales/en/copy.resx +++ b/apps/browser/store/locales/en/copy.resx @@ -139,7 +139,7 @@ Bitwarden offers Teams and Enterprise plans for companies so you can securely sh Why Choose Bitwarden: World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashing, and PBKDF2 SHA-256) so your data stays secure and private. Built-in Password Generator Generate strong, unique, and random passwords based on security requirements for every website you frequent. From 57d60e21144c020f3ddf541acc0d3e8107a132d1 Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Mon, 5 Sep 2022 21:18:18 +0200 Subject: [PATCH 11/17] [PS-1282] Enable Arabic language support for desktop, browser, web (#3333) * Register Arabic language with native name * Register Arabic language for web vault * Register Arabic language for browser * Register Arabic language for desktop --- apps/browser/src/popup/app.module.ts | 2 ++ apps/browser/src/services/i18n.service.ts | 1 + apps/desktop/src/app/app.module.ts | 2 ++ apps/desktop/src/services/i18n.service.ts | 1 + apps/web/src/app/core/i18n.service.ts | 1 + apps/web/src/app/shared/locales.ts | 2 ++ libs/common/src/services/i18n.service.ts | 1 + 7 files changed, 10 insertions(+) diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index 685c1d1db2c..af1e78fc59e 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -4,6 +4,7 @@ import { LayoutModule } from "@angular/cdk/layout"; import { OverlayModule } from "@angular/cdk/overlay"; import { ScrollingModule } from "@angular/cdk/scrolling"; import { CurrencyPipe, DatePipe, registerLocaleData } from "@angular/common"; +import localeAr from "@angular/common/locales/ar"; import localeAz from "@angular/common/locales/az"; import localeBe from "@angular/common/locales/be"; import localeBg from "@angular/common/locales/bg"; @@ -116,6 +117,7 @@ import { VaultSelectComponent } from "./vault/vault-select.component"; import { ViewCustomFieldsComponent } from "./vault/view-custom-fields.component"; import { ViewComponent } from "./vault/view.component"; +registerLocaleData(localeAr, "ar"); registerLocaleData(localeAz, "az"); registerLocaleData(localeBe, "be"); registerLocaleData(localeBg, "bg"); diff --git a/apps/browser/src/services/i18n.service.ts b/apps/browser/src/services/i18n.service.ts index 566d79b0e13..eddd2559a1a 100644 --- a/apps/browser/src/services/i18n.service.ts +++ b/apps/browser/src/services/i18n.service.ts @@ -11,6 +11,7 @@ export default class I18nService extends BaseI18nService { // Please leave 'en' where it is, as it's our fallback language in case no translation can be found this.supportedTranslationLocales = [ "en", + "ar", "az", "be", "bg", diff --git a/apps/desktop/src/app/app.module.ts b/apps/desktop/src/app/app.module.ts index 5fd9ce232d6..c1575e40392 100644 --- a/apps/desktop/src/app/app.module.ts +++ b/apps/desktop/src/app/app.module.ts @@ -2,6 +2,7 @@ import "zone.js/dist/zone"; import { registerLocaleData } from "@angular/common"; import localeAf from "@angular/common/locales/af"; +import localeAr from "@angular/common/locales/ar"; import localeAz from "@angular/common/locales/az"; import localeBe from "@angular/common/locales/be"; import localeBg from "@angular/common/locales/bg"; @@ -103,6 +104,7 @@ import { ViewCustomFieldsComponent } from "./vault/view-custom-fields.component" import { ViewComponent } from "./vault/view.component"; registerLocaleData(localeAf, "af"); +registerLocaleData(localeAr, "ar"); registerLocaleData(localeAz, "az"); registerLocaleData(localeBe, "be"); registerLocaleData(localeBg, "bg"); diff --git a/apps/desktop/src/services/i18n.service.ts b/apps/desktop/src/services/i18n.service.ts index 4a05981e338..e36af04c181 100644 --- a/apps/desktop/src/services/i18n.service.ts +++ b/apps/desktop/src/services/i18n.service.ts @@ -19,6 +19,7 @@ export class I18nService extends BaseI18nService { this.supportedTranslationLocales = [ "en", "af", + "ar", "az", "be", "bg", diff --git a/apps/web/src/app/core/i18n.service.ts b/apps/web/src/app/core/i18n.service.ts index b60efef36ba..843bb322919 100644 --- a/apps/web/src/app/core/i18n.service.ts +++ b/apps/web/src/app/core/i18n.service.ts @@ -18,6 +18,7 @@ export class I18nService extends BaseI18nService { this.supportedTranslationLocales = [ "en", "af", + "ar", "az", "be", "bg", diff --git a/apps/web/src/app/shared/locales.ts b/apps/web/src/app/shared/locales.ts index ab551e93ac8..eddf662a0af 100644 --- a/apps/web/src/app/shared/locales.ts +++ b/apps/web/src/app/shared/locales.ts @@ -1,5 +1,6 @@ import { registerLocaleData } from "@angular/common"; import localeAf from "@angular/common/locales/af"; +import localeAr from "@angular/common/locales/ar"; import localeAz from "@angular/common/locales/az"; import localeBe from "@angular/common/locales/be"; import localeBg from "@angular/common/locales/bg"; @@ -52,6 +53,7 @@ import localeZhCn from "@angular/common/locales/zh-Hans"; import localeZhTw from "@angular/common/locales/zh-Hant"; registerLocaleData(localeAf, "af"); +registerLocaleData(localeAr, "ar"); registerLocaleData(localeAz, "az"); registerLocaleData(localeBe, "be"); registerLocaleData(localeBg, "bg"); diff --git a/libs/common/src/services/i18n.service.ts b/libs/common/src/services/i18n.service.ts index 2461899e417..5076e1dbdf5 100644 --- a/libs/common/src/services/i18n.service.ts +++ b/libs/common/src/services/i18n.service.ts @@ -11,6 +11,7 @@ export class I18nService implements I18nServiceAbstraction { collator: Intl.Collator; localeNames = new Map([ ["af", "Afrikaans"], + ["ar", "العربية الفصحى"], ["az", "Azərbaycanca"], ["be", "Беларуская"], ["bg", "български"], From 15920f53541139741e14b9fbb967f585409033dc Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Tue, 6 Sep 2022 08:21:59 +0200 Subject: [PATCH 12/17] [EC-512] Tree shakeable icons (#3427) * [EC-512] feat: create new icon class * [EC-512] feat: implement protected svgIcon function * [EC-512] feat: use new icon class in component * [EC-512] feat: integrate new icons in application * [EC-512] fix: linting * [EC-512] chore: move report icons to where they are used * [EC-512] chore: add export type explanation --- .eslintrc.json | 9 ++- .../app/reports/icons/report-breach.icon.ts | 14 +++++ .../icons/report-exposed-passwords.icon.ts | 16 +++++ .../icons/report-inactive-two-factor.icon.ts | 10 +++ .../icons/report-reused-passwords.icon.ts | 9 +++ .../icons/report-unsecured-websites.icon.ts | 12 ++++ .../icons/report-weak-passwords.icon.ts | 10 +++ .../src/app/reports/models/report-entry.ts | 4 +- apps/web/src/app/reports/reports.ts | 18 ++++-- libs/components/package.json | 1 + libs/components/src/icon/icon.component.ts | 10 +-- .../src/icon/icon.components.spec.ts | 39 ++++++++++++ libs/components/src/icon/icon.spec.ts | 38 +++++++++++ libs/components/src/icon/icon.ts | 25 ++++++++ libs/components/src/icon/icons.ts | 63 ------------------- libs/components/src/icon/icons/index.ts | 4 ++ libs/components/src/icon/index.ts | 2 + 17 files changed, 208 insertions(+), 76 deletions(-) create mode 100644 apps/web/src/app/reports/icons/report-breach.icon.ts create mode 100644 apps/web/src/app/reports/icons/report-exposed-passwords.icon.ts create mode 100644 apps/web/src/app/reports/icons/report-inactive-two-factor.icon.ts create mode 100644 apps/web/src/app/reports/icons/report-reused-passwords.icon.ts create mode 100644 apps/web/src/app/reports/icons/report-unsecured-websites.icon.ts create mode 100644 apps/web/src/app/reports/icons/report-weak-passwords.icon.ts create mode 100644 libs/components/src/icon/icon.components.spec.ts create mode 100644 libs/components/src/icon/icon.spec.ts create mode 100644 libs/components/src/icon/icon.ts delete mode 100644 libs/components/src/icon/icons.ts create mode 100644 libs/components/src/icon/icons/index.ts diff --git a/.eslintrc.json b/.eslintrc.json index 72459521605..404abef39a7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -57,6 +57,13 @@ "pathGroupsExcludedImportTypes": ["builtin"] } ], - "rxjs-angular/prefer-takeuntil": "error" + "rxjs-angular/prefer-takeuntil": "error", + "no-restricted-syntax": [ + "error", + { + "message": "Calling `svgIcon` directly is not allowed", + "selector": "CallExpression[callee.name='svgIcon']" + } + ] } } diff --git a/apps/web/src/app/reports/icons/report-breach.icon.ts b/apps/web/src/app/reports/icons/report-breach.icon.ts new file mode 100644 index 00000000000..749779a87bc --- /dev/null +++ b/apps/web/src/app/reports/icons/report-breach.icon.ts @@ -0,0 +1,14 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportBreach = svgIcon` + + + + + + + + + + +`; diff --git a/apps/web/src/app/reports/icons/report-exposed-passwords.icon.ts b/apps/web/src/app/reports/icons/report-exposed-passwords.icon.ts new file mode 100644 index 00000000000..df532fe1582 --- /dev/null +++ b/apps/web/src/app/reports/icons/report-exposed-passwords.icon.ts @@ -0,0 +1,16 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportExposedPasswords = svgIcon` + + + + + + + + + + + + +`; diff --git a/apps/web/src/app/reports/icons/report-inactive-two-factor.icon.ts b/apps/web/src/app/reports/icons/report-inactive-two-factor.icon.ts new file mode 100644 index 00000000000..65ca4469648 --- /dev/null +++ b/apps/web/src/app/reports/icons/report-inactive-two-factor.icon.ts @@ -0,0 +1,10 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportInactiveTwoFactor = svgIcon` + + + + + + +`; diff --git a/apps/web/src/app/reports/icons/report-reused-passwords.icon.ts b/apps/web/src/app/reports/icons/report-reused-passwords.icon.ts new file mode 100644 index 00000000000..d28790ba051 --- /dev/null +++ b/apps/web/src/app/reports/icons/report-reused-passwords.icon.ts @@ -0,0 +1,9 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportReusedPasswords = svgIcon` + + + + + +`; diff --git a/apps/web/src/app/reports/icons/report-unsecured-websites.icon.ts b/apps/web/src/app/reports/icons/report-unsecured-websites.icon.ts new file mode 100644 index 00000000000..083ddb40db7 --- /dev/null +++ b/apps/web/src/app/reports/icons/report-unsecured-websites.icon.ts @@ -0,0 +1,12 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportUnsecuredWebsites = svgIcon` + + + + + + + + +`; diff --git a/apps/web/src/app/reports/icons/report-weak-passwords.icon.ts b/apps/web/src/app/reports/icons/report-weak-passwords.icon.ts new file mode 100644 index 00000000000..8a0ef324c73 --- /dev/null +++ b/apps/web/src/app/reports/icons/report-weak-passwords.icon.ts @@ -0,0 +1,10 @@ +import { svgIcon } from "@bitwarden/components"; + +export const ReportWeakPasswords = svgIcon` + + + + + + +`; diff --git a/apps/web/src/app/reports/models/report-entry.ts b/apps/web/src/app/reports/models/report-entry.ts index 08e31a8eca2..d4da4e36763 100644 --- a/apps/web/src/app/reports/models/report-entry.ts +++ b/apps/web/src/app/reports/models/report-entry.ts @@ -1,9 +1,11 @@ +import { Icon } from "@bitwarden/components"; + import { ReportVariant } from "./report-variant"; export type ReportEntry = { title: string; description: string; route: string; - icon: string; + icon: Icon; variant: ReportVariant; }; diff --git a/apps/web/src/app/reports/reports.ts b/apps/web/src/app/reports/reports.ts index cd393dd113f..43d086d4186 100644 --- a/apps/web/src/app/reports/reports.ts +++ b/apps/web/src/app/reports/reports.ts @@ -1,3 +1,9 @@ +import { ReportBreach } from "./icons/report-breach.icon"; +import { ReportExposedPasswords } from "./icons/report-exposed-passwords.icon"; +import { ReportInactiveTwoFactor } from "./icons/report-inactive-two-factor.icon"; +import { ReportReusedPasswords } from "./icons/report-reused-passwords.icon"; +import { ReportUnsecuredWebsites } from "./icons/report-unsecured-websites.icon"; +import { ReportWeakPasswords } from "./icons/report-weak-passwords.icon"; import { ReportEntry } from "./models/report-entry"; export enum ReportType { @@ -16,36 +22,36 @@ export const reports: Record = { title: "exposedPasswordsReport", description: "exposedPasswordsReportDesc", route: "exposed-passwords-report", - icon: "reportExposedPasswords", + icon: ReportExposedPasswords, }, [ReportType.ReusedPasswords]: { title: "reusedPasswordsReport", description: "reusedPasswordsReportDesc", route: "reused-passwords-report", - icon: "reportReusedPasswords", + icon: ReportReusedPasswords, }, [ReportType.WeakPasswords]: { title: "weakPasswordsReport", description: "weakPasswordsReportDesc", route: "weak-passwords-report", - icon: "reportWeakPasswords", + icon: ReportWeakPasswords, }, [ReportType.UnsecuredWebsites]: { title: "unsecuredWebsitesReport", description: "unsecuredWebsitesReportDesc", route: "unsecured-websites-report", - icon: "reportUnsecuredWebsites", + icon: ReportUnsecuredWebsites, }, [ReportType.Inactive2fa]: { title: "inactive2faReport", description: "inactive2faReportDesc", route: "inactive-two-factor-report", - icon: "reportInactiveTwoFactor", + icon: ReportInactiveTwoFactor, }, [ReportType.DataBreach]: { title: "dataBreachReport", description: "breachDesc", route: "breach-report", - icon: "reportBreach", + icon: ReportBreach, }, }; diff --git a/libs/components/package.json b/libs/components/package.json index d4db87c3566..168c727a3e5 100644 --- a/libs/components/package.json +++ b/libs/components/package.json @@ -1,6 +1,7 @@ { "name": "@bitwarden/components", "version": "0.0.0", + "sideEffects": false, "scripts": { "ng": "ng", "start": "ng serve", diff --git a/libs/components/src/icon/icon.component.ts b/libs/components/src/icon/icon.component.ts index 85e23fb9ea9..664642a04e9 100644 --- a/libs/components/src/icon/icon.component.ts +++ b/libs/components/src/icon/icon.component.ts @@ -1,7 +1,7 @@ import { Component, HostBinding, Input } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; -import { Icon, IconSvg } from "./icons"; +import { Icon, isIcon } from "./icon"; @Component({ selector: "bit-icon", @@ -14,11 +14,11 @@ export class BitIconComponent { @HostBinding("innerHtml") protected get innerHtml() { - const svg = IconSvg[this.icon]; - if (svg == null) { - return "Unknown icon"; + if (!isIcon(this.icon)) { + return ""; } - return this.domSanitizer.bypassSecurityTrustHtml(IconSvg[this.icon]); + const svg = this.icon.svg; + return this.domSanitizer.bypassSecurityTrustHtml(svg); } } diff --git a/libs/components/src/icon/icon.components.spec.ts b/libs/components/src/icon/icon.components.spec.ts new file mode 100644 index 00000000000..351ed5f0218 --- /dev/null +++ b/libs/components/src/icon/icon.components.spec.ts @@ -0,0 +1,39 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { Icon, svgIcon } from "./icon"; +import { BitIconComponent } from "./icon.component"; + +describe("IconComponent", () => { + let component: BitIconComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [BitIconComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(BitIconComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should have empty innerHtml when input is not an Icon", () => { + const fakeIcon = { svg: "harmful user input" } as Icon; + + component.icon = fakeIcon; + fixture.detectChanges(); + + const el = fixture.nativeElement as HTMLElement; + expect(el.innerHTML).toBe(""); + }); + + it("should contain icon when input is a safe Icon", () => { + const icon = svgIcon`safe icon`; + + component.icon = icon; + fixture.detectChanges(); + + const el = fixture.nativeElement as HTMLElement; + expect(el.innerHTML).toBe(`safe icon`); + }); +}); diff --git a/libs/components/src/icon/icon.spec.ts b/libs/components/src/icon/icon.spec.ts new file mode 100644 index 00000000000..3e7c011be93 --- /dev/null +++ b/libs/components/src/icon/icon.spec.ts @@ -0,0 +1,38 @@ +import * as IconExports from "./icon"; +import { DynamicContentNotAllowedError, isIcon, svgIcon } from "./icon"; + +describe("Icon", () => { + it("exports should not expose Icon class", () => { + expect(Object.keys(IconExports)).not.toContain("Icon"); + }); + + describe("isIcon", () => { + it("should return true when input is icon", () => { + const result = isIcon(svgIcon`icon`); + + expect(result).toBe(true); + }); + + it("should return false when input is not an icon", () => { + const result = isIcon({ svg: "not an icon" }); + + expect(result).toBe(false); + }); + }); + + describe("template literal", () => { + it("should throw when attempting to create dynamic icons", () => { + const dynamic = "some user input"; + + const f = () => svgIcon`static and ${dynamic}`; + + expect(f).toThrow(DynamicContentNotAllowedError); + }); + + it("should return svg content when supplying icon with svg string", () => { + const icon = svgIcon`safe static content`; + + expect(icon.svg).toBe("safe static content"); + }); + }); +}); diff --git a/libs/components/src/icon/icon.ts b/libs/components/src/icon/icon.ts new file mode 100644 index 00000000000..b397431da28 --- /dev/null +++ b/libs/components/src/icon/icon.ts @@ -0,0 +1,25 @@ +class Icon { + constructor(readonly svg: string) {} +} + +// We only export the type to prohibit the creation of Icons without using +// the `svgIcon` template literal tag. +export type { Icon }; + +export function isIcon(icon: unknown): icon is Icon { + return icon instanceof Icon; +} + +export class DynamicContentNotAllowedError extends Error { + constructor() { + super("Dynamic content in icons is not allowed due to risk of user-injected XSS."); + } +} + +export function svgIcon(strings: TemplateStringsArray, ...values: unknown[]): Icon { + if (values.length > 0) { + throw new DynamicContentNotAllowedError(); + } + + return new Icon(strings[0]); +} diff --git a/libs/components/src/icon/icons.ts b/libs/components/src/icon/icons.ts deleted file mode 100644 index c316d312e30..00000000000 --- a/libs/components/src/icon/icons.ts +++ /dev/null @@ -1,63 +0,0 @@ -export const IconSvg = { - reportExposedPasswords: ` - - - - - - - - - - - - - `, - reportReusedPasswords: ` - - - - - - `, - reportWeakPasswords: ` - - - - - - - `, - reportUnsecuredWebsites: ` - - - - - - - - - `, - reportInactiveTwoFactor: ` - - - - - - - `, - reportBreach: ` - - - - - - - - - - - `, -}; - -export type Icon = keyof typeof IconSvg; diff --git a/libs/components/src/icon/icons/index.ts b/libs/components/src/icon/icons/index.ts new file mode 100644 index 00000000000..bbb98817da3 --- /dev/null +++ b/libs/components/src/icon/icons/index.ts @@ -0,0 +1,4 @@ +// Put generic icons in this folder and export them here. +// Note: Icons need to be in separate files for tree-shaking to work properly + +export {}; // <- remove when adding icons in here diff --git a/libs/components/src/icon/index.ts b/libs/components/src/icon/index.ts index 1ee66e59837..8f29234dbc5 100644 --- a/libs/components/src/icon/index.ts +++ b/libs/components/src/icon/index.ts @@ -1 +1,3 @@ export * from "./icon.module"; +export * from "./icon"; +export * as Icons from "./icons"; From 460a846f89231ccd53a254222adcea680abd171f Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Tue, 6 Sep 2022 12:15:25 +0200 Subject: [PATCH 13/17] Pin Nord version to 0.2.1 (#3447) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b76952c3e3e..9e31a065d0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "ngx-toastr": "^15.0.0", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", - "nord": "^0.2.1", + "nord": "0.2.1", "open": "^8.4.0", "papaparse": "^5.3.2", "popper.js": "^1.16.1", diff --git a/package.json b/package.json index 17883612d58..cf058e3bbee 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "ngx-toastr": "^15.0.0", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", - "nord": "^0.2.1", + "nord": "0.2.1", "open": "^8.4.0", "papaparse": "^5.3.2", "popper.js": "^1.16.1", From 7c5e4dd3d6b2ddfc77d8028bf5baa253ab8659b2 Mon Sep 17 00:00:00 2001 From: rr-bw <102181210+rr-bw@users.noreply.github.com> Date: Tue, 6 Sep 2022 11:02:09 -0700 Subject: [PATCH 14/17] [CL-7] Avatar (#3153) * CL-7 Begin Implementing Avatar * add figma design to parameters * rework size property * Update Figma file to correct component * remove circle input (avatar will always be a circle) * adjust sizing and limit inputs * Setup color input and functionality * Add border option * fix bug duplicating classes * Update size for large avatar * Remove unnecessary class * Fix typo * Remove 'dynamic' input (Avatar will now regenerate on changes by default) * Use Tailwind class instead of an arbitrary value * Remove gravatars (deprecated, see SG-434) * Rename methods to a more accurate name * Rework classList() getter method * Remove unnecessary logic and services * Make properties private, and rename for better clarity * Move sanitizer logic to the TS code rather than the template * Rework and move function to a common static class in Utils * Rename 'data' to 'text' for clarity * Rework classList implementation * Remove email since we removed gravatars * Remove template * set color based on color, id, or text input * rework generate method * add explicit null/undefined check * remove comment Co-authored-by: Vincent Salucci <26154748+vincentsalucci@users.noreply.github.com> --- .../organization-name-badge.component.ts | 32 +---- .../src/components/avatar.component.ts | 15 +-- libs/common/src/misc/utils.ts | 33 +++++ .../components/src/avatar/avatar.component.ts | 127 ++++++++++++++++++ libs/components/src/avatar/avatar.module.ts | 11 ++ libs/components/src/avatar/avatar.stories.ts | 60 +++++++++ libs/components/src/avatar/index.ts | 2 + 7 files changed, 238 insertions(+), 42 deletions(-) create mode 100644 libs/components/src/avatar/avatar.component.ts create mode 100644 libs/components/src/avatar/avatar.module.ts create mode 100644 libs/components/src/avatar/avatar.stories.ts create mode 100644 libs/components/src/avatar/index.ts diff --git a/apps/web/src/app/vault/organization-badge/organization-name-badge.component.ts b/apps/web/src/app/vault/organization-badge/organization-name-badge.component.ts index e34c2a8611d..27f19c68289 100644 --- a/apps/web/src/app/vault/organization-badge/organization-name-badge.component.ts +++ b/apps/web/src/app/vault/organization-badge/organization-name-badge.component.ts @@ -1,6 +1,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; +import { Utils } from "@bitwarden/common/misc/utils"; @Component({ selector: "app-org-badge", @@ -20,37 +21,12 @@ export class OrganizationNameBadgeComponent implements OnInit { ngOnInit(): void { if (this.organizationName == null || this.organizationName === "") { this.organizationName = this.i18nService.t("me"); - this.color = this.stringToColor(this.profileName.toUpperCase()); + this.color = Utils.stringToColor(this.profileName.toUpperCase()); } if (this.color == null) { - this.color = this.stringToColor(this.organizationName.toUpperCase()); + this.color = Utils.stringToColor(this.organizationName.toUpperCase()); } - this.textColor = this.pickTextColorBasedOnBgColor(); - } - - // This value currently isn't stored anywhere, only calculated in the app-avatar component - // Once we are allowing org colors to be changed and saved, change this out - private stringToColor(str: string): string { - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); - } - let color = "#"; - for (let i = 0; i < 3; i++) { - const value = (hash >> (i * 8)) & 0xff; - color += ("00" + value.toString(16)).substr(-2); - } - return color; - } - - // There are a few ways to calculate text color for contrast, this one seems to fit accessibility guidelines best. - // https://stackoverflow.com/a/3943023/6869691 - private pickTextColorBasedOnBgColor() { - const color = this.color.charAt(0) === "#" ? this.color.substring(1, 7) : this.color; - const r = parseInt(color.substring(0, 2), 16); // hexToR - const g = parseInt(color.substring(2, 4), 16); // hexToG - const b = parseInt(color.substring(4, 6), 16); // hexToB - return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? "black !important" : "white !important"; + this.textColor = Utils.pickTextColorBasedOnBgColor(this.color); } emitOnOrganizationClicked() { diff --git a/libs/angular/src/components/avatar.component.ts b/libs/angular/src/components/avatar.component.ts index 740a66a5e2a..14b61c2351c 100644 --- a/libs/angular/src/components/avatar.component.ts +++ b/libs/angular/src/components/avatar.component.ts @@ -68,7 +68,7 @@ export class AvatarComponent implements OnChanges, OnInit { } const charObj = this.getCharText(chars); - const color = this.stringToColor(upperData); + const color = Utils.stringToColor(upperData); const svg = this.getSvg(this.size, color); svg.appendChild(charObj); const html = window.document.createElement("div").appendChild(svg).outerHTML; @@ -77,19 +77,6 @@ export class AvatarComponent implements OnChanges, OnInit { } } - private stringToColor(str: string): string { - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); - } - let color = "#"; - for (let i = 0; i < 3; i++) { - const value = (hash >> (i * 8)) & 0xff; - color += ("00" + value.toString(16)).substr(-2); - } - return color; - } - private getFirstLetters(data: string, count: number): string { const parts = data.split(" "); if (parts.length > 1) { diff --git a/libs/common/src/misc/utils.ts b/libs/common/src/misc/utils.ts index 0aebd9d728d..f66124bc47e 100644 --- a/libs/common/src/misc/utils.ts +++ b/libs/common/src/misc/utils.ts @@ -370,6 +370,39 @@ export class Utils { return s.charAt(0).toUpperCase() + s.slice(1); } + /** + * There are a few ways to calculate text color for contrast, this one seems to fit accessibility guidelines best. + * https://stackoverflow.com/a/3943023/6869691 + * + * @param {string} bgColor + * @param {number} [threshold] see stackoverflow link above + * @param {boolean} [svgTextFill] + * Indicates if this method is performed on an SVG 'fill' attribute (e.g. ). + * This check is necessary because the '!important' tag cannot be used in a 'fill' attribute. + */ + static pickTextColorBasedOnBgColor(bgColor: string, threshold = 186, svgTextFill = false) { + const bgColorHexNums = bgColor.charAt(0) === "#" ? bgColor.substring(1, 7) : bgColor; + const r = parseInt(bgColorHexNums.substring(0, 2), 16); // hexToR + const g = parseInt(bgColorHexNums.substring(2, 4), 16); // hexToG + const b = parseInt(bgColorHexNums.substring(4, 6), 16); // hexToB + const blackColor = svgTextFill ? "black" : "black !important"; + const whiteColor = svgTextFill ? "white" : "white !important"; + return r * 0.299 + g * 0.587 + b * 0.114 > threshold ? blackColor : whiteColor; + } + + static stringToColor(str: string): string { + let hash = 0; + for (let i = 0; i < str.length; i++) { + hash = str.charCodeAt(i) + ((hash << 5) - hash); + } + let color = "#"; + for (let i = 0; i < 3; i++) { + const value = (hash >> (i * 8)) & 0xff; + color += ("00" + value.toString(16)).substr(-2); + } + return color; + } + /** * @throws Will throw an error if the ContainerService has not been attached to the window object */ diff --git a/libs/components/src/avatar/avatar.component.ts b/libs/components/src/avatar/avatar.component.ts new file mode 100644 index 00000000000..2a287ea7fd1 --- /dev/null +++ b/libs/components/src/avatar/avatar.component.ts @@ -0,0 +1,127 @@ +import { Component, Input, OnChanges } from "@angular/core"; +import { DomSanitizer, SafeResourceUrl } from "@angular/platform-browser"; + +import { Utils } from "@bitwarden/common/misc/utils"; + +type SizeTypes = "large" | "default" | "small"; + +const SizeClasses: Record = { + large: ["tw-h-16", "tw-w-16"], + default: ["tw-h-12", "tw-w-12"], + small: ["tw-h-7", "tw-w-7"], +}; + +@Component({ + selector: "bit-avatar", + template: ``, +}) +export class AvatarComponent implements OnChanges { + @Input() border = false; + @Input() color: string; + @Input() id: number; + @Input() text: string; + @Input() size: SizeTypes = "default"; + + private svgCharCount = 2; + private svgFontSize = 20; + private svgFontWeight = 300; + private svgSize = 48; + src: SafeResourceUrl; + + constructor(public sanitizer: DomSanitizer) {} + + ngOnChanges() { + this.generate(); + } + + get classList() { + return ["tw-rounded-full"] + .concat(SizeClasses[this.size] ?? []) + .concat(this.border ? ["tw-border", "tw-border-solid", "tw-border-secondary-500"] : []); + } + + private generate() { + let chars: string = null; + const upperCaseText = this.text.toUpperCase(); + + chars = this.getFirstLetters(upperCaseText, this.svgCharCount); + + if (chars == null) { + chars = this.unicodeSafeSubstring(upperCaseText, this.svgCharCount); + } + + // If the chars contain an emoji, only show it. + if (chars.match(Utils.regexpEmojiPresentation)) { + chars = chars.match(Utils.regexpEmojiPresentation)[0]; + } + + let svg: HTMLElement; + let hexColor = this.color; + + if (this.color != null) { + svg = this.createSvgElement(this.svgSize, hexColor); + } else if (this.id != null) { + hexColor = Utils.stringToColor(this.id.toString()); + svg = this.createSvgElement(this.svgSize, hexColor); + } else { + hexColor = Utils.stringToColor(upperCaseText); + svg = this.createSvgElement(this.svgSize, hexColor); + } + + const charObj = this.createTextElement(chars, hexColor); + svg.appendChild(charObj); + const html = window.document.createElement("div").appendChild(svg).outerHTML; + const svgHtml = window.btoa(unescape(encodeURIComponent(html))); + this.src = this.sanitizer.bypassSecurityTrustResourceUrl( + "data:image/svg+xml;base64," + svgHtml + ); + } + + private getFirstLetters(data: string, count: number): string { + const parts = data.split(" "); + if (parts.length > 1) { + let text = ""; + for (let i = 0; i < count; i++) { + text += this.unicodeSafeSubstring(parts[i], 1); + } + return text; + } + return null; + } + + private createSvgElement(size: number, color: string): HTMLElement { + const svgTag = window.document.createElement("svg"); + svgTag.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + svgTag.setAttribute("pointer-events", "none"); + svgTag.setAttribute("width", size.toString()); + svgTag.setAttribute("height", size.toString()); + svgTag.style.backgroundColor = color; + svgTag.style.width = size + "px"; + svgTag.style.height = size + "px"; + return svgTag; + } + + private createTextElement(character: string, color: string): HTMLElement { + const textTag = window.document.createElement("text"); + textTag.setAttribute("text-anchor", "middle"); + textTag.setAttribute("y", "50%"); + textTag.setAttribute("x", "50%"); + textTag.setAttribute("dy", "0.35em"); + textTag.setAttribute("pointer-events", "auto"); + textTag.setAttribute("fill", Utils.pickTextColorBasedOnBgColor(color, 135, true)); + textTag.setAttribute( + "font-family", + '"Open Sans","Helvetica Neue",Helvetica,Arial,' + + 'sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"' + ); + textTag.textContent = character; + textTag.style.fontWeight = this.svgFontWeight.toString(); + textTag.style.fontSize = this.svgFontSize + "px"; + return textTag; + } + + private unicodeSafeSubstring(str: string, count: number) { + const characters = str.match(/./gu); + return characters != null ? characters.slice(0, count).join("") : ""; + } +} diff --git a/libs/components/src/avatar/avatar.module.ts b/libs/components/src/avatar/avatar.module.ts new file mode 100644 index 00000000000..ea78ff3a1d2 --- /dev/null +++ b/libs/components/src/avatar/avatar.module.ts @@ -0,0 +1,11 @@ +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; + +import { AvatarComponent } from "./avatar.component"; + +@NgModule({ + imports: [CommonModule], + exports: [AvatarComponent], + declarations: [AvatarComponent], +}) +export class AvatarModule {} diff --git a/libs/components/src/avatar/avatar.stories.ts b/libs/components/src/avatar/avatar.stories.ts new file mode 100644 index 00000000000..7fcb883cfee --- /dev/null +++ b/libs/components/src/avatar/avatar.stories.ts @@ -0,0 +1,60 @@ +import { Meta, Story } from "@storybook/angular"; + +import { AvatarComponent } from "./avatar.component"; + +export default { + title: "Component Library/Avatar", + component: AvatarComponent, + args: { + text: "Walt Walterson", + size: "default", + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library?node-id=1881%3A16994", + }, + }, +} as Meta; + +const Template: Story = (args: AvatarComponent) => ({ + props: args, +}); + +export const Default = Template.bind({}); +Default.args = { + color: "#175ddc", +}; + +export const Large = Template.bind({}); +Large.args = { + ...Default.args, + size: "large", +}; + +export const Small = Template.bind({}); +Small.args = { + ...Default.args, + size: "small", +}; + +export const LightBackground = Template.bind({}); +LightBackground.args = { + color: "#d2ffcf", +}; + +export const Border = Template.bind({}); +Border.args = { + ...Default.args, + border: true, +}; + +export const ColorByID = Template.bind({}); +ColorByID.args = { + id: 236478, +}; + +export const ColorByText = Template.bind({}); +ColorByText.args = { + text: "Jason Doe", +}; diff --git a/libs/components/src/avatar/index.ts b/libs/components/src/avatar/index.ts new file mode 100644 index 00000000000..d75d62e01ac --- /dev/null +++ b/libs/components/src/avatar/index.ts @@ -0,0 +1,2 @@ +export * from "./avatar.module"; +export * from "./avatar.component"; From 55e5e008c7817b14741087a80d0e3d80e44006f8 Mon Sep 17 00:00:00 2001 From: "Patrick H. Lauke" Date: Tue, 6 Sep 2022 19:32:01 +0100 Subject: [PATCH 15/17] Don't prevent whitespace wrapping in links/buttons, widen desktop pages (#3407) Allowing whitespace to wrap solves the issue of long link/button text awkwardly breaking out of controls Widening desktop "pages" prevents some unnecessary wrapping in places like the "Create account" button on the login screen, whose content is slightly wider than it should be (but this is currently masked by the `nowrap`) Closes https://github.com/bitwarden/clients/issues/2620 --- apps/browser/src/popup/scss/base.scss | 2 -- apps/browser/src/popup/scss/buttons.scss | 1 - apps/desktop/src/scss/base.scss | 1 - apps/desktop/src/scss/buttons.scss | 2 -- apps/desktop/src/scss/pages.scss | 4 ++-- apps/web/src/scss/buttons.scss | 1 - 6 files changed, 2 insertions(+), 9 deletions(-) diff --git a/apps/browser/src/popup/scss/base.scss b/apps/browser/src/popup/scss/base.scss index 8465a1ba338..0ec248e6bf7 100644 --- a/apps/browser/src/popup/scss/base.scss +++ b/apps/browser/src/popup/scss/base.scss @@ -99,7 +99,6 @@ button { } button { - white-space: nowrap; cursor: pointer; } @@ -323,7 +322,6 @@ header { padding: 7px 0; text-decoration: none; font-size: 12px; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; diff --git a/apps/browser/src/popup/scss/buttons.scss b/apps/browser/src/popup/scss/buttons.scss index f4eea2a1cc6..c1b30ae5980 100644 --- a/apps/browser/src/popup/scss/buttons.scss +++ b/apps/browser/src/popup/scss/buttons.scss @@ -5,7 +5,6 @@ padding: 7px 15px; border: 1px solid #000000; font-size: $font-size-base; - white-space: nowrap; text-align: center; cursor: pointer; diff --git a/apps/desktop/src/scss/base.scss b/apps/desktop/src/scss/base.scss index 0c891784fff..981d462f2d8 100644 --- a/apps/desktop/src/scss/base.scss +++ b/apps/desktop/src/scss/base.scss @@ -85,7 +85,6 @@ button { border: none; background: transparent; color: inherit; - white-space: nowrap; cursor: pointer; } diff --git a/apps/desktop/src/scss/buttons.scss b/apps/desktop/src/scss/buttons.scss index 4b6fe81f639..52de33c8d2c 100644 --- a/apps/desktop/src/scss/buttons.scss +++ b/apps/desktop/src/scss/buttons.scss @@ -7,7 +7,6 @@ padding: 7px 15px; border: 1px solid #000000; font-size: $font-size-base; - white-space: nowrap; text-align: center; cursor: pointer; @@ -176,7 +175,6 @@ button.no-btn { @include themify($themes) { color: themed("textColor"); } - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } diff --git a/apps/desktop/src/scss/pages.scss b/apps/desktop/src/scss/pages.scss index 6c839826ea9..87862bbef3a 100644 --- a/apps/desktop/src/scss/pages.scss +++ b/apps/desktop/src/scss/pages.scss @@ -54,7 +54,7 @@ #lock-page, #update-temp-password-page { .content { - width: 300px; + width: 325px; transition: width 0.25s linear; p { @@ -112,7 +112,7 @@ #sso-page { .content { - width: 300px; + width: 325px; .box { margin-top: 30px; diff --git a/apps/web/src/scss/buttons.scss b/apps/web/src/scss/buttons.scss index 9c854806cb7..6ff4f2e673e 100644 --- a/apps/web/src/scss/buttons.scss +++ b/apps/web/src/scss/buttons.scss @@ -191,7 +191,6 @@ button.no-btn { border: none; padding: 0; color: inherit; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; From cd1af0a9f19aa7a9bf1aefcf794df9ff7614275c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Sep 2022 13:58:30 -0700 Subject: [PATCH 16/17] Bumped web version to 2022.9.0 (#3453) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- apps/web/package.json | 2 +- package-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index 39087a2e91f..f2d7d3f48dc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2022.8.1", + "version": "2022.9.0", "scripts": { "build:oss": "webpack", "build:bit": "webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/package-lock.json b/package-lock.json index 9e31a065d0f..bb37d6c63fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -235,7 +235,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2022.8.1" + "version": "2022.9.0" }, "libs/angular": { "name": "@bitwarden/angular", From 607e86de9bf58274c96006650fb1f75342cc98be Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Sep 2022 08:33:29 -0600 Subject: [PATCH 17/17] Add needs QA to enforce labels (#3450) * Add needs QA to enforce labels * Update .github/workflows/enforce-labels.yml Co-authored-by: Daniel James Smith Co-authored-by: Daniel James Smith --- .github/workflows/enforce-labels.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml index bf8517cc251..61c3233f031 100644 --- a/.github/workflows/enforce-labels.yml +++ b/.github/workflows/enforce-labels.yml @@ -12,5 +12,5 @@ jobs: - name: Enforce Label uses: yogevbd/enforce-label-action@8d1e1709b1011e6d90400a0e6cf7c0b77aa5efeb # v2.1.0 with: - BANNED_LABELS: "hold" - BANNED_LABELS_DESCRIPTION: "PRs on hold cannot be merged" + BANNED_LABELS: "hold,needs-qa" + BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged"