diff --git a/.eslintrc.json b/.eslintrc.json index 8485a9f30a0..14b9a888444 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -73,6 +73,10 @@ { "message": "Calling `svgIcon` directly is not allowed", "selector": "CallExpression[callee.name='svgIcon']" + }, + { + "message": "Accessing FormGroup using `get` is not allowed, use `.value` instead", + "selector": "ChainExpression[expression.object.callee.property.name='get'][expression.property.name='value']" } ], "curly": ["error", "all"], @@ -97,7 +101,10 @@ ] } ], - "no-restricted-imports": ["error", { "patterns": ["src/**/*"] }] + "no-restricted-imports": [ + "error", + { "patterns": ["src/**/*"], "paths": ["@fluffy-spoon/substitute"] } + ] }, "overrides": [ { diff --git a/.github/ISSUE_TEMPLATE/browser.yml b/.github/ISSUE_TEMPLATE/browser.yml index b28dce144b3..ec78f3ee555 100644 --- a/.github/ISSUE_TEMPLATE/browser.yml +++ b/.github/ISSUE_TEMPLATE/browser.yml @@ -91,3 +91,11 @@ body: description: What version of our software are you running? (go to "Settings" → "About" in the extension) validations: required: true + - type: checkboxes + id: issue-tracking-info + attributes: + label: Issue Tracking Info + description: | + Issue tracking information + options: + - label: I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. diff --git a/.github/ISSUE_TEMPLATE/cli.yml b/.github/ISSUE_TEMPLATE/cli.yml index 3a54a40477d..699bcc77052 100644 --- a/.github/ISSUE_TEMPLATE/cli.yml +++ b/.github/ISSUE_TEMPLATE/cli.yml @@ -80,3 +80,11 @@ body: description: What version of our software are you running? (run `bw --version`) validations: required: true + - type: checkboxes + id: issue-tracking-info + attributes: + label: Issue Tracking Info + description: | + Issue tracking information + options: + - label: I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. diff --git a/.github/ISSUE_TEMPLATE/desktop.yml b/.github/ISSUE_TEMPLATE/desktop.yml index 94b72a0020d..8da7b28588d 100644 --- a/.github/ISSUE_TEMPLATE/desktop.yml +++ b/.github/ISSUE_TEMPLATE/desktop.yml @@ -83,3 +83,11 @@ body: description: What version of our software are you running? (go to "Help" → "About Bitwarden" in the app) validations: required: true + - type: checkboxes + id: issue-tracking-info + attributes: + label: Issue Tracking Info + description: | + Issue tracking information + options: + - label: I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. diff --git a/.github/ISSUE_TEMPLATE/web.yml b/.github/ISSUE_TEMPLATE/web.yml index ef995e662ce..80429112fbd 100644 --- a/.github/ISSUE_TEMPLATE/web.yml +++ b/.github/ISSUE_TEMPLATE/web.yml @@ -91,3 +91,11 @@ body: description: What version of our software are you running? (Bottom of the page) validations: required: true + - type: checkboxes + id: issue-tracking-info + attributes: + label: Issue Tracking Info + description: | + Issue tracking information + options: + - label: I understand that work is tracked outside of Github. A PR will be linked to this issue should one be opened to address it, but Bitwarden doesn't use fields like "assigned", "milestone", or "project" to track progress. diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt new file mode 100644 index 00000000000..247107e87e8 --- /dev/null +++ b/.github/whitelist-capital-letters.txt @@ -0,0 +1,446 @@ +./bitwarden_license/README.md +./bitwarden_license/bit-web/src/app/providers/services/webProvider.service.ts +./libs/angular/src/directives/cipherListVirtualScroll.directive.ts +./libs/angular/src/scss/webfonts/Open_Sans-italic-700.woff +./libs/angular/src/scss/webfonts/Open_Sans-normal-300.woff +./libs/angular/src/scss/webfonts/Open_Sans-normal-700.woff +./libs/angular/src/scss/webfonts/Open_Sans-italic-300.woff +./libs/angular/src/scss/webfonts/Open_Sans-italic-600.woff +./libs/angular/src/scss/webfonts/Open_Sans-italic-800.woff +./libs/angular/src/scss/webfonts/Open_Sans-italic-400.woff +./libs/angular/src/scss/webfonts/Open_Sans-normal-600.woff +./libs/angular/src/scss/webfonts/Open_Sans-normal-800.woff +./libs/angular/src/scss/webfonts/Open_Sans-normal-400.woff +./libs/angular/src/components/captchaProtected.component.ts +./libs/angular/src/validators/inputsFieldMatch.validator.ts +./libs/angular/src/validators/notAllowedValueAsync.validator.ts +./libs/angular/src/services/passwordReprompt.service.ts +./libs/angular/src/services/theming/themeBuilder.ts +./libs/angular/src/interfaces/selectOptions.ts +./libs/components/src/stories/Introduction.stories.mdx +./libs/common/spec/misc/logInStrategies/logIn.strategy.spec.ts +./libs/common/spec/misc/logInStrategies/apiLogIn.strategy.spec.ts +./libs/common/spec/misc/logInStrategies/passwordLogIn.strategy.spec.ts +./libs/common/spec/misc/logInStrategies/ssoLogIn.strategy.spec.ts +./libs/common/spec/importers/testData/safeInCloud/testData.xml.ts +./libs/common/spec/importers/testData/safariCsv/oldSimplePasswordData.csv.ts +./libs/common/spec/importers/testData/safariCsv/simplePasswordData.csv.ts +./libs/common/spec/importers/testData/keeperJson/testData.ts +./libs/common/spec/importers/testData/bitwardenJson/passwordProtected.json.ts +./libs/common/spec/importers/testData/onePassword1Pux/SoftwareLicense.ts +./libs/common/spec/importers/testData/onePassword1Pux/SecureNote.ts +./libs/common/spec/importers/testData/onePassword1Pux/Emailfield.ts +./libs/common/spec/importers/testData/onePassword1Pux/CreditCard.ts +./libs/common/spec/importers/testData/onePassword1Pux/LoginData.ts +./libs/common/spec/importers/testData/onePassword1Pux/WirelessRouter.ts +./libs/common/spec/importers/testData/onePassword1Pux/SanitizedExport.ts +./libs/common/spec/importers/testData/onePassword1Pux/Membership.ts +./libs/common/spec/importers/testData/onePassword1Pux/OutdoorLicense.ts +./libs/common/spec/importers/testData/onePassword1Pux/EmailAccount.ts +./libs/common/spec/importers/testData/onePassword1Pux/Password.ts +./libs/common/spec/importers/testData/onePassword1Pux/RewardsProgram.ts +./libs/common/spec/importers/testData/onePassword1Pux/EmailfieldOnIdentity_Prefilled.ts +./libs/common/spec/importers/testData/onePassword1Pux/EmailfieldOnIdentity.ts +./libs/common/spec/importers/testData/onePassword1Pux/DriversLicense.ts +./libs/common/spec/importers/testData/onePassword1Pux/Database.ts +./libs/common/spec/importers/testData/onePassword1Pux/Passport.ts +./libs/common/spec/importers/testData/onePassword1Pux/Onepux_example.ts +./libs/common/spec/importers/testData/onePassword1Pux/BankAccount.ts +./libs/common/spec/importers/testData/onePassword1Pux/MedicalRecord.ts +./libs/common/spec/importers/testData/onePassword1Pux/IdentityData.ts +./libs/common/spec/importers/testData/onePassword1Pux/Server.ts +./libs/common/spec/importers/testData/onePassword1Pux/APICredentials.ts +./libs/common/spec/importers/testData/onePassword1Pux/SSN.ts +./libs/common/spec/importers/testData/onePasswordCsv/creditCard.windows.csv.ts +./libs/common/spec/importers/testData/onePasswordCsv/creditCard.mac.csv.ts +./libs/common/spec/importers/testData/onePasswordCsv/multipleItems.windows.csv.ts +./libs/common/spec/importers/testData/onePasswordCsv/multipleItems.mac.csv.ts +./libs/common/spec/importers/testData/nordpassCsv/nordpass.secureNote.csv.ts +./libs/common/spec/importers/testData/dashlaneCsv/multiplePersonalInfo.csv.ts +./libs/common/spec/importers/testData/dashlaneCsv/personalInfo.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserIdCard.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserTwofa.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserNote.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserAccount.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserIdentity.csv.ts +./libs/common/spec/importers/testData/mykiCsv/UserCreditCard.csv.ts +./libs/common/spec/importers/testData/firefoxCsv/firefoxAccountsData.csv.ts +./libs/common/spec/importers/testData/firefoxCsv/simplePasswordData.csv.ts +./libs/common/spec/importers/fsecureFskImporter.spec.ts +./libs/common/spec/importers/safariCsvImporter.spec.ts +./libs/common/spec/importers/keeperJsonImporter.spec.ts +./libs/common/spec/importers/bitwardenPasswordProtectedImporter.spec.ts +./libs/common/spec/importers/dashlaneCsvImporter.spec.ts +./libs/common/spec/importers/nordpassCsvImporter.spec.ts +./libs/common/spec/importers/onepasswordWinCsvImporter.spec.ts +./libs/common/spec/importers/firefoxCsvImporter.spec.ts +./libs/common/spec/importers/onepassword1PuxImporter.spec.ts +./libs/common/spec/importers/onepasswordMacCsvImporter.spec.ts +./libs/common/spec/importers/lastpassCsvImporter.spec.ts +./libs/common/spec/importers/onepassword1PifImporter.spec.ts +./libs/common/spec/importers/keepass2XmlImporter.spec.ts +./libs/common/spec/importers/bitwardenJsonImporter.spec.ts +./libs/common/spec/importers/mykiCsvImporter.spec.ts +./libs/common/spec/web/services/webCryptoFunction.service.spec.ts +./libs/common/spec/shared/interceptConsole.ts +./libs/common/spec/models/view/passwordHistoryView.spec.ts +./libs/common/spec/models/view/cipherView.spec.ts +./libs/common/spec/models/view/folderView.spec.ts +./libs/common/spec/models/view/attachmentView.spec.ts +./libs/common/spec/models/view/loginView.spec.ts +./libs/common/spec/models/domain/loginUri.spec.ts +./libs/common/spec/models/domain/encString.spec.ts +./libs/common/spec/models/domain/secureNote.spec.ts +./libs/common/spec/models/domain/symmetricCryptoKey.spec.ts +./libs/common/spec/models/domain/encArrayBuffer.spec.ts +./libs/common/spec/models/domain/sendAccess.spec.ts +./libs/common/spec/models/domain/sendFile.spec.ts +./libs/common/spec/models/domain/sendText.spec.ts +./libs/common/spec/matchers/toEqualBuffer.spec.ts +./libs/common/spec/matchers/toEqualBuffer.ts +./libs/common/spec/services/stateMigration.service.spec.ts +./libs/common/spec/services/consoleLog.service.spec.ts +./libs/common/src/misc/logInStrategies/ssoLogin.strategy.ts +./libs/common/src/misc/logInStrategies/passwordLogin.strategy.ts +./libs/common/src/misc/logInStrategies/apiLogin.strategy.ts +./libs/common/src/misc/logInStrategies/passwordlessLogin.strategy.ts +./libs/common/src/misc/logInStrategies/logIn.strategy.ts +./libs/common/src/misc/nodeUtils.ts +./libs/common/src/misc/linkedFieldOption.decorator.ts +./libs/common/src/misc/serviceUtils.ts +./libs/common/src/types/twoFactorResponse.ts +./libs/common/src/types/authResponse.ts +./libs/common/src/types/syncEventArgs.ts +./libs/common/src/importers/enpassJsonImporter.ts +./libs/common/src/importers/firefoxCsvImporter.ts +./libs/common/src/importers/rememBearCsvImporter.ts +./libs/common/src/importers/ascendoCsvImporter.ts +./libs/common/src/importers/passwordDragonXmlImporter.ts +./libs/common/src/importers/passkeepCsvImporter.ts +./libs/common/src/importers/gnomeJsonImporter.ts +./libs/common/src/importers/secureSafeCsvImporter.ts +./libs/common/src/importers/zohoVaultCsvImporter.ts +./libs/common/src/importers/dashlaneImporters/dashlaneCsvImporter.ts +./libs/common/src/importers/dashlaneImporters/types/dashlaneCsvTypes.ts +./libs/common/src/importers/dashlaneImporters/dashlaneJsonImporter.ts +./libs/common/src/importers/chromeCsvImporter.ts +./libs/common/src/importers/meldiumCsvImporter.ts +./libs/common/src/importers/safariCsvImporter.ts +./libs/common/src/importers/msecureCsvImporter.ts +./libs/common/src/importers/buttercupCsvImporter.ts +./libs/common/src/importers/kasperskyTxtImporter.ts +./libs/common/src/importers/baseImporter.ts +./libs/common/src/importers/keepassxCsvImporter.ts +./libs/common/src/importers/encryptrCsvImporter.ts +./libs/common/src/importers/passwordWalletTxtImporter.ts +./libs/common/src/importers/codebookCsvImporter.ts +./libs/common/src/importers/nordpassCsvImporter.ts +./libs/common/src/importers/avastJsonImporter.ts +./libs/common/src/importers/blurCsvImporter.ts +./libs/common/src/importers/safeInCloudXmlImporter.ts +./libs/common/src/importers/enpassCsvImporter.ts +./libs/common/src/importers/saferpassCsvImport.ts +./libs/common/src/importers/keeperImporters/types/keeperJsonTypes.ts +./libs/common/src/importers/keeperImporters/keeperCsvImporter.ts +./libs/common/src/importers/keeperImporters/keeperJsonImporter.ts +./libs/common/src/importers/fsecureFskImporter.ts +./libs/common/src/importers/clipperzHtmlImporter.ts +./libs/common/src/importers/keepass2XmlImporter.ts +./libs/common/src/importers/stickyPasswordXmlImporter.ts +./libs/common/src/importers/aviraCsvImporter.ts +./libs/common/src/importers/bitwardenPasswordProtectedImporter.ts +./libs/common/src/importers/avastCsvImporter.ts +./libs/common/src/importers/mykiCsvImporter.ts +./libs/common/src/importers/logMeOnceCsvImporter.ts +./libs/common/src/importers/upmCsvImporter.ts +./libs/common/src/importers/yotiCsvImporter.ts +./libs/common/src/importers/roboformCsvImporter.ts +./libs/common/src/importers/passwordBossJsonImporter.ts +./libs/common/src/importers/splashIdCsvImporter.ts +./libs/common/src/importers/passmanJsonImporter.ts +./libs/common/src/importers/bitwardenCsvImporter.ts +./libs/common/src/importers/lastpassCsvImporter.ts +./libs/common/src/importers/bitwardenJsonImporter.ts +./libs/common/src/importers/passwordAgentCsvImporter.ts +./libs/common/src/importers/passpackCsvImporter.ts +./libs/common/src/importers/truekeyCsvImporter.ts +./libs/common/src/importers/blackBerryCsvImporter.ts +./libs/common/src/importers/importError.ts +./libs/common/src/importers/padlockCsvImporter.ts +./libs/common/src/importers/onepasswordImporters/types/onepassword1PuxImporterTypes.ts +./libs/common/src/importers/onepasswordImporters/onepasswordMacCsvImporter.ts +./libs/common/src/importers/onepasswordImporters/cipherImportContext.ts +./libs/common/src/importers/onepasswordImporters/onepasswordWinCsvImporter.ts +./libs/common/src/importers/onepasswordImporters/onepasswordCsvImporter.ts +./libs/common/src/importers/onepasswordImporters/onepassword1PuxImporter.ts +./libs/common/src/importers/onepasswordImporters/onepassword1PifImporter.ts +./libs/common/src/importers/passwordSafeXmlImporter.ts +./libs/common/src/enums/kdfType.ts +./libs/common/src/enums/fileUploadType.ts +./libs/common/src/enums/cipherType.ts +./libs/common/src/enums/twoFactorProviderType.ts +./libs/common/src/enums/clientType.ts +./libs/common/src/enums/encryptedExportType.ts +./libs/common/src/enums/linkedIdType.ts +./libs/common/src/enums/sendType.ts +./libs/common/src/enums/importOptions.ts +./libs/common/src/enums/policyType.ts +./libs/common/src/enums/planSponsorshipType.ts +./libs/common/src/enums/encryptionType.ts +./libs/common/src/enums/htmlStorageLocation.ts +./libs/common/src/enums/providerUserType.ts +./libs/common/src/enums/organizationUserStatusType.ts +./libs/common/src/enums/verificationType.ts +./libs/common/src/enums/notificationType.ts +./libs/common/src/enums/keySuffixOptions.ts +./libs/common/src/enums/productType.ts +./libs/common/src/enums/scimProviderType.ts +./libs/common/src/enums/eventType.ts +./libs/common/src/enums/organizationApiKeyType.ts +./libs/common/src/enums/hashPurpose.ts +./libs/common/src/enums/uriMatchType.ts +./libs/common/src/enums/deviceType.ts +./libs/common/src/enums/organizationConnectionType.ts +./libs/common/src/enums/secureNoteType.ts +./libs/common/src/enums/transactionType.ts +./libs/common/src/enums/providerUserStatusType.ts +./libs/common/src/enums/storageLocation.ts +./libs/common/src/enums/authenticationType.ts +./libs/common/src/enums/emergencyAccessType.ts +./libs/common/src/enums/themeType.ts +./libs/common/src/enums/logLevelType.ts +./libs/common/src/enums/planType.ts +./libs/common/src/enums/stateVersion.ts +./libs/common/src/enums/authenticationStatus.ts +./libs/common/src/enums/fieldType.ts +./libs/common/src/enums/paymentMethodType.ts +./libs/common/src/enums/ssoEnums.ts +./libs/common/src/enums/authRequestType.ts +./libs/common/src/enums/emergencyAccessStatusType.ts +./libs/common/src/enums/nativeMessagingVersion.ts +./libs/common/src/enums/cipherRepromptType.ts +./libs/common/src/enums/organizationUserType.ts +./libs/common/src/emailForwarders/fastmailForwarder.ts +./libs/common/src/emailForwarders/duckDuckGoForwarder.ts +./libs/common/src/emailForwarders/firefoxRelayForwarder.ts +./libs/common/src/emailForwarders/anonAddyForwarder.ts +./libs/common/src/emailForwarders/simpleLoginForwarder.ts +./libs/common/src/emailForwarders/forwarderOptions.ts +./libs/common/src/factories/accountFactory.ts +./libs/common/src/factories/globalStateFactory.ts +./libs/common/src/factories/stateFactory.ts +./libs/common/src/abstractions/userVerification/userVerification.service.abstraction.ts +./libs/common/src/abstractions/userVerification/userVerification-api.service.abstraction.ts +./libs/common/src/abstractions/platformUtils.service.ts +./libs/common/src/abstractions/stateMigration.service.ts +./libs/common/src/abstractions/fileDownload/fileDownloadBuilder.ts +./libs/common/src/abstractions/fileDownload/fileDownload.service.ts +./libs/common/src/abstractions/fileDownload/fileDownloadRequest.ts +./libs/common/src/abstractions/abstractEncrypt.service.ts +./libs/common/src/abstractions/passwordGeneration.service.ts +./libs/common/src/abstractions/passwordReprompt.service.ts +./libs/common/src/abstractions/formValidationErrors.service.ts +./libs/common/src/abstractions/vaultTimeout/vaultTimeoutSettings.service.ts +./libs/common/src/abstractions/vaultTimeout/vaultTimeout.service.ts +./libs/common/src/abstractions/fileUpload.service.ts +./libs/common/src/abstractions/cryptoFunction.service.ts +./libs/common/src/abstractions/keyConnector.service.ts +./libs/common/src/abstractions/anonymousHub.service.ts +./libs/common/src/abstractions/appId.service.ts +./libs/common/src/abstractions/usernameGeneration.service.ts +./libs/common/src/abstractions/twoFactor.service.ts +./libs/common/src/abstractions/sync/syncNotifier.service.abstraction.ts +./libs/common/src/services/userVerification/userVerification-api.service.ts +./libs/common/src/services/userVerification/userVerification.service.ts +./libs/common/src/services/azureFileUpload.service.ts +./libs/common/src/services/stateMigration.service.ts +./libs/common/src/services/passwordGeneration.service.ts +./libs/common/src/services/consoleLog.service.ts +./libs/common/src/services/formValidationErrors.service.ts +./libs/common/src/services/vaultTimeout/vaultTimeoutSettings.service.ts +./libs/common/src/services/vaultTimeout/vaultTimeout.service.ts +./libs/common/src/services/fileUpload.service.ts +./libs/common/src/services/keyConnector.service.ts +./libs/common/src/services/anonymousHub.service.ts +./libs/common/src/services/appId.service.ts +./libs/common/src/services/usernameGeneration.service.ts +./libs/common/src/services/noopMessaging.service.ts +./libs/common/src/services/twoFactor.service.ts +./libs/common/src/services/sync/syncNotifier.service.ts +./libs/common/src/services/memoryStorage.service.ts +./libs/common/src/services/bitwardenFileUpload.service.ts +./libs/common/src/services/webCryptoFunction.service.ts +./libs/common/src/interfaces/IEncrypted.ts +./libs/node/spec/cli/consoleLog.service.spec.ts +./libs/node/spec/services/nodeCryptoFunction.service.spec.ts +./libs/node/src/cli/models/response/baseResponse.ts +./libs/node/src/cli/models/response/stringResponse.ts +./libs/node/src/cli/models/response/fileResponse.ts +./libs/node/src/cli/models/response/messageResponse.ts +./libs/node/src/cli/models/response/listResponse.ts +./libs/node/src/cli/baseProgram.ts +./libs/node/src/cli/services/consoleLog.service.ts +./libs/node/src/cli/services/cliPlatformUtils.service.ts +./libs/node/src/services/nodeApi.service.ts +./libs/node/src/services/nodeCryptoFunction.service.ts +./libs/node/src/services/lowdbStorage.service.ts +./libs/electron/spec/services/electronLog.service.spec.ts +./libs/electron/src/baseMenu.ts +./libs/electron/src/services/electronLog.service.ts +./libs/electron/src/services/electronStorage.service.ts +./libs/electron/src/services/electronRendererMessaging.service.ts +./libs/electron/src/services/electronMainMessaging.service.ts +./libs/electron/src/services/electronPlatformUtils.service.ts +./libs/electron/src/services/electronRendererStorage.service.ts +./libs/electron/src/services/electronCrypto.service.ts +./libs/electron/src/services/electronRendererSecureStorage.service.ts +./README.md +./LICENSE_BITWARDEN.txt +./CONTRIBUTING.md +./.github/PULL_REQUEST_TEMPLATE.md +./LICENSE_GPL.txt +./LICENSE.txt +./apps/web/Dockerfile +./apps/web/README.md +./apps/desktop/resources/installerSidebar.bmp +./apps/desktop/resources/appx/SplashScreen.png +./apps/desktop/resources/appx/BadgeLogo.png +./apps/desktop/resources/appx/Square150x150Logo.png +./apps/desktop/resources/appx/StoreLogo.png +./apps/desktop/resources/appx/Wide310x150Logo.png +./apps/desktop/resources/appx/Square44x44Logo.png +./apps/desktop/native-messaging-test-runner/src/ipcService.ts +./apps/desktop/native-messaging-test-runner/src/nativeMessageService.ts +./apps/desktop/native-messaging-test-runner/src/logUtils.ts +./apps/desktop/README.md +./apps/desktop/desktop_native/Cargo.toml +./apps/desktop/desktop_native/Cargo.lock +./apps/desktop/src/app/services/desktopFileDownloadService.ts +./apps/desktop/src/models/nativeMessaging/unencryptedCommand.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessage.ts +./apps/desktop/src/models/nativeMessaging/legacyMessageWrapper.ts +./apps/desktop/src/models/nativeMessaging/unencryptedMessage.ts +./apps/desktop/src/models/nativeMessaging/unencryptedMessageResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedCommand.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/successStatusResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/generateResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/failureStatusResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/cannotDecryptErrorResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/userStatusErrorResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/accountStatusResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/encryptedMessageResponse.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessageResponses/cipherResponse.ts +./apps/desktop/src/models/nativeMessaging/decryptedCommandData.ts +./apps/desktop/src/models/nativeMessaging/messageCommon.ts +./apps/desktop/src/models/nativeMessaging/legacyMessage.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessagePayloads/credentialUpdatePayload.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessagePayloads/passwordGeneratePayload.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessagePayloads/credentialCreatePayload.ts +./apps/desktop/src/models/nativeMessaging/encryptedMessagePayloads/credentialRetrievePayload.ts +./apps/desktop/src/main/desktopCredentialStorageListener.ts +./apps/desktop/src/main/powerMonitor.main.ts +./apps/desktop/src/main/nativeMessaging.main.ts +./apps/desktop/src/services/passwordReprompt.service.ts +./apps/desktop/src/services/encryptedMessageHandlerService.ts +./apps/desktop/src/services/nativeMessaging.service.ts +./apps/desktop/src/services/nativeMessageHandler.service.ts +./apps/cli/stores/chocolatey/tools/VERIFICATION.txt +./apps/cli/README.md +./apps/cli/src/models/response/sendFileResponse.ts +./apps/cli/src/models/response/organizationCollectionResponse.ts +./apps/cli/src/models/response/collectionResponse.ts +./apps/cli/src/models/response/templateResponse.ts +./apps/cli/src/models/response/passwordHistoryResponse.ts +./apps/cli/src/models/response/folderResponse.ts +./apps/cli/src/models/response/loginResponse.ts +./apps/cli/src/models/response/sendAccessResponse.ts +./apps/cli/src/models/response/sendResponse.ts +./apps/cli/src/models/response/cipherResponse.ts +./apps/cli/src/models/response/organizationResponse.ts +./apps/cli/src/models/response/organizationUserResponse.ts +./apps/cli/src/models/response/sendTextResponse.ts +./apps/cli/src/models/response/attachmentResponse.ts +./apps/cli/src/models/selectionReadOnly.ts +./apps/cli/src/models/request/organizationCollectionRequest.ts +./apps/cli/src/commands/convertToKeyConnector.command.ts +./apps/cli/src/commands/send/removePassword.command.ts +./apps/cli/src/services/lowdbStorage.service.ts +./apps/cli/src/services/nodeEnvSecureStorage.service.ts +./apps/browser/README.md +./apps/browser/store/locales/en/screenshots/Firefox/Firefox02.png +./apps/browser/store/locales/en/screenshots/Firefox/Firefox03.png +./apps/browser/store/locales/en/screenshots/Firefox/Firefox01.png +./apps/browser/store/locales/en/screenshots/Firefox/Firefox04.png +./apps/browser/store/locales/en/screenshots/Firefox/Firefox05.png +./apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge03.png +./apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge02.png +./apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge01.png +./apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge05.png +./apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge04.png +./apps/browser/store/locales/en/screenshots/Chrome/Chrome01.png +./apps/browser/store/locales/en/screenshots/Chrome/Chrome02.png +./apps/browser/store/locales/en/screenshots/Chrome/Chrome03.png +./apps/browser/store/locales/en/screenshots/Chrome/Chrome04.png +./apps/browser/store/locales/en/screenshots/Chrome/Chrome05.png +./apps/browser/store/locales/en/screenshots/Opera/Opera01.png +./apps/browser/store/locales/en/screenshots/Opera/Opera03.png +./apps/browser/store/locales/en/screenshots/Opera/Opera02.png +./apps/browser/store/locales/en/screenshots/Opera/Opera05.png +./apps/browser/store/locales/en/screenshots/Opera/Opera04.png +./apps/browser/store/windows/AppxManifest.xml +./apps/browser/src/background/nativeMessaging.background.ts +./apps/browser/src/background/models/addLoginRuntimeMessage.ts +./apps/browser/src/background/models/addChangePasswordQueueMessage.ts +./apps/browser/src/background/models/addLoginQueueMessage.ts +./apps/browser/src/background/models/iconDetails.ts +./apps/browser/src/background/models/changePasswordRuntimeMessage.ts +./apps/browser/src/background/models/notificationQueueMessage.ts +./apps/browser/src/background/models/notificationQueueMessageType.ts +./apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts +./apps/browser/src/background/contextMenus.background.ts +./apps/browser/src/background/webRequest.background.ts +./apps/browser/src/popup/services/debounceNavigationService.ts +./apps/browser/src/content/contextMenuHandler.ts +./apps/browser/src/content/notificationBar.ts +./apps/browser/src/models/browserComponentState.ts +./apps/browser/src/models/autofillScript.ts +./apps/browser/src/models/browserSendComponentState.ts +./apps/browser/src/models/browserGroupingsComponentState.ts +./apps/browser/src/models/biometricErrors.ts +./apps/browser/src/models/autofillPageDetails.ts +./apps/browser/src/models/autofillForm.ts +./apps/browser/src/models/autofillField.ts +./apps/browser/src/browser/safariApp.ts +./apps/browser/src/browser/browserApi.ts +./apps/browser/src/safari/desktop/ViewController.swift +./apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/Contents.json +./apps/browser/src/safari/desktop/Assets.xcassets/AccentColor.colorset/Contents.json +./apps/browser/src/safari/desktop/Assets.xcassets/Contents.json +./apps/browser/src/safari/desktop/Base.lproj/Main.storyboard +./apps/browser/src/safari/desktop/AppDelegate.swift +./apps/browser/src/safari/desktop/Info.plist +./apps/browser/src/safari/safari/SafariWebExtensionHandler.swift +./apps/browser/src/safari/safari/Info.plist +./apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +./apps/browser/src/commands/autoFillActiveTabCommand.ts +./apps/browser/src/listeners/onCommandListener.ts +./apps/browser/src/listeners/onInstallListener.ts +./apps/browser/src/services/browserFileDownloadService.ts +./apps/browser/src/services/localBackedSessionStorage.service.spec.ts +./apps/browser/src/services/browserMessagingPrivateModeBackground.service.ts +./apps/browser/src/services/browserPlatformUtils.service.spec.ts +./apps/browser/src/services/browserMemoryStorage.service.ts +./apps/browser/src/services/vaultTimeout/vaultTimeout.service.ts +./apps/browser/src/services/browserCrypto.service.ts +./apps/browser/src/services/browserPlatformUtils.service.ts +./apps/browser/src/services/autofillConstants.ts +./apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts +./apps/browser/src/services/browserLocalStorage.service.ts +./apps/browser/src/services/localBackedSessionStorage.service.ts +./apps/browser/src/services/vaultFilter.service.ts +./apps/browser/src/services/browserMessagingPrivateModePopup.service.ts +./apps/browser/src/services/browserMessaging.service.ts +./apps/browser/src/services/keyGeneration.service.ts +./apps/browser/src/services/abstractChromeStorageApi.service.ts +./SECURITY.md diff --git a/.github/workflows/automatic-issue-responses.yml b/.github/workflows/automatic-issue-responses.yml index 8fb18f6b1d8..16eefb03d22 100644 --- a/.github/workflows/automatic-issue-responses.yml +++ b/.github/workflows/automatic-issue-responses.yml @@ -62,3 +62,14 @@ jobs: As we haven’t heard from you about this problem in some time, this issue will now be closed. If this happens again or continues to be an problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis. + # Translation PR / Crowdin + - if: github.event.label.name == 'translation-pr' + name: Translation-PR + uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0 + with: + comment: | + We really appreciate you taking the time to improve our translations. + + However we use a translation tool called [Crowdin](https://crowdin.com/) to help manage our localization efforts across many different languages. Our translations can only be updated using Crowdin, so we'll have to close this PR, but would really appreciate if you'd consider joining our awesome translation community over at Crowdin. + + More information can be found in the [localization section](https://contributing.bitwarden.com/contributing/#localization-l10n) of our [Contribution Guidelines](https://contributing.bitwarden.com/contributing/) diff --git a/.github/workflows/brew-bump-cli.yml b/.github/workflows/brew-bump-cli.yml index 5487095bf75..88a8cdefe50 100644 --- a/.github/workflows/brew-bump-cli.yml +++ b/.github/workflows/brew-bump-cli.yml @@ -23,17 +23,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "brew-bump-workflow-pat" - 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 fba2685f234..249c5a57d48 100644 --- a/.github/workflows/brew-bump-desktop.yml +++ b/.github/workflows/brew-bump-desktop.yml @@ -23,17 +23,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "brew-bump-workflow-pat" - 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 91134cbab65..0a5746ce682 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -24,6 +24,8 @@ on: - '!*.md' - '!*.txt' - '.github/workflows/build-browser.yml' + workflow_call: + inputs: {} workflow_dispatch: inputs: {} @@ -139,12 +141,10 @@ jobs: working-directory: ./ - name: Build - run: | - npm run dist + run: npm run dist - name: Build Manifest v3 - run: | - npm run dist:chrome:mv3 + run: npm run dist:mv3 - name: Gulp run: gulp ci @@ -177,6 +177,13 @@ jobs: path: apps/browser/dist/dist-opera.zip if-no-files-found: error + - name: Upload Opera MV3 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + with: + name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip + path: apps/browser/dist/dist-opera-mv3.zip + if-no-files-found: error + - name: Upload Chrome artifact uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 with: @@ -188,7 +195,7 @@ jobs: uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 with: name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-chrome-MV3.zip + path: apps/browser/dist/dist-chrome-mv3.zip if-no-files-found: error - name: Upload Firefox artifact @@ -205,6 +212,13 @@ jobs: path: apps/browser/dist/dist-edge.zip if-no-files-found: error + - name: Upload Edge MV3 artifact + uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + with: + name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip + path: apps/browser/dist/dist-edge-mv3.zip + if-no-files-found: error + - name: Upload browser source uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 with: @@ -332,23 +346,16 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + with: + keyvault: "bitwarden-prod-kv" + secrets: "crowdin-api-token" - name: Upload Sources uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 @@ -362,54 +369,6 @@ jobs: upload_sources: true upload_translations: false - trigger-desktop-build: - name: Trigger desktop build - if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') || github.ref != 'refs/heads/hotfix-rc-browser' }} - runs-on: ubuntu-20.04 - needs: - - build - - build-safari - steps: - - - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 - with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - - - name: Retrieve secrets - id: retrieve-secrets - 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 - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - - - name: Call GitHub API to trigger desktop build workflow - env: - TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} - BRANCH_NAME: ${{ steps.extract_branch.outputs.branch }} - run: | - - JSON_STRING=$(printf '{"ref":"%s"}' "$BRANCH_NAME") - - curl \ - -X POST \ - -i -u bitwarden-devops-bot:$TOKEN \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/bitwarden/clients/actions/workflows/build-desktop.yml/dispatches \ - -d $JSON_STRING - check-failures: name: Check for failures if: always() @@ -421,7 +380,6 @@ jobs: - build - build-safari - crowdin-push - - trigger-desktop-build steps: - name: Check if any job failed if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }} @@ -432,7 +390,6 @@ jobs: BUILD_STATUS: ${{ needs.build.result }} SAFARI_BUILD_STATUS: ${{ needs.build-safari.result }} CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} - TRIGGER_DESKTOP_BUILD_STATUS: ${{ needs.trigger-desktop-build.result }} run: | if [ "$CLOC_STATUS" = "failure" ]; then exit 1 @@ -446,12 +403,10 @@ jobs: exit 1 elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then exit 1 - elif [ "$TRIGGER_DESKTOP_BUILD_STATUS" = "failure" ]; then - exit 1 fi - name: Login to Azure - Prod Subscription - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 if: failure() with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} @@ -459,17 +414,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + with: + keyvault: "bitwarden-prod-kv" + secrets: "devops-alerts-slack-webhook-url" - 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 9147ed1b7eb..e32dbedb24c 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -361,17 +361,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index fe8df982c26..644288bd990 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -131,7 +131,8 @@ jobs: linux: name: Linux Build runs-on: ubuntu-20.04 - needs: setup + needs: + - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} defaults: @@ -142,7 +143,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -176,7 +177,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: | @@ -245,7 +246,8 @@ jobs: windows: name: Windows Build runs-on: windows-2019 - needs: setup + needs: + - setup defaults: run: shell: pwsh @@ -257,7 +259,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -272,9 +274,9 @@ jobs: node-gyp install $(node -v) - name: Install AST - uses: bitwarden/gh-actions/install-ast@f135c42c8596cb535c5bcb7523c0b2eef89709ac + uses: bitwarden/gh-actions/install-ast@471ae4aec27405f16c5b796e288f54262c406e5d - - name: Set up environment + - name: Set up environmentF run: choco install checksum --no-progress - name: Rust @@ -291,35 +293,27 @@ jobs: rustup show - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - name: Retrieve secrets id: retrieve-secrets - shell: bash - env: - KEYVAULT: bitwarden-prod-kv - SECRETS: | - code-signing-vault-url, + uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + 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 - 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 + code-signing-cert-name" - name: Install Node dependencies run: npm ci working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: apps/desktop/desktop_native/*.node @@ -328,8 +322,7 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: | - npm run build:cross-platform + run: npm run build:cross-platform - name: Build & Sign (dev) env: @@ -467,7 +460,8 @@ jobs: macos-build: name: MacOS Build runs-on: macos-11 - needs: setup + needs: + - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} defaults: @@ -478,7 +472,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -506,14 +500,14 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -591,7 +585,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: apps/desktop/desktop_native/*.node @@ -600,19 +594,26 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: | - npm run build:cross-platform + run: npm run build:cross-platform - name: Build application (dev) run: npm run build + browser-build: + name: Browser Build + needs: setup + uses: ./.github/workflows/build-browser.yml + secrets: inherit + + macos-package-github: name: MacOS Package GitHub Release Assets runs-on: macos-11 needs: - - setup + - browser-build - macos-build + - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} defaults: @@ -623,7 +624,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -651,14 +652,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -736,7 +737,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: apps/desktop/desktop_native/*.node @@ -745,38 +746,15 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: | - npm run build:cross-platform + run: npm run build:cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - - name: Download artifact from hotfix-rc-desktop - if: github.ref == 'refs/heads/hotfix-rc-desktop' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + - name: Download Browser artifact + uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: - workflow: build-browser.yml - workflow_conclusion: success - branch: hotfix-rc-desktop - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Download artifact from rc - if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 - with: - workflow: build-browser.yml - workflow_conclusion: success - branch: rc - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Download artifact from master - if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc-desktop' }} - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 - with: - workflow: build-browser.yml - workflow_conclusion: success - branch: master path: ${{ github.workspace }}/browser-build-artifacts - name: Unzip Safari artifact @@ -829,8 +807,9 @@ jobs: name: MacOS Package Prod Release Asset runs-on: macos-11 needs: - - setup + - browser-build - macos-build + - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} defaults: @@ -841,7 +820,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -869,14 +848,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -954,7 +933,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: apps/desktop/desktop_native/*.node @@ -963,38 +942,15 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: | - npm run build:cross-platform + run: npm run build:cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - - name: Download artifact from hotfix-rc-desktop - if: github.ref == 'refs/heads/hotfix-rc-desktop' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + - name: Download Browser artifact + uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: - workflow: build-browser.yml - workflow_conclusion: success - branch: hotfix-rc-desktop - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Download artifact from rc - if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 - with: - workflow: build-browser.yml - workflow_conclusion: success - branch: rc - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Download artifact from master - if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc-desktop' }} - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 - with: - workflow: build-browser.yml - workflow_conclusion: success - branch: master path: ${{ github.workspace }}/browser-build-artifacts - name: Unzip Safari artifact @@ -1039,8 +995,9 @@ jobs: if: false # We need to look into how code signing works for dev runs-on: macos-11 needs: - - setup + - browser-build - macos-build + - setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} defaults: @@ -1051,7 +1008,7 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Set up Node - uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 + uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -1074,14 +1031,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -1159,7 +1116,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + uses: actions/cache@9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7 id: cache with: path: apps/desktop/desktop_native/*.node @@ -1168,29 +1125,15 @@ jobs: - name: Build Native Module if: steps.cache.outputs.cache-hit != 'true' working-directory: apps/desktop/desktop_native - run: | - npm run build:cross-platform + run: npm run build:cross-platform - name: Build if: steps.build-cache.outputs.cache-hit != 'true' run: npm run build - - name: Download artifact from rc - if: github.ref == 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 + - name: Download Browser artifact + uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: - workflow: build-browser.yml - workflow_conclusion: success - branch: rc - path: ${{ github.workspace }}/browser-build-artifacts - - - name: Download artifact from master - if: github.ref != 'refs/heads/rc' - uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 - with: - workflow: build-browser.yml - workflow_conclusion: success - branch: master path: ${{ github.workspace }}/browser-build-artifacts - name: Unzip Safari artifact @@ -1236,26 +1179,19 @@ jobs: uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 - name: Login to Azure - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + with: + keyvault: "bitwarden-prod-kv" + secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 + uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -1274,6 +1210,7 @@ jobs: needs: - cloc - electron-verify + - browser-build - setup - linux - windows @@ -1287,6 +1224,7 @@ jobs: env: CLOC_STATUS: ${{ needs.cloc.result }} ELECTRON_VERIFY_STATUS: ${{ needs.electron-verify.result }} + BROWSER_BUILD_STATUS: ${{ needs.browser-build.result }} SETUP_STATUS: ${{ needs.setup.result }} LINUX_STATUS: ${{ needs.linux.result }} WINDOWS_STATUS: ${{ needs.windows.result }} @@ -1299,6 +1237,8 @@ jobs: exit 1 elif [ "$ELECTRON_VERIFY_STATUS" = "failure" ]; then exit 1 + elif [ "$BROWSER_BUILD_STATUS" = "failure" ]; then + exit 1 elif [ "$SETUP_STATUS" = "failure" ]; then exit 1 elif [ "$LINUX_STATUS" = "failure" ]; then @@ -1316,7 +1256,7 @@ jobs: fi - name: Login to Azure - Prod Subscription - uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 if: failure() with: creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} @@ -1324,17 +1264,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@471ae4aec27405f16c5b796e288f54262c406e5d + with: + keyvault: "bitwarden-prod-kv" + secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 675f5bbc55a..f7073ec3c62 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -119,11 +119,15 @@ jobs: working-directory: apps/web run: npm run ${{ matrix.npm_command }} + - name: Package artifact + working-directory: apps/web + run: zip -r web-${{ env._VERSION }}-${{ matrix.name }}.zip build + - name: Upload ${{ matrix.name }} artifact uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 with: name: web-${{ env._VERSION }}-${{ matrix.name }}.zip - path: apps/web/build + path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip if-no-files-found: error build-commercial-selfhost-image: @@ -153,7 +157,11 @@ jobs: uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: name: web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip - path: apps/web/build + path: apps/web + + - name: Extract artifact + working-directory: apps/web + run: unzip web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip - name: Build Docker image working-directory: apps/web @@ -268,7 +276,11 @@ jobs: uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - path: apps/web/build + path: apps/web + + - name: Extract artifact + working-directory: apps/web + run: unzip web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip - name: Build Docker image working-directory: apps/web @@ -337,17 +349,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "crowdin-api-token" - name: Upload Sources uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 @@ -370,8 +375,8 @@ jobs: - cloc - setup - build-artifacts - - build-containers - build-commercial-selfhost-image + - build-containers - crowdin-push steps: - name: Check if any job failed @@ -381,7 +386,7 @@ jobs: SETUP_STATUS: ${{ needs.setup.result }} ARTIFACT_STATUS: ${{ needs.build-artifacts.result }} BUILD_SELFHOST_STATUS: ${{ needs.build-commercial-selfhost-image.result }} - BUILD_QA_STATUS: ${{ needs.build-qa.result }} + BUILD_CONTAINERS_STATUS: ${{ needs.build-containers.result }} CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} run: | if [ "$CLOC_STATUS" = "failure" ]; then @@ -392,7 +397,7 @@ jobs: exit 1 elif [ "$BUILD_SELFHOST_STATUS" = "failure" ]; then exit 1 - elif [ "$BUILD_QA_STATUS" = "failure" ]; then + elif [ "$BUILD_CONTAINERS_STATUS" = "failure" ]; then exit 1 elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then exit 1 @@ -407,17 +412,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "devops-alerts-slack-webhook-url" - 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 9aca46ebd69..acb660177f7 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -32,17 +32,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" - name: Download translations uses: bitwarden/gh-actions/crowdin@05052c5c575ceb09ceea397fe241879e199ed44b @@ -56,11 +49,14 @@ jobs: upload_sources: false upload_translations: false download_translations: true - github_user_name: "github-actions" - github_user_email: "<>" + github_user_name: "bitwarden-devops-bot" + github_user_email: "106330231+bitwarden-devops-bot@users.noreply.github.com" commit_message: "Autosync the updated translations" localization_branch_name: crowdin-auto-sync-${{ matrix.app_name }} create_pull_request: true pull_request_title: "Autosync Crowdin Translations for ${{ matrix.app_name }}" pull_request_body: "Autosync the updated translations" working_directory: apps/${{ matrix.app_name }} + gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} + gpg_passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} + diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0e736752b8a..e3787735920 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -23,6 +23,19 @@ jobs: - name: Checkout repo uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + - name: Lint filenames (no capital characters) + run: | + find . -type f -name "*[[:upper:]]*" \ + ! -path "./node_modules/*" \ + ! -path "./coverage/*" \ + ! -path "*/dist/*" \ + ! -path "*/build/*" \ + ! -path "*/target/*" \ + ! -path "./.git/*" \ + ! -path "*/.DS_Store" \ + > tmp.txt + diff <(sort .github/whitelist-capital-letters.txt) <(sort tmp.txt) + - name: Set up Node uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0 with: diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index 7279d3b08b4..514dafa65f8 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -102,7 +102,7 @@ jobs: - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-browser.yml workflow_conclusion: success @@ -115,7 +115,7 @@ jobs: - name: Download latest master build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-browser.yml workflow_conclusion: success diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index c3ddbb98144..208cbb2d4a6 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -76,7 +76,7 @@ jobs: - name: Download all Release artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli @@ -85,7 +85,7 @@ jobs: - name: Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli @@ -148,17 +148,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "snapcraft-store-token" - name: Install Snap uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 @@ -167,7 +160,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli @@ -177,7 +170,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli @@ -209,17 +202,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "cli-choco-api-key" - name: Setup Chocolatey run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ @@ -232,7 +218,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli/dist @@ -242,7 +228,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli/dist @@ -275,21 +261,14 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "cli-npm-api-key" - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli/build @@ -299,7 +278,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-cli.yml path: apps/cli/build @@ -320,4 +299,3 @@ jobs: - name: Publish NPM if: ${{ github.event.inputs.release_type != 'Dry Run' }} run: npm publish --access public --regsitry=https://registry.npmjs.org/ --userconfig=./.npmrc - diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index 2d34ab257e9..7dbc110a04d 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -249,21 +249,14 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - env: - KEYVAULT: bitwarden-prod-kv - SECRETS: | - code-signing-vault-url, + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + 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 - 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 + code-signing-cert-name" - name: Install Node dependencies run: npm ci @@ -939,22 +932,19 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - env: - KEYVAULT: bitwarden-prod-kv - SECRETS: | - aws-electron-access-id, + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + 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 + aws-electron-bucket-name, + r2-electron-access-id, + r2-electron-access-key, + r2-electron-bucket-name, + cf-prod-account" - name: Download all artifacts - uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 # v3.0.0 + uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: path: apps/desktop/artifacts @@ -977,6 +967,20 @@ jobs: --recursive \ --quiet + - name: Publish artifacts to R2 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} + AWS_DEFAULT_REGION: 'us-east-1' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} + CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} + working-directory: apps/desktop/artifacts + run: | + aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + --recursive \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + - name: Update deployment status to Success if: ${{ success() }} uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86 @@ -1019,4 +1023,3 @@ jobs: env: BRANCH: ${{ needs.setup.outputs.branch-name }} run: git push origin --delete $BRANCH - diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 9a51a3b0bea..247b59ea43d 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -13,13 +13,18 @@ on: - Initial Release - Redeploy - Dry Run + rollout_percentage: + description: 'Staged Rollout Percentage' + required: true + default: '10' + type: string snap_publish: - description: 'Publish to snap store' + description: 'Publish to Snap store' required: true default: true type: boolean choco_publish: - description: 'Publish to chocolatey store' + description: 'Publish to Chocolatey store' required: true default: true type: boolean @@ -93,23 +98,20 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - env: - KEYVAULT: bitwarden-prod-kv - SECRETS: | - aws-electron-access-id, + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + 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 + aws-electron-bucket-name, + r2-electron-access-id, + r2-electron-access-key, + r2-electron-bucket-name, + cf-prod-account" - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success @@ -118,7 +120,7 @@ jobs: - name: Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success @@ -131,6 +133,15 @@ jobs: working-directory: apps/desktop/artifacts run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive + - name: Set staged rollout percentage + env: + RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }} + ROLLOUT_PCT: ${{ github.event.inputs.rollout_percentage }} + run: | + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}.yml + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-linux.yml + echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-mac.yml + - name: Publish artifacts to S3 if: ${{ github.event.inputs.release_type != 'Dry Run' }} env: @@ -145,8 +156,23 @@ jobs: --recursive \ --quiet - - name: Create release - uses: ncipollo/release-action@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09 # v2.8.5 + - name: Publish artifacts to R2 + if: ${{ github.event.inputs.release_type != 'Dry Run' }} + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} + AWS_DEFAULT_REGION: 'us-east-1' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} + CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} + working-directory: apps/desktop/artifacts + run: | + aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + --recursive \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + + - name: Create Release + uses: ncipollo/release-action@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09 if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }} env: PKG_VERSION: ${{ steps.version.outputs.version }} @@ -217,17 +243,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "snapcraft-store-token" - name: Install Snap uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 @@ -240,7 +259,7 @@ jobs: - name: Download Snap artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success @@ -250,7 +269,7 @@ jobs: - name: Download Snap artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success @@ -274,7 +293,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4 + uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f - name: Print Environment run: | @@ -288,17 +307,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - 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 + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "cli-choco-api-key" - name: Setup Chocolatey shell: pwsh @@ -313,7 +325,7 @@ jobs: - name: Download choco artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success @@ -323,7 +335,7 @@ jobs: - name: Download choco artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-desktop.yml workflow_conclusion: success diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml index f02286be2f7..2d46506b1ee 100644 --- a/.github/workflows/release-qa-web.yml +++ b/.github/workflows/release-qa-web.yml @@ -34,11 +34,14 @@ jobs: uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-web.yml - path: apps/web/build + path: apps/web workflow_conclusion: success branch: ${{ github.ref_name }} artifacts: web-*-cloud-QA.zip - + + - name: Unzip cloud asset + working-directory: apps/web + run: unzip web-*-cloud-QA.zip - name: Checkout Repo uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 23f99c8f9b3..2ba8ebbf882 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -154,7 +154,7 @@ jobs: - name: Download latest cloud asset if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-web.yml path: apps/web @@ -162,9 +162,9 @@ jobs: branch: ${{ github.ref_name }} artifacts: web-*-cloud-COMMERCIAL.zip - - name: Download latest cloud asset + - name: Download latest cloud asset (Dry Run) if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-web.yml path: apps/web @@ -172,7 +172,6 @@ jobs: branch: master artifacts: web-*-cloud-COMMERCIAL.zip - # This should result in a build directory in the current working directory - name: Unzip build asset working-directory: apps/web run: unzip web-*-cloud-COMMERCIAL.zip @@ -240,7 +239,7 @@ jobs: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-web.yml path: apps/web/artifacts @@ -251,7 +250,7 @@ jobs: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 + uses: bitwarden/gh-actions/download-artifacts@850faad0cf6c02a8c0dc46eddde2363fbd6c373a with: workflow: build-web.yml path: apps/web/artifacts diff --git a/.github/workflows/staged-rollout-desktop.yml b/.github/workflows/staged-rollout-desktop.yml new file mode 100644 index 00000000000..cf26212fc5a --- /dev/null +++ b/.github/workflows/staged-rollout-desktop.yml @@ -0,0 +1,120 @@ +--- +name: Staged Rollout Desktop + +on: + workflow_dispatch: + inputs: + rollout_percentage: + description: 'Staged Rollout Percentage' + required: true + default: '10' + type: string + +defaults: + run: + shell: bash + +jobs: + rollout: + name: Update Rollout Percentage + runs-on: ubuntu-22.04 + steps: + - name: Login to Azure + uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "aws-electron-access-id, + aws-electron-access-key, + aws-electron-bucket-name, + r2-electron-access-id, + r2-electron-access-key, + r2-electron-bucket-name, + cf-prod-account" + + - name: Download channel update info files from S3 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} + AWS_DEFAULT_REGION: 'us-west-2' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} + run: | + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest.yml . \ + --quiet + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-linux.yml . \ + --quiet + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-mac.yml . \ + --quiet + + - name: Download channel update info files from R2 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} + AWS_DEFAULT_REGION: 'us-east-1' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} + CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} + run: | + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest.yml . \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-linux.yml . \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + aws s3 cp $AWS_S3_BUCKET_NAME/desktop/latest-mac.yml . \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com + + - name: Check new rollout percentage + env: + NEW_PCT: ${{ github.event.inputs.rollout_percentage }} + run: | + CURRENT_PCT=$(sed -r -n "s/stagingPercentage:\s([0-9]+)/\1/p" latest.yml) + echo "Current percentage: ${CURRENT_PCT}" + echo "New percentage: ${NEW_PCT}" + echo + if [ "$NEW_PCT" -le "$CURRENT_PCT" ]; then + echo "New percentage (${NEW_PCT}) must be higher than current percentage (${CURRENT_PCT})!" + echo + echo "If you want to pull a staged release because it hasn’t gone well, you must increment the version \ + number higher than your broken release. Because some of your users will be on the broken 1.0.1, \ + releasing a new 1.0.1 would result in them staying on a broken version.” + exit 1 + fi + + - name: Set staged rollout percentage + env: + ROLLOUT_PCT: ${{ github.event.inputs.rollout_percentage }} + run: | + sed -i -r "/stagingPercentage/s/[0-9]+/${ROLLOUT_PCT}/" latest.yml + sed -i -r "/stagingPercentage/s/[0-9]+/${ROLLOUT_PCT}/" latest-linux.yml + sed -i -r "/stagingPercentage/s/[0-9]+/${ROLLOUT_PCT}/" latest-mac.yml + + - name: Publish channel update info files to S3 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }} + AWS_DEFAULT_REGION: 'us-west-2' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }} + run: | + aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + --include "latest*.yml" \ + --acl "public-read" \ + --quiet + + - name: Publish channel update info files to R2 + env: + AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }} + AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }} + AWS_DEFAULT_REGION: 'us-east-1' + AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.r2-electron-bucket-name }} + CF_ACCOUNT: ${{ steps.retrieve-secrets.outputs.cf-prod-account }} + run: | + aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \ + --include "latest*.yml" \ + --quiet \ + --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index 4c1b0f6e8f1..3e5b5fc3c2b 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -2,8 +2,9 @@ name: Version Auto Bump on: - release: - types: [published] + push: + tags: + - desktop-v** defaults: run: @@ -12,30 +13,34 @@ defaults: jobs: setup: name: "Setup" - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 outputs: version_number: ${{ steps.version.outputs.new-version }} - if: contains(github.event.release.tag, 'desktop') steps: - name: Checkout Branch uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - - name: Get version to bump + - name: Calculate bumped version id: version env: - RELEASE_TAG: ${{ github.event.release.tag }} + RELEASE_TAG: ${{ github.ref }} run: | + CURR_MAJOR=$(echo $RELEASE_TAG | sed -r 's/[a-z]*-v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\1/') + CURR_PATCH=$(echo $RELEASE_TAG | sed -r 's/[a-z]*-v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\2/') + echo "Current Major: $CURR_MAJOR" + echo "Current Patch: $CURR_PATCH" - CURR_MAJOR=$(echo $RELEASE_TAG | sed -r 's/desktop-v([0-9]{4}\.[0-9]\.)([0-9])/\1/') - CURR_VER=$(echo $RELEASE_TAG | sed -r 's/desktop-v([0-9]{4}\.[0-9]\.)([0-9])/\2/') - echo $CURR_VER - ((CURR_VER++)) - NEW_VER=$CURR_MAJOR$CURR_VER + NEW_PATCH=$((CURR_PATCH+1)) + + echo "New patch: $NEW_PATCH" + + NEW_VER=$CURR_MAJOR.$NEW_PATCH + echo "New Version: $NEW_VER" echo "::set-output name=new-version::$NEW_VER" trigger_version_bump: name: "Trigger desktop version bump workflow" - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 needs: - setup steps: @@ -46,13 +51,10 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - env: - KEYVAULT: bitwarden-prod-kv - SECRET: "github-pat-bitwarden-devops-bot-repo-scope" - run: | - VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $SECRET --query value --output tsv) - echo "::add-mask::$VALUE" - echo "::set-output name=$SECRET::$VALUE" + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "github-pat-bitwarden-devops-bot-repo-scope" - name: Call GitHub API to trigger workflow bump env: diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 1fc0fde1bb3..8a3101bd2e8 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -29,6 +29,26 @@ jobs: - name: Checkout Branch uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 + - name: Login to Azure - Prod Subscription + uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf + with: + creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af + with: + keyvault: "bitwarden-prod-kv" + secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" + + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@c8bb57c57e8df1be8c73ff3d59deab1dbc00e0d1 + with: + gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} + passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} + git_user_signingkey: true + git_commit_gpgsign: true + - name: Create Version Branch id: branch env: @@ -104,8 +124,8 @@ jobs: - name: Setup git run: | - git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --local user.name "github-actions[bot]" + git config --local user.email "106330231+bitwarden-devops-bot@users.noreply.github.com" + git config --local user.name "bitwarden-devops-bot" - name: Check if version changed id: version-changed diff --git a/.storybook/preview.js b/.storybook/preview.js index 8bc2510a082..754e8d2b884 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -12,6 +12,11 @@ export const parameters = { date: /Date$/, }, }, + options: { + storySort: { + order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], + }, + }, docs: { inlineStories: true }, }; diff --git a/apps/browser/config/config.js b/apps/browser/config/config.js index 81e2d619fee..d437f6361f6 100644 --- a/apps/browser/config/config.js +++ b/apps/browser/config/config.js @@ -1,7 +1,22 @@ function load(envName) { + const base = loadConfig("base"); + const env = loadConfig(envName); + const local = loadConfig("local"); + return { - ...loadConfig(envName), - ...loadConfig("local"), + ...base, + ...env, + ...local, + flags: { + ...base.flags, + ...env.flags, + ...local.flags, + }, + devFlags: { + ...base.devFlags, + ...env.devFlags, + ...local.devFlags, + }, }; } diff --git a/apps/browser/package.json b/apps/browser/package.json index 57414631013..83bce4648ad 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2022.9.1", + "version": "2022.10.1", "scripts": { "build": "webpack", "build:mv3": "cross-env MANIFEST_VERSION=3 webpack", @@ -9,8 +9,8 @@ "build:prod": "cross-env NODE_ENV=production webpack", "build:prod:watch": "cross-env NODE_ENV=production webpack --watch", "dist": "npm run build:prod && gulp dist", + "dist:mv3": "cross-env MANIFEST_VERSION=3 npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist", "dist:chrome": "npm run build:prod && gulp dist:chrome", - "dist:chrome:mv3": "cross-env MANIFEST_VERSION=3 npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist:chrome", "dist:firefox": "npm run build:prod && gulp dist:firefox", "dist:opera": "npm run build:prod && gulp dist:opera", "dist:safari": "npm run build:prod && gulp dist:safari", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index a6fb87d2305..1cddbf6f7ce 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -482,7 +482,7 @@ "message": "الاسم مطلوب." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { "message": "تغيير كلمة المرور الرئيسية" @@ -494,7 +494,7 @@ "message": "تسجيل الدخول بخطوتين يجعل حسابك أكثر أمنا من خلال مطالبتك بالتحقق من تسجيل الدخول باستخدام جهاز آخر مثل مفتاح الأمان، تطبيق المصادقة، الرسائل القصيرة، المكالمة الهاتفية، أو البريد الإلكتروني. يمكن تمكين تسجيل الدخول بخطوتين على خزنة الويب bitwarden.com. هل تريد زيارة الموقع الآن؟" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "هل أنت متأكد من حذف هذا المجلّد؟" @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "مشاركة" @@ -711,7 +711,7 @@ "message": "رمز التحقق (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1136,19 +1136,19 @@ "message": "الاسم الكامل" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1409,7 +1413,7 @@ "message": "هل أنت متأكد من أنك تريد حذف هذا العنصر بشكل دائم؟" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { "message": "استعادة العنصر" @@ -1418,25 +1422,25 @@ "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "حذف" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,7 +1669,7 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "كلمة المرور الجديدة" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1810,7 +1814,7 @@ "message": "يجب عليك تأكيد بريدك الإلكتروني لاستخدام هذه الميزة. يمكنك تأكيد بريدك الإلكتروني في خزنة الويب." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { "message": "تحديث كلمة المرور الرئيسية" @@ -1919,7 +1923,7 @@ "message": "نوع اسم المستخدم" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -1966,7 +1970,7 @@ "message": "مفتاح الـ API" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "الاشتراك المميز مطلوب" @@ -2005,7 +2009,7 @@ "message": "استضافة ذاتية" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index ad0bd40da11..2f352242566 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -1311,6 +1311,10 @@ "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Yaradıldı", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 5805387d8ae..4188db0ba8f 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -196,7 +196,7 @@ "message": "Даведка і зваротная сувязь" }, "sync": { - "message": "Сінхранізацыя" + "message": "Сінхранізавана" }, "syncVaultNow": { "message": "Сінхранізаваць сховішча зараз" @@ -1311,6 +1311,10 @@ "message": "Абноўлена", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Створана", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль абноўлены", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index f9507f48823..2f80a57b456 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -83,7 +83,7 @@ "message": "Копиране на потребителското име" }, "copyNumber": { - "message": "Копиране на но̀мера" + "message": "Копиране на номера" }, "copySecurityCode": { "message": "Копиране на кода да сигурност" @@ -1311,6 +1311,10 @@ "message": "Обновено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Създадено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Обновена парола", "description": "ex. Date this password was updated" @@ -1919,14 +1923,14 @@ "message": "Тип потребителско име" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Използвайте възможностите за под-адресиране на е-поща на своя доставчик." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1950,7 +1954,7 @@ "message": "Услуга" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -2005,7 +2009,7 @@ "message": "Собствен хостинг" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 0047cc61411..d811b79b113 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -59,7 +59,7 @@ "message": "আমার ভল্ট" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "সরঞ্জামসমূহ" @@ -95,7 +95,7 @@ "message": "পাসওয়ার্ড তৈরি করুন (অনুলিপিকৃত)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "কোনও মিলত লগইন নেই।" @@ -131,10 +131,10 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { "message": "যাচাইকরণ কোড" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "শব্দের সংখ্যা" @@ -339,7 +339,7 @@ "message": "আপনার ওয়েব ব্রাউজার সহজে ক্লিপবোর্ড অনুলিপি সমর্থন করে না। পরিবর্তে এটি নিজেই অনুলিপি করুন।" }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার মূল পাসওয়ার্ডটি যাচাই করান।" @@ -552,7 +552,7 @@ "message": "আপনি কি নিশ্চিত যে আপনি বর্তমান পাসওয়ার্ডটি ওভাররাইট করতে চান?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "ভাগ করুন" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "ই-মেইল" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -1133,7 +1133,7 @@ "message": "নামের শেষাংশ" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "পরিচয়ের নাম" @@ -1311,6 +1311,10 @@ "message": "হালনাগাদকৃত", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "পাসওয়ার্ড হালনাগাদকৃত", "description": "ex. Date this password was updated" @@ -1628,7 +1632,7 @@ "message": "পাসওয়ার্ড অপসারিত হয়েছে" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1816,10 +1820,10 @@ "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,7 +1878,7 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { "message": "প্রধান পাসওয়ার্ডটি অপসারণ করুন" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 0a73ff28d96..ffd3a3eee8f 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -20,7 +20,7 @@ "message": "Prijavite se" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "Otkaži" @@ -35,7 +35,7 @@ "message": "E-Mail adresa" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -44,10 +44,10 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -56,10 +56,10 @@ "message": "Vault" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Tools" @@ -68,37 +68,37 @@ "message": "Settings" }, "currentTab": { - "message": "Current Tab" + "message": "Current tab" }, "copyPassword": { - "message": "Copy Password" + "message": "Copy password" }, "copyNote": { - "message": "Copy Note" + "message": "Copy note" }, "copyUri": { "message": "Copy URI" }, "copyUsername": { - "message": "Copy Username" + "message": "Copy username" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "Copy security code" }, "autoFill": { "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Unlock your vault" @@ -110,13 +110,13 @@ "message": "There are no logins available to auto-fill for the current browser tab." }, "addLogin": { - "message": "Add a Login" + "message": "Add a login" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -131,13 +131,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -175,16 +175,16 @@ "message": "Move" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "name": { "message": "Name" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "folders": { "message": "Folders" @@ -199,13 +199,13 @@ "message": "Sync" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "Select" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "Options" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "Username" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "Folder" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "Website" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "Manage" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "Name is required." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index fe994510046..82c78e830b7 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -56,7 +56,7 @@ "message": "Caixa forta" }, "myVault": { - "message": "La meua caixa forta" + "message": "Caixa forta" }, "allVaults": { "message": "Totes les caixes fortes" @@ -494,7 +494,7 @@ "message": "L'inici de sessió en dues passes fa que el vostre compte siga més segur, ja que obliga a verificar el vostre inici de sessió amb un altre dispositiu, com ara una clau de seguretat, una aplicació autenticadora, un SMS, una trucada telefònica o un correu electrònic. Es pot habilitar l'inici de sessió en dues passes a la caixa forta web de bitwarden.com. Voleu visitar el lloc web ara?" }, "editedFolder": { - "message": "Carpeta editada" + "message": "Carpeta guardada" }, "deleteFolderConfirmation": { "message": "Esteu segur que voleu suprimir aquesta carpeta?" @@ -1311,6 +1311,10 @@ "message": "Actualitzat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creat", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contrasenya actualitzada", "description": "ex. Date this password was updated" @@ -1874,7 +1878,7 @@ } }, "leaveOrganization": { - "message": "Abandona organització" + "message": "Abandona l'organització" }, "removeMasterPassword": { "message": "Suprimiu la contrasenya mestra" @@ -1926,7 +1930,7 @@ "message": "Utilitzeu les capacitats de subadreçament del vostre proveïdor de correu electrònic." }, "catchallEmail": { - "message": "Captura tot correu electrònic" + "message": "Captura tot el correu electrònic" }, "catchallEmailDesc": { "message": "Utilitzeu la safata d'entrada global configurada del vostre domini." diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index c47f6f63b2a..e3427996601 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -149,7 +149,7 @@ "message": "Změnit hlavní heslo" }, "fingerprintPhrase": { - "message": "Fráze otisku prstu", + "message": "Unikátní přístupová fráze", "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": { @@ -184,7 +184,7 @@ "message": "Upravit složku" }, "deleteFolder": { - "message": "Smazat složku" + "message": "Odstranit složku" }, "folders": { "message": "Složky" @@ -482,7 +482,7 @@ "message": "Název je povinný." }, "addedFolder": { - "message": "Složka byla přidána" + "message": "Složka byla úspěšně přidána" }, "changeMasterPass": { "message": "Změnit hlavní heslo" @@ -500,7 +500,7 @@ "message": "Opravdu chcete tuto složku smazat?" }, "deletedFolder": { - "message": "Složka byla smazána" + "message": "Smazaná složka" }, "gettingStartedTutorial": { "message": "Průvodce pro začátečníky" @@ -534,7 +534,7 @@ "message": "Nová URI" }, "addedItem": { - "message": "Položka byla přidána" + "message": "Přidaná položka" }, "editedItem": { "message": "Položka byla upravena" @@ -1148,7 +1148,7 @@ "message": "Číslo cestovního pasu" }, "licenseNumber": { - "message": "Číslo dokladu totožnosti" + "message": "Licenční číslo" }, "email": { "message": "E-mail" @@ -1311,6 +1311,10 @@ "message": "Změněno", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bylo změněno", "description": "ex. Date this password was updated" @@ -1895,10 +1899,10 @@ "message": "Vypršel časový limit relace. Vraťte se prosím zpět a zkuste se znovu přihlásit." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1919,7 +1923,7 @@ "message": "Typ uživatelského jména" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -1950,7 +1954,7 @@ "message": "Služba" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Vygenerovat e-mailový alias pomocí externí služby pro přesměrování." @@ -1966,16 +1970,16 @@ "message": "API klíč" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Vyžadováno prémiové předplatné" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Verze serveru" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 3a4879980f2..6d282a04674 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -20,7 +20,7 @@ "message": "Log ind" }, "enterpriseSingleSignOn": { - "message": "Virksomheds Single Sign On" + "message": "Virksomheds Single-Sign-On" }, "cancel": { "message": "Annullér" @@ -44,7 +44,7 @@ "message": "Et tip til hovedadgangskoden kan hjælpe dig med at huske din adgangskode, hvis du glemmer den." }, "reTypeMasterPass": { - "message": "Bekræft hovedadgangskode" + "message": "Indtast hovedadgangskode igen" }, "masterPassHint": { "message": "Hovedadgangskodetip (valgfrit)" @@ -98,7 +98,7 @@ "message": "Kopiér brugerdefineret feltnavn" }, "noMatchingLogins": { - "message": "Ingen matchende logins." + "message": "Ingen matchende logins" }, "unlockVaultMenu": { "message": "Lås din boks op" @@ -245,7 +245,7 @@ "message": "Tal (0-9)" }, "specialCharacters": { - "message": "Specielle tegn (!@#$%^&*)" + "message": "Specialtegn (!@#$%^&*)" }, "numWords": { "message": "Antal ord" @@ -482,7 +482,7 @@ "message": "Navn er påkrævet." }, "addedFolder": { - "message": "Tilføjede mappe" + "message": "Mappe tilføjet" }, "changeMasterPass": { "message": "Skift hovedadgangskode" @@ -491,16 +491,16 @@ "message": "Du kan ændre din hovedadgangskode i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, "twoStepLoginConfirmation": { - "message": "To-trins login gør din konto mere sikker ved at kræve, at du verificerer dit login med en anden enhed, med en sikkerhedsnøgle, autentificerings app, SMS, telefonopkald eller e-mail. To-trins login kan aktiveres i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" + "message": "To-trins login gør din konto mere sikker ved at kræve, at du verificerer dit login med en anden enhed, såsom en sikkerhedsnøgle, autentificeringsapp, SMS, telefonopkald eller e-mail. To-trins login kan aktiveres i bitwarden.com web-boksen. Vil du besøge hjemmesiden nu?" }, "editedFolder": { - "message": "Redigerede mappe" + "message": "Mappe gemt" }, "deleteFolderConfirmation": { "message": "Er du sikker på du vil slette denne mappe?" }, "deletedFolder": { - "message": "Slettede mappe" + "message": "Mappe slettet" }, "gettingStartedTutorial": { "message": "Sådan kommer du i gang" @@ -534,10 +534,10 @@ "message": "Ny URI" }, "addedItem": { - "message": "Tilføjede element" + "message": "Element tilføjet" }, "editedItem": { - "message": "Redigerede element" + "message": "Element gemt" }, "deleteItemConfirmation": { "message": "Er du sikker på, at du sende til papirkurven?" @@ -723,7 +723,7 @@ "message": "Er du sikker på du vil slette denne vedhæftning?" }, "deletedAttachment": { - "message": "Slettet vedhæftning" + "message": "Vedhæftning slettet" }, "newAttachment": { "message": "Tilføj ny vedhæftning" @@ -732,13 +732,13 @@ "message": "Ingen vedhæftninger." }, "attachmentSaved": { - "message": "Vedhæftningen er blevet gemt." + "message": "Vedhæftning gemt" }, "file": { "message": "Fil" }, "selectFile": { - "message": "Vælg en fil." + "message": "Vælg en fil" }, "maxFileSize": { "message": "Maksimum filstørrelse er 500 MB." @@ -783,7 +783,7 @@ "message": "Prioriteret kundeservice." }, "ppremiumSignUpFuture": { - "message": "Alle fremtidige premium-funktioner. Mere kommer snart!" + "message": "Alle fremtidige premium-funktioner. Flere kommer snart!" }, "premiumPurchase": { "message": "Køb premium" @@ -879,7 +879,7 @@ "message": "Du skal bruge en understøttet webbrowser (såsom Chrome) og/eller tilføje ekstra udbydere, der understøttes bedre på tværs af webbrowsere (f.eks. en autentificering app)." }, "twoStepOptions": { - "message": "To-trins login muligheder" + "message": "To-trins-login indstillinger" }, "recoveryCodeDesc": { "message": "Mistet adgang til alle dine to-faktor-udbydere? Brug din genoprettelseskode til at deaktivere alle to-faktor udbydere på din konto." @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Brug en hvilken som helst WebAuthn-aktiveret sikkerhedsnøgle til at få adgang til din konto." + "message": "Brug en hvilken som helst WebAuthn-kompatibel sikkerhedsnøgle til at få adgang til din konto." }, "emailTitle": { "message": "E-mail" @@ -1049,7 +1049,7 @@ "message": "Vis hvor mange logins du har til den aktuelle webside." }, "cardholderName": { - "message": "Kortindehaverens navn" + "message": "Kortholders navn" }, "number": { "message": "Nummer" @@ -1148,7 +1148,7 @@ "message": "Pasnummer" }, "licenseNumber": { - "message": "Kørekortnummer" + "message": "Licensnummer" }, "email": { "message": "E-mail" @@ -1311,6 +1311,10 @@ "message": "Opdateret", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Oprettet", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Adgangskode opdateret", "description": "ex. Date this password was updated" @@ -1505,10 +1509,10 @@ "message": "Bekræft venligst at skrivebordsprogrammet viser dette fingeraftryk: " }, "desktopIntegrationDisabledTitle": { - "message": "Browserintegration er ikke aktiveret" + "message": "Browserintegration er ikke konfigureret" }, "desktopIntegrationDisabledDesc": { - "message": "Browserintegration er ikke aktiveret i Bitwarden skrivebordsapplikationen. Aktivér det i indstillingerne i skrivebordsprogrammet." + "message": "Browserintegration er ikke konfigureret i Bitwarden skrivebordsapplikationen. Aktivér det i indstillingerne i skrivebordsapplikationen." }, "startDesktopTitle": { "message": "Start Bitwarden skrivebordsapplikationen" @@ -1538,7 +1542,7 @@ "message": "Biometri ikke aktiveret" }, "biometricsNotEnabledDesc": { - "message": "Browserbiometri kræver, at desktop-biometri er aktiveret i indstillingerne først." + "message": "Browserbiometri kræver, at skrivebords-biometri er aktiveret i indstillingerne først." }, "biometricsNotSupportedTitle": { "message": "Biometri ikke understøttet" @@ -1559,7 +1563,7 @@ "message": "Denne handling kan ikke udføres i sidebjælken, prøv handlingen igen i popup tilstand eller i et nyt vindue." }, "personalOwnershipSubmitError": { - "message": "På grund af en virksomhedspolitik er du begrænset til at gemme elementer i din personlige boks. Skift ejerskabsindstillingen til en organisation, og vælg blandt de tilgængelige samlinger." + "message": "På grund af en virksomhedspolitik er du begrænset fra at gemme elementer i din personlige boks. Skift ejerskabsindstillingen til en organisation, og vælg blandt de tilgængelige samlinger." }, "personalOwnershipPolicyInEffect": { "message": "En organisationspolitik påvirker dine ejerskabsmuligheder." @@ -1727,14 +1731,14 @@ "message": "Aktuelt antal tilgange" }, "createSend": { - "message": "Opret ny Send", + "message": "Ny Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Ny adgangskode" }, "sendDisabled": { - "message": "Send deaktiveret", + "message": "Send fjernet", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1746,7 +1750,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send opdateret", + "message": "Send gemt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1816,10 +1820,10 @@ "message": "Opdatér hovedadgangskode" }, "updateMasterPasswordWarning": { - "message": "Dit hovedadgangskode blev for nylig ændret af en administrator i din organisation. For at få adgang til boksen skal du opdatere din hovedadgangskode nu. Hvis du fortsætter, logges du ud af din nuværende session, hvilket kræver, at du logger ind igen. Aktive sessioner på andre enheder kan fortsætte med at være aktive i op til én time." + "message": "Dit hovedadgangskode blev for nylig ændret af en administrator i din organisation. For at få adgang til boksen skal du opdatere den nu. Hvis du fortsætter, logges du ud af din nuværende session, hvilket kræver, at du logger ind igen. Aktive sessioner på andre enheder kan fortsætte med at være aktive i op til én time." }, "resetPasswordPolicyAutoEnroll": { - "message": "Auto-indrullering" + "message": "Automatisk tilmelding" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Denne organisation har en virksomhedspolitik, der automatisk tilmelder dig til nulstilling af adgangskode. Tilmelding giver organisationsadministratorer mulighed for at skifte din hovedadgangskode." @@ -1853,7 +1857,7 @@ "message": "Din boks-timeout overskrider de begrænsninger, der er fastsat af din organisation." }, "vaultExportDisabled": { - "message": "Bokseksport deaktiveret" + "message": "Boks-eksport ikke tilgængelig" }, "personalVaultExportPolicyInEffect": { "message": "En eller flere organisationspolitikker forhindrer dig i at eksportere din personlige boks." @@ -1880,7 +1884,7 @@ "message": "Fjern hovedadgangskode" }, "removedMasterPassword": { - "message": "Hovedadgangskode fjernet." + "message": "Hovedadgangskode fjernet" }, "leaveOrganizationConfirmation": { "message": "Er du sikker på, at du vil forlade denne organisation?" @@ -1898,7 +1902,7 @@ "message": "Eksporterer personlig boks" }, "exportingPersonalVaultDescription": { - "message": "Kun de personlige bokselementer tilknyttet $EMAIL$ eksporteres. Organisationsbokseelementer medtages ikke.", + "message": "Kun de personlige bokselementer tilknyttet $EMAIL$ vil blive eksporteret. Organisationsbokseelementer vil ikke være inkluderet.", "placeholders": { "email": { "content": "$1", @@ -1919,7 +1923,7 @@ "message": "Brugernavnstype" }, "plusAddressedEmail": { - "message": "Plus adresseret e-mail", + "message": "Plus-adresseret e-mail", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -1950,7 +1954,7 @@ "message": "Tjeneste" }, "forwardedEmail": { - "message": "Videresendt E-mail Alias" + "message": "Videresendt e-mail alias" }, "forwardedEmailDesc": { "message": "Generér et e-mail alias med en ekstern viderestillingstjeneste." @@ -1972,10 +1976,10 @@ "message": "Premium-abonnement kræves" }, "organizationIsDisabled": { - "message": "Organisationen er deaktiveret." + "message": "Organisation suspenderet." }, "disabledOrganizationFilterError": { - "message": "Elementer i deaktiverede organisationer kan ikke tilgås. Kontakt din organisationsejer for at få hjælp." + "message": "Elementer i suspenderede organisationer kan ikke tilgås. Kontakt din organisationsejer for at få hjælp." }, "cardBrandMir": { "message": "Mir" @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "sidst set den $DATE$", + "message": "sidst set: $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 0c00c4d6658..ba5b31a54df 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -32,7 +32,7 @@ "message": "Absenden" }, "emailAddress": { - "message": "E-Mail Adresse" + "message": "E-Mail-Adresse" }, "masterPass": { "message": "Master-Passwort" @@ -44,7 +44,7 @@ "message": "Ein Master-Passwort-Hinweis kann dir helfen, dich an das Passwort zu erinnern, sofern du es vergessen hast." }, "reTypeMasterPass": { - "message": "Master-Passwort wiederholen" + "message": "Master-Passwort erneut eingeben" }, "masterPassHint": { "message": "Master-Passwort-Hinweis (optional)" @@ -80,7 +80,7 @@ "message": "URI kopieren" }, "copyUsername": { - "message": "Nutzernamen Kopieren" + "message": "Nutzernamen kopieren" }, "copyNumber": { "message": "Nummer kopieren" @@ -131,7 +131,7 @@ "message": "Einen Bestätigungscode an deine E-Mail senden" }, "sendCode": { - "message": "Code senden" + "message": "Send Code" }, "codeSent": { "message": "Code gesendet" @@ -199,13 +199,13 @@ "message": "Synchronisierung" }, "syncVaultNow": { - "message": "Tresor jetzt synchronisieren" + "message": "Datenspeicher jetzt synchronisieren" }, "lastSync": { - "message": "Letzte Synchronisation:" + "message": "Zuletzt synchronisiert:" }, "passGen": { - "message": "Passwort-Generator" + "message": "Passwortgenerator" }, "generator": { "message": "Generator", @@ -227,7 +227,7 @@ "message": "Passwort generieren" }, "regeneratePassword": { - "message": "Password neu generieren" + "message": "Passwort neu generieren" }, "options": { "message": "Optionen" @@ -258,10 +258,10 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Zahl hinzufügen" + "message": "Ziffer hinzufügen" }, "minNumbers": { - "message": "Mindestanzahl Zahlen" + "message": "Mindestanzahl Ziffern" }, "minSpecial": { "message": "Mindestanzahl Sonderzeichen" @@ -282,7 +282,7 @@ "message": "Keine Einträge zum Anzeigen vorhanden." }, "itemInformation": { - "message": "Eintrags-Information" + "message": "Anmeldedaten Information" }, "username": { "message": "Nutzername" @@ -491,7 +491,7 @@ "message": "Du kannst dein Master-Passwort im Bitwarden.com Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?" }, "twoStepLoginConfirmation": { - "message": "Mit der Zwei-Faktor Authentifizierung wird dein Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor Authentifizierung kann im Bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Seite jetzt öffnen?" + "message": "Mit der Zwei-Faktor-Authentifizierung wird Ihr Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, eine SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchten Sie die Seite jetzt öffnen?" }, "editedFolder": { "message": "Ordner bearbeitet" @@ -705,13 +705,13 @@ "message": "Erfahre mehr" }, "authenticatorKeyTotp": { - "message": "Authenticator Schlüssel (TOTP)" + "message": "Authentifizierungsschlüssel (TOTP)" }, "verificationCodeTotp": { "message": "Verifizierungscode (TOTP)" }, "copyVerificationCode": { - "message": "Kopiere Verifizierungscode" + "message": "Verifizierungscode kopieren" }, "attachments": { "message": "Anhänge" @@ -762,7 +762,7 @@ "message": "Mitgliedschaft erneuern" }, "premiumNotCurrentMember": { - "message": "Du hast derzeit keine Premium-Mitgliedschaft." + "message": "Sie haben derzeit keine Premium-Mitgliedschaft." }, "premiumSignUpAndGet": { "message": "Werde Premium-Mitglied und erhalte dafür:" @@ -792,7 +792,7 @@ "message": "Du kannst deine Premium-Mitgliedschaft im Bitwarden.com Web-Tresor kaufen. Möchtest du die Webseite jetzt besuchen?" }, "premiumCurrentMember": { - "message": "Du bist jetzt Premium-Mitglied!" + "message": "Sie sind jetzt Premium-Mitglied!" }, "premiumCurrentMemberThanks": { "message": "Vielen Dank, dass du Bitwarden unterstützt." @@ -819,7 +819,7 @@ "message": "Beim Start nach biometrischen Daten fragen" }, "premiumRequired": { - "message": "Premium-Mitgliedschaft wird benötigt" + "message": "Erweiterte Mitgliedschaft wird benötigt" }, "premiumRequiredDesc": { "message": "Eine Premium-Mitgliedschaft ist für diese Funktion notwendig." @@ -882,7 +882,7 @@ "message": "Optionen für Zwei-Faktor Authentifizierung" }, "recoveryCodeDesc": { - "message": "Zugang zu allen Zwei-Faktor Anbietern verloren? Benutze deinen Wiederherstellungscode, um alle Zwei-Faktor Anbieter in deinem Konto zu deaktivieren." + "message": "Zugang zu allen Zwei-Faktor-Anbietern verloren? Benutzen Sie Ihren Wiederherstellungscode, um alle Zwei-Faktor-Anbieter in Ihrem Konto zu deaktivieren." }, "recoveryCodeTitle": { "message": "Wiederherstellungscode" @@ -1311,6 +1311,10 @@ "message": "Aktualisiert", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Erstellt", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passwort aktualisiert", "description": "ex. Date this password was updated" @@ -1430,7 +1434,7 @@ "message": "Automatisch ausfüllen und speichern" }, "autoFillSuccessAndSavedUri": { - "message": "Automatisch ausgefüllter Eintrag und gespeicherte URI" + "message": "Auto-Ausgefüllter Eintrag und gespeicherte URI" }, "autoFillSuccess": { "message": "Automatisch ausgefüllter Eintrag" @@ -1508,7 +1512,7 @@ "message": "Browser-Einbindung ist nicht aktiviert" }, "desktopIntegrationDisabledDesc": { - "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktiviere diese in den Einstellungen innerhalb der Desktop-Anwendung." + "message": "Die Browser-Einbindung ist in der Bitwarden Desktop-Anwendung nicht aktiviert. Bitte aktivieren Sie diese in den Einstellungen innerhalb der Desktop-Anwendung." }, "startDesktopTitle": { "message": "Bitwarden Desktop-Anwendung starten" @@ -1898,7 +1902,7 @@ "message": "Persönlichen Tresor exportieren" }, "exportingPersonalVaultDescription": { - "message": "Nur die persönlichen Tresoreinträge die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", + "message": "Nur die persönlichen Tresoreinträge, die mit $EMAIL$ verbunden sind, werden exportiert. Tresoreinträge der Organisation werden nicht berücksichtigt.", "placeholders": { "email": { "content": "$1", diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 98b40e03ac7..43a12676a09 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -32,7 +32,7 @@ "message": "Υποβολή" }, "emailAddress": { - "message": "Διεύθυνση Email" + "message": "Διεύθυνση email" }, "masterPass": { "message": "Κύριος κωδικός" @@ -1311,6 +1311,10 @@ "message": "Ενημερώθηκε", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Ο Κωδικός Ενημερώθηκε", "description": "ex. Date this password was updated" @@ -2002,10 +2006,10 @@ "message": "Έκδοση διακομιστή" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 3749bb4ae00..7a320e409e4 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -14,13 +14,13 @@ "message": "Log in or create a new account to access your secure vault." }, "createAccount": { - "message": "Create Account" + "message": "Create account" }, "login": { - "message": "Log In" + "message": "Log in" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "Cancel" @@ -32,10 +32,10 @@ "message": "Submit" }, "emailAddress": { - "message": "Email Address" + "message": "Email address" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -44,10 +44,10 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -56,10 +56,10 @@ "message": "Vault" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Tools" @@ -68,37 +68,37 @@ "message": "Settings" }, "currentTab": { - "message": "Current Tab" + "message": "Current tab" }, "copyPassword": { - "message": "Copy Password" + "message": "Copy password" }, "copyNote": { - "message": "Copy Note" + "message": "Copy note" }, "copyUri": { "message": "Copy URI" }, "copyUsername": { - "message": "Copy Username" + "message": "Copy username" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "Copy security code" }, "autoFill": { "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Unlock your vault" @@ -110,13 +110,13 @@ "message": "There are no logins available to auto-fill for the current browser tab." }, "addLogin": { - "message": "Add a Login" + "message": "Add a login" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -131,13 +131,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -175,16 +175,16 @@ "message": "Move" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "name": { "message": "Name" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "folders": { "message": "Folders" @@ -199,13 +199,13 @@ "message": "Sync" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "Select" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "Options" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "Username" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "Folder" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "Website" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "Manage" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "Name is required." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message" : "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message" : "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index e94a67345ff..379f6e0da2d 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -92,7 +92,7 @@ "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate password (copied)" + "message": "Generate Password (and Copy)" }, "copyElementIdentifier": { "message": "Copy Custom Field Name" @@ -543,7 +543,7 @@ "message": "Do you really want to send to the bin?" }, "deletedItem": { - "message": "Sent item to bin" + "message": "Deleted item" }, "overwritePassword": { "message": "Overwrite password" @@ -1311,6 +1311,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index a9bc526f019..10f2ccf37c5 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -1311,6 +1311,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index b85c00492f2..ff5ce837e13 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -822,7 +822,7 @@ "message": "Premium requerido" }, "premiumRequiredDesc": { - "message": "Una membresía Premium es requerida para utilizar esta característica." + "message": "Una membrasía Premium es requerida para utilizar esta característica." }, "enterVerificationCodeApp": { "message": "Introduce el código de verificación de 6 dígitos de tu aplicación autenticadora." @@ -1311,6 +1311,10 @@ "message": "Actualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contraseña actualizada", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index a398a08342a..3fdff052c75 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -1311,6 +1311,10 @@ "message": "Uuendatud", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Loodud", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parool on uuendatud", "description": "ex. Date this password was updated" @@ -1999,13 +2003,13 @@ "message": "et taastada eelseadistatud seaded" }, "serverVersion": { - "message": "Server Version" + "message": "Serveri versioon" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Enda majutatud" }, "thirdParty": { - "message": "Third-Party" + "message": "Kolmanda osapoole" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "viimati nähtud: $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 9af529421b1..283cc957ecd 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -1311,6 +1311,10 @@ "message": "Eguneratua", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Pasahitza eguneratu da", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 29cd75ad3f3..67018e81e5d 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -1311,6 +1311,10 @@ "message": "بروزرسانی شد", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "کلمه عبور بروزرسانی شد", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 9235a490046..fa51e48652d 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -140,7 +140,7 @@ "message": "Todennuskoodi" }, "confirmIdentity": { - "message": "Vahvista henkilöllisyytesi jatkaaksesi." + "message": "Jatka vahvistamalla henkilöllisyytesi." }, "account": { "message": "Käyttäjätili" @@ -342,7 +342,7 @@ "message": "Vahvista henkilöllisyys" }, "yourVaultIsLocked": { - "message": "Holvisi on lukittu. Vahvista henkilöllisyytesi jatkaaksesi." + "message": "Holvisi on lukittu. Jatka vahvistamalla henkilöllisyytesi." }, "unlock": { "message": "Avaa" @@ -494,13 +494,13 @@ "message": "Kaksivaiheinen kirjautuminen tekee tilistäsi turvallisemman edellyttämällä salasanan lisäksi kirjautumisen lisätodennusta todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko käydä sivustolla nyt?" }, "editedFolder": { - "message": "Kansiota muokattu" + "message": "Kansio tallennettiin" }, "deleteFolderConfirmation": { "message": "Haluatko varmasti poistaa kansion?" }, "deletedFolder": { - "message": "Kansio poistettu" + "message": "Kansio poistettiin" }, "gettingStartedTutorial": { "message": "Aloitusopas" @@ -534,10 +534,10 @@ "message": "Uusi URI" }, "addedItem": { - "message": "Kohde lisätty" + "message": "Kohde lisättiin" }, "editedItem": { - "message": "Kohdetta muokattu" + "message": "Kohde tallennettiin" }, "deleteItemConfirmation": { "message": "Haluatko varmasti siirtää roskakoriin?" @@ -677,7 +677,7 @@ "message": "Lisätietoja organisaatioista" }, "learnOrgConfirmation": { - "message": "Bitwardenin avulla voit jakaa holvisi sisältöä muiden kanssa organisaatiotiliä käyttäen. Haluatko lukea bitwarden.com-sivustolta lisää?" + "message": "Bitwarden mahdollistaa holvin sisällön jaon organisaatiotilin avulla. Haluatko lukea lisää bitwarden.com-sivustolta?" }, "moveToOrganization": { "message": "Siirrä organisaatiolle" @@ -723,7 +723,7 @@ "message": "Haluatko varmasti poistaa liitteen?" }, "deletedAttachment": { - "message": "Poistettu tiedostoliite" + "message": "Tiedostoliite poistettiin" }, "newAttachment": { "message": "Lisää uusi tiedostoliite" @@ -732,7 +732,7 @@ "message": "Ei liitteitä." }, "attachmentSaved": { - "message": "Tiedostoliite tallennettiin." + "message": "Tiedostoliite tallennettiin" }, "file": { "message": "Tiedosto" @@ -744,7 +744,7 @@ "message": "Tiedoston enimmäiskoko on 500 Mt." }, "featureUnavailable": { - "message": "Toiminto ei ole käytettävissä" + "message": "Ominaisuus ei ole käytettävissä" }, "updateKey": { "message": "Et voi käyttää tätä toimintoa ennen kuin päivität salausavaimesi." @@ -789,7 +789,7 @@ "message": "Osta Premium" }, "premiumPurchaseAlert": { - "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvissa. Haluatko käydä sivustolla nyt?" + "message": "Voit ostaa Premium-jäsenyyden bitwarden.com-verkkoholvista. Haluatko avata sivuston nyt?" }, "premiumCurrentMember": { "message": "Olet Premium-jäsen!" @@ -807,7 +807,7 @@ } }, "refreshComplete": { - "message": "Päivitys on valmis" + "message": "Päivitys valmistui" }, "enableAutoTotpCopy": { "message": "Kopioi TOTP-koodi automaattisesti" @@ -822,7 +822,7 @@ "message": "Premium vaaditaan" }, "premiumRequiredDesc": { - "message": "Käyttääksesi tätä toimintoa tarvitset Premium-jäsenyyden." + "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, "enterVerificationCodeApp": { "message": "Syötä 6-numeroinen todennuskoodi todennussovelluksestasi." @@ -873,7 +873,7 @@ "message": "Kirjautuminen ei ole käytettävissä" }, "noTwoStepProviders": { - "message": "Tilillä on käytössä kaksivaiheinen kirjautuminen, mutta tämä selain ei tue käytettävissä olevia todentajia." + "message": "Tilille on määritetty kaksivaiheinen kirjautuminen, mutta selain ei tue käytettävissä olevia todentajia." }, "noTwoStepProviders2": { "message": "Käytä tuettua selainta (kuten Chrome) ja lisää/tai ota käyttöön laajemmin tuettu todentaja (kuten todennussovellus)." @@ -882,7 +882,7 @@ "message": "Kaksivaiheisen kirjautumisen asetukset" }, "recoveryCodeDesc": { - "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilisi todentajat käytöstä palautuskoodillasi." + "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." }, "recoveryCodeTitle": { "message": "Palautuskoodi" @@ -951,7 +951,7 @@ "message": "Kuvakepalvelimen URL" }, "environmentSaved": { - "message": "Palvelinten URL-osoitteet tallennettiin." + "message": "Palvelinympäristön URL-osoitteet tallennettiin" }, "enableAutoFillOnPageLoad": { "message": "Automaattinen täyttö sivun avautuessa" @@ -969,7 +969,7 @@ "message": "Voit ottaa automaattisen täytön käyttöön tai poistaa sen käytöstä kirjautumistietokohtaisesti muokkaamalla kohdetta." }, "itemAutoFillOnPageLoad": { - "message": "Automaattinen täyttö sivun avautuessa (jos kytketty asetuksista käyttöön)" + "message": "Automaattinen täyttö sivun avautuessa (jos määritetty asetuksista)" }, "autoFillOnPageLoadUseDefault": { "message": "Käytä oletusasetusta" @@ -1281,7 +1281,7 @@ "message": "Näytä tai piilota asetukset" }, "toggleCurrentUris": { - "message": "Näytä tai piilota nykyiset URI:t", + "message": "Näytä/piilota nykyiset URI:t", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1311,6 +1311,10 @@ "message": "Päivitetty", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Luotu", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Salasana päivitetty", "description": "ex. Date this password was updated" @@ -1356,7 +1360,7 @@ "message": "Avaa PIN-koodilla" }, "setYourPinCode": { - "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos laajennuksesta." + "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut laajennuksesta kokonaan ulos." }, "pinRequired": { "message": "PIN-koodi vaaditaan." @@ -1371,7 +1375,7 @@ "message": "Odottaa vahvistusta työpöydältä" }, "awaitDesktopDesc": { - "message": "Vahvista biometrian käyttö Bitwardenin työpöytäsovelluksessa käyttääksesi sitä selaimessa." + "message": "Vahvista biometrian käyttö Bitwardenin työpöytäsovelluksesta käyttääksesi sitä selaimessa." }, "lockWithMasterPassOnRestart": { "message": "Lukitse pääsalasanalla kun selain käynnistetään uudelleen" @@ -1409,7 +1413,7 @@ "message": "Haluatko varmasti poistaa kohteen pysyvästi?" }, "permanentlyDeletedItem": { - "message": "Kohde poistettu pysyvästi" + "message": "Kohde poistettiin pysyvästi" }, "restoreItem": { "message": "Palauta kohde" @@ -1418,7 +1422,7 @@ "message": "Haluatko varmasti palauttaa kohteen?" }, "restoredItem": { - "message": "Kohde palautettu" + "message": "Kohde palautettiin" }, "vaultTimeoutLogOutConfirmation": { "message": "Uloskirjautuminen estää pääsyn holviisi ja vaatii ajan umpeuduttua todennuksen Internet-yhteyden välityksellä. Haluatko varmasti käyttää asetusta?" @@ -1508,7 +1512,7 @@ "message": "Selainintegraatio ei ole käytössä" }, "desktopIntegrationDisabledDesc": { - "message": "Selainintegraatio ei ole käytössä Bitwardenin työpöytäsovelluksessa. Ota se käyttöön työpöytäsovelluksen asetuksista." + "message": "Selainintegraatiota ei ole määritetty Bitwardenin työpöytäsovelluksesta. Määritä se työpöytäsovelluksen asetuksista." }, "startDesktopTitle": { "message": "Käynnistä Bitwardenin työpöytäsovellus" @@ -1517,7 +1521,7 @@ "message": "Bitwardenin työpöytäsovellus on käynnistettävä ennen kuin biometristä avausta voidaan käyttää." }, "errorEnableBiometricTitle": { - "message": "Biometriaa ei voitu ottaa käyttöön" + "message": "Biometriaa ei voitu määrittää" }, "errorEnableBiometricDesc": { "message": "Työpöytäsovellus perui toiminnon" @@ -1535,10 +1539,10 @@ "message": "Tili ei täsmää" }, "biometricsNotEnabledTitle": { - "message": "Biometria ei ole käytössä" + "message": "Biometriaa ei ole määritetty" }, "biometricsNotEnabledDesc": { - "message": "Käyttääksesi biometriaa selaimessa, on biometria otettava käyttöön työpöytäsovelluksen asetuksista." + "message": "Biometria selaimissa edellyttää sen määritystä työpöytäsovelluksen asetuksista." }, "biometricsNotSupportedTitle": { "message": "Biometriaa ei tueta" @@ -1550,7 +1554,7 @@ "message": "Oikeutta ei myönnetty" }, "nativeMessaginPermissionErrorDesc": { - "message": "Ilman viestintäoikeutta Bitwardenin työpöytäsovelluksen kanssa, ei biometriaa tueta selainlaajennuksessa. Yritä uudelleen." + "message": "Biometriaa ei tueta selainlaajennuksessa ilman viestintäoikeutta Bitwardenin työpöytäsovelluksen kanssa. Yritä uudelleen." }, "nativeMessaginPermissionSidebarTitle": { "message": "Käyttöoikeuspyynnön virhe" @@ -1559,7 +1563,7 @@ "message": "Toimintoa ei voi suorittaa sivupalkissa, yritä toimintoa uudelleen ponnahdusvalikossa tai ponnahdusikkunassa." }, "personalOwnershipSubmitError": { - "message": "Yrityksen asettaman käytännön johdosta kohteiden tallennus omaan holviisi ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." + "message": "Yrityksen asettaman käytännön johdosta et voi tallentaa kohteita henkilökohtaiseen holviisi. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." }, "personalOwnershipPolicyInEffect": { "message": "Organisaatiokäytäntö vaikuttaa omistajuusvalintoihisi." @@ -1625,10 +1629,10 @@ "message": "Poista" }, "removedPassword": { - "message": "Salasana poistettu" + "message": "Salasana poistettiin" }, "deletedSend": { - "message": "Poistettu Send", + "message": "Send poistettiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1724,17 +1728,17 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Nykyinen käyttökertojen määrä" + "message": "Käyttökertojen nykyinen määrä" }, "createSend": { - "message": "Luo uusi Send", + "message": "Uusi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Uusi salasana" }, "sendDisabled": { - "message": "Send on poistettu käytöstä", + "message": "Send poistettiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send luotu", + "message": "Send luotiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Sendiä muokattu", + "message": "Send tallennettiin", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1801,19 +1805,19 @@ "message": "Pääsalasanan vahvistus" }, "passwordConfirmationDesc": { - "message": "Toiminto on suojattu. Jatkaaksesi, syötä pääsalasanasi uudelleen vahvistaaksesi henkilöllisyytesi." + "message": "Toiminto on suojattu. Jatka vahvistamalla henkilöllisyytesi syöttämällä pääsalasanasi uudelleen." }, "emailVerificationRequired": { - "message": "Sähköpostiosoitteen vahvistus vaaditaan" + "message": "Sähköpostiosoite on vahvistettava" }, "emailVerificationRequiredDesc": { "message": "Sinun on vahvistettava sähköpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa." }, "updatedMasterPassword": { - "message": "Pääsalasana on päivitetty" + "message": "Pääsalasana vaihdettiin" }, "updateMasterPassword": { - "message": "Päivitä pääsalasana" + "message": "Vaihda pääsalasana" }, "updateMasterPasswordWarning": { "message": "Organisaatiosi ylläpito on hiljattain vaihtanut pääsalasanasi. Käyttääksesi holvia, on sinun päivitettävä se nyt. Tämä uloskirjaa kaikki nykyiset istunnot pakottaen uudelleenkirjautumisen. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." @@ -1853,10 +1857,10 @@ "message": "Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset." }, "vaultExportDisabled": { - "message": "Holvin vienti on poistettu käytöstä" + "message": "Holvin vienti ei ole käytettävissä" }, "personalVaultExportPolicyInEffect": { - "message": "Yksi tai useampi organisaation käytäntö estää henkilökohtaisen holvisi viennin." + "message": "Yksi tai useampi organisaatiokäytäntö estää henkilökohtaisen holvisi viennin." }, "copyCustomFieldNameInvalidElement": { "message": "Oikeaa lomakkeen elementtiä ei voitu tunnistaa. Tutki sen sijaan HTML-koodia." @@ -1880,7 +1884,7 @@ "message": "Poista pääsalasana" }, "removedMasterPassword": { - "message": "Pääsalasana on poistettu." + "message": "Pääsalasana on poistettiin" }, "leaveOrganizationConfirmation": { "message": "Haluatko varmasti poistua tästä organisaatiosta?" @@ -1898,7 +1902,7 @@ "message": "Henkilökohtaisen holvin vienti" }, "exportingPersonalVaultDescription": { - "message": "Vain tunnukseen $EMAIL$ liitetyt henkilökohtaiset holvin kohteet viedään. Organisaation kohteet eivät sisälly tähän.", + "message": "Vain tunnukselle $EMAIL$ liitetyt henkilökohtaisen holvin kohteet viedään. Organisaation kohteet eivät sisälly tähän.", "placeholders": { "email": { "content": "$1", @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "nähty viimeksi $DATE$", + "message": "nähty viimeksi: $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index a1d1a776a89..ef019e07386 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -20,7 +20,7 @@ "message": "Mag-login" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "Kanselahin" @@ -47,7 +47,7 @@ "message": "Muling i-type ang Master Password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -59,7 +59,7 @@ "message": "Aking Kahadeyero" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Mga Kagamitan" @@ -80,25 +80,25 @@ "message": "Kopyahin ang URI" }, "copyUsername": { - "message": "Copy Username" + "message": "Copy username" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "Copy security code" }, "autoFill": { "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Buksan ang iyong kahadeyero" @@ -116,7 +116,7 @@ "message": "Magdagdag ng Item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -131,13 +131,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { "message": "Ipinadala ang Code" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Kumpirmahin ang iyong identididad upang magpatuloy." @@ -175,16 +175,16 @@ "message": "Move" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "name": { "message": "Name" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "folders": { "message": "Folders" @@ -199,13 +199,13 @@ "message": "Sync" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "Select" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "Options" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "Username" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "Folder" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "Website" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "Manage" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "Name is required." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index c64d822b613..62b28b4d675 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -44,7 +44,7 @@ "message": "Un indice de mot de passe maître peut vous aider à vous rappeler de votre mot de passe en cas d'oubli." }, "reTypeMasterPass": { - "message": "Saisissez à nouveau le mot de passe maître" + "message": "Saisir à nouveau le mot de passe maître" }, "masterPassHint": { "message": "Indice du mot de passe maître (facultatif)" @@ -56,7 +56,7 @@ "message": "Coffre" }, "myVault": { - "message": "Mon coffre" + "message": "Mon Coffre" }, "allVaults": { "message": "Tous les coffres" @@ -98,7 +98,7 @@ "message": "Copier le nom du champ personnalisé" }, "noMatchingLogins": { - "message": "Aucun site correspondant." + "message": "Aucun identifiant correspondant." }, "unlockVaultMenu": { "message": "Déverrouillez votre coffre" @@ -110,13 +110,13 @@ "message": "Il n'existe aucun site disponible pour le remplissage automatique pour l'onglet actuel du navigateur." }, "addLogin": { - "message": "Ajouter un identifiant" + "message": "Ajouter un site" }, "addItem": { "message": "Ajouter un élément" }, "passwordHint": { - "message": "Indice du mot de passe" + "message": "Indice mot de passe" }, "enterEmailToGetHint": { "message": "Saisissez l'adresse e-mail de votre compte pour recevoir l'indice de votre mot de passe maître." @@ -227,7 +227,7 @@ "message": "Générer un mot de passe" }, "regeneratePassword": { - "message": "Générer un nouveau mot de passe" + "message": "Re-générer un mot de passe" }, "options": { "message": "Options" @@ -258,7 +258,7 @@ "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Inclure un chiffre" + "message": "Inclure le numéro" }, "minNumbers": { "message": "Nombre minimum de chiffres" @@ -282,7 +282,7 @@ "message": "Aucun identifiant à afficher." }, "itemInformation": { - "message": "Informations sur l'élément" + "message": "Information sur l'élément" }, "username": { "message": "Nom d'utilisateur" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Modifier l'élément" + "message": "Modifier l'identifiant" }, "folder": { "message": "Dossier" }, "deleteItem": { - "message": "Supprimer l'élément" + "message": "Supprimer l'identifiant" }, "viewItem": { - "message": "Afficher l'élément" + "message": "Voir l'élément" }, "launch": { "message": "Ouvrir" @@ -491,7 +491,7 @@ "message": "Vous pouvez modifier votre mot de passe maître depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site maintenant ?" }, "twoStepLoginConfirmation": { - "message": "L'identification en deux étapes sécurise davantage votre compte en vous demandant à chaque connexion de saisir un code de sécurité obtenu depuis un autre appareil, via une clé de sécurité, une application d'authentification, un SMS, un appel téléphonique, ou un e-mail. L'identification en deux étapes peut être activée depuis le coffre web sur bitwarden.com. Voulez-vous vous visiter le site web maintenant ?" + "message": "L'identification en deux étapes rend votre compte plus sécurisé en vous demandant de saisir un code de sécurité depuis une application d'authentification à chaque fois que vous vous identifiez. L'identification en deux étapes peut être activée depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site maintenant ?" }, "editedFolder": { "message": "Dossier modifié" @@ -503,7 +503,7 @@ "message": "Dossier supprimé" }, "gettingStartedTutorial": { - "message": "Tutoriel" + "message": "Didacticiel" }, "gettingStartedTutorialVideo": { "message": "Regardez notre didacticiel pour savoir comment parfaitement utiliser l'extension du navigateur." @@ -567,7 +567,7 @@ "message": "Rechercher dans le type" }, "noneFolder": { - "message": "Aucun dossier", + "message": "Pas de dossier", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -783,13 +783,13 @@ "message": "Support client prioritaire." }, "ppremiumSignUpFuture": { - "message": "Toutes les futures options premium. D'autres suivront prochainement !" + "message": "Toutes les futures options premium. Prochainement !" }, "premiumPurchase": { "message": "Acheter Premium" }, "premiumPurchaseAlert": { - "message": "Vous pouvez opter pour une adhésion premium depuis le coffre web sur bitwarden.com. Souhaitez-vous visiter le site web maintenant ?" + "message": "Vous pouvez opter pour une adhésion premium depuis le coffre web sur bitwarden.com. Souhaitez-vous consulter le site web maintenant ?" }, "premiumCurrentMember": { "message": "Vous êtes un adhérent premium !" @@ -819,7 +819,7 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Adhésion Premium requise" + "message": "Version Premium requise" }, "premiumRequiredDesc": { "message": "Une adhésion premium est requise pour utiliser cette fonctionnalité." @@ -870,16 +870,16 @@ "message": "Authentifier WebAuthn" }, "loginUnavailable": { - "message": "Connexion impossible" + "message": "Identifiant non disponible" }, "noTwoStepProviders": { - "message": "Ce compte dispose d'une identification en deux étapes. Cependant, aucun service d'identification en deux étapes n'est supporté par ce navigateur web." + "message": "Ce compte dispose d'une authentification à double facteurs, cependant, aucun service d'authentification à double facteurs n'est supporté par ce navigateur web." }, "noTwoStepProviders2": { "message": "Merci d'utiliser un navigateur web compatible (comme Chrome) et/ou d'ajouter des services additionnels d'identification en deux étapes qui sont mieux supportés par les navigateurs web (comme par exemple une application d'authentification)." }, "twoStepOptions": { - "message": "Options d'identification en deux étapes" + "message": "Options d'identification à double facteurs" }, "recoveryCodeDesc": { "message": "Accès perdu à tous vos services d'authentification à double facteurs ? Utilisez votre code de récupération pour désactiver tous les services de double authentifications sur votre compte." @@ -1148,7 +1148,7 @@ "message": "Numéro de passeport" }, "licenseNumber": { - "message": "Numéro de permis" + "message": "Numéro de permis de Conduire" }, "email": { "message": "E-mail" @@ -1278,7 +1278,7 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Afficher/masquer les options" + "message": "Options de basculement" }, "toggleCurrentUris": { "message": "Afficher/masquer les URIs actuels", @@ -1311,6 +1311,10 @@ "message": "Mis à jour", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Mot de passe mis à jour", "description": "ex. Date this password was updated" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 3a52d70f647..a5ab167ab74 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -20,7 +20,7 @@ "message": "התחבר" }, "enterpriseSingleSignOn": { - "message": "כניסה אחודה ארגונית" + "message": "כניסה ארגונית אחידה" }, "cancel": { "message": "בטל" @@ -32,7 +32,7 @@ "message": "שלח" }, "emailAddress": { - "message": "כתובת אימייל" + "message": "כתובת דוא\"ל" }, "masterPass": { "message": "סיסמה ראשית" @@ -59,7 +59,7 @@ "message": "הכספת שלי" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "כלים" @@ -92,10 +92,10 @@ "message": "השלמה אוטומטית" }, "generatePasswordCopied": { - "message": "צור סיסמה חדשה (והעתק לזיכרון)" + "message": "צור סיסמה (העתק)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "לא נמצאו פרטי כניסה תואמים." @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "מספר מילים" @@ -552,7 +552,7 @@ "message": "האם אתה בטוח שברצונך לדרוס את הסיסמה הנוכחית?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "שתף" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "אימייל" @@ -1311,6 +1311,10 @@ "message": "עודכן", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "הסיסמה עודכנה", "description": "ex. Date this password was updated" @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "הזמן הקצוב לכספת שלך חורג מהמגבלות שנקבעו על ידי הארגון שלך." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1910,23 +1914,23 @@ "message": "שגיאה" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { "message": "סוג שם משתמש" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,16 +1939,16 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" @@ -1966,16 +1970,16 @@ "message": "מפתח API" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index b36fe0cd95f..80e1c53c86b 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -59,7 +59,7 @@ "message": "My Vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "उपकरण" @@ -95,7 +95,7 @@ "message": "Generate Password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "कोई मेल-मिला लॉगिन नहीं |" @@ -131,10 +131,10 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { "message": "Verification Code" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "Number of Words" @@ -339,7 +339,7 @@ "message": "आपका वेब ब्राउज़र आसान क्लिपबोर्ड कॉपीिंग का समर्थन नहीं करता है। इसके बजाय इसे मैन्युअल रूप से कॉपी करें।" }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "आपकी वॉल्ट लॉक हो गई है। जारी रखने के लिए अपने मास्टर पासवर्ड को सत्यापित करें।" @@ -552,7 +552,7 @@ "message": "क्या आप सुनिश्चित हैं कि आप वर्तमान पासवर्ड को ओवरराइट करना चाहते हैं?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -1133,7 +1133,7 @@ "message": "Last Name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "Identity Name" @@ -1311,6 +1311,10 @@ "message": "अपडेट किया गया", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -1810,16 +1814,16 @@ "message": "इस सुविधा का उपयोग करने के लिए आपको अपने ईमेल को सत्यापित करना होगा। आप वेब वॉल्ट में अपने ईमेल को सत्यापित कर सकते हैं।" }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index f55313d87b3..73700c8caea 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -14,7 +14,7 @@ "message": "Prijavi se ili stvori novi račun za pristup svojem sigurnom trezoru." }, "createAccount": { - "message": "Stvori račun" + "message": "Napravi račun" }, "login": { "message": "Prijava" @@ -32,7 +32,7 @@ "message": "Pošalji" }, "emailAddress": { - "message": "Adresa e-pošte" + "message": "Email Adresa" }, "masterPass": { "message": "Glavna lozinka" @@ -95,7 +95,7 @@ "message": "Generiraj lozinku (i kopiraj)" }, "copyElementIdentifier": { - "message": "Kopiranje prilagođenog naziva polja" + "message": "Prilagođeno ime polja" }, "noMatchingLogins": { "message": "Nema podudarajućih prijava." @@ -494,7 +494,7 @@ "message": "Prijava u dva koraka čini tvoj račun još sigurnijim tako što će zahtijevati da potvrdiš prijavu putem drugog uređaja kao što je sigurnosni ključ, autentifikatorske aplikacije, SMS-om, pozivom ili e-poštom. Prijavu u dva koraka možeš omogućiti na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, "editedFolder": { - "message": "Uređena mapa" + "message": "Mapa izmijenjena" }, "deleteFolderConfirmation": { "message": "Sigurno želiš izbrisati ovu mapu?" @@ -879,7 +879,7 @@ "message": "Koristi podržani web-preglednik (npr. Chrome) i/ili dodaj dodatne usluge koje su bolje podržane u web preglednicima (npr. aplikacija Autentifikator)." }, "twoStepOptions": { - "message": "Mogućnosti prijave u dva koraka" + "message": "Mogućnosti dvostruke autentifikacije" }, "recoveryCodeDesc": { "message": "Izgubljen je pristup uređaju za dvostruku autentifikaciju? Koristi svoj kôd za oporavak za onemogućavanje svih pružatelja usluga dvostruke autentifikacije na tvojem računu." @@ -1311,6 +1311,10 @@ "message": "Ažurirano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lozinka ažurirana", "description": "ex. Date this password was updated" @@ -1972,10 +1976,10 @@ "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 78a4bc43e0d..44d7249133f 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -482,7 +482,7 @@ "message": "Név megadása kötelező." }, "addedFolder": { - "message": "Hozzáadott mappa" + "message": "A mappa hozzáadásra került." }, "changeMasterPass": { "message": "Mesterjelszó módosítása" @@ -491,7 +491,7 @@ "message": "Mesterjelszavadat a bitwarden.com webes széfén tudod megváltoztatni. Szeretnéd meglátogatni a most a weboldalt?" }, "twoStepLoginConfirmation": { - "message": "A kétlépcsős bejelentkezés biztonságosabbá teszi a felhasználódat azáltal, hogy ellenőrizned kell a bejelentkezésedet egy másik készülékkel mint például biztonsági kulcs, hitelesítő alkalmazás, SMS, telefon hívás vagy e-mail. Kétlépcsős bejelentkezést a bitwarden.com webes széfén tudod megváltoztatni. Szeretnéd meglátogatni a most a weboldalt?" + "message": "A kétlépcsős bejelentkezés biztonságosabbá teszi a fiókot azáltal, hogy ellenőrizni kell a bejelentkezést egy másik olyan eszközzel mint például biztonsági kulcs, hitelesítő alkalmazás, SMS, telefon hívás vagy email. A kétlépcsős bejelentkezést a bitwarden.com webes széfben lehet engedélyezni. Felkeressük a webhelyet most?" }, "editedFolder": { "message": "A mappa módosításra került." @@ -500,7 +500,7 @@ "message": "Biztos, hogy törölni akarod ezt a mappát?" }, "deletedFolder": { - "message": "Törölt mappa" + "message": "A mappa törlésre került." }, "gettingStartedTutorial": { "message": "Kezdeti ismertető" @@ -534,10 +534,10 @@ "message": "Új URI" }, "addedItem": { - "message": "Elem hozzáadva" + "message": "Az elem hozzáadásra került." }, "editedItem": { - "message": "Elem szerkesztve" + "message": "Az elem szerkesztésre került." }, "deleteItemConfirmation": { "message": "Biztosan törlésre kerüljön ezt az elem?" @@ -723,7 +723,7 @@ "message": "Biztos törölni akarod ezt a mellékletet?" }, "deletedAttachment": { - "message": "Mellékletek törlése" + "message": "A melléklet törlésre került." }, "newAttachment": { "message": "Új melléklet hozzáadása" @@ -738,7 +738,7 @@ "message": "Fájl" }, "selectFile": { - "message": "Válassz ki egy fájlt." + "message": "Válasszunk egy fájlt." }, "maxFileSize": { "message": "A naximális fájlméret 500 MB." @@ -762,10 +762,10 @@ "message": "Tagság frissítése" }, "premiumNotCurrentMember": { - "message": "Pillanatnyilag nem vagy prémium tag." + "message": "Jelenleg nincs prémium tagság." }, "premiumSignUpAndGet": { - "message": "Regisztrálj prémium tagságra az alábbi funkciókért:" + "message": "Regisztráció a prémium tagságra az alábbi funkciókért:" }, "ppremiumSignUpStorage": { "message": "1 GB titkosított tárhely a fájlmellékleteknek." @@ -783,16 +783,16 @@ "message": "Kiemelt ügyfélszolgálati." }, "ppremiumSignUpFuture": { - "message": "Minden jövőbeli prémium funkció. Hamarosan jön még több!" + "message": "Minden jövőbeli prémium funkció. Hamarosan jön még több." }, "premiumPurchase": { "message": "Prémium funkció megvásárlása" }, "premiumPurchaseAlert": { - "message": "Prémium tagságot a bitwarden.com webes széfén tudsz venni. Szeretnéd meglátogatni a most a weboldalt?" + "message": "A prémium tagság megvásárolható a bitwarden.com webes széfben. Szeretnénk felkeresni a webhelyet most?" }, "premiumCurrentMember": { - "message": "Te egy prémium tag vagy!" + "message": "Jelenleg a prémium tagság érvényben van." }, "premiumCurrentMemberThanks": { "message": "Köszönjük a Bitwarden támogatását." @@ -822,7 +822,7 @@ "message": "Prémium funkció szükséges" }, "premiumRequiredDesc": { - "message": "Prémium tagság szükséges ennek a funkciónak eléréséhez." + "message": "Prémium tagság szükséges ennek a funkciónak eléréséhez a jövőben." }, "enterVerificationCodeApp": { "message": "Add meg a 6 számjegyű ellenőrző kódot a hitelesítő alkalmazásodból." @@ -882,7 +882,7 @@ "message": "Kétlépcsős bejelentkezés opciók" }, "recoveryCodeDesc": { - "message": "Elvesztetted a hozzáférésed az összes kétlépcsős szolgáltatásodhoz? Használd a visszaállítókódod a kétlépcsős kiszolgálok kikapcsolásához a felhasználódon." + "message": "Elveszett a hozzáférés az összes kétlépcsős szolgáltatóhoz? A helyreállító kód használatával letilthatók fiókból a kétlépcsős szolgáltatók." }, "recoveryCodeTitle": { "message": "Helyreállító kód" @@ -927,7 +927,7 @@ "message": "A helyileg működtetett Bitwarden telepítés alap webcímének megadása." }, "customEnvironment": { - "message": "Egyedi környezet" + "message": "Egyéni környezet" }, "customEnvironmentFooter": { "message": "Haladó felhasználóknak. Minden egyes szolgáltatás alap URL-jét külön megadhatod." @@ -951,7 +951,7 @@ "message": "Ikonok szerver webcím" }, "environmentSaved": { - "message": "A környezet URL-ek mentésre kerültek." + "message": "A környezeti webcímek mentésre kerültek." }, "enableAutoFillOnPageLoad": { "message": "Automatikus kitöltés engedélyezése oldal betöltéskor" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Biztonsági kód" + "message": "Biztonsági Kód" }, "ex": { "message": "példa:" @@ -1311,6 +1311,10 @@ "message": "A frissítés megtörtént.", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Létrehozva", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "A jelszó frissítésre került.", "description": "ex. Date this password was updated" @@ -1727,7 +1731,7 @@ "message": "Aktuális elérési szám" }, "createSend": { - "message": "Új küldés létrehozása", + "message": "Új Send létrehozása", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 8cad01f8763..f0563f550ca 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -59,7 +59,7 @@ "message": "Brankas Saya" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Alat" @@ -1311,6 +1311,10 @@ "message": "Diperbarui", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Kata Sandi Diperbarui", "description": "ex. Date this password was updated" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 069bf8c9384..18f2b2d8938 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -86,7 +86,7 @@ "message": "Copia numero" }, "copySecurityCode": { - "message": "Copia codice di sicurezza" + "message": "Copia il codice di sicurezza" }, "autoFill": { "message": "Auto-riempimento" @@ -98,7 +98,7 @@ "message": "Copia nome campo personalizzato" }, "noMatchingLogins": { - "message": "Nessun login corrispondente." + "message": "Nessun accesso corrispondente." }, "unlockVaultMenu": { "message": "Sblocca la tua cassaforte" @@ -199,7 +199,7 @@ "message": "Sincronizza" }, "syncVaultNow": { - "message": "Sincronizza ora la cassaforte" + "message": "Sincronizza cassaforte ora" }, "lastSync": { "message": "Ultima sincronizzazione:" @@ -261,10 +261,10 @@ "message": "Includi numero" }, "minNumbers": { - "message": "Minimo di numeri" + "message": "Minimo numeri" }, "minSpecial": { - "message": "Minimo di speciali" + "message": "Minimo caratteri speciali" }, "avoidAmbChar": { "message": "Evita caratteri ambigui" @@ -711,7 +711,7 @@ "message": "Codice di verifica (TOTP)" }, "copyVerificationCode": { - "message": "Copia codice di verifica" + "message": "Copia il codice di verifica" }, "attachments": { "message": "Allegati" @@ -726,7 +726,7 @@ "message": "Allegato eliminato" }, "newAttachment": { - "message": "Aggiungi Nuovo Allegato" + "message": "Aggiungi nuovo allegato" }, "noAttachments": { "message": "Nessun allegato." @@ -765,7 +765,7 @@ "message": "Al momento non sei un membro premium." }, "premiumSignUpAndGet": { - "message": "Iscriviti a un abbonamento premium e ottieni:" + "message": "Iscriviti ad un abbonamento premium e ottieni:" }, "ppremiumSignUpStorage": { "message": "1 GB di spazio di archiviazione cifrato per gli allegati." @@ -822,7 +822,7 @@ "message": "Premium richiesto" }, "premiumRequiredDesc": { - "message": "Un abbonamento premium è richiesto per utilizzare questa funzionalità." + "message": "Un abbonamento Premium è richiesto per utilizzare questa funzionalità." }, "enterVerificationCodeApp": { "message": "Inserisci il codice di verifica a 6 cifre dalla tua applicazione di autenticazione." @@ -1311,6 +1311,10 @@ "message": "Aggiornato", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password aggiornata", "description": "ex. Date this password was updated" @@ -1371,7 +1375,7 @@ "message": "In attesa di conferma dal desktop" }, "awaitDesktopDesc": { - "message": "Conferma utilizzando l'autenticazione biometrica nell'applicazione Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser." + "message": "Si prega di confermare utilizzando l'autenticazione biometrica nell'applicazione Bitwarden Desktop per abilitare l'autenticazione biometrica per il browser." }, "lockWithMasterPassOnRestart": { "message": "Blocca con la password principale al riavvio del browser" diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 31e2ec70665..20dcfe6e394 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -482,7 +482,7 @@ "message": "名前は必須項目です。" }, "addedFolder": { - "message": "フォルダーを追加しました" + "message": "フォルダを追加しました" }, "changeMasterPass": { "message": "マスターパスワードの変更" @@ -534,10 +534,10 @@ "message": "新しい URI" }, "addedItem": { - "message": "追加しました" + "message": "追加されたアイテム" }, "editedItem": { - "message": "編集しました" + "message": "編集されたアイテム" }, "deleteItemConfirmation": { "message": "このアイテムを削除しますか?" @@ -567,7 +567,7 @@ "message": "検索の種類" }, "noneFolder": { - "message": "フォルダーなし", + "message": "フォルダなし", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -1311,6 +1311,10 @@ "message": "更新日", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "作成日", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "パスワード更新日", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 802693cd565..1c75bdf8d95 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -20,7 +20,7 @@ "message": "ავტორიზაცია" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "გაუქმება" @@ -35,7 +35,7 @@ "message": "ელ-ფოსტა" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -44,10 +44,10 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -56,10 +56,10 @@ "message": "Vault" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "ხელსაწყოები" @@ -68,13 +68,13 @@ "message": "პარამეტრები" }, "currentTab": { - "message": "Current Tab" + "message": "Current tab" }, "copyPassword": { "message": "პაროლის კოპირება" }, "copyNote": { - "message": "Copy Note" + "message": "Copy note" }, "copyUri": { "message": "Copy URI" @@ -83,7 +83,7 @@ "message": "მომხმარებლის სახელის კოპირება" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { "message": "უსაფრთხოების კოდის კოპირება" @@ -92,13 +92,13 @@ "message": "თვითშევსება" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Unlock your vault" @@ -113,10 +113,10 @@ "message": "ავტორიზაციის დამატება" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -199,13 +199,13 @@ "message": "სინქრონიზაცია" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "მონიშვნა" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "პარამეტრები" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "სიტყვათა რაოდენობა" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "დიდი ასოთი აღნიშვნა", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "მომხმარებლის სახელი" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "საქაღალდე" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "ვებგვერდი" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "მართვა" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "სახელი სავალდებულოა." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index d7e586da741..ae21dc164c5 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -14,13 +14,13 @@ "message": "Log in or create a new account to access your secure vault." }, "createAccount": { - "message": "Create Account" + "message": "Create account" }, "login": { - "message": "Log In" + "message": "Log in" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "Cancel" @@ -32,10 +32,10 @@ "message": "Submit" }, "emailAddress": { - "message": "Email Address" + "message": "Email address" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -44,10 +44,10 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -56,10 +56,10 @@ "message": "Vault" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Tools" @@ -68,37 +68,37 @@ "message": "Settings" }, "currentTab": { - "message": "Current Tab" + "message": "Current tab" }, "copyPassword": { - "message": "Copy Password" + "message": "Copy password" }, "copyNote": { - "message": "Copy Note" + "message": "Copy note" }, "copyUri": { "message": "Copy URI" }, "copyUsername": { - "message": "Copy Username" + "message": "Copy username" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "Copy security code" }, "autoFill": { "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Unlock your vault" @@ -110,13 +110,13 @@ "message": "There are no logins available to auto-fill for the current browser tab." }, "addLogin": { - "message": "Add a Login" + "message": "Add a login" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -131,13 +131,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -175,16 +175,16 @@ "message": "Move" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "name": { "message": "Name" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "folders": { "message": "Folders" @@ -199,13 +199,13 @@ "message": "Sync" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "Select" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "Options" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "Username" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "Folder" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "Website" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "Manage" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "Name is required." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 5a8ec8a3558..d3a91b54202 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -59,7 +59,7 @@ "message": "ನನ್ನ ವಾಲ್ಟ್" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "ಉಪಕರಣ" @@ -95,7 +95,7 @@ "message": "ಪಾಸ್ವರ್ಡ್ ರಚಿಸಿ (ನಕಲಿಸಲಾಗಿದೆ)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "ಹೊಂದಾಣಿಕೆಯ ಲಾಗಿನ್‌ಗಳು ಇಲ್ಲ." @@ -131,10 +131,10 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { "message": "ಪರಿಶೀಲನಾ ಕೋಡ್‌ಗಳು" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "ಪದಗಳ ಸಂಖ್ಯೆ" @@ -339,7 +339,7 @@ "message": "ನಿಮ್ಮ ವೆಬ್ ಬ್ರೌಸರ್ ಸುಲಭವಾದ ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ನಕಲು ಮಾಡುವುದನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬದಲಿಗೆ ಅದನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಕಲಿಸಿ." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಲಾಕ್ ಆಗಿದೆ. ಮುಂದುವರೆಯಲು ನಿಮ್ಮ ಮಾಸ್ಟರ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ." @@ -552,7 +552,7 @@ "message": "ಪ್ರಸ್ತುತ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ತಿದ್ದಿಬರೆಯಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -1133,7 +1133,7 @@ "message": "ಕೊನೆ ಹೆಸರು" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "ಹೆಸರು ಗುರುತು" @@ -1311,6 +1311,10 @@ "message": "ಅಪ್‌ಡೇಟ್", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "ಪಾಸ್ವರ್ಡ್ ನವೀಕರಿಸಲಾಗಿದೆ", "description": "ex. Date this password was updated" @@ -1810,16 +1814,16 @@ "message": "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕು. ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬಹುದು." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index a8e84cd33e8..b339d9880fa 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -1311,6 +1311,10 @@ "message": "업데이트됨", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "비밀번호 업데이트됨", "description": "ex. Date this password was updated" @@ -1919,14 +1923,14 @@ "message": "아이디 유형" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1950,7 +1954,7 @@ "message": "서비스" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1972,10 +1976,10 @@ "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index fd26e3345e7..1c37c0ef40e 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -552,10 +552,10 @@ "message": "Ar tikrai norite perrašyti dabartinį slaptažodį?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Perrašyti Vartotojo Vardą" }, "overwriteUsernameConfirmation": { - "message": "Are you sure you want to overwrite the current username?" + "message": "Ar tikrai norite perrašyti dabartinį vartotojo vardą?" }, "searchFolder": { "message": "Ieškoti aplanke" @@ -577,7 +577,7 @@ "message": "Prisijungimo pridėjimo pranešimas automatiškai Jūs paragina išsaugoti naujus prisijungimus Jūsų saugykloje, kuomet prisijungiate pirmą kartą." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Rodyti korteles skirtuko puslapyje" }, "showCardsCurrentTabDesc": { "message": "List card items on the Tab page for easy auto-fill." @@ -603,10 +603,10 @@ "message": "Taip, išsaugoti dabar" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Paprašyti atnaujinti esamą prisijungimą" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Paprašyti atnaujinti prisijungimo slaptažodį, kai pakeitimas aptiktas svetainėje." }, "notificationChangeDesc": { "message": "Ar norite atnaujinti šį slaptažodį „Bitwarden“?" @@ -680,10 +680,10 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { - "message": "Share" + "message": "Bendrinti" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -765,7 +765,7 @@ "message": "Neturite Premium narystės." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Dėkojame, kad remiate Bitwarden." @@ -852,7 +852,7 @@ "message": "Send verification code email again" }, "useAnotherTwoStepMethod": { - "message": "Use another two-step login method" + "message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą" }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." @@ -870,22 +870,22 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Prisijungimas nepasiekiamas" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { "message": "Autentifikavimo programa" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "El. paštas" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API serverio nuoroda" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Automatiškai užpildyti užsikrovus puslapiui" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,10 +999,10 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1412,28 +1416,28 @@ "message": "Ištrintas visam laikui" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { "message": "Automatiškai užpildyti ir išsaugoti" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { "message": "Pagrindinio slaptažodžio nustatymas" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrika negali būti naudojama" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,7 +1808,7 @@ "message": "Negalite šio veiksmo padaryti neįvedus savo pagrindinio slaptažodžio ir patvirtinę tapatybę." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." @@ -1813,13 +1817,13 @@ "message": "Naujasis pagrindinis slaptažodis" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { "message": "Ištrinti pagrindinį slaptažodį" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 622634bb936..8db582bc209 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -1311,6 +1311,10 @@ "message": "Atjaunināts", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Izveidots", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parole atjaunināta", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index cc79141a1c8..42376dcbfa0 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -59,7 +59,7 @@ "message": "എൻ്റെ വാൾട് " }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "ഉപകരണങ്ങള്‍" @@ -95,7 +95,7 @@ "message": "പാസ്‌വേഡ് സൃഷ്ടിക്കുക (പകർത്തുക )" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "പൊരുത്തപ്പെടുന്ന ലോഗിനുകളൊന്നുമില്ല." @@ -131,10 +131,10 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { "message": "പരിശോധിച്ചുറപ്പിക്കൽ കോഡ്" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "വാക്കുകളുടെ എണ്ണം" @@ -339,7 +339,7 @@ "message": "നിങ്ങളുടെ ബ്രൌസർ എളുപ്പമുള്ള ക്ലിപ്പ്ബോർഡ് പകർത്തൽ പിന്തുണയ്ക്കത്തില്ല. പകരം അത് സ്വമേധയാ പകർക്കുക ." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "തങ്ങളുടെ വാൾട് പൂട്ടിയിരിക്കുന്നു. തുടരുന്നതിന് നിങ്ങളുടെ പ്രാഥമിക പാസ്‌വേഡ് പരിശോധിക്കുക." @@ -552,7 +552,7 @@ "message": "നിലവിലെ പാസ്‌വേഡ് പുനരാലേഖനം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -656,7 +656,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "exportWarningDesc": { "message": "ഈ എക്‌സ്‌പോർട്ടിൽ എൻക്രിപ്റ്റ് ചെയ്യാത്ത ഫോർമാറ്റിൽ നിങ്ങളുടെ വാൾട് ഡാറ്റ അടങ്ങിയിരിക്കുന്നു. എക്‌സ്‌പോർട് ചെയ്ത ഫയൽ സുരക്ഷിതമല്ലാത്ത ചാനലുകളിൽ (ഇമെയിൽ പോലുള്ളവ) നിങ്ങൾ സംഭരിക്കുകയോ അയയ്ക്കുകയോ ചെയ്യരുത്. നിങ്ങൾ ഇത് ഉപയോഗിച്ചുകഴിഞ്ഞാലുടൻ അത് മായ്ച്ചുകളയണം." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "പങ്കിടുക" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "ഇമെയിൽ" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -1133,7 +1133,7 @@ "message": "പേരിന്റെ അവസാന ഭാഗം" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "ഐഡന്റിറ്റിയുടെ പേര്" @@ -1311,6 +1311,10 @@ "message": "പുതുക്കി", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "പാസ്സ്‌വേഡ് പുതുക്കി", "description": "ex. Date this password was updated" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "ബ്രൌസർ പുനരാരംഭത്തിൽ പ്രാഥമിക പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോക്ക് ചെയ്യുക" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 360dfddc7c3..ce7e40e7765 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -491,7 +491,7 @@ "message": "Du kan endre superpassordet ditt på bitwarden.net-netthvelvet. Vil du besøke det nettstedet nå?" }, "twoStepLoginConfirmation": { - "message": "2-trinnsinnlogging gjør kontoen din mer sikker, ved å kreve at du verifiserer din innlogging med en annen enhet, f.eks. en autentiseringsapp, SMS, E-post, telefonsamtale, eller sikkerhetsnøkkel. 2-trinnsinnlogging kan aktiveres på bitwarden.com-netthvelvet. Vil du besøke den nettsiden nå?" + "message": "2-trinnsinnlogging gjør kontoen din mer sikker, ved å kreve at du verifiserer din innlogging med en annen enhet, f.eks. en autentiseringsapp, SMS, e-post, telefonsamtale, eller sikkerhetsnøkkel. 2-trinnsinnlogging kan aktiveres i netthvelvet ditt på bitwarden.com. Vil du besøke bitwarden.com nå?" }, "editedFolder": { "message": "Redigerte mappen" @@ -534,7 +534,7 @@ "message": "Ny URI" }, "addedItem": { - "message": "La til gjenstanden" + "message": "La til element" }, "editedItem": { "message": "Redigerte elementet" @@ -783,13 +783,13 @@ "message": "Prioritert kundestøtte." }, "ppremiumSignUpFuture": { - "message": "Alle fremtidige Premium-egenskaper. Mere er planlagt snart!" + "message": "Alle fremtidige Premium-egenskaper. Mer er planlagt og vil komme snart!" }, "premiumPurchase": { "message": "Kjøp Premium" }, "premiumPurchaseAlert": { - "message": "Du kan kjøpe et Premium-medlemskap på bitwarden.net-netthvelvet. Vil du besøke det nettstedet nå?" + "message": "Du kan kjøpe et Premium-medlemskap på bitwarden.com. Vil du besøke det nettstedet nå?" }, "premiumCurrentMember": { "message": "Du er et Premium-medlem!" @@ -1311,6 +1311,10 @@ "message": "Oppdatert den", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passordet ble oppdatert den", "description": "ex. Date this password was updated" @@ -1969,19 +1973,19 @@ "message": "Key Connector feil: Sjekk at Key Connector er tilgjengelig og fungerer." }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Premium abonnement kreves" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organisasjonen er deaktivert." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Elementer i deaktiverte organisasjoner kan ikke aksesseres. Kontakt organisasjonseier for hjelp." }, "cardBrandMir": { "message": "Mir" }, "loggingInTo": { - "message": "Logging in to $DOMAIN$", + "message": "Logger inn på $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -1990,25 +1994,25 @@ } }, "settingsEdited": { - "message": "Settings have been edited" + "message": "Innstillingene har blitt endret" }, "environmentEditedClick": { - "message": "Click here" + "message": "Klikk her" }, "environmentEditedReset": { - "message": "to reset to pre-configured settings" + "message": "for å tilbakestille til forhåndskonfigurerte innstillinger" }, "serverVersion": { - "message": "Server Version" + "message": "Server Versjon" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Selvbetjent" }, "thirdParty": { - "message": "Third-Party" + "message": "Tredjepart" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Koblet til tredjeparts server-implementeringen $SERVERNAME$. Kontroller feil ved hjelp av den offisielle serveren, eller rapporter dem til tredjepartsserveren.", "placeholders": { "servername": { "content": "$1", @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "sist sett den: $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index f1fd5631207..5ae8dd4911a 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -227,7 +227,7 @@ "message": "Wachtwoord genereren" }, "regeneratePassword": { - "message": "Opnieuw genereren" + "message": "Wachtwoord opnieuw genereren" }, "options": { "message": "Opties" @@ -996,7 +996,7 @@ "message": "Kluis vergrendelen" }, "privateModeWarning": { - "message": "Private mode support is experimental and some features are limited." + "message": "Private mode ondersteuning is experimenteel en sommige functies zijn beperkt." }, "customFields": { "message": "Aangepaste velden" @@ -1127,7 +1127,7 @@ "message": "Voornaam" }, "middleName": { - "message": "Tweede naam" + "message": "Tussenvoegsel" }, "lastName": { "message": "Achternaam" @@ -1311,6 +1311,10 @@ "message": "Bijgewerkt", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Wachtwoord bijgewerkt", "description": "ex. Date this password was updated" @@ -1999,16 +2003,16 @@ "message": "om terug te gaan naar vooraf geconfigureerde instellingen" }, "serverVersion": { - "message": "Server Version" + "message": "Serverversie" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Zelfgehost" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Verbonden met server implementatie van derden, $SERVERNAME$. Reproduceer bugs via de officiële server, of meld ze bij het serverproject.", "placeholders": { "servername": { "content": "$1", @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "laatst gezien op: $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index d7e586da741..ae21dc164c5 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -14,13 +14,13 @@ "message": "Log in or create a new account to access your secure vault." }, "createAccount": { - "message": "Create Account" + "message": "Create account" }, "login": { - "message": "Log In" + "message": "Log in" }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "cancel": { "message": "Cancel" @@ -32,10 +32,10 @@ "message": "Submit" }, "emailAddress": { - "message": "Email Address" + "message": "Email address" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -44,10 +44,10 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "tab": { "message": "Tab" @@ -56,10 +56,10 @@ "message": "Vault" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Tools" @@ -68,37 +68,37 @@ "message": "Settings" }, "currentTab": { - "message": "Current Tab" + "message": "Current tab" }, "copyPassword": { - "message": "Copy Password" + "message": "Copy password" }, "copyNote": { - "message": "Copy Note" + "message": "Copy note" }, "copyUri": { "message": "Copy URI" }, "copyUsername": { - "message": "Copy Username" + "message": "Copy username" }, "copyNumber": { - "message": "Copy Number" + "message": "Copy number" }, "copySecurityCode": { - "message": "Copy Security Code" + "message": "Copy security code" }, "autoFill": { "message": "Auto-fill" }, "generatePasswordCopied": { - "message": "Generate Password (copied)" + "message": "Generate password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { - "message": "No matching logins." + "message": "No matching logins" }, "unlockVaultMenu": { "message": "Unlock your vault" @@ -110,13 +110,13 @@ "message": "There are no logins available to auto-fill for the current browser tab." }, "addLogin": { - "message": "Add a Login" + "message": "Add a login" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -131,13 +131,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -175,16 +175,16 @@ "message": "Move" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "name": { "message": "Name" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "folders": { "message": "Folders" @@ -199,13 +199,13 @@ "message": "Sync" }, "syncVaultNow": { - "message": "Sync Vault Now" + "message": "Sync vault now" }, "lastSync": { - "message": "Last Sync:" + "message": "Last sync:" }, "passGen": { - "message": "Password Generator" + "message": "Password generator" }, "generator": { "message": "Generator", @@ -224,10 +224,10 @@ "message": "Select" }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "options": { "message": "Options" @@ -245,29 +245,29 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special" + "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "searchVault": { "message": "Search vault" @@ -282,7 +282,7 @@ "message": "There are no items to list." }, "itemInformation": { - "message": "Item Information" + "message": "Item information" }, "username": { "message": "Username" @@ -303,16 +303,16 @@ "message": "Note" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "folder": { "message": "Folder" }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "launch": { "message": "Launch" @@ -321,7 +321,7 @@ "message": "Website" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "manage": { "message": "Manage" @@ -339,7 +339,7 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your identity to continue." @@ -482,28 +482,28 @@ "message": "Name is required." }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "changeMasterPass": { - "message": "Change Master Password" + "message": "Change master password" }, "changeMasterPasswordConfirmation": { "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -534,25 +534,25 @@ "message": "New URI" }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" }, "deletedItem": { - "message": "Sent item to trash" + "message": "Item sent to trash" }, "overwritePassword": { - "message": "Overwrite Password" + "message": "Overwrite password" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -567,7 +567,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -649,14 +649,14 @@ "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "warning": { "message": "WARNING", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Share" @@ -705,13 +705,13 @@ "message": "Learn more" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "attachments": { "message": "Attachments" @@ -723,28 +723,28 @@ "message": "Are you sure you want to delete this attachment?" }, "deletedAttachment": { - "message": "Deleted attachment" + "message": "Attachment deleted" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "noAttachments": { "message": "No attachments." }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" }, "selectFile": { - "message": "Select a file." + "message": "Select a file" }, "maxFileSize": { "message": "Maximum file size is 500 MB." }, "featureUnavailable": { - "message": "Feature Unavailable" + "message": "Feature unavailable" }, "updateKey": { "message": "You cannot use this feature until you update your encryption key." @@ -753,19 +753,19 @@ "message": "Premium membership" }, "premiumManage": { - "message": "Manage Membership" + "message": "Manage membership" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh Membership" + "message": "Refresh membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting Bitwarden." @@ -819,10 +819,10 @@ "message": "Ask for biometrics on launch" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -870,25 +870,25 @@ "message": "Authenticate WebAuthn" }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -921,13 +921,13 @@ "message": "Verification codes will be emailed to you." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "API Server URL" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1049,7 +1049,7 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -1058,10 +1058,10 @@ "message": "Brand" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "expiration": { "message": "Expiration" @@ -1103,7 +1103,7 @@ "message": "December" }, "securityCode": { - "message": "Security Code" + "message": "Security code" }, "ex": { "message": "ex." @@ -1124,31 +1124,31 @@ "message": "Dr" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -1175,7 +1175,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -1190,7 +1190,7 @@ "message": "Logins" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Logins" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Clear", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index cc5e8dcff1c..c4682d106ed 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -32,7 +32,7 @@ "message": "Wyślij" }, "emailAddress": { - "message": "Adres e-mail" + "message": "Adres email" }, "masterPass": { "message": "Hasło główne" @@ -56,7 +56,7 @@ "message": "Sejf" }, "myVault": { - "message": "Mój sejf" + "message": "Mój Sejf" }, "allVaults": { "message": "Wszystkie sejfy" @@ -68,31 +68,31 @@ "message": "Ustawienia" }, "currentTab": { - "message": "Obecna karta" + "message": "Bieżąca karta" }, "copyPassword": { - "message": "Kopiuj hasło" + "message": "Skopiuj hasło" }, "copyNote": { - "message": "Kopiuj notatkę" + "message": "Skopiuj notatkę" }, "copyUri": { "message": "Kopiuj URI" }, "copyUsername": { - "message": "Kopiuj nazwę użytkownika" + "message": "Skopiuj nazwę użytkownika" }, "copyNumber": { - "message": "Kopiuj numer" + "message": "Skopiuj numer" }, "copySecurityCode": { - "message": "Kopiuj kod zabezpieczający" + "message": "Skopiuj kod zabezpieczający" }, "autoFill": { "message": "Autouzupełnianie" }, "generatePasswordCopied": { - "message": "Generuj hasło (do schowka)" + "message": "Wygeneruj hasło (do schowka)" }, "copyElementIdentifier": { "message": "Kopiuj nazwę pola niestandardowego" @@ -199,7 +199,7 @@ "message": "Synchronizacja" }, "syncVaultNow": { - "message": "Synchronizuj sejf" + "message": "Rozpocznij synchronizację sejfu" }, "lastSync": { "message": "Ostatnia synchronizacja:" @@ -1311,6 +1311,10 @@ "message": "Zaktualizowano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Utworzono", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Aktualizacja hasła", "description": "ex. Date this password was updated" @@ -1810,16 +1814,16 @@ "message": "Musisz zweryfikować adres e-mail, aby korzystać z tej funkcji. Adres możesz zweryfikować w sejfie internetowym." }, "updatedMasterPassword": { - "message": "Hasło główne zostało zaktualizowane" + "message": "Zaktualizowane hasło główne" }, "updateMasterPassword": { "message": "Zaktualizuj hasło główne" }, "updateMasterPasswordWarning": { - "message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Musisz je zaktualizować, aby uzyskać dostęp do sejfu. Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." + "message": "Twoje hasło główne zostało ostatnio zmienione przez administratora Twojej organizacji. Musisz je teraz zaktualizować, aby uzyskać dostęp do sejfu. W przypadku kontynuacji nastąpi wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie jedną godzinę." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatyczne rejestrowanie użytkowników do resetowania hasła" + "message": "Automatyczne rejestrowanie użytkowników" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Ta organizacja posługuje się zasadą, która automatycznie rejestruje użytkowników do resetowania hasła. Rejestracja umożliwia administratorom organizacji zmianę Twojego hasła głównego." @@ -1853,7 +1857,7 @@ "message": "Czas blokowania sejfu przekracza limit określony przez organizację." }, "vaultExportDisabled": { - "message": "Eksportowanie sejfu zostało wyłączone" + "message": "Eksport sejfu wyłączony" }, "personalVaultExportPolicyInEffect": { "message": "Co najmniej jedna zasada organizacji uniemożliwia wyeksportowanie Twojego sejfu." diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index fe9428998ab..0714076bbda 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -110,7 +110,7 @@ "message": "Não há credenciais disponíveis para autopreenchimento para a aba do navegador atual." }, "addLogin": { - "message": "Adicionar uma Credencial" + "message": "Adicionar um Login" }, "addItem": { "message": "Adicionar Item" @@ -261,10 +261,10 @@ "message": "Incluir Número" }, "minNumbers": { - "message": "Mínimo de Números" + "message": "Números Mínimos" }, "minSpecial": { - "message": "Mínimo Especial" + "message": "Especiais Mínimos" }, "avoidAmbChar": { "message": "Evitar Caracteres Ambíguos" @@ -491,7 +491,7 @@ "message": "Você pode alterar a sua senha mestra no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "twoStepLoginConfirmation": { - "message": "O login em duas etapas torna a sua conta mais segura ao exigir que você verifique seu login com outro dispositivo como uma chave de segurança, aplicativo de autenticação, SMS, ligação telefônica, ou e-mail. O login em duas etapas pode ser ativado no cofre web em bitwarden.com. Você deseja visitar o site agora?" + "message": "O login de duas etapas torna a sua conta mais segura ao exigir que digite um código de segurança de um aplicativo de autenticação quando for iniciar a sessão. O login de duas etapas pode ser ativado no cofre web bitwarden.com. Deseja visitar o site agora?" }, "editedFolder": { "message": "Pasta Editada" @@ -543,7 +543,7 @@ "message": "Você tem certeza que deseja enviar este item para a lixeira?" }, "deletedItem": { - "message": "Enviar item para lixeira" + "message": "Item excluído" }, "overwritePassword": { "message": "Sobrescrever Senha" @@ -762,10 +762,10 @@ "message": "Atualizar Assinatura" }, "premiumNotCurrentMember": { - "message": "Você não é um membro premium atualmente." + "message": "Você não é atualmente um membro premium." }, "premiumSignUpAndGet": { - "message": "Registre-se para uma assinatura premium e obtenha:" + "message": "Registe-se para uma assinatura premium e obtenha:" }, "ppremiumSignUpStorage": { "message": "1 GB de armazenamento de arquivos encriptados." @@ -873,7 +873,7 @@ "message": "Sessão Indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem a verificação em duas etapas ativado, no entanto, nenhum dos provedores de verificação em duas etapas configurados são suportados por este navegador web." + "message": "Esta conta tem a verificação de duas etapas ativado, no entanto, nenhum dos provedores de verificação de duas etapas configurados são suportados por este navegador web." }, "noTwoStepProviders2": { "message": "Por favor utilize um navegador web suportado (tal como o Chrome) e/ou inclua provedores adicionais que são melhor suportados entre navegadores web (tal como uma aplicativo de autenticação)." @@ -1130,7 +1130,7 @@ "message": "Nome do Meio" }, "lastName": { - "message": "Sobrenome" + "message": "Último Nome" }, "fullName": { "message": "Nome Completo" @@ -1142,7 +1142,7 @@ "message": "Empresa" }, "ssn": { - "message": "Cadastro de Pessoas Físicas (CPF)" + "message": "Número de Segurança Social" }, "passportNumber": { "message": "Número do Passaporte" @@ -1311,6 +1311,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Senha Atualizada", "description": "ex. Date this password was updated" @@ -1505,10 +1509,10 @@ "message": "Por favor, verifique se o aplicativo desktop mostra esta impressão digital: " }, "desktopIntegrationDisabledTitle": { - "message": "A integração com o navegador não está ativada" + "message": "A integração com o navegador não está habilitada" }, "desktopIntegrationDisabledDesc": { - "message": "A integração com o navegador não está ativada no aplicativo Bitwarden Desktop. Por favor, ative-a nas configurações do aplicativo desktop." + "message": "A integração com o navegador não está habilitada no aplicativo Bitwarden Desktop. Por favor, habilite-a nas configurações do aplicativo desktop." }, "startDesktopTitle": { "message": "Iniciar o aplicativo Bitwarden Desktop" @@ -1538,7 +1542,7 @@ "message": "Biometria não ativada" }, "biometricsNotEnabledDesc": { - "message": "A biometria com o navegador requer que a biometria de desktop seja ativada nas configurações primeiro." + "message": "A biometria com o navegador requer que a biometria de desktop seja habilitada nas configurações primeiro." }, "biometricsNotSupportedTitle": { "message": "Biometria não suportada" diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 43e2dfd7bda..93aed50622c 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -32,10 +32,10 @@ "message": "Submeter" }, "emailAddress": { - "message": "Endereço de email" + "message": "Endereço de Email" }, "masterPass": { - "message": "Palavra-passe mestra" + "message": "Palavra-passe Mestra" }, "masterPassDesc": { "message": "A palavra-passe mestra é a palavra-passe que utiliza para aceder ao seu cofre. É muito importante que não se esqueça da sua palavra-passe mestra. Não existe maneira de recuperar a palavra-passe no caso de a esquecer." @@ -44,10 +44,10 @@ "message": "Uma dica da palavra-passe mestra pode ajudar a lembrar-se da sua palavra-passe se a esquecer." }, "reTypeMasterPass": { - "message": "Reescreva a palavra-passe mestra" + "message": "Re-digite a palavra-passe mestra" }, "masterPassHint": { - "message": "Dica da palavra-passe mestra (opcional)" + "message": "Dica da Palavra-passe Mestra (opcional)" }, "tab": { "message": "Separador" @@ -56,7 +56,7 @@ "message": "Cofre" }, "myVault": { - "message": "Meu cofre" + "message": "O meu Cofre" }, "allVaults": { "message": "Todos os Cofres" @@ -68,10 +68,10 @@ "message": "Definições" }, "currentTab": { - "message": "Separador atual" + "message": "Separador Atual" }, "copyPassword": { - "message": "Copiar palavra-passe" + "message": "Copiar Palavra-passe" }, "copyNote": { "message": "Copiar nota" @@ -80,10 +80,10 @@ "message": "Copiar URI" }, "copyUsername": { - "message": "Copiar nome de utilizador" + "message": "Copiar Nome de Utilizador" }, "copyNumber": { - "message": "Copiar número" + "message": "Copiar Número" }, "copySecurityCode": { "message": "Copiar código de segurança" @@ -92,7 +92,7 @@ "message": "Auto-preencher" }, "generatePasswordCopied": { - "message": "Gerar palavra-passe (copiada)" + "message": "Gerar Palavra-passe (copiada)" }, "copyElementIdentifier": { "message": "Copiar nome do campo personalizado" @@ -113,7 +113,7 @@ "message": "Adicionar uma credencial" }, "addItem": { - "message": "Adicionar item" + "message": "Adicionar Item" }, "passwordHint": { "message": "Dica da palavra-passe" @@ -137,7 +137,7 @@ "message": "Código enviado" }, "verificationCode": { - "message": "Código de verificação" + "message": "Código de Verificação" }, "confirmIdentity": { "message": "Confirme a sua identidade para continuar." @@ -175,13 +175,13 @@ "message": "Mover" }, "addFolder": { - "message": "Adicionar pasta" + "message": "Adicionar Pasta" }, "name": { "message": "Nome" }, "editFolder": { - "message": "Editar pasta" + "message": "Editar Pasta" }, "deleteFolder": { "message": "Eliminar pasta" @@ -264,7 +264,7 @@ "message": "Números mínimos" }, "minSpecial": { - "message": "Especiais mínimos" + "message": "Especiais minímos" }, "avoidAmbChar": { "message": "Evitar caracteres ambíguos" @@ -309,7 +309,7 @@ "message": "Pasta" }, "deleteItem": { - "message": "Eliminar item" + "message": "Apagar item" }, "viewItem": { "message": "Ver item" @@ -723,7 +723,7 @@ "message": "Tem a certeza de que deseja eliminar este anexo?" }, "deletedAttachment": { - "message": "Anexo eliminado" + "message": "Anexo apagado" }, "newAttachment": { "message": "Adicionar novo anexo" @@ -1311,6 +1311,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Criado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Palavra-passe atualizada", "description": "ex. Date this password was updated" @@ -1514,10 +1518,10 @@ "message": "Iniciar a aplicação Bitwarden Desktop" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1672,7 +1676,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,7 +1808,7 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." @@ -1816,7 +1820,7 @@ "message": "Atualizar Senha Mestra" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { "message": "Inscrição Automática" @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1919,14 +1923,14 @@ "message": "Tipo de Nome de Utilizador" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1950,7 +1954,7 @@ "message": "Serviço" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "Chave da API" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Subscrição premium necessária" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "para voltar às definições predefinidas" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index aef801e1bb2..d8e719f6aac 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -17,10 +17,10 @@ "message": "Creare cont" }, "login": { - "message": "Autentificare" + "message": "Conectare" }, "enterpriseSingleSignOn": { - "message": "Conectare unică organizație (SSO)" + "message": "Conectare unică organizație" }, "cancel": { "message": "Anulare" @@ -98,7 +98,7 @@ "message": "Copiere nume de câmp personalizat" }, "noMatchingLogins": { - "message": "Nu există potrivire de autentificări." + "message": "Nu există potrivire de autentificări" }, "unlockVaultMenu": { "message": "Deblocați-vă seiful" @@ -282,7 +282,7 @@ "message": "Nu există niciun articol de afișat." }, "itemInformation": { - "message": "Informații de autentificare" + "message": "Informații despre articol" }, "username": { "message": "Nume utilizator" @@ -491,10 +491,10 @@ "message": "Puteți modifica parola principală în seiful web bitwarden.com. Doriți să vizitați saitul acum?" }, "twoStepLoginConfirmation": { - "message": "Autentificarea în două etape întărește siguranța contului dvs. prin solicitarea unei confirmări de autentificare cu un alt dispozitiv, cum ar fi: o cheie de securitate, o aplicație de autentificare, un SMS, un apel telefonic sau un e-mail. Autentificarea în două etape poate fi activată în seiful web bitwarden.com. Doriți să vizitați saitul acum?" + "message": "Autentificarea în două etape vă face contul mai sigur, prin solicitarea unei verificări de autentificare cu un alt dispozitiv, cum ar fi o cheie de securitate, o aplicație de autentificare, un SMS, un apel telefonic sau un e-mail. Autentificarea în două etape poate fi configurată în seiful web bitwarden.com. Doriți să vizitați site-ul web acum?" }, "editedFolder": { - "message": "Dosar editat" + "message": "Dosar salvat" }, "deleteFolderConfirmation": { "message": "Sigur doriți să ștergeți dosarul?" @@ -503,7 +503,7 @@ "message": "Dosar șters" }, "gettingStartedTutorial": { - "message": "Tutorial introductiv" + "message": "Tutorial de inițiere" }, "gettingStartedTutorialVideo": { "message": "Urmăriți tutorialul nostru pentru a afla cum să beneficiați cât mai mult de această extensie a browserului." @@ -537,22 +537,22 @@ "message": "Articol adăugat" }, "editedItem": { - "message": "Articol editat" + "message": "Articol salvat" }, "deleteItemConfirmation": { "message": "Sigur doriți să trimiteți în coșul de reciclare?" }, "deletedItem": { - "message": "Articolul a fost trimis în coșul de reciclare" + "message": "Articolul a fost trimis la gunoi" }, "overwritePassword": { - "message": "Modificare parolă" + "message": "Suprascriere parolă" }, "overwritePasswordConfirmation": { "message": "Sigur doriți să modificați parola curentă?" }, "overwriteUsername": { - "message": "Suprascrieți numele de utilizator" + "message": "Suprascriere nume de utilizator" }, "overwriteUsernameConfirmation": { "message": "Sunteți sigur că doriți să suprascrieți numele de utilizator curent?" @@ -705,7 +705,7 @@ "message": "Aflați mai multe" }, "authenticatorKeyTotp": { - "message": "Cheie autentificare (TOTP)" + "message": "Cheie de autentificare (TOTP)" }, "verificationCodeTotp": { "message": "Cod de verificare (TOTP)" @@ -732,19 +732,19 @@ "message": "Niciun atașament." }, "attachmentSaved": { - "message": "Atașamentul a fost salvat." + "message": "Atașamentul a fost salvat" }, "file": { "message": "Fișier" }, "selectFile": { - "message": "Selectare fișier." + "message": "Selectare fișier" }, "maxFileSize": { "message": "Mărimea maximă a fișierului este de 500 MB." }, "featureUnavailable": { - "message": "Caracteristică indisponibilă" + "message": "Funcție indisponibilă" }, "updateKey": { "message": "Nu puteți utiliza această caracteristică înainte de a actualiza cheia de criptare." @@ -783,13 +783,13 @@ "message": "Asistență prioritară pentru clienți." }, "ppremiumSignUpFuture": { - "message": "Toate caracteristicile Premium viitoare. Mai multe în curând!" + "message": "Toate funcțiile Premium viitoare. Mai multe în curând!" }, "premiumPurchase": { "message": "Achiziționare abonament Premium" }, "premiumPurchaseAlert": { - "message": "Puteți achiziționa un abonament premium pe saitul web bitwarden.com. Doriți să vizitați saitul acum?" + "message": "Puteți achiziționa un abonament Premium pe website-ul bitwarden.com. Doriți să vizitați site-ul acum?" }, "premiumCurrentMember": { "message": "Sunteți un membru Premium!" @@ -819,10 +819,10 @@ "message": "Solicitați date biometrice la pornire" }, "premiumRequired": { - "message": "Este necesară versiunea Premium" + "message": "Premium necesar" }, "premiumRequiredDesc": { - "message": "Este necesar statutul de membru Premium pentru a utiliza această caracteristică." + "message": "Pentru a utiliza această funcție este necesar un abonament Premium." }, "enterVerificationCodeApp": { "message": "Introducere cod de verificare din 6 cifre din aplicația de autentificare." @@ -870,10 +870,10 @@ "message": "Autentificare WebAuthn" }, "loginUnavailable": { - "message": "Conectare indisponibilă" + "message": "Autentificare indisponibilă" }, "noTwoStepProviders": { - "message": "Acest cont are activată autentificarea în două etape, dar niciunul dintre furnizorii configurați pentru aceasta nu este acceptat de acest browser web." + "message": "Acest cont are autentificarea în doi etape activată, dar niciunul dintre furnizorii în două etape configurați nu este acceptat de acest browser web." }, "noTwoStepProviders2": { "message": "Utilizați un browser acceptat (cum ar fi Chrome) și/sau adăugați furnizori suplimentari mai bine susținuți de browserele web (cum ar fi o aplicație de autentificare)." @@ -888,7 +888,7 @@ "message": "Cod de recuperare" }, "authenticatorAppTitle": { - "message": "Aplicație de autentificare" + "message": "Aplicația Authenticator" }, "authenticatorAppDesc": { "message": "Utilizați o aplicație de autentificare (cum ar fi Authy sau Google Authenticator) pentru a genera codurile de verificare bazate pe timp.", @@ -921,7 +921,7 @@ "message": "Codurile de verificare vor fi trimise prin e-mail." }, "selfHostedEnvironment": { - "message": "Mediu de găzduire personal" + "message": "Mediu autogăzduit" }, "selfHostedEnvironmentFooter": { "message": "Specificați URL-ul de bază al implementări Bitwarden găzduită local." @@ -939,7 +939,7 @@ "message": "URL server API" }, "webVaultUrl": { - "message": "URL server seif Web" + "message": "URL server seif web" }, "identityUrl": { "message": "URL server de identificare" @@ -948,10 +948,10 @@ "message": "URL server de notificări" }, "iconsUrl": { - "message": "URL server de iconuri" + "message": "URL server de pictograme" }, "environmentSaved": { - "message": "URL-urile mediului au fost salvate." + "message": "URL-urile mediului au fost salvate" }, "enableAutoFillOnPageLoad": { "message": "Completare automată la încărcarea paginii" @@ -969,7 +969,7 @@ "message": "Puteți dezactiva completarea automată la încărcarea paginii pentru elementele de autentificare individuale din vizualizarea Editare element." }, "itemAutoFillOnPageLoad": { - "message": "Completare automată la încărcarea paginii (dacă este activată în Opțiuni)" + "message": "Completare automată la încărcarea paginii (dacă este configurată în Opțiuni)" }, "autoFillOnPageLoadUseDefault": { "message": "Utilizați setarea implicită" @@ -1049,7 +1049,7 @@ "message": "Indică numărul de autentificări pe care le aveți pentru pagina web curentă." }, "cardholderName": { - "message": "Deținător card" + "message": "Numele titularului cardului" }, "number": { "message": "Număr card" @@ -1103,7 +1103,7 @@ "message": "decembrie" }, "securityCode": { - "message": "Cod de securitate (CVV/CVC)" + "message": "Cod de securitate" }, "ex": { "message": "ex." @@ -1136,19 +1136,19 @@ "message": "Numele complet" }, "identityName": { - "message": "Identitate" + "message": "Numele identității" }, "company": { "message": "Companie" }, "ssn": { - "message": "Cod Numeric Personal" + "message": "Numărul de securitate socială" }, "passportNumber": { - "message": "Număr CI / Pașaport" + "message": "Numărul de pașaport" }, "licenseNumber": { - "message": "Număr licență" + "message": "Numărul de licență" }, "email": { "message": "E-mail" @@ -1190,7 +1190,7 @@ "message": "Conectări" }, "typeSecureNote": { - "message": "Notă protejată" + "message": "Notă securizată" }, "typeCard": { "message": "Card" @@ -1226,7 +1226,7 @@ "message": "Conectări" }, "secureNotes": { - "message": "Note protejate" + "message": "Note securizate" }, "clear": { "message": "Ștergere", @@ -1278,7 +1278,7 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Activare/dezactivare opțiuni" + "message": "Comutare opțiuni" }, "toggleCurrentUris": { "message": "Comutare URI-uri curente", @@ -1296,7 +1296,7 @@ "message": "Tipuri" }, "allItems": { - "message": "Toate elementele" + "message": "Toate articolele" }, "noPasswordsInList": { "message": "Nicio parolă de afișat." @@ -1311,6 +1311,10 @@ "message": "S-a actualizat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creată", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parola s-a actualizat", "description": "ex. Date this password was updated" @@ -1371,7 +1375,7 @@ "message": "Se așteaptă confirmarea de la desktop" }, "awaitDesktopDesc": { - "message": "Vă rugăm să confirmați utilizarea biometriei în aplicația Bitwarden Desktop pentru a activa biometria pentru browser." + "message": "Confirmați utilizarea datelor biometrice în aplicația desktop Bitwarden pentru a configura datele biometrice pentru browser." }, "lockWithMasterPassOnRestart": { "message": "Blocare cu parola principală la repornirea browserului" @@ -1403,13 +1407,13 @@ "message": "Căutare în coșul de reciclare" }, "permanentlyDeleteItem": { - "message": "Ștergere definitivă a articolului" + "message": "Ștergerea permanentă a articolului" }, "permanentlyDeleteItemConfirmation": { "message": "Sigur doriți să ștergeți definitiv acest articol?" }, "permanentlyDeletedItem": { - "message": "Articolul a fost șters definitiv" + "message": "Articol șters permanent" }, "restoreItem": { "message": "Restabilire articol" @@ -1427,13 +1431,13 @@ "message": "Confirmare acțiune la expirare" }, "autoFillAndSave": { - "message": "Auto-completare și Salvare" + "message": "Completare automată și salvare" }, "autoFillSuccessAndSavedUri": { - "message": "Articolul s-a completat automat și URl-ul s-a salvat" + "message": "Articol completat automat și URI salvat" }, "autoFillSuccess": { - "message": "Articolul s-a completat automat" + "message": "Articolul s-a completat automat " }, "setMasterPassword": { "message": "Setare parolă principală" @@ -1505,19 +1509,19 @@ "message": "Verificați dacă aplicația desktop afișează această amprentă digitală:" }, "desktopIntegrationDisabledTitle": { - "message": "Integrarea browserului nu este activată" + "message": "Integrarea browserului nu este configurată" }, "desktopIntegrationDisabledDesc": { - "message": "Integrarea browserului nu este activată în aplicația Bitwarden Desktop. Vă rugăm să o activați în setările din aplicația desktop." + "message": "Integrarea browserului nu este configurată în aplicația desktop Bitwarden. Configurați-o în setările din aplicația desktop." }, "startDesktopTitle": { - "message": "Porniți aplicația Bitwarden Desktop" + "message": "Porniți aplicația desktop Bitwarden" }, "startDesktopDesc": { "message": "Aplicația Bitwarden Desktop trebuie să fie pornită înainte de a putea fi utilizată deblocarea cu date biometrice." }, "errorEnableBiometricTitle": { - "message": "Nu se poate activa biometria" + "message": "Nu se pot configura datele biometrice" }, "errorEnableBiometricDesc": { "message": "Acțiunea a fost anulată de aplicația desktop" @@ -1535,10 +1539,10 @@ "message": "Eroare de cont" }, "biometricsNotEnabledTitle": { - "message": "Biometria nu a fost activată" + "message": "Datele biometrice nu sunt configurate" }, "biometricsNotEnabledDesc": { - "message": "Biometria browserului necesită activarea mai întâi a biometriei de pe desktop în setări." + "message": "Biometria browserului necesită ca biometria desktopului să fie mai întâi configurată în setări." }, "biometricsNotSupportedTitle": { "message": "Biometria nu este acceptată" @@ -1559,7 +1563,7 @@ "message": "Această acțiune nu se poate efectua în bara laterală, vă rugăm să reîncercați acțiunea în fereastra pop-up sau popup." }, "personalOwnershipSubmitError": { - "message": "Datorită unei politici pentru întreprinderi, vă este restricționată salvarea de elemente în seiful dvs. personal. Schimbați opțiunea de proprietate la o organizație și alegeți dintre colecțiile disponibile." + "message": "Datorită unei politici de întreprindere, nu puteți salva articole în seiful personal. Modificați opțiunea Proprietate la o organizație și alegeți dintre colecțiile disponibile." }, "personalOwnershipPolicyInEffect": { "message": "O politică de organizație vă afectează opțiunile de proprietate." @@ -1625,10 +1629,10 @@ "message": "Ștergere" }, "removedPassword": { - "message": "Parola a fost eliminată" + "message": "Parolă înlăturată" }, "deletedSend": { - "message": "Send-ul a fost șters", + "message": "Send șters", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1709,7 +1713,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Dezactivează acest Send astfel încât nimeni să nu-l poată accesa.", + "message": "Dezactivați acest Send pentru ca nimeni să nu-l poată accesa.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Număr actual de accesări" + "message": "Numărul actual de accesări" }, "createSend": { - "message": "Creare de nou Send", + "message": "Nou Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Parolă nouă" }, "sendDisabled": { - "message": "Send dezactivat", + "message": "Send înlăturat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1746,7 +1750,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send editat", + "message": "Send salvat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "Această acțiune este protejată. Pentru a continua, vă rugăm să reintroduceți parola principală pentru a vă verifica identitatea." }, "emailVerificationRequired": { - "message": "Este necesară verificarea adresei de e-mail" + "message": "Verificare e-mail necesară" }, "emailVerificationRequiredDesc": { "message": "Trebuie să vă verificați e-mailul pentru a utiliza această caracteristică. Puteți verifica e-mailul în seiful web." }, "updatedMasterPassword": { - "message": "Parolă principală actualizată" + "message": "Parola principală actualizată" }, "updateMasterPassword": { "message": "Actualizare parolă principală" }, "updateMasterPasswordWarning": { - "message": "Parola dvs. principală a fost modificată recent de unul din administratorii organizației dvs. Pentru a accesa seiful, trebuie să o actualizați acum. Procedura vă va deconecta de la sesiunea curentă, necesitând să vă reconectați. Sesiunile active de pe alte dispozitive pot continua să rămână active timp de până la o oră." + "message": "Parola principală a fost schimbată recent de către un administrator din organizație. Pentru a accesa seiful, trebuie să o actualizați acum. Continuarea vă va deconecta de la sesiunea curentă, cerându-vă să vă conectați din nou. Sesiunile active de pe alte dispozitive pot continua să rămână active timp de până la o oră." }, "resetPasswordPolicyAutoEnroll": { - "message": "Înregistrare automată" + "message": "Înscrierea automată" }, "resetPasswordAutoEnrollInviteWarning": { "message": "Această organizație are o politică de întreprindere care vă va înregistra automat la resetarea parolei. Înregistrarea va permite administratorilor organizației să vă modifice parola principală." @@ -1853,10 +1857,10 @@ "message": "Timpul de expirare al seifului depășește restricțiile stabilite de organizația dvs." }, "vaultExportDisabled": { - "message": "Export de seif dezactivat" + "message": "Exportul de seif indisponibil" }, "personalVaultExportPolicyInEffect": { - "message": "Una sau mai multe politici ale organizației vă împiedică să exportați seiful personal." + "message": "Una sau mai multe politici de organizație vă împiedică să vă exportați seiful individual." }, "copyCustomFieldNameInvalidElement": { "message": "Imposibil de identificat un element de formular valid. Încercați să inspectați codul HTML." @@ -1865,7 +1869,7 @@ "message": "Nu a fost găsit niciun identificator unic." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ folosește SSO cu un server de chei auto-găzduit. Membrii acestei organizații nu mai au nevoie de o parolă principală pentru autentificare.", + "message": "$ORGANIZATION$ folosește SSO cu un server de chei autogăzduit. Membrii acestei organizații nu mai au nevoie de o parolă principală pentru autentificare.", "placeholders": { "organization": { "content": "$1", @@ -1877,10 +1881,10 @@ "message": "Părăsire organizație" }, "removeMasterPassword": { - "message": "Eliminare parolă principală" + "message": "Înlăturare parolă principală" }, "removedMasterPassword": { - "message": "Parolă principală eliminată." + "message": "Parola principală înlăturată" }, "leaveOrganizationConfirmation": { "message": "Sigur doriți să părăsiți această organizație?" @@ -1895,10 +1899,10 @@ "message": "Sesiunea dvs. a expirat. Vă rugăm reveniți și încercați să vă autentificați din nou." }, "exportingPersonalVaultTitle": { - "message": "Exportarea seifului personal" + "message": "Exportul seifului individual" }, "exportingPersonalVaultDescription": { - "message": "Numai elementele personale din seif asociate cu $EMAIL$ vor fi exportate. Elementele seifului organizației nu vor fi incluse.", + "message": "Numai articolele de seif individuale asociate cu $EMAIL$ vor fi exportate. Articolele de seif ale organizației nu vor fi incluse.", "placeholders": { "email": { "content": "$1", @@ -1919,7 +1923,7 @@ "message": "Tip de nume de utilizator" }, "plusAddressedEmail": { - "message": "Plus e-mail adresat", + "message": "E-mail Plus adresat", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { @@ -1938,7 +1942,7 @@ "message": "Cuvânt aleatoriu" }, "websiteName": { - "message": "Numele site-ului web" + "message": "Nume website" }, "whatWouldYouLikeToGenerate": { "message": "Ce doriți să generați?" @@ -1966,16 +1970,16 @@ "message": "Cheie API" }, "ssoKeyConnectorError": { - "message": "Eroare de Conector Cheie: asigurați-vă că aveți conectorul Cheie disponibil și că funcționează corect." + "message": "Eroare de conector cheie: verificați dacă acesta este disponibil și funcționează corect." }, "premiumSubcriptionRequired": { "message": "Este necesar un abonament Premium" }, "organizationIsDisabled": { - "message": "Organizația este dezactivată." + "message": "Organizație suspendată." }, "disabledOrganizationFilterError": { - "message": "Articolele din Organizațiile dezactivate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." + "message": "Articolele din Organizații suspendate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." }, "cardBrandMir": { "message": "Mir" @@ -2002,7 +2006,7 @@ "message": "Versiune server" }, "selfHosted": { - "message": "Auto-găzduit" + "message": "Autogăzduit" }, "thirdParty": { "message": "Parte terță" diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 53814e19891..72b3150d4ef 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -309,7 +309,7 @@ "message": "Папка" }, "deleteItem": { - "message": "Удалить элемент" + "message": "Удаление элемента" }, "viewItem": { "message": "Просмотр элемента" @@ -494,7 +494,7 @@ "message": "Двухфакторная аутентификация делает ваш аккаунт более защищенным, требуя подтверждения входа на другом устройстве, например, ключом безопасности, приложением-аутентификатором, SMS, телефонным звонком или письмом. Двухфакторная аутентификация включается на bitwarden.com. Перейти на сайт сейчас?" }, "editedFolder": { - "message": "Папка отредактирована" + "message": "Папка сохранена" }, "deleteFolderConfirmation": { "message": "Удалить эту папку?" @@ -503,7 +503,7 @@ "message": "Папка удалена" }, "gettingStartedTutorial": { - "message": "Учебник по началу работы" + "message": "Гид по bitwarden" }, "gettingStartedTutorialVideo": { "message": "Посмотрите небольшой обучающий материал, чтобы узнать, как получить максимальную отдачу от расширения браузера." @@ -537,7 +537,7 @@ "message": "Элемент добавлен" }, "editedItem": { - "message": "Элемент изменен" + "message": "Элемент сохранен" }, "deleteItemConfirmation": { "message": "Вы действительно хотите отправить в корзину?" @@ -723,7 +723,7 @@ "message": "Вы действительно хотите удалить это вложение?" }, "deletedAttachment": { - "message": "Вложение удалено" + "message": "Удаленное вложение" }, "newAttachment": { "message": "Добавить новое вложение" @@ -753,19 +753,19 @@ "message": "Премиум" }, "premiumManage": { - "message": "Управление Премиум" + "message": "Управление статусом" }, "premiumManageAlert": { "message": "Вы можете управлять Премиум на bitwarden.com. Перейти на сайт сейчас?" }, "premiumRefresh": { - "message": "Обновить Премиум" + "message": "Обновить статус" }, "premiumNotCurrentMember": { - "message": "На текущий момент у вас отсутствует Премиум." + "message": "Сейчас вы не Премиум-участник." }, "premiumSignUpAndGet": { - "message": "Подпишитесь на Премиум и получите:" + "message": "Подпишитесь на премиум-статус и получите:" }, "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованного хранилища для вложенных файлов." @@ -783,16 +783,16 @@ "message": "Приоритетная поддержка." }, "ppremiumSignUpFuture": { - "message": "Все будущие функции Премиум. Их будет больше!" + "message": "Все будущие функции премиум-статуса. Их будет больше!" }, "premiumPurchase": { "message": "Купить Премиум" }, "premiumPurchaseAlert": { - "message": "Вы можете купить Премиум на bitwarden.com. Перейти на сайт сейчас?" + "message": "Вы можете купить премиум-статус на bitwarden.com. Перейти на сайт сейчас?" }, "premiumCurrentMember": { - "message": "У вас есть Премиум!" + "message": "У вас премиум-статус!" }, "premiumCurrentMemberThanks": { "message": "Благодарим вас за поддержку Bitwarden." @@ -819,7 +819,7 @@ "message": "Запрашивать биометрию при запуске" }, "premiumRequired": { - "message": "Необходим Премиум" + "message": "Требуется Премиум" }, "premiumRequiredDesc": { "message": "Для использования этой функции необходим Премиум." @@ -873,13 +873,13 @@ "message": "Вход недоступен" }, "noTwoStepProviders": { - "message": "У этой учетной записи включена двухфакторная аутентификация, однако ни один из настроенных вариантов не поддерживается этим веб-браузером." + "message": "У аккаунта включена двухэтапная аутентификация, но ни один из настроенных вариантов не поддерживается этим веб-браузером." }, "noTwoStepProviders2": { "message": "Используйте поддерживаемый веб-браузер (например, Chrome) и/или добавьте дополнительные варианты аутентификации, которые поддерживаются в веб-браузерах (например, приложение-аутентификатор)." }, "twoStepOptions": { - "message": "Настройки двухфакторной аутентификации" + "message": "Настройки двухэтапной аутентификации" }, "recoveryCodeDesc": { "message": "Потеряли доступ ко всем вариантам двухфакторной аутентификации? Используйте код восстановления, чтобы отключить двухфакторную аутентификацию для вашей учетной записи." @@ -1278,7 +1278,7 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Переключить настройки" + "message": "Настройки перебора" }, "toggleCurrentUris": { "message": "Переключить текущий URI", @@ -1311,6 +1311,10 @@ "message": "Обновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Создан", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль обновлен", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 36e072746b8..e12ddce1f19 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -59,7 +59,7 @@ "message": "මගේ සුරක්ෂිතාගාරය" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "මෙවලම්" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "වචන ගණන" @@ -552,7 +552,7 @@ "message": "ඔබට වත්මන් මුරපදය නැවත ලිවීමට අවශ්ය බව ඔබට විශ්වාසද?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -1311,6 +1311,10 @@ "message": "යාවත්කාලීන", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "මුරපදය යාවත්කාලීන කිරීම", "description": "ex. Date this password was updated" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index e699eaf3ffd..b7c2cc79d84 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -20,7 +20,7 @@ "message": "Prihlásiť sa" }, "enterpriseSingleSignOn": { - "message": "Prihlásenie cez prihlasovací formulár spoločnosti (SSO)" + "message": "Jednotné prihlásenie pre podniky (SSO)" }, "cancel": { "message": "Zrušiť" @@ -309,7 +309,7 @@ "message": "Priečinok" }, "deleteItem": { - "message": "Zmazať položku" + "message": "Odstrániť položku" }, "viewItem": { "message": "Zobraziť položku" @@ -534,16 +534,16 @@ "message": "Nové URI" }, "addedItem": { - "message": "Položka pridaná" + "message": "Pridaná položka" }, "editedItem": { - "message": "Položka upravená" + "message": "Upravená položka" }, "deleteItemConfirmation": { "message": "Naozaj chcete odstrániť túto položku?" }, "deletedItem": { - "message": "Položka odstránená do koša" + "message": "Odstránená položka" }, "overwritePassword": { "message": "Prepísať heslo" @@ -1311,6 +1311,10 @@ "message": "Aktualizované", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Vytvorené", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bolo aktualizované", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index da47adc01b3..2624b26293a 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -59,7 +59,7 @@ "message": "Moj trezor" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Orodja" @@ -95,7 +95,7 @@ "message": "Generiraj geslo (kopirano)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "Nobenih ujemajočih prijav." @@ -131,10 +131,10 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { "message": "Verifikacijska koda" @@ -245,7 +245,7 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { "message": "Število besed" @@ -339,7 +339,7 @@ "message": "Vaš spletni brskalnik ne podpira enostavno kopiranje odložišča. Kopirajte ročno." }, "verifyIdentity": { - "message": "Verify Identity" + "message": "Verify identity" }, "yourVaultIsLocked": { "message": "Vaš trezor je zaklenjen. Potrdite vaše glavno geslo za nadaljevanje." @@ -491,7 +491,7 @@ "message": "Svoje glavno geslo lahko spremenite v bitwarden.com spletnem trezorju. Želite obiskati spletno stran zdaj?" }, "twoStepLoginConfirmation": { - "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" }, "editedFolder": { "message": "Urejena mapa" @@ -503,7 +503,7 @@ "message": "Izbrisana mapa" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "Getting started tutorial" }, "gettingStartedTutorialVideo": { "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." @@ -552,7 +552,7 @@ "message": "Ali ste prepričani, da želite prepisati vaše trenutno geslo?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "Deli" @@ -879,10 +879,10 @@ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { "message": "Koda za obnovitev" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "E-pošta" @@ -921,13 +921,13 @@ "message": "Potrditvene kode vam bodo posredovane po e-pošti." }, "selfHostedEnvironment": { - "message": "Self-hosted Environment" + "message": "Self-hosted environment" }, "selfHostedEnvironmentFooter": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom Environment" + "message": "Custom environment" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -939,19 +939,19 @@ "message": "URL naslov API strežnika" }, "webVaultUrl": { - "message": "Web Vault Server URL" + "message": "Web vault server URL" }, "identityUrl": { - "message": "Identity Server URL" + "message": "Identity server URL" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "Notifications server URL" }, "iconsUrl": { - "message": "Icons Server URL" + "message": "Icons server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Auto-fill on page load" @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Uporabi privzete nastavitve" @@ -999,16 +999,16 @@ "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "copyValue": { - "message": "Copy Value" + "message": "Copy value" }, "value": { "message": "Value" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "dragToSort": { "message": "Drag to sort" @@ -1133,7 +1133,7 @@ "message": "Priimek" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "Ime identitete" @@ -1190,7 +1190,7 @@ "message": "Prijave" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeCard": { "message": "Card" @@ -1199,7 +1199,7 @@ "message": "Identity" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "back": { "message": "Back" @@ -1226,7 +1226,7 @@ "message": "Prijave" }, "secureNotes": { - "message": "Secure Notes" + "message": "Secure notes" }, "clear": { "message": "Počisti", @@ -1270,7 +1270,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -1278,10 +1278,10 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Toggle Options" + "message": "Toggle options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1296,7 +1296,7 @@ "message": "Types" }, "allItems": { - "message": "All Items" + "message": "All items" }, "noPasswordsInList": { "message": "There are no passwords to list." @@ -1311,8 +1311,12 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,40 +1407,40 @@ "message": "Search trash" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "masterPasswordPolicyInEffect": { "message": "One or more organization policies require your master password to meet the following requirements:" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1625,10 +1629,10 @@ "message": "Delete" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index ab2033e54f0..459ffad893d 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -1311,6 +1311,10 @@ "message": "Промењено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Лозинка ажурирана", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index eb8eff77062..31ea1f7e23e 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -44,7 +44,7 @@ "message": "En huvudlösenordsledtråd kan hjälpa dig att komma ihåg ditt lösenord om du glömmer bort det." }, "reTypeMasterPass": { - "message": "Ange huvudlösenordet igen" + "message": "Skriv in huvudlösenordet igen" }, "masterPassHint": { "message": "Huvudlösenordsledtråd (frivillig)" @@ -92,7 +92,7 @@ "message": "Fyll i automatiskt" }, "generatePasswordCopied": { - "message": "Skapa lösenord (kopierad)" + "message": "Skapa lösenord (kopieras)" }, "copyElementIdentifier": { "message": "Kopiera anpassat fältnamn" @@ -175,7 +175,7 @@ "message": "Flytta" }, "addFolder": { - "message": "Skapa mapp" + "message": "Lägg till mapp" }, "name": { "message": "Namn" @@ -251,7 +251,7 @@ "message": "Antal ord" }, "wordSeparator": { - "message": "Ordseparator" + "message": "Ordavgränsare" }, "capitalize": { "message": "Versalisera", @@ -261,13 +261,13 @@ "message": "Inkludera siffra" }, "minNumbers": { - "message": "Minst antal nummer" + "message": "Minsta antal siffror" }, "minSpecial": { - "message": "Minst antal speciella tecken" + "message": "Minsta antal specialtecken" }, "avoidAmbChar": { - "message": "Undvik mångtydiga tecken" + "message": "Undvik tvetydiga tecken" }, "searchVault": { "message": "Sök i valvet" @@ -482,7 +482,7 @@ "message": "Namn krävs." }, "addedFolder": { - "message": "Skapade mapp" + "message": "Lade till mapp" }, "changeMasterPass": { "message": "Ändra huvudlösenord" @@ -491,16 +491,16 @@ "message": "Du kan ändra ditt huvudlösenord på bitwardens webbvalv. Vill du besöka webbplatsen nu?" }, "twoStepLoginConfirmation": { - "message": "Tvåstegsverifiering gör ditt konto säkrare genom att kräva att du verifierar din inloggning med en annan enhet, till exempel genom en säkerhetsnyckel, autentiseringsapp, SMS, telefonsamtal eller mejl. Tvåstegsverifiering kan aktiveras på bitwardens webbvalv. Vill du besöka webbplatsen nu?" + "message": "Tvåstegsverifiering gör ditt konto säkrare genom att kräva att du verifierar din inloggning med en annan enhet, t.ex. en säkerhetsnyckel, autentiseringsapp, SMS, telefonsamtal eller e-post. Tvåstegsverifiering kan aktiveras i Bitwardens webbvalv. Vill du besöka webbplatsen nu?" }, "editedFolder": { - "message": "Ändrade mapp" + "message": "Redigerade mapp" }, "deleteFolderConfirmation": { "message": "Är du säker på att du vill ta bort den här mappen?" }, "deletedFolder": { - "message": "Tog bort mapp" + "message": "Raderade mapp" }, "gettingStartedTutorial": { "message": "Komma igång - Handledning" @@ -534,10 +534,10 @@ "message": "Ny URI" }, "addedItem": { - "message": "Skapade objekt" + "message": "Lade till objekt" }, "editedItem": { - "message": "Ändrade objekt" + "message": "Redigerade objekt" }, "deleteItemConfirmation": { "message": "Är du säker på att du vill radera detta objekt?" @@ -723,16 +723,16 @@ "message": "Är du säker på att du vill ta bort bilagan?" }, "deletedAttachment": { - "message": "Tog bort bilaga" + "message": "Raderade bilaga" }, "newAttachment": { - "message": "Bifoga ny fil" + "message": "Lägg till ny bilaga" }, "noAttachments": { "message": "Inga bilagor." }, "attachmentSaved": { - "message": "Den bifogade filen har sparats." + "message": "Bilagan har sparats." }, "file": { "message": "Fil" @@ -744,7 +744,7 @@ "message": "Filen får vara maximalt 500 MB." }, "featureUnavailable": { - "message": "Funktionen är inte tillgänglig" + "message": "Funktion ej tillgänglig" }, "updateKey": { "message": "Du kan inte använda denna funktion förrän du uppdaterar din krypteringsnyckel." @@ -789,7 +789,7 @@ "message": "Köp Premium" }, "premiumPurchaseAlert": { - "message": "Du kan köpa premium-medlemskap på bitwardens webbvalv. Vill du besöka webbplatsen nu?" + "message": "Du kan köpa premium-medlemskap i Bitwardens webbvalv. Vill du besöka webbplatsen nu?" }, "premiumCurrentMember": { "message": "Du är en premium-medlem!" @@ -870,10 +870,10 @@ "message": "Autentisera WebAuthn" }, "loginUnavailable": { - "message": "Inloggning inte tillgänglig" + "message": "Inloggning ej tillgänglig" }, "noTwoStepProviders": { - "message": "Detta konto har tvåstegsverifiering aktiverat, men inget av de aktiverade alternativen stöds av den här webbläsaren." + "message": "Detta konto har tvåstegsverifiering aktiverat, men ingen av de konfigurerade metoderna stöds av den här webbläsaren." }, "noTwoStepProviders2": { "message": "Vänligen använd en webbläsare som stöds (till exempel Chrome) och/eller lägg till fler alternativ som stöds bättre över webbläsare (till exempel en autentiseringsapp)." @@ -882,7 +882,7 @@ "message": "Alternativ för tvåstegsverifiering" }, "recoveryCodeDesc": { - "message": "Förlorat åtkomst till alla dina tvåstegsverifierings-alternativ? Använd din återställningskod för att inaktivera tvåstegsverifiering på ditt konto." + "message": "Förlorat åtkomst till alla dina metoder för tvåstegsverifiering? Använd din återställningskod för att inaktivera tvåstegsverifiering på ditt konto." }, "recoveryCodeTitle": { "message": "Återställningskod" @@ -939,19 +939,19 @@ "message": "API server-URL" }, "webVaultUrl": { - "message": "Webbvalv server-URL" + "message": "Webbvalvsserver-URL" }, "identityUrl": { "message": "Identitetsserver-URL" }, "notificationsUrl": { - "message": "URL för notifieringsserver" + "message": "Aviseringsserver-URL" }, "iconsUrl": { - "message": "Ikoner Server-URL" + "message": "Ikonserver-URL" }, "environmentSaved": { - "message": "Miljö-URL:er har sparats." + "message": "Miljö-URL:erna har sparats." }, "enableAutoFillOnPageLoad": { "message": "Aktivera automatisk ifyllnad vid sidhämtning" @@ -1058,10 +1058,10 @@ "message": "Märke" }, "expirationMonth": { - "message": "Förfallomånad" + "message": "Utgångsmånad" }, "expirationYear": { - "message": "Förfalloår" + "message": "Utgångsår" }, "expiration": { "message": "Utgång" @@ -1148,7 +1148,7 @@ "message": "Passnummer" }, "licenseNumber": { - "message": "Licensnummer" + "message": "Körkortsnummer" }, "email": { "message": "E-post" @@ -1311,8 +1311,12 @@ "message": "Uppdaterad", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Skapad", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Lösenord uppdaterat", + "message": "Lösenordet uppdaterades", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1628,7 +1632,7 @@ "message": "Tog bort lösenord" }, "deletedSend": { - "message": "Raderade Send", + "message": "Raderad Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 7c1851aefd1..610e6a1950f 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -59,7 +59,7 @@ "message": "My Vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "เครื่องมือ" @@ -95,7 +95,7 @@ "message": "Generate Password (copied)" }, "copyElementIdentifier": { - "message": "Copy Custom Field Name" + "message": "Copy custom field name" }, "noMatchingLogins": { "message": "ไม่พบข้อมูลล็อกอินที่ตรงกัน" @@ -552,7 +552,7 @@ "message": "คุณต้องการเขียนทับรหัสผ่านปัจจุบันใช่หรือไม่?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -656,7 +656,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -680,7 +680,7 @@ "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?" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "share": { "message": "แชร์" @@ -762,10 +762,10 @@ "message": "Refresh Membership" }, "premiumNotCurrentMember": { - "message": "You are not currently a premium member." + "message": "You are not currently a Premium member." }, "premiumSignUpAndGet": { - "message": "Sign up for a premium membership and get:" + "message": "Sign up for a Premium membership and get:" }, "ppremiumSignUpStorage": { "message": "1 GB of encrypted file storage." @@ -783,16 +783,16 @@ "message": "Priority customer support." }, "ppremiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPurchase": { "message": "Purchase Premium" }, "premiumPurchaseAlert": { - "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumCurrentMember": { - "message": "You are a premium member!" + "message": "You are a Premium member!" }, "premiumCurrentMemberThanks": { "message": "Thank you for supporting bitwarden." @@ -822,7 +822,7 @@ "message": "Premium Required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "enterVerificationCodeApp": { "message": "Enter the 6 digit verification code from your authenticator app." @@ -882,7 +882,7 @@ "message": "Two-step Login Options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { "message": "Recovery Code" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "อีเมล" @@ -951,7 +951,7 @@ "message": "Icons Server URL" }, "environmentSaved": { - "message": "The environment URLs have been saved." + "message": "Environment URLs saved" }, "enableAutoFillOnPageLoad": { "message": "Enable Auto-fill On Page Load." @@ -969,7 +969,7 @@ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." }, "itemAutoFillOnPageLoad": { - "message": "Auto-fill on page load (if enabled in Options)" + "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { "message": "Use default setting" @@ -1133,7 +1133,7 @@ "message": "Last Name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "identityName": { "message": "Identity Name" @@ -1281,7 +1281,7 @@ "message": "Toggle Options" }, "toggleCurrentUris": { - "message": "Toggle Current URIs", + "message": "Toggle current URIs", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -1311,6 +1311,10 @@ "message": "อัปเดตแล้ว", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "อัปเดต Password แล้ว", "description": "ex. Date this password was updated" @@ -1371,7 +1375,7 @@ "message": "Awaiting confirmation from desktop" }, "awaitDesktopDesc": { - "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser." + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." }, "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" @@ -1380,7 +1384,7 @@ "message": "You must select at least one collection." }, "cloneItem": { - "message": "Clone Item" + "message": "Clone item" }, "clone": { "message": "Clone" @@ -1403,37 +1407,37 @@ "message": "ค้นหาในถังขยะ" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "autoFillAndSave": { - "message": "Auto-fill and Save" + "message": "Auto-fill and save" }, "autoFillSuccessAndSavedUri": { - "message": "Auto-filled Item and Saved URI" + "message": "Item auto-filled and URI saved" }, "autoFillSuccess": { - "message": "Auto-filled Item" + "message": "Item auto-filled " }, "setMasterPassword": { "message": "ตั้งรหัสผ่านหลัก" @@ -1505,19 +1509,19 @@ "message": "Please verify that the desktop application shows this fingerprint: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not enabled" + "message": "Browser integration is not set up" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { - "message": "Start the Bitwarden Desktop application" + "message": "Start the Bitwarden desktop application" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { - "message": "Unable to enable biometrics" + "message": "Unable to set up biometrics" }, "errorEnableBiometricDesc": { "message": "Action was canceled by the desktop application" @@ -1535,10 +1539,10 @@ "message": "Account missmatch" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not enabled" + "message": "Biometrics not set up" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Biometrics not supported" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1665,14 +1669,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,17 +1728,17 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New 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": "New password" }, "sendDisabled": { - "message": "Send Disabled", + "message": "Send removed", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "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 created", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,22 +1808,22 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Updated master password" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1853,10 +1857,10 @@ "message": "Your vault timeout exceeds the restrictions set by your organization." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export unavailable" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "leaveOrganizationConfirmation": { "message": "Are you sure you want to leave this organization?" @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "API Key" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "to reset to pre-configured settings" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 3e79a9e586d..47bebf604ed 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -14,10 +14,10 @@ "message": "Güvenli kasanıza ulaşmak için giriş yapın veya yeni bir hesap oluşturun." }, "createAccount": { - "message": "Hesap oluştur" + "message": "Hesap Oluştur" }, "login": { - "message": "Giriş yap" + "message": "Giriş Yap" }, "enterpriseSingleSignOn": { "message": "Kurumsal tek oturum açma (SSO)" @@ -32,10 +32,10 @@ "message": "Gönder" }, "emailAddress": { - "message": "E-posta adresi" + "message": "E-posta Adresi" }, "masterPass": { - "message": "Ana parola" + "message": "Ana Parola" }, "masterPassDesc": { "message": "Ana parola, kasanıza ulaşmak için kullanacağınız paroladır. Ana parolanızı unutmamanız çok önemlidir. Unutursanız parolalarınızı asla kurtaramazsınız." @@ -44,7 +44,7 @@ "message": "Ana parolanızı unutursanız bu ipucuna bakınca size ana parolanızı hatırlatacak bir şey yazabilirsiniz." }, "reTypeMasterPass": { - "message": "Ana parolayı tekrar yazın" + "message": "Ana Parolayı Tekrar Yazın" }, "masterPassHint": { "message": "Ana Parola İpucu (isteğe bağlı)" @@ -68,10 +68,10 @@ "message": "Ayarlar" }, "currentTab": { - "message": "Geçerli sekme" + "message": "Mevcut Sekme" }, "copyPassword": { - "message": "Parolayı kopyala" + "message": "Parolayı Kopyala" }, "copyNote": { "message": "Notu kopyala" @@ -80,19 +80,19 @@ "message": "URI'yi kopyala" }, "copyUsername": { - "message": "Kullanıcı adını kopyala" + "message": "Kullanıcı Adını Kopyala" }, "copyNumber": { - "message": "Numarayı kopyala" + "message": "Numarayı Kopyala" }, "copySecurityCode": { - "message": "Güvenlik kodunu kopyala" + "message": "Güvenlik Kodunu Kopyala" }, "autoFill": { "message": "Otomatik doldur" }, "generatePasswordCopied": { - "message": "Parola oluştur (ve kopyala)" + "message": "Parola Oluştur (kopyalandı)" }, "copyElementIdentifier": { "message": "Özel alan adını kopyala" @@ -110,13 +110,13 @@ "message": "Mevcut sekme için otomatik doldurulacak giriş bilgisi bulunmuyor." }, "addLogin": { - "message": "Hesap ekle" + "message": "Oturum Ekle" }, "addItem": { - "message": "Kayıt ekle" + "message": "Hesap Ekle" }, "passwordHint": { - "message": "Parola ipucu" + "message": "Parola İpucu" }, "enterEmailToGetHint": { "message": "Ana parola ipucunu almak için hesabınızın e-posta adresini girin." @@ -137,7 +137,7 @@ "message": "Kod gönderildi" }, "verificationCode": { - "message": "Doğrulama kodu" + "message": "Doğrulama Kodu" }, "confirmIdentity": { "message": "Devam etmek için kimliğinizi doğrulayın." @@ -175,16 +175,16 @@ "message": "Taşı" }, "addFolder": { - "message": "Klasör ekle" + "message": "Klasör Ekle" }, "name": { "message": "Ad" }, "editFolder": { - "message": "Klasörü düzenle" + "message": "Klasörü Düzenle" }, "deleteFolder": { - "message": "Klasörü sil" + "message": "Klasörü Sil" }, "folders": { "message": "Klasörler" @@ -199,10 +199,10 @@ "message": "Eşitle" }, "syncVaultNow": { - "message": "Kasayı şimdi eşitle" + "message": "Kasayı Şimdi Eşitle" }, "lastSync": { - "message": "Son eşitleme:" + "message": "Son Eşitleme:" }, "passGen": { "message": "Parola Oluşturucu" @@ -224,10 +224,10 @@ "message": "Seç" }, "generatePassword": { - "message": "Parola oluştur" + "message": "Parola Oluştur" }, "regeneratePassword": { - "message": "Yeni parola oluştur" + "message": "Tekrar Parola Oluştur" }, "options": { "message": "Seçenekler" @@ -248,26 +248,26 @@ "message": "Özel karakterler (!@#$%^&*)" }, "numWords": { - "message": "Kelime sayısı" + "message": "Kelime Sayısı" }, "wordSeparator": { - "message": "Kelime ayracı" + "message": "Kelime Ayracı" }, "capitalize": { "message": "Baş harfleri büyük yap", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Rakam ekle" + "message": "Sayı Ekle" }, "minNumbers": { - "message": "En az rakam" + "message": "En Az Rakam" }, "minSpecial": { - "message": "En az özel karakter" + "message": "En Az Özel Karakter" }, "avoidAmbChar": { - "message": "Okurken karışabilecek karakterleri kullanma" + "message": "Belirsiz Karakterler Kullanma" }, "searchVault": { "message": "Kasada ara" @@ -282,7 +282,7 @@ "message": "Listelenecek kayıt yok." }, "itemInformation": { - "message": "Hesap Bilgileri" + "message": "Hesap Bilgisi" }, "username": { "message": "Kullanıcı adı" @@ -485,7 +485,7 @@ "message": "Klasör eklendi" }, "changeMasterPass": { - "message": "Ana parolayı değiştir" + "message": "Ana Parolayı Değiştir" }, "changeMasterPasswordConfirmation": { "message": "Ana parolanızı bitwarden.com web kasası üzerinden değiştirebilirsiniz. Siteye gitmek ister misiniz?" @@ -494,7 +494,7 @@ "message": "İki aşamalı giriş, hesabınıza girererken işlemi bir güvenlik anahtarı, şifrematik uygulaması, SMS, telefon araması veya e-posta gibi ek bir yöntemle doğrulamanızı isteyerek hesabınızın güvenliğini artırır. İki aşamalı giriş özelliğini bitwarden.com web kasası üzerinden etkinleştirebilirsiniz. Şimdi siteye gitmek ister misiniz?" }, "editedFolder": { - "message": "Klasör düzenlendi" + "message": "Klasör Düzenlendi" }, "deleteFolderConfirmation": { "message": "Bu klasörü silmek istediğinizden emin misiniz?" @@ -567,7 +567,7 @@ "message": "Arama türü" }, "noneFolder": { - "message": "Klasör yok", + "message": "Klasör Yok", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -885,7 +885,7 @@ "message": "İki aşamalı doğrulama sağlayıcılarınıza ulaşamıyor musunuz? Kurtarma kodunuzu kullanarak hesabınızdaki tüm iki aşamalı giriş sağlayıcılarını devre dışı bırakabilirsiniz." }, "recoveryCodeTitle": { - "message": "Kurtarma kodu" + "message": "Kurtarma Kodu" }, "authenticatorAppTitle": { "message": "Kimlik doğrulama uygulaması" @@ -1002,7 +1002,7 @@ "message": "Özel alanlar" }, "copyValue": { - "message": "Değeri kopyala" + "message": "Değeri Kopyala" }, "value": { "message": "Değer" @@ -1296,7 +1296,7 @@ "message": "Türler" }, "allItems": { - "message": "Tüm kayıtlar" + "message": "Tüm ögeler" }, "noPasswordsInList": { "message": "Listelenecek parola yok." @@ -1311,8 +1311,12 @@ "message": "Güncelleme", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Oluşturma", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Parola güncelleme", + "message": "Parola Güncellendi", "description": "ex. Date this password was updated" }, "neverLockWarning": { diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index ce1660dd759..007e0a45703 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -98,7 +98,7 @@ "message": "Копіювати назву власного поля" }, "noMatchingLogins": { - "message": "Немає відповідних записів." + "message": "Немає відповідних записів" }, "unlockVaultMenu": { "message": "Розблокуйте сховище" @@ -303,7 +303,7 @@ "message": "Нотатка" }, "editItem": { - "message": "Зміна запису" + "message": "Редагування запису" }, "folder": { "message": "Тека" @@ -482,7 +482,7 @@ "message": "Потрібна назва." }, "addedFolder": { - "message": "Додано теку" + "message": "Теку додано" }, "changeMasterPass": { "message": "Змінити головний пароль" @@ -494,7 +494,7 @@ "message": "Двоетапна перевірка робить ваш обліковий запис більш захищеним, вимагаючи підтвердження входу з використанням іншого пристрою, наприклад, за допомогою коду безпеки, програми авторизації, SMS, телефонного виклику, або е-пошти. Ви можете увімкнути двоетапну перевірку в сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, "editedFolder": { - "message": "Тека змінена" + "message": "Теку збережено" }, "deleteFolderConfirmation": { "message": "Ви дійсно хочете видалити цю теку?" @@ -543,7 +543,7 @@ "message": "Ви дійсно хочете перенести до смітника?" }, "deletedItem": { - "message": "Запис перенесено до смітника" + "message": "Запис переміщено до смітника" }, "overwritePassword": { "message": "Перезаписати пароль" @@ -732,13 +732,13 @@ "message": "Немає вкладень." }, "attachmentSaved": { - "message": "Вкладення збережено." + "message": "Вкладення збережено" }, "file": { "message": "Файл" }, "selectFile": { - "message": "Оберіть файл." + "message": "Оберіть файл" }, "maxFileSize": { "message": "Максимальний розмір файлу 500 Мб." @@ -753,19 +753,19 @@ "message": "Преміум статус" }, "premiumManage": { - "message": "Керувати статусом" + "message": "Керувати передплатою" }, "premiumManageAlert": { "message": "Ви можете керувати своїм статусом у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, "premiumRefresh": { - "message": "Оновити статус" + "message": "Оновити стан передплати" }, "premiumNotCurrentMember": { - "message": "Зараз у вас немає преміум-статусу." + "message": "Зараз у вас немає передплати преміум." }, "premiumSignUpAndGet": { - "message": "Підпишіться на преміум-статус і отримайте:" + "message": "Передплатіть преміум і отримайте:" }, "ppremiumSignUpStorage": { "message": "1 ГБ зашифрованого сховища для файлів." @@ -783,16 +783,16 @@ "message": "Пріоритетну технічну підтримку." }, "ppremiumSignUpFuture": { - "message": "Всі майбутні функції преміум статусу. Їх буде більше!" + "message": "Усі майбутні преміумфункції. Їх буде більше!" }, "premiumPurchase": { "message": "Придбати преміум" }, "premiumPurchaseAlert": { - "message": "Ви можете придбати преміум статус у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" + "message": "Ви можете передплатити преміум у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, "premiumCurrentMember": { - "message": "У вас преміум статус!" + "message": "Ви користуєтеся передплатою преміум!" }, "premiumCurrentMemberThanks": { "message": "Дякуємо за підтримку Bitwarden." @@ -819,10 +819,10 @@ "message": "Запитувати біометрію під час запуску" }, "premiumRequired": { - "message": "Необхідний преміум статус" + "message": "Необхідна передплата преміум" }, "premiumRequiredDesc": { - "message": "Для використання цієї функції необхідний преміум статус." + "message": "Для використання цієї функції необхідна передплата преміум." }, "enterVerificationCodeApp": { "message": "Введіть 6-значний код підтвердження з програми авторизації." @@ -1311,6 +1311,10 @@ "message": "Оновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Створено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль оновлено", "description": "ex. Date this password was updated" diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 3e6db9fa609..d4d1ec1178c 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -59,7 +59,7 @@ "message": "Hầm của tôi" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "tools": { "message": "Công cụ" @@ -491,7 +491,7 @@ "message": "Bạn có thể thay đổi mật khẩu chủ trong trang web Bitwarden. Bạn có muốn truy cập bitwarden.com bây giờ?" }, "twoStepLoginConfirmation": { - "message": "Xác thực hai lớp giúp cho tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh thông tin đăng nhập của bạn bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Bạn có thể bật xác thực hai lớp trong trang web Bitwarden. Bạn có muốn ghé thăm bitwarden.com bây giờ?" + "message": "Xác thực hai lớp giúp cho tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh thông tin đăng nhập của bạn bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Bạn có thể bật xác thực hai lớp trong kho bitwarden nền web. Bạn có muốn ghé thăm trang web bây giờ?" }, "editedFolder": { "message": "Chỉnh sửa Thư mục" @@ -552,7 +552,7 @@ "message": "Bạn có chắc chắn muốn ghi đè mật khẩu hiện tại không?" }, "overwriteUsername": { - "message": "Overwrite Username" + "message": "Overwrite username" }, "overwriteUsernameConfirmation": { "message": "Are you sure you want to overwrite the current username?" @@ -789,7 +789,7 @@ "message": "Mua bản Cao Cấp" }, "premiumPurchaseAlert": { - "message": "Bạn có thể nâng cấp làm thành viên cao cấp trong trang web Bitwarden. Bạn có muốn truy cập bitwarden.com bây giờ?" + "message": "Bạn có thể nâng cấp làm thành viên cao cấp trong kho bitwarden nền web. Bạn có muốn truy cập trang web bây giờ?" }, "premiumCurrentMember": { "message": "Bạn là một thành viên cao cấp!" @@ -912,7 +912,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { "message": "Email" @@ -1311,6 +1311,10 @@ "message": "Ngày cập nhật", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -1508,13 +1512,13 @@ "message": "Tích hợp trình duyệt chưa được kích hoạt" }, "desktopIntegrationDisabledDesc": { - "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application." + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." }, "startDesktopTitle": { "message": "Mở ứng dụng Bitwarden trên máy tính" }, "startDesktopDesc": { - "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used." + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." }, "errorEnableBiometricTitle": { "message": "Không thể bật nhận dạng sinh trắc học" @@ -1538,7 +1542,7 @@ "message": "Nhận dạng sinh trắc học chưa được bật" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be enabled in the settings first." + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." }, "biometricsNotSupportedTitle": { "message": "Nhận dạng sinh trắc học không được hỗ trợ" @@ -1559,7 +1563,7 @@ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." }, "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": "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." }, "personalOwnershipPolicyInEffect": { "message": "An organization policy is affecting your ownership options." @@ -1709,7 +1713,7 @@ "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": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { @@ -1724,10 +1728,10 @@ "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": "Current access count" }, "createSend": { - "message": "Create New Send", + "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { @@ -1816,10 +1820,10 @@ "message": "Cập nhật mật khẩu chính" }, "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": "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." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "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." @@ -1856,7 +1860,7 @@ "message": "Xuất mật khẩu đăng tắt" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "copyCustomFieldNameInvalidElement": { "message": "Unable to identify a valid form element. Try inspecting the HTML instead." @@ -1895,10 +1899,10 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -1910,23 +1914,23 @@ "message": "Error" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -1935,22 +1939,22 @@ "message": "Random" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "websiteName": { - "message": "Website Name" + "message": "Website name" }, "whatWouldYouLikeToGenerate": { "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "service": { "message": "Service" }, "forwardedEmail": { - "message": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -1966,16 +1970,16 @@ "message": "Khóa API" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "Key connector error: make sure key connector is available and working correctly." }, "premiumSubcriptionRequired": { "message": "Premium subscription required" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." }, "cardBrandMir": { "message": "Mir" @@ -1999,13 +2003,13 @@ "message": "để đặt lại cài đặt đã thiết đặt từ trước" }, "serverVersion": { - "message": "Server Version" + "message": "Server version" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Self-hosted" }, "thirdParty": { - "message": "Third-Party" + "message": "Third-party" }, "thirdPartyServerMessage": { "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index d3a1ec4373d..e14469c8646 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -44,7 +44,7 @@ "message": "主密码提示可以在你忘记密码时帮你回忆起来。" }, "reTypeMasterPass": { - "message": "重新输入主密码" + "message": "再次输入主密码" }, "masterPassHint": { "message": "主密码提示(可选)" @@ -56,7 +56,7 @@ "message": "密码库" }, "myVault": { - "message": "密码库" + "message": "我的密码库" }, "allVaults": { "message": "所有密码库" @@ -98,7 +98,7 @@ "message": "复制自定义字段名称" }, "noMatchingLogins": { - "message": "无匹配的登录信息。" + "message": "无匹配的登录项目" }, "unlockVaultMenu": { "message": "解锁您的密码库" @@ -131,10 +131,10 @@ "message": "发送验证码到您的电子邮箱" }, "sendCode": { - "message": "发送验证码" + "message": "发送代码" }, "codeSent": { - "message": "验证码已发送" + "message": "代码已发送" }, "verificationCode": { "message": "验证码" @@ -248,7 +248,7 @@ "message": "特殊字符 (!@#$%^&*)" }, "numWords": { - "message": "单词数" + "message": "单词个数" }, "wordSeparator": { "message": "单词分隔符" @@ -491,10 +491,10 @@ "message": "您可以在 bitwarden.com 网页版密码库修改主密码。您现在要访问这个网站吗?" }, "twoStepLoginConfirmation": { - "message": "两步登录要求您从其他设备(例如安全钥匙、验证器应用、短信、电话或者电子邮件)来验证你的登录,这能使您的账户更加安全。两步登录可以在 bitwarden.com 网页版密码库启用。您现在要访问这个网站吗?" + "message": "两步登录要求您从其他设备(例如安全钥匙、验证器应用、短信、电话或者电子邮件)来验证您的登录,这能使您的账户更加安全。两步登录需要在 bitwarden.com 网页版密码中设置。您现在要访问这个网站吗?" }, "editedFolder": { - "message": "文件夹已编辑" + "message": "文件夹已保存" }, "deleteFolderConfirmation": { "message": "您确定要删除此文件夹吗?" @@ -537,7 +537,7 @@ "message": "项目已添加" }, "editedItem": { - "message": "项目已编辑" + "message": "项目已保存" }, "deleteItemConfirmation": { "message": "您确定要删除此项目吗?" @@ -732,13 +732,13 @@ "message": "没有附件。" }, "attachmentSaved": { - "message": "附件已保存。" + "message": "附件已保存" }, "file": { "message": "文件" }, "selectFile": { - "message": "选择一个文件。" + "message": "选择一个文件" }, "maxFileSize": { "message": "文件最大为 500 MB。" @@ -825,7 +825,7 @@ "message": "使用此功能需要高级会员资格。" }, "enterVerificationCodeApp": { - "message": "请输入您的身份验证器应用中的 6 位验证码。" + "message": "请输入您的验证器应用中的 6 位验证码。" }, "enterVerificationCodeEmail": { "message": "请输入通过电子邮件发送给 $EMAIL$ 的 6 位验证码。", @@ -873,16 +873,16 @@ "message": "登录不可用" }, "noTwoStepProviders": { - "message": "此账户已启用两步登录,但此浏览器不支持任何已配置的两步登录提供程序。" + "message": "此账户已设置两步登录,但此浏览器不支持任何已配置的两步登录提供程序。" }, "noTwoStepProviders2": { - "message": "请使用支持的网页浏览器(例如 Chrome)和/或添加其他支持更广泛的提供程序(例如验证器应用)。" + "message": "请使用支持的网页浏览器(例如 Chrome),和/或添加其他对跨浏览器支持更广泛的提供程序(例如验证器应用)。" }, "twoStepOptions": { "message": "两步登录选项" }, "recoveryCodeDesc": { - "message": "失去访问您所有的双重身份验证设备?请使用您的恢复代码来禁用您账户中所有的两步登录提供程序。" + "message": "无法访问您所有的双重身份提供程序吗?请使用您的恢复代码来禁用您账户中所有的双重身份提供程序。" }, "recoveryCodeTitle": { "message": "恢复代码" @@ -891,7 +891,7 @@ "message": "验证器应用" }, "authenticatorAppDesc": { - "message": "使用身份验证器应用(例如 Authy 或 Google Authenticator)来生成基于时间的验证码。", + "message": "使用验证器应用(例如 Authy 或 Google Authenticator)来生成基于时间的验证码。", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { @@ -951,7 +951,7 @@ "message": "图标服务器 URL" }, "environmentSaved": { - "message": "各环境 URL 已保存。" + "message": "环境 URL 已保存" }, "enableAutoFillOnPageLoad": { "message": "页面加载时自动填充" @@ -969,7 +969,7 @@ "message": "您可以从项目编辑视图中为单个登录项目关闭页面加载时自动填充。" }, "itemAutoFillOnPageLoad": { - "message": "页面加载时自动填充(如果选项中已启用)" + "message": "页面加载时自动填充(如果选项中已设置)" }, "autoFillOnPageLoadUseDefault": { "message": "使用默认设置" @@ -1142,13 +1142,13 @@ "message": "公司" }, "ssn": { - "message": "社会安全号码" + "message": "社会保险号码" }, "passportNumber": { "message": "护照号码" }, "licenseNumber": { - "message": "许可证编号" + "message": "许可证号码" }, "email": { "message": "Email" @@ -1311,6 +1311,10 @@ "message": "更新于", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "创建于", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密码更新于", "description": "ex. Date this password was updated" @@ -1343,7 +1347,7 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "脆弱的主密码" + "message": "弱主密码" }, "weakMasterPasswordDesc": { "message": "您选择的主密码较弱。您应该使用强密码(或密码短语)来正确保护您的 Bitwarden 账户。仍要使用此主密码吗?" @@ -1356,7 +1360,7 @@ "message": "使用 PIN 码解锁" }, "setYourPinCode": { - "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您退出账户时被重置。" + "message": "设置您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您退出账户时被重置。" }, "pinRequired": { "message": "需要 PIN 码。" @@ -1371,7 +1375,7 @@ "message": "等待来自桌面应用程序的确认" }, "awaitDesktopDesc": { - "message": "请确认在 Bitwarden 桌面应用程序中使用了生物识别以启用浏览器的生物识别。" + "message": "请确认在 Bitwarden 桌面应用程序中设置了生物识别以设置浏览器的生物识别。" }, "lockWithMasterPassOnRestart": { "message": "浏览器重启后使用主密码锁定" @@ -1409,7 +1413,7 @@ "message": "您确定要永久删除此项目吗?" }, "permanentlyDeletedItem": { - "message": "已永久删除项目" + "message": "项目已永久删除" }, "restoreItem": { "message": "恢复项目" @@ -1433,7 +1437,7 @@ "message": "项目已自动填充且 URI 已保存" }, "autoFillSuccess": { - "message": "项目已自动填充" + "message": "项目已自动填充 " }, "setMasterPassword": { "message": "设置主密码" @@ -1505,19 +1509,19 @@ "message": "请确认桌面应用程序显示此指纹: " }, "desktopIntegrationDisabledTitle": { - "message": "浏览器整合未启用" + "message": "浏览器集成未设置" }, "desktopIntegrationDisabledDesc": { - "message": "浏览器整合在 Bitwarden 桌面应用程序中未启用。请在桌面应用程序的设置中启用它。" + "message": "浏览器集成在 Bitwarden 桌面应用程序中未设置。请在桌面应用程序的设置中设置它。" }, "startDesktopTitle": { "message": "启动 Bitwarden 桌面应用程序" }, "startDesktopDesc": { - "message": "Bitwarden 桌面应用程序需要已启动才能使用生物识别解锁功能。" + "message": "Bitwarden 桌面应用程序需要已启动才能使用生物识别解锁。" }, "errorEnableBiometricTitle": { - "message": "无法启用生物识别" + "message": "无法设置生物识别" }, "errorEnableBiometricDesc": { "message": "操作被桌面应用程序取消" @@ -1535,10 +1539,10 @@ "message": "账户不匹配" }, "biometricsNotEnabledTitle": { - "message": "生物识别未启用" + "message": "生物识别未设置" }, "biometricsNotEnabledDesc": { - "message": "需要首先在桌面应用程序的设置中启用生物识别才能使用浏览器的生物识别。" + "message": "需要首先在桌面应用程序的设置中设置生物识别才能使用浏览器的生物识别。" }, "biometricsNotSupportedTitle": { "message": "不支持生物识别" @@ -1559,7 +1563,7 @@ "message": "此操作不能在侧边栏中完成,请在弹出窗口或弹出对话框中重试。" }, "personalOwnershipSubmitError": { - "message": "由于某个企业策略,您被限制为保存项目到您的个人密码库。将所有权选项更改为组织,并从可用的集合中选择。" + "message": "由于某个企业策略,您被限制为保存项目到您的个人密码库。将所有权选项更改为组织,然后从可用的集合中选择。" }, "personalOwnershipPolicyInEffect": { "message": "一个组织策略正影响您的所有权选项。" @@ -1727,14 +1731,14 @@ "message": "当前访问次数" }, "createSend": { - "message": "创建新 Send", + "message": "新建 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { - "message": "新密码" + "message": "新建密码" }, "sendDisabled": { - "message": "Send 已禁用", + "message": "Send 已移除", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1746,7 +1750,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Send 已编辑", + "message": "Send 已保存", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1804,7 +1808,7 @@ "message": "此操作受到保护。若要继续,请重新输入您的主密码以验证您的身份。" }, "emailVerificationRequired": { - "message": "需要验证电子邮件地址" + "message": "需要验证电子邮件" }, "emailVerificationRequiredDesc": { "message": "您必须验证电子邮件才能使用此功能。您可以在网页密码库中验证您的电子邮件。" @@ -1816,7 +1820,7 @@ "message": "更新主密码" }, "updateMasterPasswordWarning": { - "message": "您的主密码最近被您组织的管理员更改过。要访问密码库,您必须立即更新它。继续操作将使您退出当前会话,要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。" + "message": "您的主密码最近被您组织的管理员更改过。要访问密码库,您必须立即更新它。继续操作将使您退出当前会话并要求您重新登录。其他设备上的活动会话可能会继续保持活动状态长达一小时。" }, "resetPasswordPolicyAutoEnroll": { "message": "自动注册" @@ -1856,7 +1860,7 @@ "message": "密码库导出已禁用" }, "personalVaultExportPolicyInEffect": { - "message": "一个或多个组织策略阻止您导出个人密码库。" + "message": "一个或多个组织策略禁止您导出个人密码库。" }, "copyCustomFieldNameInvalidElement": { "message": "无法识别有效的表单元素。请尝试检查 HTML。" @@ -1874,13 +1878,13 @@ } }, "leaveOrganization": { - "message": "离开组织" + "message": "退出组织" }, "removeMasterPassword": { "message": "移除主密码" }, "removedMasterPassword": { - "message": "主密码已移除。" + "message": "主密码已移除" }, "leaveOrganizationConfirmation": { "message": "您确定要离开该组织吗?" @@ -1898,7 +1902,7 @@ "message": "导出个人密码库" }, "exportingPersonalVaultDescription": { - "message": "仅会导出与 $EMAIL$ 关联的个人密码库。组织密码库的项目不会导出。", + "message": "仅会导出与 $EMAIL$ 关联的个人密码库项目。组织密码库的项目不会导出。", "placeholders": { "email": { "content": "$1", @@ -1972,10 +1976,10 @@ "message": "需要高级版订阅" }, "organizationIsDisabled": { - "message": "组织已被禁用。" + "message": "组织已被挂起。" }, "disabledOrganizationFilterError": { - "message": "无法访问已禁用组织中的项目。请联系您的组织所有者获取协助。" + "message": "无法访问已被挂起的组织中的项目。请联系您的组织所有者获取帮助。" }, "cardBrandMir": { "message": "Mir" @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "最后上线于 $DATE$", + "message": "最后上线于:$DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 0f78713b417..60ce0f000c8 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -14,7 +14,7 @@ "message": "登入或建立帳戶以存取您的安全密碼庫。" }, "createAccount": { - "message": "建立帳戶" + "message": "新增帳戶" }, "login": { "message": "登入" @@ -44,7 +44,7 @@ "message": "主密碼提示可以在您忘記主密碼時幫助您回憶主密碼。" }, "reTypeMasterPass": { - "message": "重新輸入主密碼" + "message": "再次輸入主密碼" }, "masterPassHint": { "message": "主密碼提示(選用)" @@ -56,7 +56,7 @@ "message": "密碼庫" }, "myVault": { - "message": "密碼庫" + "message": "我的密碼庫" }, "allVaults": { "message": "所有密碼庫" @@ -98,7 +98,7 @@ "message": "複製自訂欄位名稱" }, "noMatchingLogins": { - "message": "無符合的登入資料。" + "message": "無符合的登入資料" }, "unlockVaultMenu": { "message": "解鎖您的密碼庫" @@ -248,10 +248,10 @@ "message": "特殊字元 (!@#$%^&*)" }, "numWords": { - "message": "字數" + "message": "單詞數量" }, "wordSeparator": { - "message": "文字分隔字元" + "message": "單詞分隔字元" }, "capitalize": { "message": "大寫", @@ -321,7 +321,7 @@ "message": "網站" }, "toggleVisibility": { - "message": "切換可見度" + "message": "切換可見性" }, "manage": { "message": "管理" @@ -482,7 +482,7 @@ "message": "必須填入名稱。" }, "addedFolder": { - "message": "已新增資料夾" + "message": "資料夾已新增" }, "changeMasterPass": { "message": "變更主密碼" @@ -494,13 +494,13 @@ "message": "兩步驟登入需要您從其他裝置(例如安全金鑰、驗證器程式、SMS、手機或電子郵件)來驗證您的登入,這使您的帳戶更加安全。兩步驟登入可以在 bitwarden.com 網頁版密碼庫啟用。現在要前往嗎?" }, "editedFolder": { - "message": "已編輯資料夾" + "message": "資料夾已儲存" }, "deleteFolderConfirmation": { "message": "您確定要刪除此資料夾嗎?" }, "deletedFolder": { - "message": "已刪除資料夾" + "message": "資料夾已刪除" }, "gettingStartedTutorial": { "message": "新手教學" @@ -534,16 +534,16 @@ "message": "新增 URI" }, "addedItem": { - "message": "已新增項目" + "message": "項目已新增" }, "editedItem": { - "message": "已編輯項目" + "message": "項目已儲存" }, "deleteItemConfirmation": { "message": "確定要刪除此項目嗎?" }, "deletedItem": { - "message": "已將項目移至垃圾桶" + "message": "項目已移至垃圾桶" }, "overwritePassword": { "message": "覆寫密碼" @@ -567,7 +567,7 @@ "message": "搜尋類型" }, "noneFolder": { - "message": "(未分類)", + "message": "預設資料夾", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -732,7 +732,7 @@ "message": "沒有附件。" }, "attachmentSaved": { - "message": "附件已儲存。" + "message": "附件已儲存" }, "file": { "message": "檔案" @@ -744,7 +744,7 @@ "message": "檔案最大為 500MB。" }, "featureUnavailable": { - "message": "功能無法使用" + "message": "功能不可用" }, "updateKey": { "message": "更新加密金鑰前不能使用此功能。" @@ -870,13 +870,13 @@ "message": "驗證 WebAuthn" }, "loginUnavailable": { - "message": "無法登入" + "message": "登入無法使用" }, "noTwoStepProviders": { - "message": "此帳戶已啟用兩步驟登入,但是本瀏覽器不支援已設定的兩步驟登入方式。" + "message": "此帳戶已設定兩步驟登入,但是本瀏覽器不支援已設定的任一個兩步驟提供程式。" }, "noTwoStepProviders2": { - "message": "請使用已支援的瀏覽器(例如 Chrome ),及/或新增可以更好地跨瀏覽器的兩步驟登入方法(例如驗證器應用程式)。" + "message": "請使用受支援的瀏覽器(例如 Chrome ),及/或新增可以更好地跨瀏覽器的提供程式(例如驗證器應用程式)。" }, "twoStepOptions": { "message": "兩步驟登入選項" @@ -885,7 +885,7 @@ "message": "無法使用任何雙因素提供程式嗎?請使用您的復原碼以停用您帳戶的所有雙因素提供程式。" }, "recoveryCodeTitle": { - "message": "復原碼" + "message": "復原代碼" }, "authenticatorAppTitle": { "message": "驗證器應用程式" @@ -939,19 +939,19 @@ "message": "API 伺服器 URL" }, "webVaultUrl": { - "message": "網頁版密碼庫伺服器 URL" + "message": "網路版密碼庫伺服器 URL" }, "identityUrl": { - "message": "身分伺服器 URL" + "message": "身份伺服器 URL" }, "notificationsUrl": { "message": "通知伺服器 URL" }, "iconsUrl": { - "message": "圖示伺服器 URL" + "message": "圖標伺服器 URL" }, "environmentSaved": { - "message": "已儲存環境 URL。" + "message": "環境 URL 已儲存" }, "enableAutoFillOnPageLoad": { "message": "頁面載入時自動填入" @@ -969,7 +969,7 @@ "message": "您可以從項目的編輯檢視中為單個登入項目關閉頁面載入時自動填入。" }, "itemAutoFillOnPageLoad": { - "message": "頁面載入時自動填入(如果選項中已啟用)" + "message": "頁面載入時自動填入(如果選項中已設定)" }, "autoFillOnPageLoadUseDefault": { "message": "使用預設設定" @@ -1136,7 +1136,7 @@ "message": "全名" }, "identityName": { - "message": "身分名稱" + "message": "身份名稱" }, "company": { "message": "公司" @@ -1311,6 +1311,10 @@ "message": "更新於", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "建立於", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密碼更新於", "description": "ex. Date this password was updated" @@ -1371,7 +1375,7 @@ "message": "等待來自桌面應用程式的確認" }, "awaitDesktopDesc": { - "message": "請確認在 Bitwarden 桌面應用程式中使用了生物特徵辨識,以啟用瀏覽器的生物特徵辨識。" + "message": "請確認在 Bitwarden 桌面應用程式中使用了生物特徵辨識,以啟用瀏覽器的生物特徵辨識功能。" }, "lockWithMasterPassOnRestart": { "message": "瀏覽器重啟後使用主密碼鎖定" @@ -1409,7 +1413,7 @@ "message": "您確定要永久刪除此項目嗎?" }, "permanentlyDeletedItem": { - "message": "已永久刪除項目" + "message": "項目已永久刪除" }, "restoreItem": { "message": "還原項目" @@ -1505,10 +1509,10 @@ "message": "請驗證桌面應用程式顯示的指紋為: " }, "desktopIntegrationDisabledTitle": { - "message": "瀏覽器整合未啟用" + "message": "瀏覽器整合未設定" }, "desktopIntegrationDisabledDesc": { - "message": "瀏覽器整合在桌面應用程式中未啟用,請在桌面應用程式的設定中啟用它。" + "message": "瀏覽器整合在桌面應用程式中未設定,請在桌面應用程式的設定中設定它。" }, "startDesktopTitle": { "message": "啟動 Bitwarden 桌面應用程式" @@ -1535,10 +1539,10 @@ "message": "帳戶不相符" }, "biometricsNotEnabledTitle": { - "message": "生物特徵辨識未啟用" + "message": "生物特徵辨識未設定" }, "biometricsNotEnabledDesc": { - "message": "需先在桌面應用程式設定中啟用生物特徵辨識,才能使用瀏覽器的生物特徵辨識功能。" + "message": "需先在桌面應用程式設定中設定生物特徵辨識,才能使用瀏覽器的生物特徵辨識功能。" }, "biometricsNotSupportedTitle": { "message": "不支援生物特徵辨識" @@ -1628,7 +1632,7 @@ "message": "已移除密碼" }, "deletedSend": { - "message": "已刪除 Send", + "message": "Send 已刪除", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1734,7 +1738,7 @@ "message": "新密碼" }, "sendDisabled": { - "message": "已停用 Send", + "message": "Send 已停用", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { @@ -1742,11 +1746,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "已建立 Send", + "message": "Send 已建立", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "已編輯 Send", + "message": "Send 已儲存", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1880,7 +1884,7 @@ "message": "移除主密碼" }, "removedMasterPassword": { - "message": "已移除主密碼。" + "message": "主密碼已移除。" }, "leaveOrganizationConfirmation": { "message": "您確定要離開這個組織嗎?" @@ -1898,7 +1902,7 @@ "message": "匯出個人密碼庫" }, "exportingPersonalVaultDescription": { - "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫。組織密碼庫的項目不包含在內。", + "message": "只會匯出與 $EMAIL$ 關聯的個人密碼庫項目。組織密碼庫的項目不包含在內。", "placeholders": { "email": { "content": "$1", @@ -2017,7 +2021,7 @@ } }, "lastSeenOn": { - "message": "最後上線於 $DATE$", + "message": "最後上線於:$DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/background.ts b/apps/browser/src/background.ts index ebc2aad10ad..504b5afb5c0 100644 --- a/apps/browser/src/background.ts +++ b/apps/browser/src/background.ts @@ -1,12 +1,39 @@ import MainBackground from "./background/main.background"; +import { BrowserApi } from "./browser/browserApi"; +import { ClearClipboard } from "./clipboard"; import { onCommandListener } from "./listeners/onCommandListener"; import { onInstallListener } from "./listeners/onInstallListener"; +import { UpdateBadge } from "./listeners/update-badge"; -const manifest = chrome.runtime.getManifest(); +const manifestV3MessageListeners: (( + serviceCache: Record, + message: { command: string } +) => void | Promise)[] = [UpdateBadge.messageListener]; +type AlarmAction = (executionTime: Date, serviceCache: Record) => void; -if (manifest.manifest_version === 3) { +const AlarmActions: AlarmAction[] = [ClearClipboard.run]; + +if (BrowserApi.manifestVersion === 3) { chrome.commands.onCommand.addListener(onCommandListener); chrome.runtime.onInstalled.addListener(onInstallListener); + chrome.tabs.onActivated.addListener(UpdateBadge.tabsOnActivatedListener); + chrome.tabs.onReplaced.addListener(UpdateBadge.tabsOnReplacedListener); + chrome.tabs.onUpdated.addListener(UpdateBadge.tabsOnUpdatedListener); + BrowserApi.messageListener("runtime.background", (message) => { + const serviceCache = {}; + + manifestV3MessageListeners.forEach((listener) => { + listener(serviceCache, message); + }); + }); + chrome.alarms.onAlarm.addListener((_alarm) => { + const executionTime = new Date(); + const serviceCache = {}; + + for (const alarmAction of AlarmActions) { + alarmAction(executionTime, serviceCache); + } + }); } else { const bitwardenMain = ((window as any).bitwardenMain = new MainBackground()); bitwardenMain.bootstrap().then(() => { diff --git a/apps/browser/src/background/commands.background.ts b/apps/browser/src/background/commands.background.ts index 7303d790ec9..2ad3eafe49c 100644 --- a/apps/browser/src/background/commands.background.ts +++ b/apps/browser/src/background/commands.background.ts @@ -64,7 +64,7 @@ export default class CommandsBackground { } private async generatePasswordToClipboard() { - const options = (await this.passwordGenerationService.getOptions())[0]; + const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; const password = await this.passwordGenerationService.generatePassword(options); this.platformUtilsService.copyToClipboard(password, { window: window }); this.passwordGenerationService.addHistory(password); diff --git a/apps/browser/src/background/contextMenus.background.ts b/apps/browser/src/background/contextMenus.background.ts index 22d9d56bbff..76fbfd78a97 100644 --- a/apps/browser/src/background/contextMenus.background.ts +++ b/apps/browser/src/background/contextMenus.background.ts @@ -7,7 +7,7 @@ import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { EventType } from "@bitwarden/common/enums/eventType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { BrowserApi } from "../browser/browserApi"; @@ -66,7 +66,7 @@ export default class ContextMenusBackground { } private async generatePasswordToClipboard() { - const options = (await this.passwordGenerationService.getOptions())[0]; + const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; const password = await this.passwordGenerationService.generatePassword(options); this.platformUtilsService.copyToClipboard(password, { window: window }); this.passwordGenerationService.addHistory(password); diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index cf83b6e78d1..c90d58ec138 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -41,8 +41,8 @@ import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStat import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { ApiService } from "@bitwarden/common/services/api.service"; import { AppIdService } from "@bitwarden/common/services/appId.service"; import { AuditService } from "@bitwarden/common/services/audit.service"; @@ -82,6 +82,7 @@ import { WebCryptoFunctionService } from "@bitwarden/common/services/webCryptoFu import { BrowserApi } from "../browser/browserApi"; import { SafariApp } from "../browser/safariApp"; +import { UpdateBadge } from "../listeners/update-badge"; import { Account } from "../models/account"; import { PopupUtilsService } from "../popup/services/popup-utils.service"; import { AutofillService as AutofillServiceAbstraction } from "../services/abstractions/autofill.service"; @@ -183,15 +184,18 @@ export default class MainBackground { private syncTimeout: any; private isSafari: boolean; private nativeMessagingBackground: NativeMessagingBackground; + popupOnlyContext: boolean; constructor(public isPrivateMode: boolean = false) { + this.popupOnlyContext = isPrivateMode || BrowserApi.manifestVersion === 3; + // Services const lockedCallback = async (userId?: string) => { if (this.notificationsService != null) { this.notificationsService.updateConnection(false); } - await this.setIcon(); - await this.refreshBadgeAndMenu(true); + await this.refreshBadge(); + await this.refreshMenu(true); if (this.systemService != null) { await this.systemService.clearPendingClipboard(); await this.systemService.startProcessReload(this.authService); @@ -201,7 +205,7 @@ export default class MainBackground { const logoutCallback = async (expired: boolean, userId?: string) => await this.logout(expired, userId); - this.messagingService = isPrivateMode + this.messagingService = this.popupOnlyContext ? new BrowserMessagingPrivateModeBackgroundService() : new BrowserMessagingService(); this.logService = new ConsoleLogService(false); @@ -209,7 +213,7 @@ export default class MainBackground { this.storageService = new BrowserLocalStorageService(); this.secureStorageService = new BrowserLocalStorageService(); this.memoryStorageService = - chrome.runtime.getManifest().manifest_version == 3 + BrowserApi.manifestVersion === 3 ? new LocalBackedSessionStorageService( new EncryptService(this.cryptoFunctionService, this.logService, false), new KeyGenerationService(this.cryptoFunctionService) @@ -247,7 +251,8 @@ export default class MainBackground { return promise.then((result) => result.response === "unlocked"); } - } + }, + window ); this.i18nService = new I18nService(BrowserApi.getUILanguage(window)); this.encryptService = new EncryptService(this.cryptoFunctionService, this.logService, true); @@ -561,14 +566,12 @@ export default class MainBackground { // Set Private Mode windows to the default icon - they do not share state with the background page const privateWindows = await BrowserApi.getPrivateModeWindows(); privateWindows.forEach(async (win) => { - await this.actionSetIcon(chrome.browserAction, "", win.id); - await this.actionSetIcon(this.sidebarAction, "", win.id); + await new UpdateBadge(self).setBadgeIcon("", win.id); }); BrowserApi.onWindowCreated(async (win) => { if (win.incognito) { - await this.actionSetIcon(chrome.browserAction, "", win.id); - await this.actionSetIcon(this.sidebarAction, "", win.id); + await new UpdateBadge(self).setBadgeIcon("", win.id); } }); } @@ -576,7 +579,7 @@ export default class MainBackground { return new Promise((resolve) => { setTimeout(async () => { await this.environmentService.setUrlsFromStorage(); - await this.setIcon(); + await this.refreshBadge(); this.fullSync(true); setTimeout(() => this.notificationsService.init(), 2500); resolve(); @@ -584,25 +587,11 @@ export default class MainBackground { }); } - async setIcon() { - if ((!chrome.browserAction && !this.sidebarAction) || this.isPrivateMode) { - return; - } - - const authStatus = await this.authService.getAuthStatus(); - - let suffix = ""; - if (authStatus === AuthenticationStatus.LoggedOut) { - suffix = "_gray"; - } else if (authStatus === AuthenticationStatus.Locked) { - suffix = "_locked"; - } - - await this.actionSetIcon(chrome.browserAction, suffix); - await this.actionSetIcon(this.sidebarAction, suffix); + async refreshBadge() { + await new UpdateBadge(self).run({ existingServices: this as any }); } - async refreshBadgeAndMenu(forLocked = false) { + async refreshMenu(forLocked = false) { if (!chrome.windows || !chrome.contextMenus) { return; } @@ -615,7 +604,7 @@ export default class MainBackground { } if (forLocked) { - await this.loadMenuAndUpdateBadgeForNoAccessState(!menuDisabled); + await this.loadMenuForNoAccessState(!menuDisabled); this.onUpdatedRan = this.onReplacedRan = false; return; } @@ -651,8 +640,11 @@ export default class MainBackground { this.messagingService.send("doneLoggingOut", { expired: expired, userId: userId }); } - await this.setIcon(); - await this.refreshBadgeAndMenu(true); + if (BrowserApi.manifestVersion === 3) { + BrowserApi.sendMessage("updateBadge"); + } + await this.refreshBadge(); + await this.refreshMenu(true); await this.reseedStorage(); this.notificationsService.updateConnection(false); await this.systemService.clearPendingClipboard(); @@ -800,18 +792,15 @@ export default class MainBackground { } private async contextMenuReady(tab: any, contextMenuEnabled: boolean) { - await this.loadMenuAndUpdateBadge(tab.url, tab.id, contextMenuEnabled); + await this.loadMenu(tab.url, tab.id, contextMenuEnabled); this.onUpdatedRan = this.onReplacedRan = false; } - private async loadMenuAndUpdateBadge(url: string, tabId: number, contextMenuEnabled: boolean) { + private async loadMenu(url: string, tabId: number, contextMenuEnabled: boolean) { if (!url || (!chrome.browserAction && !this.sidebarAction)) { return; } - this.actionSetBadgeBackgroundColor(chrome.browserAction); - this.actionSetBadgeBackgroundColor(this.sidebarAction); - this.menuOptionsLoaded = []; const authStatus = await this.authService.getAuthStatus(); if (authStatus === AuthenticationStatus.Unlocked) { @@ -825,50 +814,26 @@ export default class MainBackground { }); } - const disableBadgeCounter = await this.stateService.getDisableBadgeCounter(); - let theText = ""; - - if (!disableBadgeCounter) { - if (ciphers.length > 0 && ciphers.length <= 9) { - theText = ciphers.length.toString(); - } else if (ciphers.length > 0) { - theText = "9+"; - } - } - if (contextMenuEnabled && ciphers.length === 0) { await this.loadNoLoginsContextMenuOptions(this.i18nService.t("noMatchingLogins")); } - this.sidebarActionSetBadgeText(theText, tabId); - this.browserActionSetBadgeText(theText, tabId); - return; } catch (e) { this.logService.error(e); } } - await this.loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled); + await this.loadMenuForNoAccessState(contextMenuEnabled); } - private async loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled: boolean) { + private async loadMenuForNoAccessState(contextMenuEnabled: boolean) { if (contextMenuEnabled) { const authed = await this.stateService.getIsAuthenticated(); await this.loadNoLoginsContextMenuOptions( this.i18nService.t(authed ? "unlockVaultMenu" : "loginToVaultMenu") ); } - - const tabs = await BrowserApi.getActiveTabs(); - if (tabs != null) { - tabs.forEach((tab) => { - if (tab.id != null) { - this.browserActionSetBadgeText("", tab.id); - this.sidebarActionSetBadgeText("", tab.id); - } - }); - } } private async loadLoginContextMenuOptions(cipher: any) { @@ -1025,42 +990,4 @@ export default class MainBackground { }); } } - - private actionSetBadgeBackgroundColor(action: any) { - if (action && action.setBadgeBackgroundColor) { - action.setBadgeBackgroundColor({ color: "#294e5f" }); - } - } - - private browserActionSetBadgeText(text: string, tabId: number) { - if (chrome.browserAction && chrome.browserAction.setBadgeText) { - chrome.browserAction.setBadgeText({ - text: text, - tabId: tabId, - }); - } - } - - private sidebarActionSetBadgeText(text: string, tabId: number) { - if (!this.sidebarAction) { - return; - } - - if (this.sidebarAction.setBadgeText) { - this.sidebarAction.setBadgeText({ - text: text, - tabId: tabId, - }); - } else if (this.sidebarAction.setTitle) { - let title = "Bitwarden"; - if (text && text !== "") { - title += " [" + text + "]"; - } - - this.sidebarAction.setTitle({ - title: title, - tabId: tabId, - }); - } - } } diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 2e410b8e6ce..77146633cf7 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -9,8 +9,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { BrowserApi } from "../browser/browserApi"; diff --git a/apps/browser/src/background/notification.background.ts b/apps/browser/src/background/notification.background.ts index e011f3d6976..569a77abe70 100644 --- a/apps/browser/src/background/notification.background.ts +++ b/apps/browser/src/background/notification.background.ts @@ -8,9 +8,9 @@ import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStat import { CipherType } from "@bitwarden/common/enums/cipherType"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { LoginUriView } from "@bitwarden/common/models/view/loginUriView"; -import { LoginView } from "@bitwarden/common/models/view/loginView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { LoginUriView } from "@bitwarden/common/models/view/login-uri.view"; +import { LoginView } from "@bitwarden/common/models/view/login.view"; import { BrowserApi } from "../browser/browserApi"; import { AutofillService } from "../services/abstractions/autofill.service"; @@ -446,6 +446,8 @@ export default class NotificationBackground { } private async allowPersonalOwnership(): Promise { - return !(await this.policyService.policyAppliesToUser(PolicyType.PersonalOwnership)); + return !(await firstValueFrom( + this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership) + )); } } diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 652996e2525..309edee28ce 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -51,7 +51,7 @@ export default class RuntimeBackground { }; BrowserApi.messageListener("runtime.background", backgroundMessageListener); - if (this.main.isPrivateMode) { + if (this.main.popupOnlyContext) { (window as any).bitwardenBackgroundMessageListener = backgroundMessageListener; } } @@ -71,8 +71,8 @@ export default class RuntimeBackground { } } - await this.main.setIcon(); - await this.main.refreshBadgeAndMenu(false); + await this.main.refreshBadge(); + await this.main.refreshMenu(false); this.notificationsService.updateConnection(msg.command === "unlocked"); this.systemService.cancelProcessReload(); @@ -93,7 +93,10 @@ export default class RuntimeBackground { break; case "syncCompleted": if (msg.successfully) { - setTimeout(async () => await this.main.refreshBadgeAndMenu(), 2000); + setTimeout(async () => { + await this.main.refreshBadge(); + await this.main.refreshMenu(); + }, 2000); } break; case "openPopup": @@ -112,7 +115,8 @@ export default class RuntimeBackground { case "editedCipher": case "addedCipher": case "deletedCipher": - await this.main.refreshBadgeAndMenu(); + await this.main.refreshBadge(); + await this.main.refreshMenu(); break; case "bgReseedStorage": await this.main.reseedStorage(); diff --git a/apps/browser/src/background/service_factories/autofill-service.factory.ts b/apps/browser/src/background/service_factories/autofill-service.factory.ts new file mode 100644 index 00000000000..a14cd1dd8c3 --- /dev/null +++ b/apps/browser/src/background/service_factories/autofill-service.factory.ts @@ -0,0 +1,37 @@ +import { AutofillService as AbstractAutoFillService } from "../../services/abstractions/autofill.service"; +import AutofillService from "../../services/autofill.service"; + +import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory"; +import { EventServiceInitOptions, eventServiceFactory } from "./event-service.factory"; +import { CachedServices, factory, FactoryOptions } from "./factory-options"; +import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; +import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory"; +import { totpServiceFactory, TotpServiceInitOptions } from "./totp-service.factory"; + +type AutoFillServiceOptions = FactoryOptions; + +export type AutoFillServiceInitOptions = AutoFillServiceOptions & + CipherServiceInitOptions & + StateServiceInitOptions & + TotpServiceInitOptions & + EventServiceInitOptions & + LogServiceInitOptions; + +export function autofillServiceFactory( + cache: { autofillService?: AbstractAutoFillService } & CachedServices, + opts: AutoFillServiceInitOptions +): Promise { + return factory( + cache, + "autofillService", + opts, + async () => + new AutofillService( + await cipherServiceFactory(cache, opts), + await stateServiceFactory(cache, opts), + await totpServiceFactory(cache, opts), + await eventServiceFactory(cache, opts), + await logServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/background/service_factories/cipher-service.factory.ts b/apps/browser/src/background/service_factories/cipher-service.factory.ts index 149ac54fc82..03141f2c84f 100644 --- a/apps/browser/src/background/service_factories/cipher-service.factory.ts +++ b/apps/browser/src/background/service_factories/cipher-service.factory.ts @@ -44,7 +44,7 @@ export function cipherServiceFactory( await apiServiceFactory(cache, opts), await fileUploadServiceFactory(cache, opts), await i18nServiceFactory(cache, opts), - opts.cipherServiceOptions.searchServiceFactory === undefined + opts.cipherServiceOptions?.searchServiceFactory === undefined ? () => cache.searchService : opts.cipherServiceOptions.searchServiceFactory, await logServiceFactory(cache, opts), diff --git a/apps/browser/src/background/service_factories/crypto-function-service.factory.ts b/apps/browser/src/background/service_factories/crypto-function-service.factory.ts index d7611c86a1f..6a092091746 100644 --- a/apps/browser/src/background/service_factories/crypto-function-service.factory.ts +++ b/apps/browser/src/background/service_factories/crypto-function-service.factory.ts @@ -5,7 +5,7 @@ import { CachedServices, factory, FactoryOptions } from "./factory-options"; type CryptoFunctionServiceFactoryOptions = FactoryOptions & { cryptoFunctionServiceOptions: { - win: Window | typeof global; + win: Window | typeof globalThis; }; }; diff --git a/apps/browser/src/background/service_factories/crypto-service.factory.ts b/apps/browser/src/background/service_factories/crypto-service.factory.ts index b61b72ec04b..784314b12d2 100644 --- a/apps/browser/src/background/service_factories/crypto-service.factory.ts +++ b/apps/browser/src/background/service_factories/crypto-service.factory.ts @@ -1,5 +1,6 @@ import { CryptoService as AbstractCryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { CryptoService } from "@bitwarden/common/services/crypto.service"; + +import { BrowserCryptoService } from "../../services/browserCrypto.service"; import { cryptoFunctionServiceFactory, @@ -32,7 +33,7 @@ export function cryptoServiceFactory( "cryptoService", opts, async () => - new CryptoService( + new BrowserCryptoService( await cryptoFunctionServiceFactory(cache, opts), await encryptServiceFactory(cache, opts), await platformUtilsServiceFactory(cache, opts), diff --git a/apps/browser/src/background/service_factories/event-service.factory.ts b/apps/browser/src/background/service_factories/event-service.factory.ts new file mode 100644 index 00000000000..61a82ebeb19 --- /dev/null +++ b/apps/browser/src/background/service_factories/event-service.factory.ts @@ -0,0 +1,40 @@ +import { EventService as AbstractEventService } from "@bitwarden/common/abstractions/event.service"; +import { EventService } from "@bitwarden/common/services/event.service"; + +import { apiServiceFactory, ApiServiceInitOptions } from "./api-service.factory"; +import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory"; +import { FactoryOptions, CachedServices, factory } from "./factory-options"; +import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; +import { + organizationServiceFactory, + OrganizationServiceInitOptions, +} from "./organization-service.factory"; +import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory"; + +type EventServiceOptions = FactoryOptions; + +export type EventServiceInitOptions = EventServiceOptions & + ApiServiceInitOptions & + CipherServiceInitOptions & + StateServiceInitOptions & + LogServiceInitOptions & + OrganizationServiceInitOptions; + +export function eventServiceFactory( + cache: { eventService?: AbstractEventService } & CachedServices, + opts: EventServiceInitOptions +): Promise { + return factory( + cache, + "eventService", + opts, + async () => + new EventService( + await apiServiceFactory(cache, opts), + await cipherServiceFactory(cache, opts), + await stateServiceFactory(cache, opts), + await logServiceFactory(cache, opts), + await organizationServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/background/service_factories/password-generation-service.factory.ts b/apps/browser/src/background/service_factories/password-generation-service.factory.ts new file mode 100644 index 00000000000..d69f22401c8 --- /dev/null +++ b/apps/browser/src/background/service_factories/password-generation-service.factory.ts @@ -0,0 +1,31 @@ +import { PasswordGenerationService as AbstractPasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; +import { PasswordGenerationService } from "@bitwarden/common/services/passwordGeneration.service"; + +import { cryptoServiceFactory, CryptoServiceInitOptions } from "./crypto-service.factory"; +import { CachedServices, factory, FactoryOptions } from "./factory-options"; +import { policyServiceFactory, PolicyServiceInitOptions } from "./policy-service.factory"; +import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory"; + +type PasswordGenerationServiceFactoryOptions = FactoryOptions; + +export type PasswordGenerationServiceInitOptions = PasswordGenerationServiceFactoryOptions & + CryptoServiceInitOptions & + PolicyServiceInitOptions & + StateServiceInitOptions; + +export function passwordGenerationServiceFactory( + cache: { passwordGenerationService?: AbstractPasswordGenerationService } & CachedServices, + opts: PasswordGenerationServiceInitOptions +): Promise { + return factory( + cache, + "passwordGenerationService", + opts, + async () => + new PasswordGenerationService( + await cryptoServiceFactory(cache, opts), + await policyServiceFactory(cache, opts), + await stateServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/background/service_factories/platform-utils-service.factory.ts b/apps/browser/src/background/service_factories/platform-utils-service.factory.ts index 6d85f126361..da25e51ce0c 100644 --- a/apps/browser/src/background/service_factories/platform-utils-service.factory.ts +++ b/apps/browser/src/background/service_factories/platform-utils-service.factory.ts @@ -28,7 +28,8 @@ export function platformUtilsServiceFactory( new BrowserPlatformUtilsService( await messagingServiceFactory(cache, opts), opts.platformUtilsServiceOptions.clipboardWriteCallback, - opts.platformUtilsServiceOptions.biometricCallback + opts.platformUtilsServiceOptions.biometricCallback, + opts.platformUtilsServiceOptions.win ) ); } diff --git a/apps/browser/src/background/service_factories/state-migration-service.factory.ts b/apps/browser/src/background/service_factories/state-migration-service.factory.ts index ae21298b72a..5c7fba3ed85 100644 --- a/apps/browser/src/background/service_factories/state-migration-service.factory.ts +++ b/apps/browser/src/background/service_factories/state-migration-service.factory.ts @@ -1,5 +1,5 @@ import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { StateMigrationService } from "@bitwarden/common/services/stateMigration.service"; import { Account } from "../../models/account"; diff --git a/apps/browser/src/background/service_factories/state-service.factory.ts b/apps/browser/src/background/service_factories/state-service.factory.ts index 202148cd746..1b81567ac52 100644 --- a/apps/browser/src/background/service_factories/state-service.factory.ts +++ b/apps/browser/src/background/service_factories/state-service.factory.ts @@ -1,5 +1,5 @@ import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { Account } from "../../models/account"; import { StateService } from "../../services/state.service"; diff --git a/apps/browser/src/background/service_factories/storage-service.factory.ts b/apps/browser/src/background/service_factories/storage-service.factory.ts index 09ee4c7371a..51993277c92 100644 --- a/apps/browser/src/background/service_factories/storage-service.factory.ts +++ b/apps/browser/src/background/service_factories/storage-service.factory.ts @@ -1,6 +1,7 @@ import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; +import { BrowserApi } from "../../browser/browserApi"; import BrowserLocalStorageService from "../../services/browserLocalStorage.service"; import { LocalBackedSessionStorageService } from "../../services/localBackedSessionStorage.service"; @@ -38,7 +39,7 @@ export function memoryStorageServiceFactory( opts: MemoryStorageServiceInitOptions ): Promise { return factory(cache, "memoryStorageService", opts, async () => { - if (chrome.runtime.getManifest().manifest_version == 3) { + if (BrowserApi.manifestVersion === 3) { return new LocalBackedSessionStorageService( await encryptServiceFactory(cache, opts), await keyGenerationServiceFactory(cache, opts) diff --git a/apps/browser/src/background/service_factories/totp-service.factory.ts b/apps/browser/src/background/service_factories/totp-service.factory.ts new file mode 100644 index 00000000000..07556489de5 --- /dev/null +++ b/apps/browser/src/background/service_factories/totp-service.factory.ts @@ -0,0 +1,31 @@ +import { TotpService as AbstractTotpService } from "@bitwarden/common/abstractions/totp.service"; +import { TotpService } from "@bitwarden/common/services/totp.service"; + +import { + cryptoFunctionServiceFactory, + CryptoFunctionServiceInitOptions, +} from "./crypto-function-service.factory"; +import { CachedServices, factory, FactoryOptions } from "./factory-options"; +import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory"; + +type TotpServiceOptions = FactoryOptions; + +export type TotpServiceInitOptions = TotpServiceOptions & + CryptoFunctionServiceInitOptions & + LogServiceInitOptions; + +export function totpServiceFactory( + cache: { totpService?: AbstractTotpService } & CachedServices, + opts: TotpServiceInitOptions +): Promise { + return factory( + cache, + "totpService", + opts, + async () => + new TotpService( + await cryptoFunctionServiceFactory(cache, opts), + await logServiceFactory(cache, opts) + ) + ); +} diff --git a/apps/browser/src/background/service_factories/two-factor-service.factory.ts b/apps/browser/src/background/service_factories/two-factor-service.factory.ts index 07bed5400b4..6a0788e8465 100644 --- a/apps/browser/src/background/service_factories/two-factor-service.factory.ts +++ b/apps/browser/src/background/service_factories/two-factor-service.factory.ts @@ -28,6 +28,6 @@ export async function twoFactorServiceFactory( await platformUtilsServiceFactory(cache, opts) ) ); - await service.init(); + service.init(); return service; } diff --git a/apps/browser/src/background/tabs.background.ts b/apps/browser/src/background/tabs.background.ts index ba56d996923..70d2ce1f002 100644 --- a/apps/browser/src/background/tabs.background.ts +++ b/apps/browser/src/background/tabs.background.ts @@ -24,7 +24,8 @@ export default class TabsBackground { }); chrome.tabs.onActivated.addListener(async (activeInfo: chrome.tabs.TabActiveInfo) => { - await this.main.refreshBadgeAndMenu(); + await this.main.refreshBadge(); + await this.main.refreshMenu(); this.main.messagingService.send("tabChanged"); }); @@ -35,7 +36,8 @@ export default class TabsBackground { this.main.onReplacedRan = true; await this.notificationBackground.checkNotificationQueue(); - await this.main.refreshBadgeAndMenu(); + await this.main.refreshBadge(); + await this.main.refreshMenu(); this.main.messagingService.send("tabChanged"); }); @@ -55,7 +57,8 @@ export default class TabsBackground { this.main.onUpdatedRan = true; await this.notificationBackground.checkNotificationQueue(tab); - await this.main.refreshBadgeAndMenu(); + await this.main.refreshBadge(); + await this.main.refreshMenu(); this.main.messagingService.send("tabChanged"); } ); diff --git a/apps/browser/src/background/webRequest.background.ts b/apps/browser/src/background/webRequest.background.ts index 26dd86a9081..b4b4cc4f37c 100644 --- a/apps/browser/src/background/webRequest.background.ts +++ b/apps/browser/src/background/webRequest.background.ts @@ -4,6 +4,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { UriMatchType } from "@bitwarden/common/enums/uriMatchType"; +import { BrowserApi } from "../browser/browserApi"; + export default class WebRequestBackground { private pendingAuthRequests: any[] = []; private webRequest: any; @@ -14,8 +16,7 @@ export default class WebRequestBackground { private cipherService: CipherService, private authService: AuthService ) { - const manifest = chrome.runtime.getManifest(); - if (manifest.manifest_version === 2) { + if (BrowserApi.manifestVersion === 2) { this.webRequest = (window as any).chrome.webRequest; } this.isFirefox = platformUtilsService.isFirefox(); diff --git a/apps/browser/src/browser/browserApi.ts b/apps/browser/src/browser/browserApi.ts index 7b0152a9bdb..d64231833df 100644 --- a/apps/browser/src/browser/browserApi.ts +++ b/apps/browser/src/browser/browserApi.ts @@ -1,3 +1,6 @@ +import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service"; +import { TabMessage } from "../types/tab-messages"; + export class BrowserApi { static isWebExtensionsApi: boolean = typeof browser !== "undefined"; static isSafariApi: boolean = @@ -8,6 +11,10 @@ export class BrowserApi { static isFirefoxOnAndroid: boolean = navigator.userAgent.indexOf("Firefox/") !== -1 && navigator.userAgent.indexOf("Android") !== -1; + static get manifestVersion() { + return chrome.runtime.getManifest().manifest_version; + } + static async getTabFromCurrentWindowId(): Promise | null { return await BrowserApi.tabsQueryFirst({ active: true, @@ -15,6 +22,13 @@ export class BrowserApi { }); } + static async getTab(tabId: number) { + if (tabId == null) { + return null; + } + return await chrome.tabs.get(tabId); + } + static async getTabFromCurrentWindow(): Promise | null { return await BrowserApi.tabsQueryFirst({ active: true, @@ -80,6 +94,14 @@ export class BrowserApi { }); } + static sendTabsMessage( + tabId: number, + message: TabMessage, + responseCallback?: (response: T) => void + ) { + chrome.tabs.sendMessage(tabId, message, responseCallback); + } + static async getPrivateModeWindows(): Promise { return (await browser.windows.getAll()).filter((win) => win.incognito); } @@ -201,4 +223,16 @@ export class BrowserApi { chrome.runtime.getPlatformInfo(resolve); }); } + + static getBrowserAction() { + return BrowserApi.manifestVersion === 3 ? chrome.action : chrome.browserAction; + } + + static getSidebarAction(win: Window & typeof globalThis) { + return BrowserPlatformUtilsService.isSafari(win) + ? null + : typeof win.opr !== "undefined" && win.opr.sidebarAction + ? win.opr.sidebarAction + : win.chrome.sidebarAction; + } } diff --git a/apps/browser/src/clipboard/clear-clipboard.spec.ts b/apps/browser/src/clipboard/clear-clipboard.spec.ts new file mode 100644 index 00000000000..6f7314d91ac --- /dev/null +++ b/apps/browser/src/clipboard/clear-clipboard.spec.ts @@ -0,0 +1,79 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import { BrowserApi } from "../browser/browserApi"; +import { StateService } from "../services/abstractions/state.service"; + +import { ClearClipboard } from "./clear-clipboard"; +import { getClearClipboardTime, setClearClipboardTime } from "./clipboard-state"; + +jest.mock("./clipboard-state", () => { + return { + getClearClipboardTime: jest.fn(), + setClearClipboardTime: jest.fn(), + }; +}); + +const getClearClipboardTimeMock = getClearClipboardTime as jest.Mock; +const setClearClipboardTimeMock = setClearClipboardTime as jest.Mock; + +describe("clearClipboard", () => { + describe("run", () => { + let stateService: MockProxy; + let serviceCache: Record; + + beforeEach(() => { + stateService = mock(); + serviceCache = { + stateService: stateService, + }; + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it("has a clear time that is past execution time", async () => { + const executionTime = new Date(2022, 1, 1, 12); + const clearTime = new Date(2022, 1, 1, 12, 1); + + jest.spyOn(BrowserApi, "getActiveTabs").mockResolvedValue([ + { + id: 1, + }, + ] as any); + + jest.spyOn(BrowserApi, "sendTabsMessage").mockReturnValue(); + + getClearClipboardTimeMock.mockResolvedValue(clearTime.getTime()); + + await ClearClipboard.run(executionTime, serviceCache); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { + command: "clearClipboard", + }); + }); + + it("has a clear time before execution time", async () => { + const executionTime = new Date(2022, 1, 1, 12); + const clearTime = new Date(2022, 1, 1, 11); + + setClearClipboardTimeMock.mockResolvedValue(clearTime.getTime()); + + await ClearClipboard.run(executionTime, serviceCache); + + expect(jest.spyOn(BrowserApi, "getActiveTabs")).not.toHaveBeenCalled(); + }); + + it("has an undefined clearTime", async () => { + const executionTime = new Date(2022, 1, 1); + + getClearClipboardTimeMock.mockResolvedValue(undefined); + + await ClearClipboard.run(executionTime, serviceCache); + + expect(jest.spyOn(BrowserApi, "getActiveTabs")).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/clipboard/clear-clipboard.ts b/apps/browser/src/clipboard/clear-clipboard.ts new file mode 100644 index 00000000000..00bf329f8d3 --- /dev/null +++ b/apps/browser/src/clipboard/clear-clipboard.ts @@ -0,0 +1,50 @@ +import { StateFactory } from "@bitwarden/common/factories/stateFactory"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; + +import { stateServiceFactory } from "../background/service_factories/state-service.factory"; +import { BrowserApi } from "../browser/browserApi"; +import { Account } from "../models/account"; + +import { getClearClipboardTime } from "./clipboard-state"; + +export class ClearClipboard { + static async run(executionTime: Date, serviceCache: Record) { + const stateFactory = new StateFactory(GlobalState, Account); + const stateService = await stateServiceFactory(serviceCache, { + cryptoFunctionServiceOptions: { + win: self, + }, + encryptServiceOptions: { + logMacFailures: false, + }, + logServiceOptions: { + isDev: false, + }, + stateMigrationServiceOptions: { + stateFactory: stateFactory, + }, + stateServiceOptions: { + stateFactory: stateFactory, + }, + }); + + const clearClipboardTime = await getClearClipboardTime(stateService); + + if (!clearClipboardTime) { + return; + } + + if (clearClipboardTime < executionTime.getTime()) { + return; + } + + const activeTabs = await BrowserApi.getActiveTabs(); + if (!activeTabs || activeTabs.length === 0) { + return; + } + + BrowserApi.sendTabsMessage(activeTabs[0].id, { + command: "clearClipboard", + }); + } +} diff --git a/apps/browser/src/clipboard/clipboard-state.ts b/apps/browser/src/clipboard/clipboard-state.ts new file mode 100644 index 00000000000..a1c15addc0a --- /dev/null +++ b/apps/browser/src/clipboard/clipboard-state.ts @@ -0,0 +1,10 @@ +import { StateService } from "../services/abstractions/state.service"; + +const clearClipboardStorageKey = "clearClipboardTime"; +export const getClearClipboardTime = async (stateService: StateService) => { + return await stateService.getFromSessionMemory(clearClipboardStorageKey); +}; + +export const setClearClipboardTime = async (stateService: StateService, time: number) => { + await stateService.setInSessionMemory(clearClipboardStorageKey, time); +}; diff --git a/apps/browser/src/clipboard/copy-to-clipboard-command.ts b/apps/browser/src/clipboard/copy-to-clipboard-command.ts new file mode 100644 index 00000000000..e1f2cca3f2c --- /dev/null +++ b/apps/browser/src/clipboard/copy-to-clipboard-command.ts @@ -0,0 +1,17 @@ +import { BrowserApi } from "../browser/browserApi"; + +/** + * Copies text to the clipboard in a MV3 safe way. + * @param tab - The tab that the text will be sent to so that it can be copied to the users clipboard this needs to be an active tab or the DOM won't be able to be used to do the action. The tab sent in here should be from a user started action or queried for active tabs. + * @param text - The text that you want added to the users clipboard. + */ +export const copyToClipboard = async (tab: chrome.tabs.Tab, text: string) => { + if (tab.id == null) { + throw new Error("Cannot copy text to clipboard with a tab that does not have an id."); + } + + BrowserApi.sendTabsMessage(tab.id, { + command: "copyText", + text: text, + }); +}; diff --git a/apps/browser/src/clipboard/generate-password-to-clipboard-command.spec.ts b/apps/browser/src/clipboard/generate-password-to-clipboard-command.spec.ts new file mode 100644 index 00000000000..e9c2141211f --- /dev/null +++ b/apps/browser/src/clipboard/generate-password-to-clipboard-command.spec.ts @@ -0,0 +1,76 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; + +import { BrowserApi } from "../browser/browserApi"; +import { StateService } from "../services/abstractions/state.service"; + +import { setClearClipboardTime } from "./clipboard-state"; +import { GeneratePasswordToClipboardCommand } from "./generate-password-to-clipboard-command"; + +jest.mock("./clipboard-state", () => { + return { + getClearClipboardTime: jest.fn(), + setClearClipboardTime: jest.fn(), + }; +}); + +const setClearClipboardTimeMock = setClearClipboardTime as jest.Mock; + +describe("GeneratePasswordToClipboardCommand", () => { + let passwordGenerationService: MockProxy; + let stateService: MockProxy; + + let sut: GeneratePasswordToClipboardCommand; + + beforeEach(() => { + passwordGenerationService = mock(); + stateService = mock(); + + passwordGenerationService.getOptions.mockResolvedValue([{ length: 8 }, {} as any]); + + passwordGenerationService.generatePassword.mockResolvedValue("PASSWORD"); + + jest.spyOn(BrowserApi, "sendTabsMessage").mockReturnValue(); + + sut = new GeneratePasswordToClipboardCommand(passwordGenerationService, stateService); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe("generatePasswordToClipboard", () => { + it("has clear clipboard value", async () => { + stateService.getClearClipboard.mockResolvedValue(5 * 60); // 5 minutes + + await sut.generatePasswordToClipboard({ id: 1 } as any); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { + command: "copyText", + text: "PASSWORD", + }); + + expect(setClearClipboardTimeMock).toHaveBeenCalledTimes(1); + + expect(setClearClipboardTimeMock).toHaveBeenCalledWith(stateService, expect.any(Number)); + }); + + it("does not have clear clipboard value", async () => { + stateService.getClearClipboard.mockResolvedValue(null); + + await sut.generatePasswordToClipboard({ id: 1 } as any); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledTimes(1); + + expect(jest.spyOn(BrowserApi, "sendTabsMessage")).toHaveBeenCalledWith(1, { + command: "copyText", + text: "PASSWORD", + }); + + expect(setClearClipboardTimeMock).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/browser/src/clipboard/generate-password-to-clipboard-command.ts b/apps/browser/src/clipboard/generate-password-to-clipboard-command.ts new file mode 100644 index 00000000000..ca92d2c686f --- /dev/null +++ b/apps/browser/src/clipboard/generate-password-to-clipboard-command.ts @@ -0,0 +1,26 @@ +import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; + +import { StateService } from "../services/abstractions/state.service"; + +import { setClearClipboardTime } from "./clipboard-state"; +import { copyToClipboard } from "./copy-to-clipboard-command"; + +export class GeneratePasswordToClipboardCommand { + constructor( + private passwordGenerationService: PasswordGenerationService, + private stateService: StateService + ) {} + + async generatePasswordToClipboard(tab: chrome.tabs.Tab) { + const [options] = await this.passwordGenerationService.getOptions(); + const password = await this.passwordGenerationService.generatePassword(options); + + copyToClipboard(tab, password); + + const clearClipboard = await this.stateService.getClearClipboard(); + + if (clearClipboard != null) { + await setClearClipboardTime(this.stateService, Date.now() + clearClipboard * 1000); + } + } +} diff --git a/apps/browser/src/clipboard/index.ts b/apps/browser/src/clipboard/index.ts new file mode 100644 index 00000000000..3682afd5054 --- /dev/null +++ b/apps/browser/src/clipboard/index.ts @@ -0,0 +1,3 @@ +export * from "./clear-clipboard"; +export * from "./copy-to-clipboard-command"; +export * from "./generate-password-to-clipboard-command"; diff --git a/apps/browser/src/content/misc-utils.ts b/apps/browser/src/content/misc-utils.ts new file mode 100644 index 00000000000..94e2e0f7a09 --- /dev/null +++ b/apps/browser/src/content/misc-utils.ts @@ -0,0 +1,23 @@ +import { TabMessage } from "../types/tab-messages"; + +async function copyText(text: string) { + await window.navigator.clipboard.writeText(text); +} + +async function onMessageListener( + msg: TabMessage, + sender: chrome.runtime.MessageSender, + responseCallback: (response: unknown) => void +) { + switch (msg.command) { + case "copyText": + await copyText(msg.text); + break; + case "clearClipboard": + await copyText("\u0000"); + break; + default: + } +} + +chrome.runtime.onMessage.addListener(onMessageListener); diff --git a/apps/browser/src/decorators/session-sync-observable/session-syncer.ts b/apps/browser/src/decorators/session-sync-observable/session-syncer.ts index c757a44c7f2..2acfed2954f 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-syncer.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-syncer.ts @@ -29,7 +29,7 @@ export class SessionSyncer { } init() { - if (chrome.runtime.getManifest().manifest_version != 3) { + if (BrowserApi.manifestVersion !== 3) { return; } diff --git a/apps/browser/src/globals.d.ts b/apps/browser/src/globals.d.ts index 9662c3d71b9..ace24cf3900 100644 --- a/apps/browser/src/globals.d.ts +++ b/apps/browser/src/globals.d.ts @@ -100,28 +100,28 @@ type OperaSidebarAction = { onBlur: OperaEvent; }; +/** + * This is for firefox's sidebar action and it is based on the opera one but with a few less methods + * + * @link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/sidebarAction + */ +type FirefoxSidebarAction = Omit< + OperaSidebarAction, + | "setBadgeText" + | "getBadgeText" + | "setBadgeBackgroundColor" + | "getBadgeBackgroundColor" + | "onFocus" + | "onBlur" +>; + type Opera = { addons: OperaAddons; sidebarAction: OperaSidebarAction; }; declare namespace chrome { - /** - * This is for firefoxes sidebar action and it is based on the opera one but with a few less methods - * - * @link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/sidebarAction - */ - let sidebarAction: - | Omit< - OperaSidebarAction, - | "setBadgeText" - | "getBadgeText" - | "setBadgeBackgroundColor" - | "getBadgeBackgroundColor" - | "onFocus" - | "onBlur" - > - | undefined; + let sidebarAction: FirefoxSidebarAction | undefined; } interface Window { diff --git a/apps/browser/src/listeners/onCommandListener.ts b/apps/browser/src/listeners/onCommandListener.ts index 2a33e91e578..c52e5cb61ac 100644 --- a/apps/browser/src/listeners/onCommandListener.ts +++ b/apps/browser/src/listeners/onCommandListener.ts @@ -1,131 +1,72 @@ +import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; -import { AuthService } from "@bitwarden/common/services/auth.service"; -import { CipherService } from "@bitwarden/common/services/cipher.service"; -import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service"; -import { EncryptService } from "@bitwarden/common/services/encrypt.service"; -import { NoopEventService } from "@bitwarden/common/services/noopEvent.service"; -import { SearchService } from "@bitwarden/common/services/search.service"; -import { SettingsService } from "@bitwarden/common/services/settings.service"; -import { StateMigrationService } from "@bitwarden/common/services/stateMigration.service"; -import { WebCryptoFunctionService } from "@bitwarden/common/services/webCryptoFunction.service"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { authServiceFactory } from "../background/service_factories/auth-service.factory"; +import { autofillServiceFactory } from "../background/service_factories/autofill-service.factory"; +import { CachedServices } from "../background/service_factories/factory-options"; +import { logServiceFactory } from "../background/service_factories/log-service.factory"; +import { + passwordGenerationServiceFactory, + PasswordGenerationServiceInitOptions, +} from "../background/service_factories/password-generation-service.factory"; +import { stateServiceFactory } from "../background/service_factories/state-service.factory"; +import { BrowserApi } from "../browser/browserApi"; +import { GeneratePasswordToClipboardCommand } from "../clipboard"; import { AutoFillActiveTabCommand } from "../commands/autoFillActiveTabCommand"; import { Account } from "../models/account"; -import { StateService as AbstractStateService } from "../services/abstractions/state.service"; -import AutofillService from "../services/autofill.service"; -import { BrowserCryptoService } from "../services/browserCrypto.service"; -import BrowserLocalStorageService from "../services/browserLocalStorage.service"; -import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service"; -import I18nService from "../services/i18n.service"; -import { KeyGenerationService } from "../services/keyGeneration.service"; -import { LocalBackedSessionStorageService } from "../services/localBackedSessionStorage.service"; -import { StateService } from "../services/state.service"; export const onCommandListener = async (command: string, tab: chrome.tabs.Tab) => { switch (command) { case "autofill_login": await doAutoFillLogin(tab); break; + case "generate_password": + await doGeneratePasswordToClipboard(tab); + break; } }; const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise => { - const logService = new ConsoleLogService(false); - - const cryptoFunctionService = new WebCryptoFunctionService(self); - - const storageService = new BrowserLocalStorageService(); - - const secureStorageService = new BrowserLocalStorageService(); - - const memoryStorageService = new LocalBackedSessionStorageService( - new EncryptService(cryptoFunctionService, logService, false), - new KeyGenerationService(cryptoFunctionService) - ); - - const stateFactory = new StateFactory(GlobalState, Account); - - const stateMigrationService = new StateMigrationService( - storageService, - secureStorageService, - stateFactory - ); - - const stateService: AbstractStateService = new StateService( - storageService, - secureStorageService, - memoryStorageService, // AbstractStorageService - logService, - stateMigrationService, - stateFactory - ); - - await stateService.init(); - - const platformUtils = new BrowserPlatformUtilsService( - null, // MessagingService - null, // clipboardWriteCallback - null // biometricCallback - ); - - const cryptoService = new BrowserCryptoService( - cryptoFunctionService, - null, // AbstractEncryptService - platformUtils, - logService, - stateService - ); - - const settingsService = new SettingsService(stateService); - - const i18nService = new I18nService(chrome.i18n.getUILanguage()); - - await i18nService.init(); - - // Don't love this pt.1 - let searchService: SearchService = null; - - const cipherService = new CipherService( - cryptoService, - settingsService, - null, // ApiService - null, // FileUploadService, - i18nService, - () => searchService, // Don't love this pt.2 - logService, - stateService - ); - - // Don't love this pt.3 - searchService = new SearchService(cipherService, logService, i18nService); - - // TODO: Remove this before we encourage anyone to start using this - const eventService = new NoopEventService(); - - const autofillService = new AutofillService( - cipherService, - stateService, - null, // TotpService - eventService, - logService - ); - - const authService = new AuthService( - cryptoService, // CryptoService - null, // ApiService - null, // TokenService - null, // AppIdService - platformUtils, - null, // MessagingService - logService, - null, // KeyConnectorService - null, // EnvironmentService - stateService, - null, // TwoFactorService - i18nService - ); + const cachedServices: CachedServices = {}; + const opts = { + cryptoFunctionServiceOptions: { + win: self, + }, + encryptServiceOptions: { + logMacFailures: true, + }, + logServiceOptions: { + isDev: false, + }, + platformUtilsServiceOptions: { + clipboardWriteCallback: () => Promise.resolve(), + biometricCallback: () => Promise.resolve(false), + win: self, + }, + stateServiceOptions: { + stateFactory: new StateFactory(GlobalState, Account), + }, + stateMigrationServiceOptions: { + stateFactory: new StateFactory(GlobalState, Account), + }, + apiServiceOptions: { + logoutCallback: () => Promise.resolve(), + }, + keyConnectorServiceOptions: { + logoutCallback: () => Promise.resolve(), + }, + i18nServiceOptions: { + systemLanguage: BrowserApi.getUILanguage(self), + }, + cipherServiceOptions: { + searchServiceFactory: null as () => SearchService, // No dependence on search service + }, + }; + const logService = await logServiceFactory(cachedServices, opts); + const authService = await authServiceFactory(cachedServices, opts); + const autofillService = await autofillServiceFactory(cachedServices, opts); const authStatus = await authService.getAuthStatus(); if (authStatus < AuthenticationStatus.Unlocked) { @@ -137,3 +78,37 @@ const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise => { const command = new AutoFillActiveTabCommand(autofillService); await command.doAutoFillActiveTabCommand(tab); }; + +const doGeneratePasswordToClipboard = async (tab: chrome.tabs.Tab): Promise => { + const stateFactory = new StateFactory(GlobalState, Account); + + const cache = {}; + const options: PasswordGenerationServiceInitOptions = { + cryptoFunctionServiceOptions: { + win: self, + }, + encryptServiceOptions: { + logMacFailures: false, + }, + logServiceOptions: { + isDev: false, + }, + platformUtilsServiceOptions: { + biometricCallback: () => Promise.resolve(true), + clipboardWriteCallback: (_clipboardValue, _clearMs) => Promise.resolve(), + win: self, + }, + stateMigrationServiceOptions: { + stateFactory: stateFactory, + }, + stateServiceOptions: { + stateFactory: stateFactory, + }, + }; + + const command = new GeneratePasswordToClipboardCommand( + await passwordGenerationServiceFactory(cache, options), + await stateServiceFactory(cache, options) + ); + command.generatePasswordToClipboard(tab); +}; diff --git a/apps/browser/src/listeners/onInstallListener.ts b/apps/browser/src/listeners/onInstallListener.ts index 63414d633ff..cc2d60594c9 100644 --- a/apps/browser/src/listeners/onInstallListener.ts +++ b/apps/browser/src/listeners/onInstallListener.ts @@ -1,5 +1,5 @@ import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { environmentServiceFactory } from "../background/service_factories/environment-service.factory"; import { BrowserApi } from "../browser/browserApi"; diff --git a/apps/browser/src/listeners/update-badge.ts b/apps/browser/src/listeners/update-badge.ts new file mode 100644 index 00000000000..888f4ce7917 --- /dev/null +++ b/apps/browser/src/listeners/update-badge.ts @@ -0,0 +1,276 @@ +import { AbstractEncryptService } from "@bitwarden/common/abstractions/abstractEncrypt.service"; +import { AuthService } from "@bitwarden/common/abstractions/auth.service"; +import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; +import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; +import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; +import { StateFactory } from "@bitwarden/common/factories/stateFactory"; +import { Utils } from "@bitwarden/common/misc/utils"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { ContainerService } from "@bitwarden/common/services/container.service"; + +import IconDetails from "../background/models/iconDetails"; +import { authServiceFactory } from "../background/service_factories/auth-service.factory"; +import { cipherServiceFactory } from "../background/service_factories/cipher-service.factory"; +import { searchServiceFactory } from "../background/service_factories/search-service.factory"; +import { stateServiceFactory } from "../background/service_factories/state-service.factory"; +import { BrowserApi } from "../browser/browserApi"; +import { Account } from "../models/account"; +import { StateService } from "../services/abstractions/state.service"; +import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service"; + +export type BadgeOptions = { + tab?: chrome.tabs.Tab; + windowId?: number; +}; + +export class UpdateBadge { + private authService: AuthService; + private stateService: StateService; + private cipherService: CipherService; + private badgeAction: typeof chrome.action; + private sidebarAction: OperaSidebarAction | FirefoxSidebarAction; + private inited = false; + private win: Window & typeof globalThis; + + private static readonly listenedToCommands = [ + "updateBadge", + "loggedIn", + "unlocked", + "syncCompleted", + "bgUpdateContextMenu", + "editedCipher", + "addedCipher", + "deletedCipher", + ]; + + static async tabsOnActivatedListener(activeInfo: chrome.tabs.TabActiveInfo) { + await new UpdateBadge(self).run({ tabId: activeInfo.tabId }); + } + + static async tabsOnReplacedListener(addedTabId: number, removedTabId: number) { + await new UpdateBadge(self).run({ tabId: addedTabId }); + } + + static async tabsOnUpdatedListener(tabId: number) { + await new UpdateBadge(self).run({ tabId }); + } + + static async messageListener( + serviceCache: Record, + message: { command: string; tabId: number } + ) { + if (!UpdateBadge.listenedToCommands.includes(message.command)) { + return; + } + + await new UpdateBadge(self).run(); + } + + constructor(win: Window & typeof globalThis) { + this.badgeAction = BrowserApi.getBrowserAction(); + this.sidebarAction = BrowserApi.getSidebarAction(self); + this.win = win; + } + + async run(opts?: { + tabId?: number; + windowId?: number; + existingServices?: Record; + }): Promise { + await this.initServices(opts?.existingServices); + + const authStatus = await this.authService.getAuthStatus(); + + const tab = await this.getTab(opts?.tabId, opts?.windowId); + const windowId = tab?.windowId; + + await this.setBadgeBackgroundColor(); + + switch (authStatus) { + case AuthenticationStatus.LoggedOut: { + await this.setLoggedOut({ tab, windowId }); + break; + } + case AuthenticationStatus.Locked: { + await this.setLocked({ tab, windowId }); + break; + } + case AuthenticationStatus.Unlocked: { + await this.setUnlocked({ tab, windowId }); + break; + } + } + } + + async setLoggedOut(opts: BadgeOptions): Promise { + await this.setBadgeIcon("_gray", opts?.windowId); + await this.setBadgeText("", opts?.tab?.id); + } + + async setLocked(opts: BadgeOptions) { + await this.setBadgeIcon("_locked", opts?.windowId); + await this.setBadgeText("", opts?.tab?.id); + } + + async setUnlocked(opts: BadgeOptions) { + await this.initServices(); + + await this.setBadgeIcon("", opts?.windowId); + + const disableBadgeCounter = await this.stateService.getDisableBadgeCounter(); + if (disableBadgeCounter) { + return; + } + + const ciphers = await this.cipherService.getAllDecryptedForUrl(opts?.tab?.url); + let countText = ciphers.length == 0 ? "" : ciphers.length.toString(); + if (ciphers.length > 9) { + countText = "9+"; + } + await this.setBadgeText(countText, opts?.tab?.id); + } + + setBadgeBackgroundColor(color = "#294e5f") { + if (this.badgeAction?.setBadgeBackgroundColor) { + this.badgeAction.setBadgeBackgroundColor({ color }); + } + if (this.isOperaSidebar(this.sidebarAction)) { + this.sidebarAction.setBadgeBackgroundColor({ color }); + } + } + + setBadgeText(text: string, tabId?: number) { + this.setActionText(text, tabId); + this.setSideBarText(text, tabId); + } + + async setBadgeIcon(iconSuffix: string, windowId?: number) { + const options: IconDetails = { + path: { + 19: "/images/icon19" + iconSuffix + ".png", + 38: "/images/icon38" + iconSuffix + ".png", + }, + }; + if (BrowserPlatformUtilsService.isFirefox()) { + options.windowId = windowId; + } + + await this.setActionIcon(options); + await this.setSidebarActionIcon(options); + } + + private setActionText(text: string, tabId?: number) { + if (this.badgeAction?.setBadgeText) { + this.badgeAction.setBadgeText({ text, tabId }); + } + } + + private setSideBarText(text: string, tabId?: number) { + if (this.isOperaSidebar(this.sidebarAction)) { + this.sidebarAction.setBadgeText({ text, tabId }); + } else if (this.sidebarAction) { + // Firefox + const title = `Bitwarden${Utils.isNullOrEmpty(text) ? "" : ` [${text}]`}`; + this.sidebarAction.setTitle({ title, tabId }); + } + } + + private async setActionIcon(options: IconDetails) { + if (!this.badgeAction?.setIcon) { + return; + } + + if (this.useSyncApiCalls) { + this.badgeAction.setIcon(options); + } else { + await new Promise((resolve) => this.badgeAction.setIcon(options, () => resolve())); + } + } + + private async setSidebarActionIcon(options: IconDetails) { + if (!this.sidebarAction?.setIcon) { + return; + } + + if (this.useSyncApiCalls) { + this.sidebarAction.setIcon(options); + } else { + await new Promise((resolve) => this.sidebarAction.setIcon(options, () => resolve())); + } + } + + private async getTab(tabId?: number, windowId?: number) { + return ( + (await BrowserApi.getTab(tabId)) ?? + (await BrowserApi.tabsQueryFirst({ active: true, windowId })) ?? + (await BrowserApi.tabsQueryFirst({ active: true, lastFocusedWindow: true })) ?? + (await BrowserApi.tabsQueryFirst({ active: true })) + ); + } + + private get useSyncApiCalls() { + return ( + BrowserPlatformUtilsService.isFirefox() || BrowserPlatformUtilsService.isSafari(this.win) + ); + } + + private async initServices(existingServiceCache?: Record): Promise { + if (this.inited) { + return this; + } + + const serviceCache: Record = existingServiceCache || {}; + const opts = { + cryptoFunctionServiceOptions: { win: self }, + encryptServiceOptions: { logMacFailures: false }, + logServiceOptions: { isDev: false }, + platformUtilsServiceOptions: { + clipboardWriteCallback: (clipboardValue: string, clearMs: number) => + Promise.reject("not implemented"), + biometricCallback: () => Promise.reject("not implemented"), + win: self, + }, + stateServiceOptions: { + stateFactory: new StateFactory(GlobalState, Account), + }, + stateMigrationServiceOptions: { + stateFactory: new StateFactory(GlobalState, Account), + }, + apiServiceOptions: { + logoutCallback: () => Promise.reject("not implemented"), + }, + keyConnectorServiceOptions: { + logoutCallback: () => Promise.reject("not implemented"), + }, + i18nServiceOptions: { + systemLanguage: BrowserApi.getUILanguage(self), + }, + }; + this.stateService = await stateServiceFactory(serviceCache, opts); + this.authService = await authServiceFactory(serviceCache, opts); + const searchService = await searchServiceFactory(serviceCache, opts); + + this.cipherService = await cipherServiceFactory(serviceCache, { + ...opts, + cipherServiceOptions: { searchServiceFactory: () => searchService }, + }); + + // Needed for cipher decryption + if (!self.bitwardenContainerService) { + new ContainerService( + serviceCache.cryptoService as CryptoService, + serviceCache.encryptService as AbstractEncryptService + ).attachToGlobal(self); + } + + this.inited = true; + + return this; + } + + private isOperaSidebar( + action: OperaSidebarAction | FirefoxSidebarAction + ): action is OperaSidebarAction { + return action != null && (action as OperaSidebarAction).setBadgeText != null; + } +} diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index d29223559e0..ef236acac30 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2022.9.1", + "version": "2022.10.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 68a9ff30c88..5a2c2963d73 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2022.9.1", + "version": "2022.10.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -38,6 +38,12 @@ "css": ["content/autofill.css"], "matches": ["http://*/*", "https://*/*", "file:///*"], "run_at": "document_end" + }, + { + "all_frames": true, + "js": ["content/misc-utils.js"], + "matches": ["http://*/*", "https://*/*", "file:///*"], + "run_at": "document_end" } ], "background": { @@ -59,7 +65,8 @@ "unlimitedStorage", "clipboardRead", "clipboardWrite", - "idle" + "idle", + "alarms" ], "optional_permissions": ["nativeMessaging"], "host_permissions": ["http://*/*", "https://*/*"], diff --git a/apps/browser/src/models/browserGroupingsComponentState.ts b/apps/browser/src/models/browserGroupingsComponentState.ts index 3e244f9a52e..63eb4aaa88f 100644 --- a/apps/browser/src/models/browserGroupingsComponentState.ts +++ b/apps/browser/src/models/browserGroupingsComponentState.ts @@ -1,7 +1,7 @@ import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { BrowserComponentState } from "./browserComponentState"; diff --git a/apps/browser/src/models/browserSendComponentState.ts b/apps/browser/src/models/browserSendComponentState.ts index 8ba2407c5f8..e2bf4eaa5d6 100644 --- a/apps/browser/src/models/browserSendComponentState.ts +++ b/apps/browser/src/models/browserSendComponentState.ts @@ -1,5 +1,5 @@ import { SendType } from "@bitwarden/common/enums/sendType"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { BrowserComponentState } from "./browserComponentState"; diff --git a/apps/browser/src/popup/accounts/lock.component.ts b/apps/browser/src/popup/accounts/lock.component.ts index c288a54a65b..775ecaa3ca0 100644 --- a/apps/browser/src/popup/accounts/lock.component.ts +++ b/apps/browser/src/popup/accounts/lock.component.ts @@ -12,7 +12,6 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; @@ -28,8 +27,6 @@ export class LockComponent extends BaseLockComponent { biometricError: string; pendingBiometric = false; - authenicatedUrl = "/tabs/current"; - unAuthenicatedUrl = "/update-temp-password"; constructor( router: Router, @@ -45,8 +42,7 @@ export class LockComponent extends BaseLockComponent { logService: LogService, keyConnectorService: KeyConnectorService, ngZone: NgZone, - private authService: AuthService, - private syncService: SyncService + private authService: AuthService ) { super( router, @@ -63,17 +59,12 @@ export class LockComponent extends BaseLockComponent { keyConnectorService, ngZone ); - + this.successRoute = "/tabs/current"; this.isInitialLockScreen = (window as any).previousPopupUrl == null; } async ngOnInit() { await super.ngOnInit(); - await this.syncService.fullSync(true); - - const forcePasswordReset = await this.stateService.getForcePasswordReset(); - this.successRoute = forcePasswordReset === true ? this.unAuthenicatedUrl : this.authenicatedUrl; - const disableAutoBiometricsPrompt = (await this.stateService.getDisableAutoBiometricsPrompt()) ?? true; diff --git a/apps/browser/src/popup/components/action-buttons.component.ts b/apps/browser/src/popup/components/action-buttons.component.ts index 5fd76bb4be1..3df8e0d4cd5 100644 --- a/apps/browser/src/popup/components/action-buttons.component.ts +++ b/apps/browser/src/popup/components/action-buttons.component.ts @@ -9,7 +9,7 @@ import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { EventType } from "@bitwarden/common/enums/eventType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; @Component({ selector: "app-action-buttons", diff --git a/apps/browser/src/popup/components/cipher-row.component.html b/apps/browser/src/popup/components/cipher-row.component.html index fce966adb4d..ebb18bebe83 100644 --- a/apps/browser/src/popup/components/cipher-row.component.html +++ b/apps/browser/src/popup/components/cipher-row.component.html @@ -15,23 +15,25 @@
- {{ cipher.name | ellipsis: 20 }} - - - {{ "shared" | i18n }} - - - - {{ "attachments" | i18n }} - + + {{ cipher.name }} + + + {{ "shared" | i18n }} + + + + {{ "attachments" | i18n }} + + {{ cipher.subTitle }}
diff --git a/apps/browser/src/popup/components/cipher-row.component.ts b/apps/browser/src/popup/components/cipher-row.component.ts index 41fe8e07866..bb99316dd25 100644 --- a/apps/browser/src/popup/components/cipher-row.component.ts +++ b/apps/browser/src/popup/components/cipher-row.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; @Component({ selector: "app-cipher-row", diff --git a/apps/browser/src/popup/components/send-list.component.ts b/apps/browser/src/popup/components/send-list.component.ts index f019510b366..05254729eb3 100644 --- a/apps/browser/src/popup/components/send-list.component.ts +++ b/apps/browser/src/popup/components/send-list.component.ts @@ -1,7 +1,7 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; import { SendType } from "@bitwarden/common/enums/sendType"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; @Component({ selector: "app-send-list", diff --git a/apps/browser/src/popup/generator/generator.component.ts b/apps/browser/src/popup/generator/generator.component.ts index 41a033b980e..cff5e9e3c37 100644 --- a/apps/browser/src/popup/generator/generator.component.ts +++ b/apps/browser/src/popup/generator/generator.component.ts @@ -9,7 +9,7 @@ import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwo import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { UsernameGenerationService } from "@bitwarden/common/abstractions/usernameGeneration.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; @Component({ selector: "app-generator", diff --git a/apps/browser/src/popup/scss/base.scss b/apps/browser/src/popup/scss/base.scss index 0ec248e6bf7..1222f66aaac 100644 --- a/apps/browser/src/popup/scss/base.scss +++ b/apps/browser/src/popup/scss/base.scss @@ -98,6 +98,11 @@ button { font-family: $font-family-sans-serif; } +select { + width: 100%; + padding: 0.35rem; +} + button { cursor: pointer; } diff --git a/apps/browser/src/popup/scss/box.scss b/apps/browser/src/popup/scss/box.scss index 3a4dfd5620d..586c2d1c85e 100644 --- a/apps/browser/src/popup/scss/box.scss +++ b/apps/browser/src/popup/scss/box.scss @@ -707,3 +707,16 @@ } } } + +.truncate-box { + display: flex; + align-items: center; + gap: 5px; +} + +.truncate { + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/apps/browser/src/popup/scss/misc.scss b/apps/browser/src/popup/scss/misc.scss index 1d6acfe6417..a4d5dcba96a 100644 --- a/apps/browser/src/popup/scss/misc.scss +++ b/apps/browser/src/popup/scss/misc.scss @@ -392,6 +392,18 @@ input[type="password"]::-ms-reveal { } } +// Text selection styles +// Set explicit selection styles (assumes primary accent color has sufficient +// contrast against the background, so its inversion is also still readable) +// and suppress user selection for most elements (to make it more app-like) + +::selection { + @include themify($themes) { + color: themed("backgroundColor"); + background-color: themed("primaryAccentColor"); + } +} + h1, h2, h3, @@ -410,6 +422,7 @@ img, user-select: none; } +app-about .modal-body > *, app-vault-view .box-footer { user-select: auto; } diff --git a/apps/browser/src/popup/send/send-groupings.component.ts b/apps/browser/src/popup/send/send-groupings.component.ts index 0805742666d..1af715ada0f 100644 --- a/apps/browser/src/popup/send/send-groupings.component.ts +++ b/apps/browser/src/popup/send/send-groupings.component.ts @@ -12,7 +12,7 @@ import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { SendType } from "@bitwarden/common/enums/sendType"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { BrowserSendComponentState } from "../../models/browserSendComponentState"; import { StateService } from "../../services/abstractions/state.service"; diff --git a/apps/browser/src/popup/send/send-type.component.ts b/apps/browser/src/popup/send/send-type.component.ts index 3e4054bf723..afd3daeeda5 100644 --- a/apps/browser/src/popup/send/send-type.component.ts +++ b/apps/browser/src/popup/send/send-type.component.ts @@ -13,7 +13,7 @@ import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.serv import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; import { SendType } from "@bitwarden/common/enums/sendType"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { BrowserComponentState } from "../../models/browserComponentState"; import { StateService } from "../../services/abstractions/state.service"; diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index a79028a26d1..da96f7f9037 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -68,13 +68,14 @@ import { PopupSearchService } from "./popup-search.service"; import { PopupUtilsService } from "./popup-utils.service"; import { UnauthGuardService } from "./unauth-guard.service"; -const isPrivateMode = BrowserApi.getBackgroundPage() == null; -const mainBackground: MainBackground = isPrivateMode +const needsBackgroundInit = BrowserApi.getBackgroundPage() == null; +const isPrivateMode = needsBackgroundInit && BrowserApi.manifestVersion !== 3; +const mainBackground: MainBackground = needsBackgroundInit ? createLocalBgService() : BrowserApi.getBackgroundPage().bitwardenMain; function createLocalBgService() { - const localBgService = new MainBackground(true); + const localBgService = new MainBackground(isPrivateMode); localBgService.bootstrap(); return localBgService; } @@ -108,7 +109,7 @@ function getBgService(service: keyof MainBackground) { { provide: MessagingService, useFactory: () => { - return isPrivateMode + return needsBackgroundInit ? new BrowserMessagingPrivateModePopupService() : new BrowserMessagingService(); }, diff --git a/apps/browser/src/popup/settings/folders.component.ts b/apps/browser/src/popup/settings/folders.component.ts index f0fb2204d88..45f92d52212 100644 --- a/apps/browser/src/popup/settings/folders.component.ts +++ b/apps/browser/src/popup/settings/folders.component.ts @@ -3,7 +3,7 @@ import { Router } from "@angular/router"; import { map, Observable } from "rxjs"; import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; @Component({ selector: "app-folders", diff --git a/apps/browser/src/popup/vault/add-edit.component.ts b/apps/browser/src/popup/vault/add-edit.component.ts index d220a24a0d8..b890766f6b9 100644 --- a/apps/browser/src/popup/vault/add-edit.component.ts +++ b/apps/browser/src/popup/vault/add-edit.component.ts @@ -18,7 +18,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { LoginUriView } from "@bitwarden/common/models/view/loginUriView"; +import { LoginUriView } from "@bitwarden/common/models/view/login-uri.view"; import { BrowserApi } from "../../browser/browserApi"; import { PopupUtilsService } from "../services/popup-utils.service"; diff --git a/apps/browser/src/popup/vault/ciphers.component.ts b/apps/browser/src/popup/vault/ciphers.component.ts index 34d567bbe4f..2366a55d5bd 100644 --- a/apps/browser/src/popup/vault/ciphers.component.ts +++ b/apps/browser/src/popup/vault/ciphers.component.ts @@ -14,10 +14,10 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { TreeNode } from "@bitwarden/common/models/domain/treeNode"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { BrowserApi } from "../../browser/browserApi"; import { BrowserComponentState } from "../../models/browserComponentState"; diff --git a/apps/browser/src/popup/vault/current-tab.component.html b/apps/browser/src/popup/vault/current-tab.component.html index c1029abffb3..f88fd2feca3 100644 --- a/apps/browser/src/popup/vault/current-tab.component.html +++ b/apps/browser/src/popup/vault/current-tab.component.html @@ -17,9 +17,10 @@ placeholder="{{ 'searchVault' | i18n }}" id="search" [(ngModel)]="searchText" - (input)="searchVault()" + (input)="search$.next()" autocomplete="off" (keydown)="closeOnEsc($event)" + appAutofocus /> diff --git a/apps/browser/src/popup/vault/current-tab.component.ts b/apps/browser/src/popup/vault/current-tab.component.ts index f3e97dd233d..48b22a518f7 100644 --- a/apps/browser/src/popup/vault/current-tab.component.ts +++ b/apps/browser/src/popup/vault/current-tab.component.ts @@ -1,5 +1,7 @@ import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { Router } from "@angular/router"; +import { Subject } from "rxjs"; +import { debounceTime, takeUntil } from "rxjs/operators"; import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; @@ -13,7 +15,7 @@ import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.ab import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { BrowserApi } from "../../browser/browserApi"; import { AutofillService } from "../../services/abstractions/autofill.service"; @@ -40,6 +42,8 @@ export class CurrentTabComponent implements OnInit, OnDestroy { loaded = false; isLoading = false; showOrganizations = false; + protected search$ = new Subject(); + private destroy$ = new Subject(); private totpCode: string; private totpTimeout: number; @@ -105,14 +109,17 @@ export class CurrentTabComponent implements OnInit, OnDestroy { }, 5000); } - window.setTimeout(() => { - document.getElementById("search").focus(); - }, 100); + this.search$ + .pipe(debounceTime(500), takeUntil(this.destroy$)) + .subscribe(() => this.searchVault()); } ngOnDestroy() { window.clearTimeout(this.loadedTimeout); this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); + + this.destroy$.next(); + this.destroy$.complete(); } async refresh() { @@ -179,15 +186,11 @@ export class CurrentTabComponent implements OnInit, OnDestroy { } searchVault() { - if (this.searchTimeout != null) { - clearTimeout(this.searchTimeout); - } if (!this.searchService.isSearchable(this.searchText)) { return; } - this.searchTimeout = window.setTimeout(async () => { - this.router.navigate(["/tabs/vault"], { queryParams: { searchText: this.searchText } }); - }, 200); + + this.router.navigate(["/tabs/vault"], { queryParams: { searchText: this.searchText } }); } closeOnEsc(e: KeyboardEvent) { diff --git a/apps/browser/src/popup/vault/vault-filter.component.ts b/apps/browser/src/popup/vault/vault-filter.component.ts index 0abc16e1eca..6ae6f9b88d9 100644 --- a/apps/browser/src/popup/vault/vault-filter.component.ts +++ b/apps/browser/src/popup/vault/vault-filter.component.ts @@ -11,10 +11,10 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { TreeNode } from "@bitwarden/common/models/domain/treeNode"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { TreeNode } from "@bitwarden/common/models/domain/tree-node"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { BrowserApi } from "../../browser/browserApi"; import { BrowserGroupingsComponentState } from "../../models/browserGroupingsComponentState"; diff --git a/apps/browser/src/popup/vault/view.component.html b/apps/browser/src/popup/vault/view.component.html index 5fa5d2aba6c..3857dc2ba0b 100644 --- a/apps/browser/src/popup/vault/view.component.html +++ b/apps/browser/src/popup/vault/view.component.html @@ -475,6 +475,20 @@ +
+
+
+ + +
+
+

+
+ {{ "dateCreated" | i18n }}: + {{ cipher.creationDate | date: "medium" }} +
{{ "datePasswordUpdated" | i18n }}: {{ cipher.passwordRevisionDisplayDate | date: "medium" }} diff --git a/apps/browser/src/popup/vault/view.component.ts b/apps/browser/src/popup/vault/view.component.ts index e43b86e6b8f..905b515f540 100644 --- a/apps/browser/src/popup/vault/view.component.ts +++ b/apps/browser/src/popup/vault/view.component.ts @@ -11,6 +11,7 @@ import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; @@ -21,7 +22,7 @@ import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; -import { LoginUriView } from "@bitwarden/common/models/view/loginUriView"; +import { LoginUriView } from "@bitwarden/common/models/view/login-uri.view"; import { BrowserApi } from "../../browser/browserApi"; import { AutofillService } from "../../services/abstractions/autofill.service"; @@ -43,6 +44,7 @@ export class ViewComponent extends BaseViewComponent { constructor( cipherService: CipherService, + folderService: FolderService, totpService: TotpService, tokenService: TokenService, i18nService: I18nService, @@ -67,6 +69,7 @@ export class ViewComponent extends BaseViewComponent { ) { super( cipherService, + folderService, totpService, tokenService, i18nService, diff --git a/apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts b/apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts index ec6c758d968..6a70718addf 100644 --- a/apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts +++ b/apps/browser/src/services/abstractions/abstractKeyGeneration.service.ts @@ -1,4 +1,4 @@ -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; export interface AbstractKeyGenerationService { makeEphemeralKey(numBytes?: number): Promise; diff --git a/apps/browser/src/services/abstractions/autofill.service.ts b/apps/browser/src/services/abstractions/autofill.service.ts index ceab1d589f8..c900875f5e4 100644 --- a/apps/browser/src/services/abstractions/autofill.service.ts +++ b/apps/browser/src/services/abstractions/autofill.service.ts @@ -1,4 +1,4 @@ -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import AutofillField from "../../models/autofillField"; import AutofillForm from "../../models/autofillForm"; diff --git a/apps/browser/src/services/abstractions/state.service.ts b/apps/browser/src/services/abstractions/state.service.ts index 0f552154d6a..294bc814e61 100644 --- a/apps/browser/src/services/abstractions/state.service.ts +++ b/apps/browser/src/services/abstractions/state.service.ts @@ -1,7 +1,7 @@ import { Jsonify } from "type-fest"; import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/abstractions/state.service"; -import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; +import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; import { Account } from "../../models/account"; import { BrowserComponentState } from "../../models/browserComponentState"; diff --git a/apps/browser/src/services/autofill.service.ts b/apps/browser/src/services/autofill.service.ts index ff8eca93475..fe7837dd4b5 100644 --- a/apps/browser/src/services/autofill.service.ts +++ b/apps/browser/src/services/autofill.service.ts @@ -6,8 +6,8 @@ import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { EventType } from "@bitwarden/common/enums/eventType"; import { FieldType } from "@bitwarden/common/enums/fieldType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { FieldView } from "@bitwarden/common/models/view/fieldView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { FieldView } from "@bitwarden/common/models/view/field.view"; import { BrowserApi } from "../browser/browserApi"; import AutofillField from "../models/autofillField"; @@ -172,14 +172,10 @@ export default class AutofillService implements AutofillServiceInterface { } else { cipher = await this.cipherService.getLastUsedForUrl(tab.url, true); } - - if (cipher == null) { - return null; - } } - if (cipher.reprompt !== CipherRepromptType.None) { - return; + if (cipher == null || cipher.reprompt !== CipherRepromptType.None) { + return null; } const totpCode = await this.doAutoFill({ diff --git a/apps/browser/src/services/browserPlatformUtils.service.spec.ts b/apps/browser/src/services/browserPlatformUtils.service.spec.ts index 21034bcfa47..683254087e7 100644 --- a/apps/browser/src/services/browserPlatformUtils.service.spec.ts +++ b/apps/browser/src/services/browserPlatformUtils.service.spec.ts @@ -16,7 +16,7 @@ describe("Browser Utils Service", () => { let browserPlatformUtilsService: BrowserPlatformUtilsService; beforeEach(() => { (window as any).matchMedia = jest.fn().mockReturnValueOnce({}); - browserPlatformUtilsService = new BrowserPlatformUtilsService(null, null, null); + browserPlatformUtilsService = new BrowserPlatformUtilsService(null, null, null, window); }); afterEach(() => { diff --git a/apps/browser/src/services/browserPlatformUtils.service.ts b/apps/browser/src/services/browserPlatformUtils.service.ts index a9f1c35567d..feb50a5ccf1 100644 --- a/apps/browser/src/services/browserPlatformUtils.service.ts +++ b/apps/browser/src/services/browserPlatformUtils.service.ts @@ -19,7 +19,8 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService constructor( private messagingService: MessagingService, private clipboardWriteCallback: (clipboardValue: string, clearMs: number) => void, - private biometricCallback: () => Promise + private biometricCallback: () => Promise, + private win: Window & typeof globalThis ) {} getDevice(): DeviceType { @@ -27,24 +28,17 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService return this.deviceCache; } - if ( - navigator.userAgent.indexOf(" Firefox/") !== -1 || - navigator.userAgent.indexOf(" Gecko/") !== -1 - ) { + if (BrowserPlatformUtilsService.isFirefox()) { this.deviceCache = DeviceType.FirefoxExtension; - } else if ( - (self.opr && self.opr.addons) || - self.opera || - navigator.userAgent.indexOf(" OPR/") >= 0 - ) { + } else if (BrowserPlatformUtilsService.isOpera(this.win)) { this.deviceCache = DeviceType.OperaExtension; - } else if (navigator.userAgent.indexOf(" Edg/") !== -1) { + } else if (BrowserPlatformUtilsService.isEdge()) { this.deviceCache = DeviceType.EdgeExtension; - } else if (navigator.userAgent.indexOf(" Vivaldi/") !== -1) { + } else if (BrowserPlatformUtilsService.isVivaldi()) { this.deviceCache = DeviceType.VivaldiExtension; - } else if (window.chrome && navigator.userAgent.indexOf(" Chrome/") !== -1) { + } else if (BrowserPlatformUtilsService.isChrome(this.win)) { this.deviceCache = DeviceType.ChromeExtension; - } else if (navigator.userAgent.indexOf(" Safari/") !== -1) { + } else if (BrowserPlatformUtilsService.isSafari(this.win)) { this.deviceCache = DeviceType.SafariExtension; } @@ -60,26 +54,58 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService return ClientType.Browser; } + static isFirefox(): boolean { + return ( + navigator.userAgent.indexOf(" Firefox/") !== -1 || + navigator.userAgent.indexOf(" Gecko/") !== -1 + ); + } + isFirefox(): boolean { return this.getDevice() === DeviceType.FirefoxExtension; } + static isChrome(win: Window & typeof globalThis): boolean { + return win.chrome && navigator.userAgent.indexOf(" Chrome/") !== -1; + } + isChrome(): boolean { return this.getDevice() === DeviceType.ChromeExtension; } + static isEdge(): boolean { + return navigator.userAgent.indexOf(" Edg/") !== -1; + } + isEdge(): boolean { return this.getDevice() === DeviceType.EdgeExtension; } + static isOpera(win: Window & typeof globalThis): boolean { + return ( + (!!win.opr && !!win.opr.addons) || !!win.opera || navigator.userAgent.indexOf(" OPR/") >= 0 + ); + } + isOpera(): boolean { return this.getDevice() === DeviceType.OperaExtension; } + static isVivaldi(): boolean { + return navigator.userAgent.indexOf(" Vivaldi/") !== -1; + } + isVivaldi(): boolean { return this.getDevice() === DeviceType.VivaldiExtension; } + static isSafari(win: Window & typeof globalThis): boolean { + // Opera masquerades as Safari, so make sure we're not there first + return ( + !BrowserPlatformUtilsService.isOpera(win) && navigator.userAgent.indexOf(" Safari/") !== -1 + ); + } + isSafari(): boolean { return this.getDevice() === DeviceType.SafariExtension; } @@ -178,8 +204,8 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService } copyToClipboard(text: string, options?: any): void { - let win = window; - let doc = window.document; + let win = this.win; + let doc = this.win.document; if (options && (options.window || options.win)) { win = options.window || options.win; doc = win.document; @@ -238,8 +264,8 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService } async readFromClipboard(options?: any): Promise { - let win = window; - let doc = window.document; + let win = this.win; + let doc = this.win.document; if (options && (options.window || options.win)) { win = options.window || options.win; doc = win.document; @@ -335,7 +361,7 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService } sidebarViewName(): string { - if (window.chrome.sidebarAction && this.isFirefox()) { + if (this.win.chrome.sidebarAction && this.isFirefox()) { return "sidebar"; } else if (this.isOpera() && typeof opr !== "undefined" && opr.sidebarAction) { return "sidebar_panel"; diff --git a/apps/browser/src/services/folders/folder.service.ts b/apps/browser/src/services/folders/folder.service.ts index a3a6a4d8ba6..e4fc19644da 100644 --- a/apps/browser/src/services/folders/folder.service.ts +++ b/apps/browser/src/services/folders/folder.service.ts @@ -1,7 +1,7 @@ import { BehaviorSubject } from "rxjs"; import { Folder } from "@bitwarden/common/models/domain/folder"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { FolderService as BaseFolderService } from "@bitwarden/common/services/folder/folder.service"; import { browserSession, sessionSync } from "../../decorators/session-sync-observable"; diff --git a/apps/browser/src/services/keyGeneration.service.ts b/apps/browser/src/services/keyGeneration.service.ts index f6e1160a14a..0dbb1e81225 100644 --- a/apps/browser/src/services/keyGeneration.service.ts +++ b/apps/browser/src/services/keyGeneration.service.ts @@ -1,5 +1,5 @@ import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { AbstractKeyGenerationService } from "./abstractions/abstractKeyGeneration.service"; diff --git a/apps/browser/src/services/localBackedSessionStorage.service.spec.ts b/apps/browser/src/services/localBackedSessionStorage.service.spec.ts index f7101ddae2e..85937336081 100644 --- a/apps/browser/src/services/localBackedSessionStorage.service.spec.ts +++ b/apps/browser/src/services/localBackedSessionStorage.service.spec.ts @@ -1,8 +1,9 @@ +// eslint-disable-next-line no-restricted-imports import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { EncryptService } from "@bitwarden/common/src/services/encrypt.service"; import BrowserLocalStorageService from "./browserLocalStorage.service"; diff --git a/apps/browser/src/services/localBackedSessionStorage.service.ts b/apps/browser/src/services/localBackedSessionStorage.service.ts index dea2e75a5ed..5c98f4e3103 100644 --- a/apps/browser/src/services/localBackedSessionStorage.service.ts +++ b/apps/browser/src/services/localBackedSessionStorage.service.ts @@ -5,9 +5,9 @@ import { AbstractCachedStorageService, MemoryStorageServiceInterface, } from "@bitwarden/common/abstractions/storage.service"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { MemoryStorageOptions } from "@bitwarden/common/models/domain/storageOptions"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { MemoryStorageOptions } from "@bitwarden/common/models/domain/storage-options"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { devFlag } from "../decorators/dev-flag.decorator"; import { devFlagEnabled } from "../flags"; diff --git a/apps/browser/src/services/state.service.spec.ts b/apps/browser/src/services/state.service.spec.ts index f3b6c74a5e3..e6bde9af5bb 100644 --- a/apps/browser/src/services/state.service.spec.ts +++ b/apps/browser/src/services/state.service.spec.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line no-restricted-imports import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -7,9 +8,9 @@ import { } from "@bitwarden/common/abstractions/storage.service"; import { SendType } from "@bitwarden/common/enums/sendType"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { State } from "@bitwarden/common/models/domain/state"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { StateMigrationService } from "@bitwarden/common/services/stateMigration.service"; import { Account } from "../models/account"; diff --git a/apps/browser/src/services/state.service.ts b/apps/browser/src/services/state.service.ts index 78bc721031a..1a627935ee4 100644 --- a/apps/browser/src/services/state.service.ts +++ b/apps/browser/src/services/state.service.ts @@ -1,8 +1,8 @@ import { Jsonify } from "type-fest"; import { AbstractCachedStorageService } from "@bitwarden/common/abstractions/storage.service"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; -import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; +import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; import { StateService as BaseStateService, withPrototype, diff --git a/apps/browser/src/services/vaultFilter.service.ts b/apps/browser/src/services/vaultFilter.service.ts index 77016638d8f..f8b2e37d0ea 100644 --- a/apps/browser/src/services/vaultFilter.service.ts +++ b/apps/browser/src/services/vaultFilter.service.ts @@ -6,7 +6,7 @@ import { FolderService } from "@bitwarden/common/abstractions/folder/folder.serv import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; export class VaultFilterService extends BaseVaultFilterService { vaultFilter: VaultFilter = new VaultFilter(); diff --git a/apps/browser/src/types/tab-messages.ts b/apps/browser/src/types/tab-messages.ts new file mode 100644 index 00000000000..12496f5aa3d --- /dev/null +++ b/apps/browser/src/types/tab-messages.ts @@ -0,0 +1,9 @@ +export type TabMessage = CopyTextTabMessage | TabMessageBase<"clearClipboard">; + +export type TabMessageBase = { + command: T; +}; + +export type CopyTextTabMessage = TabMessageBase<"copyText"> & { + text: string; +}; diff --git a/apps/browser/store/locales/fa/copy.resx b/apps/browser/store/locales/fa/copy.resx index 60386bf1841..bcb2ff69b30 100644 --- a/apps/browser/store/locales/fa/copy.resx +++ b/apps/browser/store/locales/fa/copy.resx @@ -124,32 +124,31 @@ یک مدیریت کننده کلمه عبور رایگان برای تمامی دستگاههایتان - 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. +به عنوان بهترین مدیر رمز عبور توسط VERGE، US 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 برنامه‌های Teams و Enterprise را برای شرکت‌ها ارائه می‌دهد تا بتوانید به‌طور ایمن گذرواژه‌ها را با همکاران خود به اشتراک بگذارید. -Why Choose Bitwarden: +چرا Bitwarden را انتخاب کنید: -World-Class Encryption -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. +رمزگذاری در کلاس جهانی +گذرواژه‌ها با رمزگذاری پیشرفته (AES-256 بیت، هش سالت، و 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 Vault خود از هر مرورگر، دستگاه تلفن همراه یا سیستم عامل دسکتاپ و غیره ایمن کنید و به اشتراک بگذارید. یک مدیریت کننده کلمه عبور رایگان برای تمامی دستگاههایتان diff --git a/apps/browser/store/locales/ml/copy.resx b/apps/browser/store/locales/ml/copy.resx index 78c3eea8dd3..cf9b6312273 100644 --- a/apps/browser/store/locales/ml/copy.resx +++ b/apps/browser/store/locales/ml/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ബിറ്റ്വാർഡൻ - സൗജന്യമായി പാസ്‌വേഡ് മാനേജർ + Bitwarden - സൗജന്യ പാസ്സ്‌വേഡ് മാനേജർ - നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങൾക്കും സുരക്ഷിതവും സൗജന്യവുമായ പാസ്‌വേഡ് മാനേജർ. + നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങൾക്കും സുരക്ഷിതവും സൗജന്യവുമായ പാസ്‌വേഡ് മാനേജർ നിങ്ങളുടെ എല്ലാ ലോഗിനുകളും പാസ്‌വേഡുകളും സംഭരിക്കുന്നതിനുള്ള ഏറ്റവും എളുപ്പവും സുരക്ഷിതവുമായ മാർഗ്ഗമാണ് Bitwarden, ഒപ്പം നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളും തമ്മിൽ സമന്വയിപ്പിക്കുകയും ചെയ്യുന്നു. diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index 116ed19bd2e..9159028af01 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -218,6 +218,8 @@ if (manifestVersion == 2) { return chunk.name === "background"; }, }; +} else { + config.entry["content/misc-utils"] = "./src/content/misc-utils.ts"; } module.exports = config; diff --git a/apps/cli/package-lock.json b/apps/cli/package-lock.json index 8a66d813d65..b9ef73baba3 100644 --- a/apps/cli/package-lock.json +++ b/apps/cli/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/cli", - "version": "2022.9.0", + "version": "2022.10.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitwarden/cli", - "version": "2022.9.0", + "version": "2022.10.0", "license": "GPL-3.0-only", "dependencies": { "@koa/multer": "^3.0.0", diff --git a/apps/cli/package.json b/apps/cli/package.json index a360c1bef58..b41baeec419 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2022.9.0", + "version": "2022.10.0", "keywords": [ "bitwarden", "password", diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts index 489f92fac9d..c14fcc229a8 100644 --- a/apps/cli/src/bw.ts +++ b/apps/cli/src/bw.ts @@ -11,7 +11,7 @@ import { KeySuffixOptions } from "@bitwarden/common/enums/keySuffixOptions"; import { LogLevelType } from "@bitwarden/common/enums/logLevelType"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; import { Account } from "@bitwarden/common/models/domain/account"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { AppIdService } from "@bitwarden/common/services/appId.service"; import { AuditService } from "@bitwarden/common/services/audit.service"; import { AuthService } from "@bitwarden/common/services/auth.service"; diff --git a/apps/cli/src/commands/confirm.command.ts b/apps/cli/src/commands/confirm.command.ts index 1eb469908a3..79d30dfec65 100644 --- a/apps/cli/src/commands/confirm.command.ts +++ b/apps/cli/src/commands/confirm.command.ts @@ -1,7 +1,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { OrganizationUserConfirmRequest } from "@bitwarden/common/models/request/organizationUserConfirmRequest"; +import { OrganizationUserConfirmRequest } from "@bitwarden/common/models/request/organization-user-confirm.request"; import { Response } from "@bitwarden/node/cli/models/response"; export class ConfirmCommand { diff --git a/apps/cli/src/commands/create.command.ts b/apps/cli/src/commands/create.command.ts index ad69efe51e8..2cebe225089 100644 --- a/apps/cli/src/commands/create.command.ts +++ b/apps/cli/src/commands/create.command.ts @@ -8,11 +8,11 @@ import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/fold import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherExport } from "@bitwarden/common/models/export/cipherExport"; -import { CollectionExport } from "@bitwarden/common/models/export/collectionExport"; -import { FolderExport } from "@bitwarden/common/models/export/folderExport"; -import { CollectionRequest } from "@bitwarden/common/models/request/collectionRequest"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; +import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; +import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; +import { FolderExport } from "@bitwarden/common/models/export/folder.export"; +import { CollectionRequest } from "@bitwarden/common/models/request/collection.request"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; import { Response } from "@bitwarden/node/cli/models/response"; import { OrganizationCollectionRequest } from "../models/request/organizationCollectionRequest"; diff --git a/apps/cli/src/commands/download.command.ts b/apps/cli/src/commands/download.command.ts index bcd5a831f4c..eb40cf5a2d7 100644 --- a/apps/cli/src/commands/download.command.ts +++ b/apps/cli/src/commands/download.command.ts @@ -1,8 +1,8 @@ import * as fet from "node-fetch"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { EncArrayBuffer } from "@bitwarden/common/models/domain/encArrayBuffer"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncArrayBuffer } from "@bitwarden/common/models/domain/enc-array-buffer"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { Response } from "@bitwarden/node/cli/models/response"; import { FileResponse } from "@bitwarden/node/cli/models/response/fileResponse"; diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index 9c8f68c8285..6c3dd9d2ef1 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -4,11 +4,11 @@ import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction"; import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherExport } from "@bitwarden/common/models/export/cipherExport"; -import { CollectionExport } from "@bitwarden/common/models/export/collectionExport"; -import { FolderExport } from "@bitwarden/common/models/export/folderExport"; -import { CollectionRequest } from "@bitwarden/common/models/request/collectionRequest"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; +import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; +import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; +import { FolderExport } from "@bitwarden/common/models/export/folder.export"; +import { CollectionRequest } from "@bitwarden/common/models/request/collection.request"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; import { Response } from "@bitwarden/node/cli/models/response"; import { OrganizationCollectionRequest } from "../models/request/organizationCollectionRequest"; diff --git a/apps/cli/src/commands/export.command.ts b/apps/cli/src/commands/export.command.ts index 50446d7e027..4b367463096 100644 --- a/apps/cli/src/commands/export.command.ts +++ b/apps/cli/src/commands/export.command.ts @@ -1,5 +1,6 @@ import * as program from "commander"; import * as inquirer from "inquirer"; +import { firstValueFrom } from "rxjs"; import { ExportFormat, ExportService } from "@bitwarden/common/abstractions/export.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; @@ -15,7 +16,9 @@ export class ExportCommand { async run(options: program.OptionValues): Promise { if ( options.organizationid == null && - (await this.policyService.policyAppliesToUser(PolicyType.DisablePersonalVaultExport)) + (await firstValueFrom( + this.policyService.policyAppliesToActiveUser$(PolicyType.DisablePersonalVaultExport) + )) ) { return Response.badRequest( "One or more organization policies prevents you from exporting your personal vault." diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 510cb10da3f..fb08ce06567 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -11,21 +11,21 @@ import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { SendType } from "@bitwarden/common/enums/sendType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CardExport } from "@bitwarden/common/models/export/cardExport"; -import { CipherExport } from "@bitwarden/common/models/export/cipherExport"; -import { CollectionExport } from "@bitwarden/common/models/export/collectionExport"; -import { FieldExport } from "@bitwarden/common/models/export/fieldExport"; -import { FolderExport } from "@bitwarden/common/models/export/folderExport"; -import { IdentityExport } from "@bitwarden/common/models/export/identityExport"; -import { LoginExport } from "@bitwarden/common/models/export/loginExport"; -import { LoginUriExport } from "@bitwarden/common/models/export/loginUriExport"; -import { SecureNoteExport } from "@bitwarden/common/models/export/secureNoteExport"; -import { ErrorResponse } from "@bitwarden/common/models/response/errorResponse"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { CardExport } from "@bitwarden/common/models/export/card.export"; +import { CipherExport } from "@bitwarden/common/models/export/cipher.export"; +import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; +import { FieldExport } from "@bitwarden/common/models/export/field.export"; +import { FolderExport } from "@bitwarden/common/models/export/folder.export"; +import { IdentityExport } from "@bitwarden/common/models/export/identity.export"; +import { LoginUriExport } from "@bitwarden/common/models/export/login-uri.export"; +import { LoginExport } from "@bitwarden/common/models/export/login.export"; +import { SecureNoteExport } from "@bitwarden/common/models/export/secure-note.export"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { Response } from "@bitwarden/node/cli/models/response"; import { StringResponse } from "@bitwarden/node/cli/models/response/stringResponse"; diff --git a/apps/cli/src/commands/list.command.ts b/apps/cli/src/commands/list.command.ts index dd779ec0576..250237a7878 100644 --- a/apps/cli/src/commands/list.command.ts +++ b/apps/cli/src/commands/list.command.ts @@ -5,14 +5,14 @@ import { FolderService } from "@bitwarden/common/abstractions/folder/folder.serv import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; import { Collection } from "@bitwarden/common/models/domain/collection"; import { CollectionDetailsResponse as ApiCollectionDetailsResponse, CollectionResponse as ApiCollectionResponse, -} from "@bitwarden/common/models/response/collectionResponse"; -import { ListResponse as ApiListResponse } from "@bitwarden/common/models/response/listResponse"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +} from "@bitwarden/common/models/response/collection.response"; +import { ListResponse as ApiListResponse } from "@bitwarden/common/models/response/list.response"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { Response } from "@bitwarden/node/cli/models/response"; import { ListResponse } from "@bitwarden/node/cli/models/response/listResponse"; diff --git a/apps/cli/src/commands/send/get.command.ts b/apps/cli/src/commands/send/get.command.ts index f47d8fbc5d3..aeae1203a61 100644 --- a/apps/cli/src/commands/send/get.command.ts +++ b/apps/cli/src/commands/send/get.command.ts @@ -5,7 +5,7 @@ import { EnvironmentService } from "@bitwarden/common/abstractions/environment.s import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { Response } from "@bitwarden/node/cli/models/response"; import { SendResponse } from "../../models/response/sendResponse"; diff --git a/apps/cli/src/commands/send/receive.command.ts b/apps/cli/src/commands/send/receive.command.ts index 21ab10eba94..9a9803e57f5 100644 --- a/apps/cli/src/commands/send/receive.command.ts +++ b/apps/cli/src/commands/send/receive.command.ts @@ -9,11 +9,11 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { SendType } from "@bitwarden/common/enums/sendType"; import { NodeUtils } from "@bitwarden/common/misc/nodeUtils"; import { Utils } from "@bitwarden/common/misc/utils"; -import { SendAccess } from "@bitwarden/common/models/domain/sendAccess"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { SendAccessRequest } from "@bitwarden/common/models/request/sendAccessRequest"; -import { ErrorResponse } from "@bitwarden/common/models/response/errorResponse"; -import { SendAccessView } from "@bitwarden/common/models/view/sendAccessView"; +import { SendAccess } from "@bitwarden/common/models/domain/send-access"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { SendAccessRequest } from "@bitwarden/common/models/request/send-access.request"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { SendAccessView } from "@bitwarden/common/models/view/send-access.view"; import { Response } from "@bitwarden/node/cli/models/response"; import { SendAccessResponse } from "../../models/response/sendAccessResponse"; diff --git a/apps/cli/src/commands/unlock.command.ts b/apps/cli/src/commands/unlock.command.ts index 4318a22cbdc..83de7a0b1ce 100644 --- a/apps/cli/src/commands/unlock.command.ts +++ b/apps/cli/src/commands/unlock.command.ts @@ -8,7 +8,7 @@ import { StateService } from "@bitwarden/common/abstractions/state.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { HashPurpose } from "@bitwarden/common/enums/hashPurpose"; import { Utils } from "@bitwarden/common/misc/utils"; -import { SecretVerificationRequest } from "@bitwarden/common/models/request/secretVerificationRequest"; +import { SecretVerificationRequest } from "@bitwarden/common/models/request/secret-verification.request"; import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service"; import { Response } from "@bitwarden/node/cli/models/response"; import { MessageResponse } from "@bitwarden/node/cli/models/response/messageResponse"; diff --git a/apps/cli/src/models/request/organizationCollectionRequest.ts b/apps/cli/src/models/request/organizationCollectionRequest.ts index 79e85847c6d..7b9f184d855 100644 --- a/apps/cli/src/models/request/organizationCollectionRequest.ts +++ b/apps/cli/src/models/request/organizationCollectionRequest.ts @@ -1,4 +1,4 @@ -import { CollectionExport } from "@bitwarden/common/models/export/collectionExport"; +import { CollectionExport } from "@bitwarden/common/models/export/collection.export"; import { SelectionReadOnly } from "../selectionReadOnly"; diff --git a/apps/cli/src/models/response/attachmentResponse.ts b/apps/cli/src/models/response/attachmentResponse.ts index c8fcb875afd..2c6cb66e45d 100644 --- a/apps/cli/src/models/response/attachmentResponse.ts +++ b/apps/cli/src/models/response/attachmentResponse.ts @@ -1,4 +1,4 @@ -import { AttachmentView } from "@bitwarden/common/models/view/attachmentView"; +import { AttachmentView } from "@bitwarden/common/models/view/attachment.view"; export class AttachmentResponse { id: string; diff --git a/apps/cli/src/models/response/cipherResponse.ts b/apps/cli/src/models/response/cipherResponse.ts index a52084de772..f1e83ac30e2 100644 --- a/apps/cli/src/models/response/cipherResponse.ts +++ b/apps/cli/src/models/response/cipherResponse.ts @@ -1,6 +1,6 @@ import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherWithIdExport } from "@bitwarden/common/models/export/cipherWithIdsExport"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherWithIdExport } from "@bitwarden/common/models/export/cipher-with-ids.export"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { BaseResponse } from "@bitwarden/node/cli/models/response/baseResponse"; import { AttachmentResponse } from "./attachmentResponse"; @@ -11,6 +11,7 @@ export class CipherResponse extends CipherWithIdExport implements BaseResponse { object: string; attachments: AttachmentResponse[]; revisionDate: Date; + creationDate: Date; deletedDate: Date; passwordHistory: PasswordHistoryResponse[]; @@ -22,6 +23,9 @@ export class CipherResponse extends CipherWithIdExport implements BaseResponse { this.attachments = o.attachments.map((a) => new AttachmentResponse(a)); } this.revisionDate = o.revisionDate; + if (o.creationDate != null) { + this.creationDate = o.creationDate; + } this.deletedDate = o.deletedDate; if (o.passwordHistory != null) { this.passwordHistory = o.passwordHistory.map((h) => new PasswordHistoryResponse(h)); diff --git a/apps/cli/src/models/response/collectionResponse.ts b/apps/cli/src/models/response/collectionResponse.ts index 866b5687dc1..1818c946e35 100644 --- a/apps/cli/src/models/response/collectionResponse.ts +++ b/apps/cli/src/models/response/collectionResponse.ts @@ -1,5 +1,5 @@ -import { CollectionWithIdExport } from "@bitwarden/common/models/export/collectionWithIdExport"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { CollectionWithIdExport } from "@bitwarden/common/models/export/collection-with-id.export"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { BaseResponse } from "@bitwarden/node/cli/models/response/baseResponse"; export class CollectionResponse extends CollectionWithIdExport implements BaseResponse { diff --git a/apps/cli/src/models/response/folderResponse.ts b/apps/cli/src/models/response/folderResponse.ts index 6baa0df759c..196071fbab7 100644 --- a/apps/cli/src/models/response/folderResponse.ts +++ b/apps/cli/src/models/response/folderResponse.ts @@ -1,5 +1,5 @@ -import { FolderWithIdExport } from "@bitwarden/common/models/export/folderWithIdExport"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { FolderWithIdExport } from "@bitwarden/common/models/export/folder-with-id.export"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { BaseResponse } from "@bitwarden/node/cli/models/response/baseResponse"; export class FolderResponse extends FolderWithIdExport implements BaseResponse { diff --git a/apps/cli/src/models/response/loginResponse.ts b/apps/cli/src/models/response/loginResponse.ts index 9ebebcae9f6..7aa6e9184d6 100644 --- a/apps/cli/src/models/response/loginResponse.ts +++ b/apps/cli/src/models/response/loginResponse.ts @@ -1,5 +1,5 @@ -import { LoginExport } from "@bitwarden/common/models/export/loginExport"; -import { LoginView } from "@bitwarden/common/models/view/loginView"; +import { LoginExport } from "@bitwarden/common/models/export/login.export"; +import { LoginView } from "@bitwarden/common/models/view/login.view"; export class LoginResponse extends LoginExport { passwordRevisionDate: Date; diff --git a/apps/cli/src/models/response/organizationCollectionResponse.ts b/apps/cli/src/models/response/organizationCollectionResponse.ts index 812cc5de925..811e4b2a57d 100644 --- a/apps/cli/src/models/response/organizationCollectionResponse.ts +++ b/apps/cli/src/models/response/organizationCollectionResponse.ts @@ -1,4 +1,4 @@ -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { SelectionReadOnly } from "../selectionReadOnly"; diff --git a/apps/cli/src/models/response/passwordHistoryResponse.ts b/apps/cli/src/models/response/passwordHistoryResponse.ts index 55a626309b2..32f8878a380 100644 --- a/apps/cli/src/models/response/passwordHistoryResponse.ts +++ b/apps/cli/src/models/response/passwordHistoryResponse.ts @@ -1,4 +1,4 @@ -import { PasswordHistoryView } from "@bitwarden/common/models/view/passwordHistoryView"; +import { PasswordHistoryView } from "@bitwarden/common/models/view/password-history.view"; export class PasswordHistoryResponse { lastUsedDate: Date; diff --git a/apps/cli/src/models/response/sendAccessResponse.ts b/apps/cli/src/models/response/sendAccessResponse.ts index 4417b15a1ea..a37fd479b7e 100644 --- a/apps/cli/src/models/response/sendAccessResponse.ts +++ b/apps/cli/src/models/response/sendAccessResponse.ts @@ -1,5 +1,5 @@ import { SendType } from "@bitwarden/common/enums/sendType"; -import { SendAccessView } from "@bitwarden/common/models/view/sendAccessView"; +import { SendAccessView } from "@bitwarden/common/models/view/send-access.view"; import { BaseResponse } from "@bitwarden/node/cli/models/response/baseResponse"; import { SendFileResponse } from "./sendFileResponse"; diff --git a/apps/cli/src/models/response/sendFileResponse.ts b/apps/cli/src/models/response/sendFileResponse.ts index 6f80904ea96..b99fac379c9 100644 --- a/apps/cli/src/models/response/sendFileResponse.ts +++ b/apps/cli/src/models/response/sendFileResponse.ts @@ -1,4 +1,4 @@ -import { SendFileView } from "@bitwarden/common/models/view/sendFileView"; +import { SendFileView } from "@bitwarden/common/models/view/send-file.view"; export class SendFileResponse { static template(fileName = "file attachment location"): SendFileResponse { diff --git a/apps/cli/src/models/response/sendResponse.ts b/apps/cli/src/models/response/sendResponse.ts index b2c715d8f72..c2e47fa740e 100644 --- a/apps/cli/src/models/response/sendResponse.ts +++ b/apps/cli/src/models/response/sendResponse.ts @@ -1,6 +1,6 @@ import { SendType } from "@bitwarden/common/enums/sendType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { BaseResponse } from "@bitwarden/node/cli/models/response/baseResponse"; import { SendFileResponse } from "./sendFileResponse"; diff --git a/apps/cli/src/models/response/sendTextResponse.ts b/apps/cli/src/models/response/sendTextResponse.ts index 330f9d94601..e234ed66793 100644 --- a/apps/cli/src/models/response/sendTextResponse.ts +++ b/apps/cli/src/models/response/sendTextResponse.ts @@ -1,4 +1,4 @@ -import { SendTextView } from "@bitwarden/common/models/view/sendTextView"; +import { SendTextView } from "@bitwarden/common/models/view/send-text.view"; export class SendTextResponse { static template(text = "Text contained in the send.", hidden = false): SendTextResponse { diff --git a/apps/cli/src/services/nodeEnvSecureStorage.service.ts b/apps/cli/src/services/nodeEnvSecureStorage.service.ts index dcec777347e..2d1a8663eb8 100644 --- a/apps/cli/src/services/nodeEnvSecureStorage.service.ts +++ b/apps/cli/src/services/nodeEnvSecureStorage.service.ts @@ -2,8 +2,8 @@ import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncArrayBuffer } from "@bitwarden/common/models/domain/encArrayBuffer"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncArrayBuffer } from "@bitwarden/common/models/domain/enc-array-buffer"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; export class NodeEnvSecureStorageService implements AbstractStorageService { constructor( diff --git a/apps/cli/src/utils.ts b/apps/cli/src/utils.ts index 62f09c6a135..440d02c25d2 100644 --- a/apps/cli/src/utils.ts +++ b/apps/cli/src/utils.ts @@ -8,8 +8,8 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { NodeUtils } from "@bitwarden/common/misc/nodeUtils"; import { Utils } from "@bitwarden/common/misc/utils"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { Response } from "@bitwarden/node/cli/models/response"; import { MessageResponse } from "@bitwarden/node/cli/models/response/messageResponse"; diff --git a/apps/desktop/SECURITY.md b/apps/desktop/SECURITY.md deleted file mode 100644 index e6edb96da72..00000000000 --- a/apps/desktop/SECURITY.md +++ /dev/null @@ -1,21 +0,0 @@ -Bitwarden believes that working with security researchers across the globe is crucial to keeping our users safe. If you believe you've found a security issue in our product or service, we encourage you to please submit a report through our [HackerOne Program](https://hackerone.com/bitwarden/). We welcome working with you to resolve the issue promptly. Thanks in advance! - -# Disclosure Policy - -- Let us know as soon as possible upon discovery of a potential security issue, and we'll make every effort to quickly resolve the issue. -- Provide us a reasonable amount of time to resolve the issue before any disclosure to the public or a third-party. We may publicly disclose the issue before resolving it, if appropriate. -- Make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our service. Only interact with accounts you own or with explicit permission of the account holder. -- If you would like to encrypt your report, please use the PGP key with long ID `0xDE6887086F892325FEC04CC0D847525B6931381F` (available in the public keyserver pool). - -While researching, we'd like to ask you to refrain from: - -- Denial of service -- Spamming -- Social engineering (including phishing) of Bitwarden staff or contractors -- Any physical attempts against Bitwarden property or data centers - -# We want to help you! - -If you have something that you feel is close to exploitation, or if you'd like some information regarding the internal API, or generally have any questions regarding the app that would help in your efforts, please email us at https://bitwarden.com/contact and ask for that information. As stated above, Bitwarden wants to help you find issues, and is more than willing to help. - -Thank you for helping keep Bitwarden and our users safe! diff --git a/apps/desktop/config/config.js b/apps/desktop/config/config.js index 2e3347321d7..404295dd0db 100644 --- a/apps/desktop/config/config.js +++ b/apps/desktop/config/config.js @@ -1,7 +1,22 @@ function load(envName) { + const base = loadConfig("base"); + const env = loadConfig(envName); + const local = loadConfig("local"); + return { - ...loadConfig(envName), - ...loadConfig("local"), + ...base, + ...env, + ...local, + flags: { + ...base.flags, + ...env.flags, + ...local.flags, + }, + devFlags: { + ...base.devFlags, + ...env.devFlags, + ...local.devFlags, + }, }; } diff --git a/apps/desktop/native-messaging-test-runner/src/nativeMessageService.ts b/apps/desktop/native-messaging-test-runner/src/nativeMessageService.ts index ada09064e3c..0a5f4323b5f 100644 --- a/apps/desktop/native-messaging-test-runner/src/nativeMessageService.ts +++ b/apps/desktop/native-messaging-test-runner/src/nativeMessageService.ts @@ -3,8 +3,8 @@ import "module-alias/register"; import { v4 as uuidv4 } from "uuid"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service"; import { EncryptService } from "@bitwarden/common/services/encrypt.service"; import { NodeCryptoFunctionService } from "@bitwarden/node/services/nodeCryptoFunction.service"; diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 1e67787343c..a76bcf0fb63 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2022.9.2", + "version": "2022.10.1", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/src/app/accounts/delete-account.component.ts b/apps/desktop/src/app/accounts/delete-account.component.ts index c708ba57416..74e79b22900 100644 --- a/apps/desktop/src/app/accounts/delete-account.component.ts +++ b/apps/desktop/src/app/accounts/delete-account.component.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; import { FormBuilder } from "@angular/forms"; -import { AccountService } from "@bitwarden/common/abstractions/account/account.service.abstraction"; +import { AccountApiService } from "@bitwarden/common/abstractions/account/account-api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -23,7 +23,7 @@ export class DeleteAccountComponent { private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private formBuilder: FormBuilder, - private accountService: AccountService, + private accountApiService: AccountApiService, private logService: LogService ) {} @@ -34,7 +34,7 @@ export class DeleteAccountComponent { async submit() { try { const verification = this.deleteForm.get("verification").value; - this.formPromise = this.accountService.delete(verification); + this.formPromise = this.accountApiService.deleteAccount(verification); await this.formPromise; this.platformUtilsService.showToast( "success", diff --git a/apps/desktop/src/app/accounts/lock.component.ts b/apps/desktop/src/app/accounts/lock.component.ts index ff136aa982e..5cb28802796 100644 --- a/apps/desktop/src/app/accounts/lock.component.ts +++ b/apps/desktop/src/app/accounts/lock.component.ts @@ -13,7 +13,6 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; @@ -25,8 +24,6 @@ const BroadcasterSubscriptionId = "LockComponent"; }) export class LockComponent extends BaseLockComponent { private deferFocus: boolean = null; - authenicatedUrl = "vault"; - unAuthenicatedUrl = "update-temp-password"; constructor( router: Router, @@ -43,8 +40,7 @@ export class LockComponent extends BaseLockComponent { private broadcasterService: BroadcasterService, ngZone: NgZone, logService: LogService, - keyConnectorService: KeyConnectorService, - private syncService: SyncService + keyConnectorService: KeyConnectorService ) { super( router, @@ -67,11 +63,6 @@ export class LockComponent extends BaseLockComponent { await super.ngOnInit(); const autoPromptBiometric = !(await this.stateService.getNoAutoPromptBiometrics()); - await this.syncService.fullSync(true); - - const forcePasswordReset = await this.stateService.getForcePasswordReset(); - this.successRoute = forcePasswordReset === true ? this.unAuthenicatedUrl : this.authenicatedUrl; - // eslint-disable-next-line rxjs-angular/prefer-takeuntil this.route.queryParams.subscribe((params) => { if (this.supportsBiometric && params.promptBiometric && autoPromptBiometric) { diff --git a/apps/desktop/src/app/send/send.component.ts b/apps/desktop/src/app/send/send.component.ts index 0717734f37d..95dfb83f367 100644 --- a/apps/desktop/src/app/send/send.component.ts +++ b/apps/desktop/src/app/send/send.component.ts @@ -9,7 +9,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { invokeMenu, RendererMenuItem } from "@bitwarden/electron/utils"; import { SearchBarService } from "../layout/search/search-bar.service"; diff --git a/apps/desktop/src/app/services/services.module.ts b/apps/desktop/src/app/services/services.module.ts index 44087b518a8..35ce7604bf7 100644 --- a/apps/desktop/src/app/services/services.module.ts +++ b/apps/desktop/src/app/services/services.module.ts @@ -34,7 +34,7 @@ import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.s import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/abstractions/system.service"; import { ClientType } from "@bitwarden/common/enums/clientType"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; import { SystemService } from "@bitwarden/common/services/system.service"; import { ElectronCryptoService } from "@bitwarden/electron/services/electronCrypto.service"; diff --git a/apps/desktop/src/app/vault/ciphers.component.html b/apps/desktop/src/app/vault/ciphers.component.html index 0b324cf0edb..478b46b9273 100644 --- a/apps/desktop/src/app/vault/ciphers.component.html +++ b/apps/desktop/src/app/vault/ciphers.component.html @@ -24,23 +24,25 @@
- {{ c.name | ellipsis }} - - - {{ "shared" | i18n }} - - - - {{ "attachments" | i18n }} - + + {{ c.name }} + + + {{ "shared" | i18n }} + + + + {{ "attachments" | i18n }} + + {{ c.subTitle }}
diff --git a/apps/desktop/src/app/vault/ciphers.component.ts b/apps/desktop/src/app/vault/ciphers.component.ts index 8039a938430..4e0c6016ca9 100644 --- a/apps/desktop/src/app/vault/ciphers.component.ts +++ b/apps/desktop/src/app/vault/ciphers.component.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { CiphersComponent as BaseCiphersComponent } from "@bitwarden/angular/components/ciphers.component"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { SearchBarService } from "../layout/search/search-bar.service"; diff --git a/apps/desktop/src/app/vault/generator.component.spec.ts b/apps/desktop/src/app/vault/generator.component.spec.ts index 6c906e9b367..59638bb7584 100644 --- a/apps/desktop/src/app/vault/generator.component.spec.ts +++ b/apps/desktop/src/app/vault/generator.component.spec.ts @@ -1,6 +1,7 @@ import { NO_ERRORS_SCHEMA } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { ActivatedRoute } from "@angular/router"; +// eslint-disable-next-line no-restricted-imports import { Substitute } from "@fluffy-spoon/substitute"; import { mock, MockProxy } from "jest-mock-extended"; diff --git a/apps/desktop/src/app/vault/vault.component.ts b/apps/desktop/src/app/vault/vault.component.ts index c3437063021..9ddf15d65e6 100644 --- a/apps/desktop/src/app/vault/vault.component.ts +++ b/apps/desktop/src/app/vault/vault.component.ts @@ -25,8 +25,8 @@ import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { EventType } from "@bitwarden/common/enums/eventType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { FolderView } from "@bitwarden/common/models/view/folderView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { FolderView } from "@bitwarden/common/models/view/folder.view"; import { invokeMenu, RendererMenuItem } from "@bitwarden/electron/utils"; import { SearchBarService } from "../layout/search/search-bar.service"; diff --git a/apps/desktop/src/app/vault/view.component.html b/apps/desktop/src/app/vault/view.component.html index 69201a18d67..ec68f7e4a6d 100644 --- a/apps/desktop/src/app/vault/view.component.html +++ b/apps/desktop/src/app/vault/view.component.html @@ -422,6 +422,20 @@
+
+
+
+ + +
+
+

{{ "dateUpdated" | i18n }}: {{ cipher.revisionDate | date: "medium" }}

+
+ {{ "dateCreated" | i18n }}: + {{ cipher.creationDate | date: "medium" }} +
{{ "datePasswordUpdated" | i18n }}: {{ cipher.passwordRevisionDisplayDate | date: "medium" }} diff --git a/apps/desktop/src/app/vault/view.component.ts b/apps/desktop/src/app/vault/view.component.ts index a3125c02e7d..52db3e22bc7 100644 --- a/apps/desktop/src/app/vault/view.component.ts +++ b/apps/desktop/src/app/vault/view.component.ts @@ -15,6 +15,7 @@ import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { EventService } from "@bitwarden/common/abstractions/event.service"; import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service"; +import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; @@ -23,7 +24,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; const BroadcasterSubscriptionId = "ViewComponent"; @@ -36,6 +37,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges { constructor( cipherService: CipherService, + folderService: FolderService, totpService: TotpService, tokenService: TokenService, i18nService: I18nService, @@ -55,6 +57,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges { ) { super( cipherService, + folderService, totpService, tokenService, i18nService, diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index d9d58ee0732..8231e925e8c 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -1266,6 +1266,10 @@ "message": "Bygewerk", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Wagwoord bygewerk", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "Blaaierintegrasie word gebruik vir biometrie in blaaier." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Staan DuckDuckGo-blaaierintegrasie toe" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Gebruik u Bitwarden-kluis wanneer u met DuckDuckGo blaai." }, "browserIntegrationUnsupportedTitle": { "message": "Blaaierintegrasie word nie ondersteun nie" @@ -1604,7 +1608,7 @@ "message": "Maak seker dat die getoonde vingerafdruk identies is aan dié wat in die blaaieruitbreiding vertoon word." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ wil aan Bitwarden koppel", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Wil u hierdie versoek goedkeur?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Indien u nie hierdie versoek geïnisieer het nie, moet dit dan nie goedkeur nie." }, "biometricsNotEnabledTitle": { "message": "Biometrie is geaktiveer" @@ -2016,6 +2020,6 @@ "message": "Mir" }, "vault": { - "message": "Vault" + "message": "Kluis" } } diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 305af3d4e90..eeb8a3cf57b 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -1266,6 +1266,10 @@ "message": "تم التحديث", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "تم تحديث كلمة المرور", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index 93585928533..786ffaf1e44 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -1266,6 +1266,10 @@ "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Yaradıldı", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index f9458cf61a7..f552a265ff1 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -1266,6 +1266,10 @@ "message": "Абноўлена", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Створана", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль абноўлены", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 72ee6e08e32..640e13020a7 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -1266,6 +1266,10 @@ "message": "Обновено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Създадено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Обновена парола", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 47c7b64a8e1..f16d79ba980 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -1266,6 +1266,10 @@ "message": "হালনাগাদকৃত", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "পাসওয়ার্ড হালনাগাদকৃত", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 2b20273114e..a9e2d7ca650 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -1266,6 +1266,10 @@ "message": "Ažurirano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lozinka ažurirana", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index ff2fb9047e3..028207e8750 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -1266,6 +1266,10 @@ "message": "Actualitzat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contrasenya actualitzada", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index b6ef93b4cd4..dc543548cc5 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -1266,6 +1266,10 @@ "message": "Změněno", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bylo změněno", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index bf909c8fad0..f6d9b6d386b 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -1266,6 +1266,10 @@ "message": "Opdateret", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Adgangskode opdateret", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "Bruges til biometri i browser." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Tillad DuckDuckGo browserintegration" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Brug din Bitwarden-boks, når du browser med DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "Browserintegration understøttes ikke" @@ -1604,7 +1608,7 @@ "message": "Sørg for, at det viste fingeraftryk er identisk med det fingeraftryk, der vises i browserudvidelsen." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ ønsker at oprette forbindelse til Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Vil du godkende denne anmodning?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Hvis du ikke indledte denne anmodning, skal du ikke godkende den." }, "biometricsNotEnabledTitle": { "message": "Biometri ikke aktiveret" diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 612b1edd0b1..e920b824f5f 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -1266,6 +1266,10 @@ "message": "Aktualisiert", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Erstellt", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passwort aktualisiert", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index b4834c571aa..cacf5a7e955 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -1266,6 +1266,10 @@ "message": "Ενημερώθηκε", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Ο Κωδικός Ενημερώθηκε", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index 2c0967fa27d..b656c5b1964 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index f2d527b668d..d7687161cc5 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index 11eb95758d7..60df91fd685 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 7ddbc614b59..19fbf3836f1 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index aab30fce0d5..9876eb6c589 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -1266,6 +1266,10 @@ "message": "Actualizada", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contraseña actualizada", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 3dfb0bcbc70..ff7a066b9bc 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -1266,6 +1266,10 @@ "message": "Uuendatud", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parool on uuendatud", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index d196a5bdda2..213ca0cac88 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -1266,6 +1266,10 @@ "message": "Eguneratua", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Pasahitza eguneratu da", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "Nabigatzailean biometria erabiltzen da." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Baimendu DuckDuckGo nabigatzailearekin integratzea" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Erabili zure Bitwarden kutxa gotorra, DuckDuckGo-rekin nabigatzean." }, "browserIntegrationUnsupportedTitle": { "message": "Ez da nabigatzailearen integrazioa onartzen" @@ -1604,7 +1608,7 @@ "message": "Ziurtatu bistaratutako hatz-marka digitala nabigatzailearen gehigarrian agertzen den hatz-marka digitalaren berdina dela." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$-ek Bitwardenekin konektatu nahi du", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Eskaera hau onartu nahi duzu?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Eskaera hasi ez baduzu, ez onartu." }, "biometricsNotEnabledTitle": { "message": "Biometria desgaitua" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 0febe54c5d9..8292ecde7bb 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -1266,6 +1266,10 @@ "message": "بروزرسانی شد", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "کلمه عبور بروزرسانی شد", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "یکپارچه سازی مرورگر برای بیومتریک در مرورگر استفاده می شود." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "اجازه ادغام مرورگر DuckDuckGo را بدهید" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "هنگام مرور با DuckDuckGo از گاوصندوق Bitwarden خود استفاده کنید." }, "browserIntegrationUnsupportedTitle": { "message": "ادغام مرورگر پشتیبانی نمی شود" @@ -1604,7 +1608,7 @@ "message": "لطفاً اطمینان حاصل کنید که اثر انگشت نشان داده شده با اثر انگشت نشان داده شده در افزونه مرورگر یکسان است." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ می‌خواهد به Bitwarden متصل شود", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "آیا می‌خواهید این درخواست را تأیید کنید؟" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "اگر شما این درخواست را آغاز نکرده اید، آن را تأیید نکنید." }, "biometricsNotEnabledTitle": { "message": "بیومتریک فعال نیست" @@ -2016,6 +2020,6 @@ "message": "میر" }, "vault": { - "message": "Vault" + "message": "گاوصندوق" } } diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 1483f362306..c7656bb26f6 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -346,7 +346,7 @@ "message": "Nimi vaaditaan." }, "addedItem": { - "message": "Kohde lisätty" + "message": "Kohde lisättiin" }, "editedItem": { "message": "Kohdetta muokattu" @@ -764,7 +764,7 @@ "message": "Hanki apua" }, "fileBugReport": { - "message": "Jätä virheilmoitus" + "message": "Lähetä virheilmoitus" }, "blog": { "message": "Blogi" @@ -1266,6 +1266,10 @@ "message": "Päivitetty", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Luotu", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Salasana päivitetty", "description": "ex. Date this password was updated" @@ -1364,7 +1368,7 @@ "message": "Avaa PIN-koodilla" }, "setYourPinCode": { - "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos sovelluksesta." + "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut sovelluksesta kokonaan ulos." }, "pinRequired": { "message": "PIN-koodi vaaditaan." @@ -1568,10 +1572,10 @@ "message": "Salli selainintegraatio" }, "enableBrowserIntegrationDesc": { - "message": "Käytetään selainten biometriatukeen." + "message": "Käytetään verkkoselainten biometriatukeen." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Salli integrointi DuckDuckGo-selaimeen" + "message": "Salli integraatio DuckDuckGo-selaimeen" }, "enableDuckDuckGoBrowserIntegrationDesc": { "message": "Käytä Bitwardenin holvia DuckDuckGo-selaimessa." @@ -1580,10 +1584,10 @@ "message": "Selainintegraatiota ei tueta" }, "browserIntegrationMasOnlyDesc": { - "message": "Valitettavasti selainintegraatiota tukee toistaiseksi vain Mac App Store -versio." + "message": "Valitettavasti selainintegraatiota tuetaan toistaiseksi vain Mac App Store -versiossa." }, "browserIntegrationWindowsStoreDesc": { - "message": "Valitettavasti selainintegraatiota ei toistaiseksi tueta sovelluksen Microsoft Store -versiossa." + "message": "Valitettavasti selainintegraatiota ei toistaiseksi tueta Microsoft Store -versiossa." }, "browserIntegrationLinuxDesc": { "message": "Valitettavasti selainintegraatiota ei toistaiseksi tueta Linux-versiossa." @@ -1616,7 +1620,7 @@ "message": "Haluatko hyväksyä pyynnön?" }, "verifyNativeMessagingConnectionWarning": { - "message": "Älä hyväksy pyyntöä, jollet itse aiheuttanut sitä." + "message": "Älä hyväksy pyyntöä, jos et tunnista sitä." }, "biometricsNotEnabledTitle": { "message": "Biometria ei ole käytössä" @@ -1680,7 +1684,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Nykyinen käyttökertojen määrä" + "message": "Käyttökertojen nykyinen määrä" }, "disableSend": { "message": "Poista Send käytöstä, jottei kukaan voi avata sitä.", diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 4f77b521ad0..0cc64739e4e 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 86e4c15eb50..00962690919 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -1266,6 +1266,10 @@ "message": "Mis à jour ", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Mot de passe mis à jour", "description": "ex. Date this password was updated" @@ -1385,10 +1389,10 @@ "message": "déverouiller votre coffre" }, "autoPromptWindowsHello": { - "message": "Ask for Windows Hello on launch" + "message": "Demander à Windows Hello au démarrage" }, "autoPromptTouchId": { - "message": "Ask for Touch ID on launch" + "message": "Demander à Touch ID au démarrage" }, "lockWithMasterPassOnRestart": { "message": "Verrouiller avec le mot de passe maître lors du redémarrage" @@ -1571,10 +1575,10 @@ "message": "L'intégration avec le navigateur est utilisée pour le déverrouillage biométrique dans le navigateur." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Autoriser l'intégration DuckDuckGo au navigateur" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Utiliser votre coffre Bitwarden quand vous naviguez avec DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "Intégration dans le navigateur non supportée" @@ -1604,7 +1608,7 @@ "message": "Veuillez vous assurer que la phrase d'empreinte affichée est identique à celle affichée dans l'extension de navigateur." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ souhaite se connecter à Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Voulez-vous approuver cette demande ?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Si vous n'avez pas initié cette demande, ne l'approuverez pas." }, "biometricsNotEnabledTitle": { "message": "Le déverrouillage biométrique n'est pas activé" @@ -2016,6 +2020,6 @@ "message": "Mir" }, "vault": { - "message": "Vault" + "message": "Coffre" } } diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index d2eedf07910..d1cf929c9d1 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -1266,6 +1266,10 @@ "message": "עודכן", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "הסיסמה עודכנה", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index d2eb932e7f1..2c5465dbd16 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index c720728df00..ef793dc9fec 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -1266,6 +1266,10 @@ "message": "Ažurirano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lozinka ažurirana", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index b89d898cb3e..607dc42911a 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -1266,6 +1266,10 @@ "message": "A frissítés megtörtént.", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Létrehozva", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "A jelszó frissítésre került.", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index b355f13f5d7..4e9856955b9 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -1266,6 +1266,10 @@ "message": "Di perbarui", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Kata Sandi telah Diperbarui", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index c8b708dea27..397aec93987 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -1266,6 +1266,10 @@ "message": "Aggiornato", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creato", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password aggiornata", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "L'integrazione del browser è utilizzata per l'autenticazione biometrica." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Consenti l'integrazione del browser DuckDuckGo" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Usa la tua cassaforte Bitwarden quando navighi con DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "L'integrazione del browser non è supportata" @@ -1604,7 +1608,7 @@ "message": "Assicurati che l'impronta digitale mostrata sia identica all'impronta digitale mostrata nell'estensione del browser." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ vuole connettersi a Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Vuoi approvare questa richiesta?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Se la richiesta non è stata fatta da te, non approvarla." }, "biometricsNotEnabledTitle": { "message": "Autenticazione biometrica non abilitata" diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index d2f5953e0fd..1e3a633874a 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -1266,6 +1266,10 @@ "message": "更新日", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "作成日", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "パスワード更新日", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 4f77b521ad0..0cc64739e4e 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index 4f77b521ad0..0cc64739e4e 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 44349769747..d53acd225bc 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -1266,6 +1266,10 @@ "message": "ಅಪ್‌ಡೇಟ್", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "ಪಾಸ್ವರ್ಡ್ ನವೀಕರಿಸಲಾಗಿದೆ", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 39b7981ce11..5b42b687f76 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -1266,6 +1266,10 @@ "message": "업데이트됨", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "비밀번호 업데이트됨", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 5de38d841f5..226e4cc1aa2 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -1266,6 +1266,10 @@ "message": "Atjaunināts", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Izveidots", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parole atjaunināta", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index bff24d49664..b62af8f36ec 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -1266,6 +1266,10 @@ "message": "Ažurirano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lozinka ažurirana", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 2b79830ce3f..9b9d7f5f17d 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -1266,6 +1266,10 @@ "message": "പുതുക്കിയത്", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "പാസ്‍വേഡ് പുതുക്കി", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 4b7c78764cc..096b37b23b9 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -36,7 +36,7 @@ "message": "Søk i hvelvet" }, "addItem": { - "message": "Legg til objekt" + "message": "Legg til element" }, "shared": { "message": "Delt" @@ -1266,6 +1266,10 @@ "message": "Oppdatert den", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passordet ble oppdatert den", "description": "ex. Date this password was updated" @@ -1397,16 +1401,16 @@ "message": "Slett konto" }, "deleteAccountDesc": { - "message": "Proceed below to delete your account and all vault data." + "message": "Fortsett nedenfor for å slette kontoen din og alle hvelvdataene." }, "deleteAccountWarning": { - "message": "Deleting your account is permanent. It cannot be undone." + "message": "Å slette kontoen din er permanent. Det kan ikke reverseres." }, "accountDeleted": { "message": "Konto slettet" }, "accountDeletedDesc": { - "message": "Your account has been closed and all associated data has been deleted." + "message": "Kontoen din har blitt avsluttet og all relatert data har blitt slettet." }, "preferences": { "message": "Innstillinger" @@ -1571,10 +1575,10 @@ "message": "Nettleserintegrasjon brukes til biometri i nettleseren." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Tillat integrering av DuckDuckGo" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Bruk Bitwarden-hvelvet ditt når du surfer med DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "Nettleserintegrasjon støttes ikke" @@ -1604,7 +1608,7 @@ "message": "Kontroller at vist fingeravtrykk er identisk med fingeravtrykket som vises i nettleserutvidelsen." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ ønsker å koble til Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Ønsker du å godkjenne denne forespørselen?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Ikke godkjenn denne forespørselen dersom du ikke initierte den." }, "biometricsNotEnabledTitle": { "message": "Biometri er ikke aktivert" @@ -2001,13 +2005,13 @@ "message": "API-nøkkel" }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "Premium abonnement kreves" }, "organizationIsDisabled": { "message": "Organisasjonen er deaktivert." }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Elementer i deaktiverte organisasjoner kan ikke aksesseres. Kontakt organisasjonseier for hjelp." }, "neverLockWarning": { "message": "Er du sikker på at du vil bruke alternativet «Aldri»? Ved å angi låsemulighetene til «Aldri» lagres hvelvets krypteringsnøkkel på enheten. Hvis du bruker dette alternativet, bør du sørge for at du holder enheten forsvarlig beskyttet." @@ -2016,6 +2020,6 @@ "message": "Mir" }, "vault": { - "message": "Vault" + "message": "Hvelv" } } diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index 0040f88c980..8d88419e8dc 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -1266,6 +1266,10 @@ "message": "Bijgewerkt", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Aangemaakt", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Wachtwoord bijgewerkt", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index 27cb9423df4..44eed89c74f 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -1266,6 +1266,10 @@ "message": "Retta", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 7653d6143a3..75ebf05cb02 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -1266,6 +1266,10 @@ "message": "Zaktualizowano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Utworzono", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Aktualizacja hasła", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index f27f6cee8d3..1df8d3774a2 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -1266,6 +1266,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Senha Atualizada", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index 524f4209836..c647b0bd62a 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -1266,6 +1266,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Criado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Palavra-passe atualizada", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 3a54501d709..7b0ad37c853 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -1266,6 +1266,10 @@ "message": "S-a actualizat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creată", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parola s-a actualizat", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 84e67f00232..d0d325b9674 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -1239,7 +1239,7 @@ "description": "Default URI match detection for auto-fill." }, "toggleOptions": { - "message": "Переключить настройки" + "message": "Настройки перебора" }, "organization": { "message": "Организация", @@ -1266,6 +1266,10 @@ "message": "Обновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Создан", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль обновлен", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "Используется для биометрии в браузере." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Разрешить интеграцию в браузер DuckDuckGo" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Использовать хранилище Bitwarden совместно с браузером DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "Интеграция с браузером не поддерживается" @@ -1604,7 +1608,7 @@ "message": "Пожалуйста, убедитесь, что отображаемый отпечаток идентичен отпечатку, отображаемому в расширении браузера." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ хочет подключиться к Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Вы хотите одобрить этот запрос?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Если запрос инициировали не вы, не одобряйте его." }, "biometricsNotEnabledTitle": { "message": "Биометрия не включена" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index 32eebc8e99e..4c7c458a6b9 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -1266,6 +1266,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index a0d1cd36431..bc16be1747e 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -1266,6 +1266,10 @@ "message": "Aktualizované", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Vytvorené", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bolo aktualizované", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 34e557dc68e..225866453ff 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -1266,6 +1266,10 @@ "message": "Posodobljeno", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Geslo je bilo posodobljeno", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 1d01f438130..fdf8cce3c0a 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -1266,6 +1266,10 @@ "message": "Промењено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Лозинка ажурирана", "description": "ex. Date this password was updated" @@ -1571,10 +1575,10 @@ "message": "Интеграција прегледача се користи за биометрију у прегледачу." }, "enableDuckDuckGoBrowserIntegration": { - "message": "Allow DuckDuckGo browser integration" + "message": "Дозволи DuckDuckGo интерграцију претраживача" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "Use your Bitwarden vault when browsing with DuckDuckGo." + "message": "Употребити Bitwarden сеф када користите DuckDuckGo." }, "browserIntegrationUnsupportedTitle": { "message": "Интеграција са претраживачем није подржана" @@ -1604,7 +1608,7 @@ "message": "Уверите се да је приказани отисак идентичан отиску приказаном у додатку прегледача." }, "verifyNativeMessagingConnectionTitle": { - "message": "$APPID$ wants to connect to Bitwarden", + "message": "$APPID$ жели да се повеже са Bitwarden", "placeholders": { "appid": { "content": "$1", @@ -1613,10 +1617,10 @@ } }, "verifyNativeMessagingConnectionDesc": { - "message": "Would you like to approve this request?" + "message": "Да ли желите да одобрите овај захтев?" }, "verifyNativeMessagingConnectionWarning": { - "message": "If you did not initiate this request, do not approve it." + "message": "Ако нисте ви покренули овај захтев, немојте га одобрити." }, "biometricsNotEnabledTitle": { "message": "Биометрија није омогућена" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index aa99b529b13..0239eb435b5 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -1266,6 +1266,10 @@ "message": "Uppdaterades", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lösenordet uppdaterades", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index cfdde1e0700..7c006ebf594 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -1266,6 +1266,10 @@ "message": "อัปเดตแล้ว", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 5919d1fc067..7a475bf1c7a 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -1266,6 +1266,10 @@ "message": "Güncelleme", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Oluşturma", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parola güncelleme", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index b8ef216840a..e6fe9b3eab1 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -175,10 +175,10 @@ "message": "Адреса" }, "premiumRequired": { - "message": "Необхідний преміум статус" + "message": "Необхідна передплата преміум" }, "premiumRequiredDesc": { - "message": "Для використання цієї функції необхідний преміум статус." + "message": "Для використання цієї функції необхідна передплата преміум." }, "errorOccurred": { "message": "Сталася помилка." @@ -364,7 +364,7 @@ "message": "Ви дійсно хочете перенести до смітника?" }, "deletedItem": { - "message": "Запис перенесено до смітника" + "message": "Запис переміщено до смітника" }, "overwritePasswordConfirmation": { "message": "Ви дійсно хочете перезаписати поточний пароль?" @@ -479,7 +479,7 @@ "message": "Тека відредагована" }, "addedFolder": { - "message": "Додано теку" + "message": "Теку додано" }, "deleteFolderConfirmation": { "message": "Ви дійсно хочете видалити цю теку?" @@ -1047,19 +1047,19 @@ "message": "Преміум статус" }, "premiumManage": { - "message": "Керувати статусом" + "message": "Керувати передплатою" }, "premiumManageAlert": { "message": "Ви можете керувати своїм статусом у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, "premiumRefresh": { - "message": "Оновити статус" + "message": "Оновити стан передплати" }, "premiumNotCurrentMember": { - "message": "Зараз у вас немає преміум-статусу." + "message": "Зараз у вас немає передплати преміум." }, "premiumSignUpAndGet": { - "message": "Підпишіться на преміум-статус і отримайте:" + "message": "Передплатіть преміум і отримайте:" }, "premiumSignUpStorage": { "message": "1 ГБ зашифрованого сховища для файлів." @@ -1077,16 +1077,16 @@ "message": "Пріоритетну технічну підтримку." }, "premiumSignUpFuture": { - "message": "Всі майбутні функції преміум статусу. Їх буде більше!" + "message": "Усі майбутні преміумфункції. Їх буде більше!" }, "premiumPurchase": { "message": "Придбати преміум" }, "premiumPurchaseAlert": { - "message": "Ви можете придбати преміум статус у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" + "message": "Ви можете передплатити преміум у сховищі на bitwarden.com. Хочете перейти на вебсайт зараз?" }, "premiumCurrentMember": { - "message": "У вас преміум статус!" + "message": "Ви користуєтеся передплатою преміум!" }, "premiumCurrentMemberThanks": { "message": "Дякуємо за підтримку Bitwarden." @@ -1266,6 +1266,10 @@ "message": "Оновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Створено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль оновлено", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index d1609de42f7..5c653a7693e 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -1266,6 +1266,10 @@ "message": "Ngày cập nhật", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index caf13e94e0e..c392d2a78c2 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -1266,6 +1266,10 @@ "message": "更新于", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "创建于", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密码更新于", "description": "ex. Date this password was updated" diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index cff53e074c5..f32e5e03eb6 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -1266,6 +1266,10 @@ "message": "更新於", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "建立於", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密碼更新於", "description": "ex. Date this password was updated" @@ -1574,7 +1578,7 @@ "message": "允許 DuckDuckGo 瀏覽器整合" }, "enableDuckDuckGoBrowserIntegrationDesc": { - "message": "使用 DuckDuckGo 瀏覽時,使用您的 Bitwarden 密碼庫。" + "message": "當使用 DuckDuckGo 瀏覽時,使用您的 Bitwarden 密碼庫。" }, "browserIntegrationUnsupportedTitle": { "message": "不支援瀏覽器整合" diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 071cbebc33d..e47c3f47a18 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -3,7 +3,7 @@ import * as path from "path"; import { app } from "electron"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; import { StateService } from "@bitwarden/common/services/state.service"; import { ElectronLogService } from "@bitwarden/electron/services/electronLog.service"; diff --git a/apps/desktop/src/models/nativeMessaging/encryptedMessage.ts b/apps/desktop/src/models/nativeMessaging/encryptedMessage.ts index c7fd9913d11..bd0b5177a40 100644 --- a/apps/desktop/src/models/nativeMessaging/encryptedMessage.ts +++ b/apps/desktop/src/models/nativeMessaging/encryptedMessage.ts @@ -1,4 +1,4 @@ -import { EncString } from "@bitwarden/common/models/domain/encString"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { MessageCommon } from "./messageCommon"; diff --git a/apps/desktop/src/models/nativeMessaging/encryptedMessageResponse.ts b/apps/desktop/src/models/nativeMessaging/encryptedMessageResponse.ts index 1abb81ba8f8..bed85b65e96 100644 --- a/apps/desktop/src/models/nativeMessaging/encryptedMessageResponse.ts +++ b/apps/desktop/src/models/nativeMessaging/encryptedMessageResponse.ts @@ -1,4 +1,4 @@ -import { EncString } from "@bitwarden/common/models/domain/encString"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { MessageCommon } from "./messageCommon"; diff --git a/apps/desktop/src/models/nativeMessaging/legacyMessageWrapper.ts b/apps/desktop/src/models/nativeMessaging/legacyMessageWrapper.ts index 65142540fa7..5ef10e73289 100644 --- a/apps/desktop/src/models/nativeMessaging/legacyMessageWrapper.ts +++ b/apps/desktop/src/models/nativeMessaging/legacyMessageWrapper.ts @@ -1,4 +1,4 @@ -import { EncString } from "@bitwarden/common/models/domain/encString"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; import { LegacyMessage } from "./legacyMessage"; diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index 2e0090096bb..023bca1e320 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2022.9.2", + "version": "2022.10.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2022.9.2", + "version": "2022.10.1", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-native": "file:../desktop_native" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 0bf1bfd925c..3ad0e2f285f 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2022.9.2", + "version": "2022.10.1", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/desktop/src/scss/base.scss b/apps/desktop/src/scss/base.scss index 981d462f2d8..1a2eddca680 100644 --- a/apps/desktop/src/scss/base.scss +++ b/apps/desktop/src/scss/base.scss @@ -81,6 +81,11 @@ button { line-height: $line-height-base; } +select { + width: 100%; + padding: 0.35rem; +} + button { border: none; background: transparent; diff --git a/apps/desktop/src/scss/list.scss b/apps/desktop/src/scss/list.scss index 343dd550f0c..ec56eaa6c88 100644 --- a/apps/desktop/src/scss/list.scss +++ b/apps/desktop/src/scss/list.scss @@ -152,3 +152,16 @@ height: 100%; overflow-y: auto; } + +.truncate-box { + display: flex; + align-items: center; + gap: 5px; +} + +.truncate { + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/apps/desktop/src/scss/misc.scss b/apps/desktop/src/scss/misc.scss index c1517b72180..50ba40ba707 100644 --- a/apps/desktop/src/scss/misc.scss +++ b/apps/desktop/src/scss/misc.scss @@ -266,7 +266,7 @@ p.lead { form, .form { .form-group { - margin-bottom: 10px; + margin-bottom: 1.25rem; &:last-child { margin-bottom: 0; @@ -492,6 +492,18 @@ app-root > #loading, border-radius: 50% !important; } +// Text selection styles +// Set explicit selection styles (assumes primary accent color has sufficient +// contrast against the background, so its inversion is also still readable) +// and suppress user selection for most elements (to make it more app-like) + +::selection { + @include themify($themes) { + color: themed("backgroundColor"); + background-color: themed("primaryAccentColor"); + } +} + h1, h2, h3, diff --git a/apps/desktop/src/services/encryptedMessageHandlerService.ts b/apps/desktop/src/services/encryptedMessageHandlerService.ts index 1dd66185957..a064e031c89 100644 --- a/apps/desktop/src/services/encryptedMessageHandlerService.ts +++ b/apps/desktop/src/services/encryptedMessageHandlerService.ts @@ -6,9 +6,9 @@ import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.serv import { AuthenticationStatus } from "@bitwarden/common/enums/authenticationStatus"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; -import { LoginUriView } from "@bitwarden/common/models/view/loginUriView"; -import { LoginView } from "@bitwarden/common/models/view/loginView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; +import { LoginUriView } from "@bitwarden/common/models/view/login-uri.view"; +import { LoginView } from "@bitwarden/common/models/view/login.view"; import { DecryptedCommandData } from "../models/nativeMessaging/decryptedCommandData"; import { CredentialCreatePayload } from "../models/nativeMessaging/encryptedMessagePayloads/credentialCreatePayload"; diff --git a/apps/desktop/src/services/nativeMessageHandler.service.ts b/apps/desktop/src/services/nativeMessageHandler.service.ts index 916bd86bc89..8a578957bfe 100644 --- a/apps/desktop/src/services/nativeMessageHandler.service.ts +++ b/apps/desktop/src/services/nativeMessageHandler.service.ts @@ -8,8 +8,8 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { NativeMessagingVersion } from "@bitwarden/common/enums/nativeMessagingVersion"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { StateService } from "@bitwarden/common/services/state.service"; import { DecryptedCommandData } from "../models/nativeMessaging/decryptedCommandData"; @@ -182,12 +182,25 @@ export class NativeMessageHandlerService { this.ddgSharedSecret = SymmetricCryptoKey.fromJSON({ keyB64: storedKey }); } - return JSON.parse( - await this.cryptoService.decryptToUtf8( + try { + let decryptedResult = await this.cryptoService.decryptToUtf8( message.encryptedCommand as EncString, this.ddgSharedSecret - ) - ); + ); + + decryptedResult = this.trimNullCharsFromMessage(decryptedResult); + + return JSON.parse(decryptedResult); + } catch { + this.sendResponse({ + messageId: message.messageId, + version: NativeMessagingVersion.Latest, + payload: { + error: "cannot-decrypt", + }, + }); + return; + } } private async sendEncryptedResponse( @@ -218,4 +231,23 @@ export class NativeMessageHandlerService { private sendResponse(response: EncryptedMessageResponse | UnencryptedMessageResponse) { ipcRenderer.send("nativeMessagingReply", response); } + + // Trim all null bytes padded at the end of messages. This happens with C encryption libraries. + private trimNullCharsFromMessage(message: string): string { + const charNull = 0; + const charRightCurlyBrace = 125; + const charRightBracket = 93; + + for (let i = message.length - 1; i >= 0; i--) { + if (message.charCodeAt(i) === charNull) { + message = message.substring(0, message.length - 1); + } else if ( + message.charCodeAt(i) === charRightCurlyBrace || + message.charCodeAt(i) === charRightBracket + ) { + break; + } + } + return message; + } } diff --git a/apps/desktop/src/services/nativeMessaging.service.ts b/apps/desktop/src/services/nativeMessaging.service.ts index 2ff014fb240..484522d7a5d 100644 --- a/apps/desktop/src/services/nativeMessaging.service.ts +++ b/apps/desktop/src/services/nativeMessaging.service.ts @@ -11,8 +11,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { KeySuffixOptions } from "@bitwarden/common/enums/keySuffixOptions"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; import { LegacyMessage } from "../models/nativeMessaging/legacyMessage"; import { LegacyMessageWrapper } from "../models/nativeMessaging/legacyMessageWrapper"; diff --git a/apps/desktop/src/services/state.service.ts b/apps/desktop/src/services/state.service.ts index 521868a8867..4cbf030d387 100644 --- a/apps/desktop/src/services/state.service.ts +++ b/apps/desktop/src/services/state.service.ts @@ -1,5 +1,5 @@ import { StateService as StateServiceAbstraction } from "@bitwarden/common/abstractions/state.service"; -import { GlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState } from "@bitwarden/common/models/domain/global-state"; import { StateService as BaseStateService } from "@bitwarden/common/services/state.service"; import { Account } from "../models/account"; diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json index 6f171a4bed1..6c519d70ae1 100644 --- a/apps/web/.eslintrc.json +++ b/apps/web/.eslintrc.json @@ -12,7 +12,8 @@ "**/app/shared/*", "@bitwarden/web-vault/*", "src/**/*" - ] + ], + "paths": ["@fluffy-spoon/substitute"] } ] } diff --git a/apps/web/config.js b/apps/web/config.js index 2bfc929d354..72ccf4b90ad 100644 --- a/apps/web/config.js +++ b/apps/web/config.js @@ -1,12 +1,26 @@ function load(envName) { + const base = require("./config/base.json"); + const env = loadConfig(envName); + const local = loadConfig("local"); + return { - ...require("./config/base.json"), - ...loadConfig(envName), - ...loadConfig("local"), + ...base, + ...env, + ...local, dev: { - ...require("./config/base.json").dev, - ...loadConfig(envName).dev, - ...loadConfig("local").dev, + ...base.dev, + ...env.dev, + ...local.dev, + }, + flags: { + ...base.flags, + ...env.flags, + ...local.flags, + }, + devFlags: { + ...base.devFlags, + ...env.devFlags, + ...local.devFlags, }, }; } diff --git a/apps/web/package.json b/apps/web/package.json index cbf65094dd7..a879649ec62 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2022.9.2", + "version": "2022.10.1", "scripts": { "build:oss": "webpack", "build:bit": "webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/apps/web/src/app/accounts/accept-emergency.component.ts b/apps/web/src/app/accounts/accept-emergency.component.ts index a3a2f43fc08..8cfdb9dcb14 100644 --- a/apps/web/src/app/accounts/accept-emergency.component.ts +++ b/apps/web/src/app/accounts/accept-emergency.component.ts @@ -5,7 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { EmergencyAccessAcceptRequest } from "@bitwarden/common/models/request/emergencyAccessAcceptRequest"; +import { EmergencyAccessAcceptRequest } from "@bitwarden/common/models/request/emergency-access-accept.request"; import { BaseAcceptComponent } from "../common/base.accept.component"; diff --git a/apps/web/src/app/accounts/accept-organization.component.ts b/apps/web/src/app/accounts/accept-organization.component.ts index ae24498ddeb..be3826fe18c 100644 --- a/apps/web/src/app/accounts/accept-organization.component.ts +++ b/apps/web/src/app/accounts/accept-organization.component.ts @@ -12,7 +12,7 @@ import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.serv import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { OrganizationUserAcceptRequest } from "@bitwarden/common/models/request/organizationUserAcceptRequest"; +import { OrganizationUserAcceptRequest } from "@bitwarden/common/models/request/organization-user-accept.request"; import { BaseAcceptComponent } from "../common/base.accept.component"; diff --git a/apps/web/src/app/accounts/login/login-with-device.component.ts b/apps/web/src/app/accounts/login/login-with-device.component.ts index 4c6f6268dfd..4fce6c05ebf 100644 --- a/apps/web/src/app/accounts/login/login-with-device.component.ts +++ b/apps/web/src/app/accounts/login/login-with-device.component.ts @@ -17,10 +17,10 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { AuthRequestType } from "@bitwarden/common/enums/authRequestType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { PasswordlessLogInCredentials } from "@bitwarden/common/models/domain/logInCredentials"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { PasswordlessCreateAuthRequest } from "@bitwarden/common/models/request/passwordlessCreateAuthRequest"; -import { AuthRequestResponse } from "@bitwarden/common/models/response/authRequestResponse"; +import { PasswordlessLogInCredentials } from "@bitwarden/common/models/domain/log-in-credentials"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { PasswordlessCreateAuthRequest } from "@bitwarden/common/models/request/passwordless-create-auth.request"; +import { AuthRequestResponse } from "@bitwarden/common/models/response/auth-request.response"; @Component({ selector: "app-login-with-device", @@ -37,9 +37,11 @@ export class LoginWithDeviceComponent onSuccessfulLoginTwoFactorNavigate: () => Promise; onSuccessfulLogin: () => Promise; onSuccessfulLoginNavigate: () => Promise; + onSuccessfulLoginForceResetNavigate: () => Promise; protected twoFactorRoute = "2fa"; protected successRoute = "vault"; + protected forcePasswordResetRoute = "update-temp-password"; private authRequestKeyPair: [publicKey: ArrayBuffer, privateKey: ArrayBuffer]; constructor( @@ -119,14 +121,29 @@ export class LoginWithDeviceComponent } const credentials = await this.buildLoginCredntials(requestId, response); - await this.authService.logIn(credentials); - if (this.onSuccessfulLogin != null) { - this.onSuccessfulLogin(); - } - if (this.onSuccessfulLoginNavigate != null) { - this.onSuccessfulLoginNavigate(); + const loginResponse = await this.authService.logIn(credentials); + + if (loginResponse.requiresTwoFactor) { + if (this.onSuccessfulLoginTwoFactorNavigate != null) { + this.onSuccessfulLoginTwoFactorNavigate(); + } else { + this.router.navigate([this.twoFactorRoute]); + } + } else if (loginResponse.forcePasswordReset) { + if (this.onSuccessfulLoginForceResetNavigate != null) { + this.onSuccessfulLoginForceResetNavigate(); + } else { + this.router.navigate([this.forcePasswordResetRoute]); + } } else { - this.router.navigate([this.successRoute]); + if (this.onSuccessfulLogin != null) { + this.onSuccessfulLogin(); + } + if (this.onSuccessfulLoginNavigate != null) { + this.onSuccessfulLoginNavigate(); + } else { + this.router.navigate([this.successRoute]); + } } } catch (error) { this.logService.error(error); diff --git a/apps/web/src/app/accounts/login/login.component.ts b/apps/web/src/app/accounts/login/login.component.ts index 2568d5a3e74..1c842650498 100644 --- a/apps/web/src/app/accounts/login/login.component.ts +++ b/apps/web/src/app/accounts/login/login.component.ts @@ -1,6 +1,7 @@ -import { Component, NgZone } from "@angular/core"; +import { Component, NgZone, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; +import { Subject, takeUntil } from "rxjs"; import { first } from "rxjs/operators"; import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/components/login.component"; @@ -16,11 +17,11 @@ import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwo import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; -import { PolicyData } from "@bitwarden/common/models/data/policyData"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; +import { PolicyData } from "@bitwarden/common/models/data/policy.data"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; -import { PolicyResponse } from "@bitwarden/common/models/response/policyResponse"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; import { flagEnabled } from "../../../utils/flags"; import { RouterService, StateService } from "../../core"; @@ -29,13 +30,14 @@ import { RouterService, StateService } from "../../core"; selector: "app-login", templateUrl: "login.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class LoginComponent extends BaseLoginComponent { +export class LoginComponent extends BaseLoginComponent implements OnInit, OnDestroy { showResetPasswordAutoEnrollWarning = false; enforcedPasswordPolicyOptions: MasterPasswordPolicyOptions; policies: ListResponse; showPasswordless = false; + private destroy$ = new Subject(); + constructor( authService: AuthService, router: Router, @@ -128,14 +130,23 @@ export class LoginComponent extends BaseLoginComponent { this.showResetPasswordAutoEnrollWarning = resetPasswordPolicy[1] && resetPasswordPolicy[0].autoEnrollEnabled; - this.enforcedPasswordPolicyOptions = - await this.policyService.getMasterPasswordPolicyOptions(policyList); + this.policyService + .masterPasswordPolicyOptions$(policyList) + .pipe(takeUntil(this.destroy$)) + .subscribe((enforcedPasswordPolicyOptions) => { + this.enforcedPasswordPolicyOptions = enforcedPasswordPolicyOptions; + }); } } } + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + async goAfterLogIn() { - const masterPassword = this.formGroup.get("masterPassword")?.value; + const masterPassword = this.formGroup.value.masterPassword; // Check master password against policy if (this.enforcedPasswordPolicyOptions != null) { @@ -170,7 +181,7 @@ export class LoginComponent extends BaseLoginComponent { } async submit() { - const rememberEmail = this.formGroup.get("rememberEmail")?.value; + const rememberEmail = this.formGroup.value.rememberEmail; await this.stateService.setRememberEmail(rememberEmail); if (!rememberEmail) { @@ -192,7 +203,7 @@ export class LoginComponent extends BaseLoginComponent { } private getPasswordStrengthUserInput() { - const email = this.formGroup.get("email")?.value; + const email = this.formGroup.value.email; let userInput: string[] = []; const atPosition = email.indexOf("@"); if (atPosition > -1) { diff --git a/apps/web/src/app/accounts/recover-delete.component.ts b/apps/web/src/app/accounts/recover-delete.component.ts index 66f2fa03732..c6af89b3adf 100644 --- a/apps/web/src/app/accounts/recover-delete.component.ts +++ b/apps/web/src/app/accounts/recover-delete.component.ts @@ -5,7 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { DeleteRecoverRequest } from "@bitwarden/common/models/request/deleteRecoverRequest"; +import { DeleteRecoverRequest } from "@bitwarden/common/models/request/delete-recover.request"; @Component({ selector: "app-recover-delete", diff --git a/apps/web/src/app/accounts/recover-two-factor.component.ts b/apps/web/src/app/accounts/recover-two-factor.component.ts index 44245dfbced..bfedd8679a4 100644 --- a/apps/web/src/app/accounts/recover-two-factor.component.ts +++ b/apps/web/src/app/accounts/recover-two-factor.component.ts @@ -7,7 +7,7 @@ import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { TwoFactorRecoveryRequest } from "@bitwarden/common/models/request/twoFactorRecoveryRequest"; +import { TwoFactorRecoveryRequest } from "@bitwarden/common/models/request/two-factor-recovery.request"; @Component({ selector: "app-recover-two-factor", diff --git a/apps/web/src/app/accounts/register-form/register-form.component.ts b/apps/web/src/app/accounts/register-form/register-form.component.ts index 8045ef18f1e..6cd62ea13e4 100644 --- a/apps/web/src/app/accounts/register-form/register-form.component.ts +++ b/apps/web/src/app/accounts/register-form/register-form.component.ts @@ -14,8 +14,8 @@ import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwo import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; -import { ReferenceEventRequest } from "@bitwarden/common/models/request/referenceEventRequest"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; +import { ReferenceEventRequest } from "@bitwarden/common/models/request/reference-event.request"; @Component({ selector: "app-register-form", @@ -73,7 +73,7 @@ export class RegisterFormComponent extends BaseRegisterComponent { this.enforcedPolicyOptions != null && !this.policyService.evaluateMasterPassword( this.passwordStrengthResult.score, - this.formGroup.get("masterPassword")?.value, + this.formGroup.value.masterPassword, this.enforcedPolicyOptions ) ) { diff --git a/apps/web/src/app/accounts/register.component.ts b/apps/web/src/app/accounts/register.component.ts index 4e700ca4d40..c7c3b7dfc58 100644 --- a/apps/web/src/app/accounts/register.component.ts +++ b/apps/web/src/app/accounts/register.component.ts @@ -1,6 +1,7 @@ -import { Component } from "@angular/core"; +import { Component, OnDestroy, OnInit } from "@angular/core"; import { UntypedFormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; +import { Subject, takeUntil } from "rxjs"; import { first } from "rxjs/operators"; import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/components/register.component"; @@ -16,10 +17,10 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { PolicyData } from "@bitwarden/common/models/data/policyData"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; +import { PolicyData } from "@bitwarden/common/models/data/policy.data"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { ReferenceEventRequest } from "@bitwarden/common/models/request/referenceEventRequest"; +import { ReferenceEventRequest } from "@bitwarden/common/models/request/reference-event.request"; import { RouterService } from "../core"; @@ -27,14 +28,14 @@ import { RouterService } from "../core"; selector: "app-register", templateUrl: "register.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class RegisterComponent extends BaseRegisterComponent { +export class RegisterComponent extends BaseRegisterComponent implements OnInit, OnDestroy { email = ""; showCreateOrgMessage = false; layout = ""; enforcedPolicyOptions: MasterPasswordPolicyOptions; private policies: Policy[]; + private destroy$ = new Subject(); constructor( formValidationErrorService: FormValidationErrorsService, @@ -130,11 +131,19 @@ export class RegisterComponent extends BaseRegisterComponent { } if (this.policies != null) { - this.enforcedPolicyOptions = await this.policyService.getMasterPasswordPolicyOptions( - this.policies - ); + this.policyService + .masterPasswordPolicyOptions$(this.policies) + .pipe(takeUntil(this.destroy$)) + .subscribe((enforcedPasswordPolicyOptions) => { + this.enforcedPolicyOptions = enforcedPasswordPolicyOptions; + }); } await super.ngOnInit(); } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } } diff --git a/apps/web/src/app/accounts/trial-initiation/billing.component.ts b/apps/web/src/app/accounts/trial-initiation/billing.component.ts index aff798b5b86..0817c19c26b 100644 --- a/apps/web/src/app/accounts/trial-initiation/billing.component.ts +++ b/apps/web/src/app/accounts/trial-initiation/billing.component.ts @@ -57,8 +57,8 @@ export class BillingComponent extends OrganizationPlansComponent { async ngOnInit() { const additionalSeats = this.product == ProductType.Families ? 0 : 1; this.formGroup.patchValue({ - name: this.orgInfoForm.get("name")?.value, - billingEmail: this.orgInfoForm.get("email")?.value, + name: this.orgInfoForm.value.name, + billingEmail: this.orgInfoForm.value.email, additionalSeats: additionalSeats, plan: this.plan, product: this.product, diff --git a/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.spec.ts b/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.spec.ts index f20b407e6bf..9cfe9333801 100644 --- a/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.spec.ts +++ b/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.spec.ts @@ -5,18 +5,19 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testin import { FormBuilder, UntypedFormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; -import { Substitute } from "@fluffy-spoon/substitute"; -import { BehaviorSubject } from "rxjs"; +import { mock, MockProxy } from "jest-mock-extended"; +import { BehaviorSubject, of } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/pipes/i18n.pipe"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; -import { StateService as BaseStateService } from "@bitwarden/common/abstractions/state.service"; +import { StateService } from "@bitwarden/common/abstractions/state.service"; import { PlanType } from "@bitwarden/common/enums/planType"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; import { RouterService } from "../../core"; @@ -31,23 +32,15 @@ describe("TrialInitiationComponent", () => { const formBuilder: FormBuilder = new FormBuilder(); let routerSpy: jest.SpyInstance; - let stateServiceMock: any; - let apiServiceMock: any; - let policyServiceMock: any; + let stateServiceMock: MockProxy; + let policyApiServiceMock: MockProxy; + let policyServiceMock: MockProxy; beforeEach(() => { - // only mock functions we use in this component - stateServiceMock = { - getOrganizationInvitation: jest.fn(), - }; - - apiServiceMock = { - getPoliciesByToken: jest.fn(), - }; - - policyServiceMock = { - getMasterPasswordPolicyOptions: jest.fn(), - }; + // only define services directly that we want to mock return values in this component + stateServiceMock = mock(); + policyApiServiceMock = mock(); + policyServiceMock = mock(); TestBed.configureTestingModule({ imports: [ @@ -72,23 +65,19 @@ describe("TrialInitiationComponent", () => { queryParams: mockQueryParams.asObservable(), }, }, - { provide: BaseStateService, useValue: stateServiceMock }, + { provide: StateService, useValue: stateServiceMock }, { provide: PolicyService, useValue: policyServiceMock }, - { provide: ApiService, useValue: apiServiceMock }, - { provide: LogService, useClass: Substitute.for() }, - { provide: I18nService, useClass: Substitute.for() }, - { provide: TitleCasePipe, useClass: Substitute.for() }, - { - provide: PolicyApiServiceAbstraction, - useClass: Substitute.for(), - }, + { provide: PolicyApiServiceAbstraction, useValue: policyApiServiceMock }, + { provide: LogService, useValue: mock() }, + { provide: I18nService, useValue: mock() }, + { provide: TitleCasePipe, useValue: mock() }, { provide: VerticalStepperComponent, useClass: VerticalStepperStubComponent, }, { provide: RouterService, - useClass: Substitute.for(), + useValue: mock(), }, ], schemas: [NO_ERRORS_SCHEMA], // Allows child components to be ignored (such as register component) @@ -118,40 +107,46 @@ describe("TrialInitiationComponent", () => { }); it("should set enforcedPolicyOptions if state service returns an invite", async () => { // Set up service method mocks - stateServiceMock.getOrganizationInvitation.mockReturnValueOnce({ - organizationId: testOrgId, - token: "token", - email: "testEmail", - organizationUserId: "123", - }); - apiServiceMock.getPoliciesByToken.mockReturnValueOnce({ - data: [ - { - id: "345", - organizationId: testOrgId, - type: 1, - data: [ - { - minComplexity: 4, - minLength: 10, - requireLower: null, - requireNumbers: null, - requireSpecial: null, - requireUpper: null, - }, - ], - enabled: true, - }, - ], - }); - policyServiceMock.getMasterPasswordPolicyOptions.mockReturnValueOnce({ - minComplexity: 4, - minLength: 10, - requireLower: null, - requireNumbers: null, - requireSpecial: null, - requireUpper: null, - } as MasterPasswordPolicyOptions); + stateServiceMock.getOrganizationInvitation.mockReturnValueOnce( + Promise.resolve({ + organizationId: testOrgId, + token: "token", + email: "testEmail", + organizationUserId: "123", + }) + ); + policyApiServiceMock.getPoliciesByToken.mockReturnValueOnce( + Promise.resolve({ + data: [ + { + id: "345", + organizationId: testOrgId, + type: 1, + data: [ + { + minComplexity: 4, + minLength: 10, + requireLower: null, + requireNumbers: null, + requireSpecial: null, + requireUpper: null, + }, + ], + enabled: true, + }, + ], + } as ListResponse) + ); + policyServiceMock.masterPasswordPolicyOptions$.mockReturnValue( + of({ + minComplexity: 4, + minLength: 10, + requireLower: null, + requireNumbers: null, + requireSpecial: null, + requireUpper: null, + } as MasterPasswordPolicyOptions) + ); // Need to recreate component with new service mocks fixture = TestBed.createComponent(TrialInitiationComponent); diff --git a/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.ts b/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.ts index 00bbc6e236f..1f9b08987d1 100644 --- a/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.ts +++ b/apps/web/src/app/accounts/trial-initiation/trial-initiation.component.ts @@ -1,9 +1,9 @@ import { StepperSelectionEvent } from "@angular/cdk/stepper"; import { TitleCasePipe } from "@angular/common"; -import { Component, OnInit, ViewChild } from "@angular/core"; +import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { UntypedFormBuilder, Validators } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import { first } from "rxjs"; +import { first, Subject, takeUntil } from "rxjs"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -12,10 +12,10 @@ import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.serv import { StateService } from "@bitwarden/common/abstractions/state.service"; import { PlanType } from "@bitwarden/common/enums/planType"; import { ProductType } from "@bitwarden/common/enums/productType"; -import { PolicyData } from "@bitwarden/common/models/data/policyData"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; +import { PolicyData } from "@bitwarden/common/models/data/policy.data"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { ReferenceEventRequest } from "@bitwarden/common/models/request/referenceEventRequest"; +import { ReferenceEventRequest } from "@bitwarden/common/models/request/reference-event.request"; import { RouterService } from "./../../core/router.service"; import { VerticalStepperComponent } from "./vertical-stepper/vertical-stepper.component"; @@ -24,8 +24,7 @@ import { VerticalStepperComponent } from "./vertical-stepper/vertical-stepper.co selector: "app-trial", templateUrl: "trial-initiation.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class TrialInitiationComponent implements OnInit { +export class TrialInitiationComponent implements OnInit, OnDestroy { email = ""; org = ""; orgInfoSubLabel = ""; @@ -63,6 +62,8 @@ export class TrialInitiationComponent implements OnInit { } } + private destroy$ = new Subject(); + constructor( private route: ActivatedRoute, protected router: Router, @@ -140,12 +141,20 @@ export class TrialInitiationComponent implements OnInit { } if (this.policies != null) { - this.enforcedPolicyOptions = await this.policyService.getMasterPasswordPolicyOptions( - this.policies - ); + this.policyService + .masterPasswordPolicyOptions$(this.policies) + .pipe(takeUntil(this.destroy$)) + .subscribe((enforcedPasswordPolicyOptions) => { + this.enforcedPolicyOptions = enforcedPasswordPolicyOptions; + }); } } + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + stepSelectionChange(event: StepperSelectionEvent) { // Set org info sub label if (event.selectedIndex === 1 && this.orgInfoFormGroup.controls.name.value === "") { diff --git a/apps/web/src/app/accounts/verify-email-token.component.ts b/apps/web/src/app/accounts/verify-email-token.component.ts index c0ebfa78d7f..6c2cf169a90 100644 --- a/apps/web/src/app/accounts/verify-email-token.component.ts +++ b/apps/web/src/app/accounts/verify-email-token.component.ts @@ -7,7 +7,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { VerifyEmailRequest } from "@bitwarden/common/models/request/verifyEmailRequest"; +import { VerifyEmailRequest } from "@bitwarden/common/models/request/verify-email.request"; @Component({ selector: "app-verify-email-token", diff --git a/apps/web/src/app/accounts/verify-recover-delete.component.ts b/apps/web/src/app/accounts/verify-recover-delete.component.ts index 7139e4d10e7..b3eb4819b8b 100644 --- a/apps/web/src/app/accounts/verify-recover-delete.component.ts +++ b/apps/web/src/app/accounts/verify-recover-delete.component.ts @@ -6,7 +6,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { VerifyDeleteRecoverRequest } from "@bitwarden/common/models/request/verifyDeleteRecoverRequest"; +import { VerifyDeleteRecoverRequest } from "@bitwarden/common/models/request/verify-delete-recover.request"; @Component({ selector: "app-verify-recover-delete", diff --git a/apps/web/src/app/common/base.events.component.ts b/apps/web/src/app/common/base.events.component.ts index 31d44f68250..51a2d3afad9 100644 --- a/apps/web/src/app/common/base.events.component.ts +++ b/apps/web/src/app/common/base.events.component.ts @@ -5,9 +5,9 @@ import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { EventResponse } from "@bitwarden/common/models/response/eventResponse"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; -import { EventView } from "@bitwarden/common/models/view/eventView"; +import { EventResponse } from "@bitwarden/common/models/response/event.response"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { EventView } from "@bitwarden/common/models/view/event.view"; import { EventService } from "../core"; diff --git a/apps/web/src/app/common/base.people.component.ts b/apps/web/src/app/common/base.people.component.ts index 8d9a3324244..c3ee6bb209d 100644 --- a/apps/web/src/app/common/base.people.component.ts +++ b/apps/web/src/app/common/base.people.component.ts @@ -3,7 +3,6 @@ import { Directive, ViewChild, ViewContainerRef } from "@angular/core"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { ValidationService } from "@bitwarden/angular/services/validation.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -11,14 +10,15 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType"; import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType"; import { ProviderUserStatusType } from "@bitwarden/common/enums/providerUserStatusType"; import { ProviderUserType } from "@bitwarden/common/enums/providerUserType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; -import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organizationUserResponse"; -import { ProviderUserUserDetailsResponse } from "@bitwarden/common/models/response/provider/providerUserResponse"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organization-user.response"; +import { ProviderUserUserDetailsResponse } from "@bitwarden/common/models/response/provider/provider-user.response"; import { UserConfirmComponent } from "../organizations/manage/user-confirm.component"; diff --git a/apps/web/src/app/components/premium-badge.stories.ts b/apps/web/src/app/components/premium-badge.stories.ts index fda398c8397..a1fcfd471e3 100644 --- a/apps/web/src/app/components/premium-badge.stories.ts +++ b/apps/web/src/app/components/premium-badge.stories.ts @@ -4,7 +4,7 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; +import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; import { BadgeModule, I18nMockService } from "@bitwarden/components"; import { PremiumBadgeComponent } from "./premium-badge.component"; diff --git a/apps/web/src/app/core/event.service.ts b/apps/web/src/app/core/event.service.ts index 1a17998747e..62054188100 100644 --- a/apps/web/src/app/core/event.service.ts +++ b/apps/web/src/app/core/event.service.ts @@ -1,16 +1,32 @@ -import { Injectable } from "@angular/core"; +import { Injectable, OnDestroy, OnInit } from "@angular/core"; +import { Subject, takeUntil } from "rxjs"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { DeviceType } from "@bitwarden/common/enums/deviceType"; import { EventType } from "@bitwarden/common/enums/eventType"; import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { EventResponse } from "@bitwarden/common/models/response/eventResponse"; +import { Policy } from "@bitwarden/common/models/domain/policy"; +import { EventResponse } from "@bitwarden/common/models/response/event.response"; @Injectable() -export class EventService { +export class EventService implements OnInit, OnDestroy { + private destroy$ = new Subject(); + private policies: Policy[]; + constructor(private i18nService: I18nService, private policyService: PolicyService) {} + ngOnInit(): void { + this.policyService.policies$.pipe(takeUntil(this.destroy$)).subscribe((policies) => { + this.policies = policies; + }); + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + getDefaultDateFilters() { const d = new Date(); const end = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59); @@ -326,8 +342,7 @@ export class EventService { case EventType.Policy_Updated: { msg = this.i18nService.t("modifiedPolicyId", this.formatPolicyId(ev)); - const policies = await this.policyService.getAll(); - const policy = policies.filter((p) => p.id === ev.policyId)[0]; + const policy = this.policies.filter((p) => p.id === ev.policyId)[0]; let p1 = this.getShortId(ev.policyId); if (policy != null) { p1 = PolicyType[policy.type]; diff --git a/apps/web/src/app/core/html-storage.service.ts b/apps/web/src/app/core/html-storage.service.ts index 680051aa858..5988f3f289e 100644 --- a/apps/web/src/app/core/html-storage.service.ts +++ b/apps/web/src/app/core/html-storage.service.ts @@ -2,7 +2,7 @@ import { Injectable } from "@angular/core"; import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { HtmlStorageLocation } from "@bitwarden/common/enums/htmlStorageLocation"; -import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; +import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; @Injectable() export class HtmlStorageService implements AbstractStorageService { diff --git a/apps/web/src/app/core/state/global-state.ts b/apps/web/src/app/core/state/global-state.ts index 15fc03876f2..1bd80e20f1f 100644 --- a/apps/web/src/app/core/state/global-state.ts +++ b/apps/web/src/app/core/state/global-state.ts @@ -1,5 +1,5 @@ import { ThemeType } from "@bitwarden/common/enums/themeType"; -import { GlobalState as BaseGlobalState } from "@bitwarden/common/models/domain/globalState"; +import { GlobalState as BaseGlobalState } from "@bitwarden/common/models/domain/global-state"; export class GlobalState extends BaseGlobalState { theme?: ThemeType = ThemeType.Light; diff --git a/apps/web/src/app/core/state/state.service.ts b/apps/web/src/app/core/state/state.service.ts index 7284ad87fed..7c1eefe2701 100644 --- a/apps/web/src/app/core/state/state.service.ts +++ b/apps/web/src/app/core/state/state.service.ts @@ -10,11 +10,11 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { StateMigrationService } from "@bitwarden/common/abstractions/stateMigration.service"; import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { StateFactory } from "@bitwarden/common/factories/stateFactory"; -import { CipherData } from "@bitwarden/common/models/data/cipherData"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; -import { FolderData } from "@bitwarden/common/models/data/folderData"; -import { SendData } from "@bitwarden/common/models/data/sendData"; -import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; +import { CipherData } from "@bitwarden/common/models/data/cipher.data"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; +import { FolderData } from "@bitwarden/common/models/data/folder.data"; +import { SendData } from "@bitwarden/common/models/data/send.data"; +import { StorageOptions } from "@bitwarden/common/models/domain/storage-options"; import { StateService as BaseStateService } from "@bitwarden/common/services/state.service"; import { Account } from "./account"; diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.ts b/apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.ts index 6c5f6e9a342..dc54300f6f8 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.ts +++ b/apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.ts @@ -5,8 +5,8 @@ import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { OrganizationUserBulkConfirmRequest } from "@bitwarden/common/models/request/organizationUserBulkConfirmRequest"; -import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organizationUserBulkRequest"; +import { OrganizationUserBulkConfirmRequest } from "@bitwarden/common/models/request/organization-user-bulk-confirm.request"; +import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organization-user-bulk.request"; import { BulkUserDetails } from "./bulk-status.component"; diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts index 33641d76164..6a73de05df2 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts +++ b/apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts @@ -2,7 +2,7 @@ import { Component, Input } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organizationUserBulkRequest"; +import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organization-user-bulk.request"; import { BulkUserDetails } from "./bulk-status.component"; diff --git a/apps/web/src/app/organizations/manage/bulk/bulk-restore-revoke.component.ts b/apps/web/src/app/organizations/manage/bulk/bulk-restore-revoke.component.ts index fa0a916ef05..7f12111d60b 100644 --- a/apps/web/src/app/organizations/manage/bulk/bulk-restore-revoke.component.ts +++ b/apps/web/src/app/organizations/manage/bulk/bulk-restore-revoke.component.ts @@ -3,7 +3,7 @@ import { Component } from "@angular/core"; import { ModalConfig } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organizationUserBulkRequest"; +import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organization-user-bulk.request"; import { BulkUserDetails } from "./bulk-status.component"; diff --git a/apps/web/src/app/organizations/manage/collection-add-edit.component.ts b/apps/web/src/app/organizations/manage/collection-add-edit.component.ts index 5c428abda4f..bf381031404 100644 --- a/apps/web/src/app/organizations/manage/collection-add-edit.component.ts +++ b/apps/web/src/app/organizations/manage/collection-add-edit.component.ts @@ -7,11 +7,11 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { CollectionRequest } from "@bitwarden/common/models/request/collectionRequest"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; -import { GroupResponse } from "@bitwarden/common/models/response/groupResponse"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { CollectionRequest } from "@bitwarden/common/models/request/collection.request"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; +import { GroupResponse } from "@bitwarden/common/models/response/group.response"; @Component({ selector: "app-collection-add-edit", diff --git a/apps/web/src/app/organizations/manage/collections.component.ts b/apps/web/src/app/organizations/manage/collections.component.ts index d9fe9bdb689..111b0cd139d 100644 --- a/apps/web/src/app/organizations/manage/collections.component.ts +++ b/apps/web/src/app/organizations/manage/collections.component.ts @@ -10,15 +10,15 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; import { Collection } from "@bitwarden/common/models/domain/collection"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { CollectionDetailsResponse, CollectionResponse, -} from "@bitwarden/common/models/response/collectionResponse"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +} from "@bitwarden/common/models/response/collection.response"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; import { CollectionAddEditComponent } from "./collection-add-edit.component"; import { EntityUsersComponent } from "./entity-users.component"; diff --git a/apps/web/src/app/organizations/manage/entity-events.component.ts b/apps/web/src/app/organizations/manage/entity-events.component.ts index 6801c905939..0eac612cd0d 100644 --- a/apps/web/src/app/organizations/manage/entity-events.component.ts +++ b/apps/web/src/app/organizations/manage/entity-events.component.ts @@ -5,8 +5,8 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { EventResponse } from "@bitwarden/common/models/response/eventResponse"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; +import { EventResponse } from "@bitwarden/common/models/response/event.response"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { EventService } from "../../core"; diff --git a/apps/web/src/app/organizations/manage/entity-users.component.ts b/apps/web/src/app/organizations/manage/entity-users.component.ts index bce2812078b..f2e443bce58 100644 --- a/apps/web/src/app/organizations/manage/entity-users.component.ts +++ b/apps/web/src/app/organizations/manage/entity-users.component.ts @@ -8,8 +8,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType"; import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; -import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organizationUserResponse"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; +import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organization-user.response"; @Component({ selector: "app-entity-users", diff --git a/apps/web/src/app/organizations/manage/events.component.ts b/apps/web/src/app/organizations/manage/events.component.ts index 9ee2152f229..43896085efb 100644 --- a/apps/web/src/app/organizations/manage/events.component.ts +++ b/apps/web/src/app/organizations/manage/events.component.ts @@ -11,7 +11,7 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { ProviderService } from "@bitwarden/common/abstractions/provider.service"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { EventResponse } from "@bitwarden/common/models/response/eventResponse"; +import { EventResponse } from "@bitwarden/common/models/response/event.response"; import { BaseEventsComponent } from "../../common/base.events.component"; import { EventService } from "../../core"; diff --git a/apps/web/src/app/organizations/manage/group-add-edit.component.ts b/apps/web/src/app/organizations/manage/group-add-edit.component.ts index 0d5f654a505..f916e20aee0 100644 --- a/apps/web/src/app/organizations/manage/group-add-edit.component.ts +++ b/apps/web/src/app/organizations/manage/group-add-edit.component.ts @@ -5,12 +5,12 @@ import { CollectionService } from "@bitwarden/common/abstractions/collection.ser import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; import { Collection } from "@bitwarden/common/models/domain/collection"; -import { GroupRequest } from "@bitwarden/common/models/request/groupRequest"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; -import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collectionResponse"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { GroupRequest } from "@bitwarden/common/models/request/group.request"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; +import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collection.response"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; @Component({ selector: "app-group-add-edit", diff --git a/apps/web/src/app/organizations/manage/groups.component.ts b/apps/web/src/app/organizations/manage/groups.component.ts index 419e3ab6410..e38ddf38da7 100644 --- a/apps/web/src/app/organizations/manage/groups.component.ts +++ b/apps/web/src/app/organizations/manage/groups.component.ts @@ -9,7 +9,7 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { GroupResponse } from "@bitwarden/common/models/response/groupResponse"; +import { GroupResponse } from "@bitwarden/common/models/response/group.response"; import { EntityUsersComponent } from "./entity-users.component"; import { GroupAddEditComponent } from "./group-add-edit.component"; diff --git a/apps/web/src/app/organizations/manage/people.component.ts b/apps/web/src/app/organizations/manage/people.component.ts index d8535c14352..8fb4e789a5f 100644 --- a/apps/web/src/app/organizations/manage/people.component.ts +++ b/apps/web/src/app/organizations/manage/people.component.ts @@ -1,11 +1,10 @@ -import { Component, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; -import { first } from "rxjs/operators"; +import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { combineLatest, concatMap, Subject, takeUntil } from "rxjs"; import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { ValidationService } from "@bitwarden/angular/services/validation.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; @@ -13,20 +12,20 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType"; import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType"; import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organizationKeysRequest"; -import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organizationUserBulkRequest"; -import { OrganizationUserConfirmRequest } from "@bitwarden/common/models/request/organizationUserConfirmRequest"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; -import { OrganizationUserBulkResponse } from "@bitwarden/common/models/response/organizationUserBulkResponse"; -import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organizationUserResponse"; +import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organization-keys.request"; +import { OrganizationUserBulkRequest } from "@bitwarden/common/models/request/organization-user-bulk.request"; +import { OrganizationUserConfirmRequest } from "@bitwarden/common/models/request/organization-user-confirm.request"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { OrganizationUserBulkResponse } from "@bitwarden/common/models/response/organization-user-bulk.response"; +import { OrganizationUserUserDetailsResponse } from "@bitwarden/common/models/response/organization-user.response"; import { BasePeopleComponent } from "../../common/base.people.component"; @@ -43,10 +42,9 @@ import { UserGroupsComponent } from "./user-groups.component"; selector: "app-org-people", templateUrl: "people.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class PeopleComponent extends BasePeopleComponent - implements OnInit + implements OnInit, OnDestroy { @ViewChild("addEdit", { read: ViewContainerRef, static: true }) addEditModalRef: ViewContainerRef; @ViewChild("groupsTemplate", { read: ViewContainerRef, static: true }) @@ -77,6 +75,8 @@ export class PeopleComponent orgResetPasswordPolicyEnabled = false; callingUserType: OrganizationUserType = null; + private destroy$ = new Subject(); + constructor( apiService: ApiService, private route: ActivatedRoute, @@ -84,10 +84,8 @@ export class PeopleComponent modalService: ModalService, platformUtilsService: PlatformUtilsService, cryptoService: CryptoService, - private router: Router, searchService: SearchService, validationService: ValidationService, - private policyApiService: PolicyApiServiceAbstraction, private policyService: PolicyService, logService: LogService, searchPipe: SearchPipe, @@ -113,53 +111,63 @@ export class PeopleComponent } async ngOnInit() { - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe - this.route.parent.parent.params.subscribe(async (params) => { - this.organizationId = params.organizationId; - const organization = await this.organizationService.get(this.organizationId); - this.accessEvents = organization.useEvents; - this.accessGroups = organization.useGroups; - this.canResetPassword = organization.canManageUsersPassword; - this.orgUseResetPassword = organization.useResetPassword; - this.callingUserType = organization.type; - this.orgHasKeys = organization.hasPublicAndPrivateKeys; + combineLatest([this.route.params, this.route.queryParams, this.policyService.policies$]) + .pipe( + concatMap(async ([params, qParams, policies]) => { + this.organizationId = params.organizationId; + const organization = await this.organizationService.get(this.organizationId); + this.accessEvents = organization.useEvents; + this.accessGroups = organization.useGroups; + this.canResetPassword = organization.canManageUsersPassword; + this.orgUseResetPassword = organization.useResetPassword; + this.callingUserType = organization.type; + this.orgHasKeys = organization.hasPublicAndPrivateKeys; - // Backfill pub/priv key if necessary - if (this.canResetPassword && !this.orgHasKeys) { - const orgShareKey = await this.cryptoService.getOrgKey(this.organizationId); - const orgKeys = await this.cryptoService.makeKeyPair(orgShareKey); - const request = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString); - const response = await this.organizationApiService.updateKeys(this.organizationId, request); - if (response != null) { - this.orgHasKeys = response.publicKey != null && response.privateKey != null; - await this.syncService.fullSync(true); // Replace oganizations with new data - } else { - throw new Error(this.i18nService.t("resetPasswordOrgKeysError")); - } - } - - await this.load(); - - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe - this.route.queryParams.pipe(first()).subscribe(async (qParams) => { - this.searchText = qParams.search; - if (qParams.viewEvents != null) { - const user = this.users.filter((u) => u.id === qParams.viewEvents); - if (user.length > 0 && user[0].status === OrganizationUserStatusType.Confirmed) { - this.events(user[0]); + // Backfill pub/priv key if necessary + if (this.canResetPassword && !this.orgHasKeys) { + const orgShareKey = await this.cryptoService.getOrgKey(this.organizationId); + const orgKeys = await this.cryptoService.makeKeyPair(orgShareKey); + const request = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString); + const response = await this.organizationApiService.updateKeys( + this.organizationId, + request + ); + if (response != null) { + this.orgHasKeys = response.publicKey != null && response.privateKey != null; + await this.syncService.fullSync(true); // Replace oganizations with new data + } else { + throw new Error(this.i18nService.t("resetPasswordOrgKeysError")); + } } - } - }); - }); + + const resetPasswordPolicy = policies + .filter((policy) => policy.type === PolicyType.ResetPassword) + .find((p) => p.organizationId === this.organizationId); + this.orgResetPasswordPolicyEnabled = resetPasswordPolicy?.enabled; + + await this.load(); + + this.searchText = qParams.search; + if (qParams.viewEvents != null) { + const user = this.users.filter((u) => u.id === qParams.viewEvents); + if (user.length > 0 && user[0].status === OrganizationUserStatusType.Confirmed) { + this.events(user[0]); + } + } + }), + takeUntil(this.destroy$) + ) + .subscribe(); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); } async load() { - const resetPasswordPolicy = await this.policyApiService.getPolicyForOrganization( - PolicyType.ResetPassword, - this.organizationId - ); - this.orgResetPasswordPolicyEnabled = resetPasswordPolicy?.enabled; super.load(); + await super.load(); } getUsers(): Promise> { diff --git a/apps/web/src/app/organizations/manage/policies.component.ts b/apps/web/src/app/organizations/manage/policies.component.ts index 468b4118d1e..ba08e2efdd0 100644 --- a/apps/web/src/app/organizations/manage/policies.component.ts +++ b/apps/web/src/app/organizations/manage/policies.component.ts @@ -7,7 +7,7 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { PolicyResponse } from "@bitwarden/common/models/response/policyResponse"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; import { PolicyListService } from "../../core"; import { BasePolicy } from "../policies/base-policy.component"; diff --git a/apps/web/src/app/organizations/manage/policy-edit.component.ts b/apps/web/src/app/organizations/manage/policy-edit.component.ts index 4efb35cba37..09a85d782b3 100644 --- a/apps/web/src/app/organizations/manage/policy-edit.component.ts +++ b/apps/web/src/app/organizations/manage/policy-edit.component.ts @@ -14,8 +14,8 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/abstractions/policy/policy-api.service.abstraction"; import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { PolicyRequest } from "@bitwarden/common/models/request/policyRequest"; -import { PolicyResponse } from "@bitwarden/common/models/response/policyResponse"; +import { PolicyRequest } from "@bitwarden/common/models/request/policy.request"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; import { BasePolicy, BasePolicyComponent } from "../policies/base-policy.component"; diff --git a/apps/web/src/app/organizations/manage/reset-password.component.ts b/apps/web/src/app/organizations/manage/reset-password.component.ts index d37148a25eb..8899e6684c9 100644 --- a/apps/web/src/app/organizations/manage/reset-password.component.ts +++ b/apps/web/src/app/organizations/manage/reset-password.component.ts @@ -1,4 +1,13 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from "@angular/core"; +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, +} from "@angular/core"; +import { Subject, takeUntil } from "rxjs"; import zxcvbn from "zxcvbn"; import { PasswordStrengthComponent } from "@bitwarden/angular/shared/components/password-strength/password-strength.component"; @@ -9,16 +18,16 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/masterPasswordPolicyOptions"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { OrganizationUserResetPasswordRequest } from "@bitwarden/common/models/request/organizationUserResetPasswordRequest"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { MasterPasswordPolicyOptions } from "@bitwarden/common/models/domain/master-password-policy-options"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { OrganizationUserResetPasswordRequest } from "@bitwarden/common/models/request/organization-user-reset-password.request"; @Component({ selector: "app-reset-password", templateUrl: "reset-password.component.html", }) -export class ResetPasswordComponent implements OnInit { +export class ResetPasswordComponent implements OnInit, OnDestroy { @Input() name: string; @Input() email: string; @Input() id: string; @@ -32,6 +41,8 @@ export class ResetPasswordComponent implements OnInit { passwordStrengthResult: zxcvbn.ZXCVBNResult; formPromise: Promise; + private destroy$ = new Subject(); + constructor( private apiService: ApiService, private i18nService: I18nService, @@ -43,8 +54,18 @@ export class ResetPasswordComponent implements OnInit { ) {} async ngOnInit() { - // Get Enforced Policy Options - this.enforcedPolicyOptions = await this.policyService.getMasterPasswordPolicyOptions(); + this.policyService + .masterPasswordPolicyOptions$() + .pipe(takeUntil(this.destroy$)) + .subscribe( + (enforcedPasswordPolicyOptions) => + (this.enforcedPolicyOptions = enforcedPasswordPolicyOptions) + ); + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); } get loggedOutWarningName() { @@ -52,7 +73,7 @@ export class ResetPasswordComponent implements OnInit { } async generatePassword() { - const options = (await this.passwordGenerationService.getOptions())[0]; + const options = (await this.passwordGenerationService.getOptions())?.[0] ?? {}; this.newPassword = await this.passwordGenerationService.generatePassword(options); this.passwordStrengthComponent.updatePasswordStrength(this.newPassword); } diff --git a/apps/web/src/app/organizations/manage/user-add-edit.component.ts b/apps/web/src/app/organizations/manage/user-add-edit.component.ts index 678053b8690..4a9d01efb5d 100644 --- a/apps/web/src/app/organizations/manage/user-add-edit.component.ts +++ b/apps/web/src/app/organizations/manage/user-add-edit.component.ts @@ -7,14 +7,14 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType"; import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType"; -import { PermissionsApi } from "@bitwarden/common/models/api/permissionsApi"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; +import { PermissionsApi } from "@bitwarden/common/models/api/permissions.api"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; import { Collection } from "@bitwarden/common/models/domain/collection"; -import { OrganizationUserInviteRequest } from "@bitwarden/common/models/request/organizationUserInviteRequest"; -import { OrganizationUserUpdateRequest } from "@bitwarden/common/models/request/organizationUserUpdateRequest"; -import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; -import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collectionResponse"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { OrganizationUserInviteRequest } from "@bitwarden/common/models/request/organization-user-invite.request"; +import { OrganizationUserUpdateRequest } from "@bitwarden/common/models/request/organization-user-update.request"; +import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selection-read-only.request"; +import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collection.response"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; @Component({ selector: "app-user-add-edit", diff --git a/apps/web/src/app/organizations/manage/user-groups.component.ts b/apps/web/src/app/organizations/manage/user-groups.component.ts index baacade7577..999fba57a33 100644 --- a/apps/web/src/app/organizations/manage/user-groups.component.ts +++ b/apps/web/src/app/organizations/manage/user-groups.component.ts @@ -5,8 +5,8 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { Utils } from "@bitwarden/common/misc/utils"; -import { OrganizationUserUpdateGroupsRequest } from "@bitwarden/common/models/request/organizationUserUpdateGroupsRequest"; -import { GroupResponse } from "@bitwarden/common/models/response/groupResponse"; +import { OrganizationUserUpdateGroupsRequest } from "@bitwarden/common/models/request/organization-user-update-groups.request"; +import { GroupResponse } from "@bitwarden/common/models/response/group.response"; @Component({ selector: "app-user-groups", diff --git a/apps/web/src/app/organizations/policies/base-policy.component.ts b/apps/web/src/app/organizations/policies/base-policy.component.ts index 6e530b075d5..ef9635acb69 100644 --- a/apps/web/src/app/organizations/policies/base-policy.component.ts +++ b/apps/web/src/app/organizations/policies/base-policy.component.ts @@ -3,8 +3,8 @@ import { UntypedFormControl, UntypedFormGroup } from "@angular/forms"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { PolicyRequest } from "@bitwarden/common/models/request/policyRequest"; -import { PolicyResponse } from "@bitwarden/common/models/response/policyResponse"; +import { PolicyRequest } from "@bitwarden/common/models/request/policy.request"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; export abstract class BasePolicy { abstract name: string; diff --git a/apps/web/src/app/organizations/policies/require-sso.component.ts b/apps/web/src/app/organizations/policies/require-sso.component.ts index 53fbc584cfc..a56f36c7f73 100644 --- a/apps/web/src/app/organizations/policies/require-sso.component.ts +++ b/apps/web/src/app/organizations/policies/require-sso.component.ts @@ -3,7 +3,7 @@ import { Component } from "@angular/core"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { PolicyRequest } from "@bitwarden/common/models/request/policyRequest"; +import { PolicyRequest } from "@bitwarden/common/models/request/policy.request"; import { BasePolicy, BasePolicyComponent } from "./base-policy.component"; diff --git a/apps/web/src/app/organizations/policies/single-org.component.ts b/apps/web/src/app/organizations/policies/single-org.component.ts index a36da283de9..8b34d132df8 100644 --- a/apps/web/src/app/organizations/policies/single-org.component.ts +++ b/apps/web/src/app/organizations/policies/single-org.component.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PolicyType } from "@bitwarden/common/enums/policyType"; -import { PolicyRequest } from "@bitwarden/common/models/request/policyRequest"; +import { PolicyRequest } from "@bitwarden/common/models/request/policy.request"; import { BasePolicy, BasePolicyComponent } from "./base-policy.component"; diff --git a/apps/web/src/app/organizations/settings/account.component.ts b/apps/web/src/app/organizations/settings/account.component.ts index 24f17ac7ad0..ca3cb559917 100644 --- a/apps/web/src/app/organizations/settings/account.component.ts +++ b/apps/web/src/app/organizations/settings/account.component.ts @@ -8,9 +8,9 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organizationKeysRequest"; -import { OrganizationUpdateRequest } from "@bitwarden/common/models/request/organizationUpdateRequest"; -import { OrganizationResponse } from "@bitwarden/common/models/response/organizationResponse"; +import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organization-keys.request"; +import { OrganizationUpdateRequest } from "@bitwarden/common/models/request/organization-update.request"; +import { OrganizationResponse } from "@bitwarden/common/models/response/organization.response"; import { ApiKeyComponent } from "../../settings/api-key.component"; import { PurgeVaultComponent } from "../../settings/purge-vault.component"; diff --git a/apps/web/src/app/organizations/settings/adjust-subscription.component.ts b/apps/web/src/app/organizations/settings/adjust-subscription.component.ts index 6930f86068a..00dd0cce30b 100644 --- a/apps/web/src/app/organizations/settings/adjust-subscription.component.ts +++ b/apps/web/src/app/organizations/settings/adjust-subscription.component.ts @@ -4,7 +4,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { OrganizationSubscriptionUpdateRequest } from "@bitwarden/common/models/request/organizationSubscriptionUpdateRequest"; +import { OrganizationSubscriptionUpdateRequest } from "@bitwarden/common/models/request/organization-subscription-update.request"; @Component({ selector: "app-adjust-subscription", diff --git a/apps/web/src/app/organizations/settings/billing-sync-api-key.component.ts b/apps/web/src/app/organizations/settings/billing-sync-api-key.component.ts index d93e1654d5c..5fbd5aa907d 100644 --- a/apps/web/src/app/organizations/settings/billing-sync-api-key.component.ts +++ b/apps/web/src/app/organizations/settings/billing-sync-api-key.component.ts @@ -6,8 +6,8 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstraction import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { OrganizationApiKeyType } from "@bitwarden/common/enums/organizationApiKeyType"; -import { OrganizationApiKeyRequest } from "@bitwarden/common/models/request/organizationApiKeyRequest"; -import { ApiKeyResponse } from "@bitwarden/common/models/response/apiKeyResponse"; +import { OrganizationApiKeyRequest } from "@bitwarden/common/models/request/organization-api-key.request"; +import { ApiKeyResponse } from "@bitwarden/common/models/response/api-key.response"; import { Verification } from "@bitwarden/common/types/verification"; @Component({ diff --git a/apps/web/src/app/organizations/settings/delete-organization.component.ts b/apps/web/src/app/organizations/settings/delete-organization.component.ts index e67f667b9c9..1857a94f4c9 100644 --- a/apps/web/src/app/organizations/settings/delete-organization.component.ts +++ b/apps/web/src/app/organizations/settings/delete-organization.component.ts @@ -9,7 +9,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { Verification } from "@bitwarden/common/types/verification"; class CountBasedLocalizationKey { diff --git a/apps/web/src/app/organizations/settings/organization-billing.component.ts b/apps/web/src/app/organizations/settings/organization-billing.component.ts index 7cb05dc60d9..99121482ff7 100644 --- a/apps/web/src/app/organizations/settings/organization-billing.component.ts +++ b/apps/web/src/app/organizations/settings/organization-billing.component.ts @@ -7,8 +7,8 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstraction import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; import { TransactionType } from "@bitwarden/common/enums/transactionType"; -import { VerifyBankRequest } from "@bitwarden/common/models/request/verifyBankRequest"; -import { BillingResponse } from "@bitwarden/common/models/response/billingResponse"; +import { VerifyBankRequest } from "@bitwarden/common/models/request/verify-bank.request"; +import { BillingResponse } from "@bitwarden/common/models/response/billing.response"; @Component({ selector: "app-org-billing", diff --git a/apps/web/src/app/organizations/settings/organization-subscription.component.ts b/apps/web/src/app/organizations/settings/organization-subscription.component.ts index 7ee3a42da89..fe29a38a96d 100644 --- a/apps/web/src/app/organizations/settings/organization-subscription.component.ts +++ b/apps/web/src/app/organizations/settings/organization-subscription.component.ts @@ -13,10 +13,10 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { OrganizationApiKeyType } from "@bitwarden/common/enums/organizationApiKeyType"; import { OrganizationConnectionType } from "@bitwarden/common/enums/organizationConnectionType"; import { PlanType } from "@bitwarden/common/enums/planType"; -import { BillingSyncConfigApi } from "@bitwarden/common/models/api/billingSyncConfigApi"; +import { BillingSyncConfigApi } from "@bitwarden/common/models/api/billing-sync-config.api"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { OrganizationConnectionResponse } from "@bitwarden/common/models/response/organizationConnectionResponse"; -import { OrganizationSubscriptionResponse } from "@bitwarden/common/models/response/organizationSubscriptionResponse"; +import { OrganizationConnectionResponse } from "@bitwarden/common/models/response/organization-connection.response"; +import { OrganizationSubscriptionResponse } from "@bitwarden/common/models/response/organization-subscription.response"; import { BillingSyncKeyComponent } from "../../settings/billing-sync-key.component"; diff --git a/apps/web/src/app/organizations/settings/two-factor-setup.component.ts b/apps/web/src/app/organizations/settings/two-factor-setup.component.ts index be82b0a86b9..b50adc3bb02 100644 --- a/apps/web/src/app/organizations/settings/two-factor-setup.component.ts +++ b/apps/web/src/app/organizations/settings/two-factor-setup.component.ts @@ -3,10 +3,7 @@ import { ActivatedRoute } from "@angular/router"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; @@ -26,21 +23,9 @@ export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent { messagingService: MessagingService, policyService: PolicyService, private route: ActivatedRoute, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - i18nService: I18nService, - logService: LogService + stateService: StateService ) { - super( - apiService, - modalService, - messagingService, - policyService, - stateService, - platformUtilsService, - i18nService, - logService - ); + super(apiService, modalService, messagingService, policyService, stateService); } async ngOnInit() { diff --git a/apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.ts b/apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.ts index 7d7f8193065..58286c55fcd 100644 --- a/apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.ts +++ b/apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.ts @@ -4,17 +4,17 @@ import { Observable, Subject } from "rxjs"; import { first, map, takeUntil } from "rxjs/operators"; import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { ValidationService } from "@bitwarden/angular/services/validation.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { PlanSponsorshipType } from "@bitwarden/common/enums/planSponsorshipType"; import { PlanType } from "@bitwarden/common/enums/planType"; import { ProductType } from "@bitwarden/common/enums/productType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { OrganizationSponsorshipRedeemRequest } from "@bitwarden/common/models/request/organization/organizationSponsorshipRedeemRequest"; +import { OrganizationSponsorshipRedeemRequest } from "@bitwarden/common/models/request/organization/organization-sponsorship-redeem.request"; import { OrganizationPlansComponent } from "../../settings/organization-plans.component"; import { DeleteOrganizationComponent } from "../settings/delete-organization.component"; diff --git a/apps/web/src/app/organizations/tools/exposed-passwords-report.component.ts b/apps/web/src/app/organizations/tools/exposed-passwords-report.component.ts index adb7ba60246..af4cc8b4303 100644 --- a/apps/web/src/app/organizations/tools/exposed-passwords-report.component.ts +++ b/apps/web/src/app/organizations/tools/exposed-passwords-report.component.ts @@ -9,7 +9,7 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; // eslint-disable-next-line no-restricted-imports import { ExposedPasswordsReportComponent as BaseExposedPasswordsReportComponent } from "../../reports/pages/exposed-passwords-report.component"; diff --git a/apps/web/src/app/organizations/tools/import-export/org-import.component.ts b/apps/web/src/app/organizations/tools/import-export/org-import.component.ts index 69506b226a3..81a16a29680 100644 --- a/apps/web/src/app/organizations/tools/import-export/org-import.component.ts +++ b/apps/web/src/app/organizations/tools/import-export/org-import.component.ts @@ -47,7 +47,6 @@ export class OrganizationImportComponent extends ImportComponent { this.organizationId = params.organizationId; this.successNavigate = ["organizations", this.organizationId, "vault"]; await super.ngOnInit(); - this.importBlockedByPolicy = false; }); const organization = await this.organizationService.get(this.organizationId); this.organizationName = organization.name; diff --git a/apps/web/src/app/organizations/tools/inactive-two-factor-report.component.ts b/apps/web/src/app/organizations/tools/inactive-two-factor-report.component.ts index 49ae82ab5f3..4675c88dde9 100644 --- a/apps/web/src/app/organizations/tools/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/organizations/tools/inactive-two-factor-report.component.ts @@ -8,7 +8,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; // eslint-disable-next-line no-restricted-imports import { InactiveTwoFactorReportComponent as BaseInactiveTwoFactorReportComponent } from "../../reports/pages/inactive-two-factor-report.component"; diff --git a/apps/web/src/app/organizations/tools/reused-passwords-report.component.ts b/apps/web/src/app/organizations/tools/reused-passwords-report.component.ts index 74e5ac91bb1..1c43c7f748b 100644 --- a/apps/web/src/app/organizations/tools/reused-passwords-report.component.ts +++ b/apps/web/src/app/organizations/tools/reused-passwords-report.component.ts @@ -8,7 +8,7 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; // eslint-disable-next-line no-restricted-imports import { ReusedPasswordsReportComponent as BaseReusedPasswordsReportComponent } from "../../reports/pages/reused-passwords-report.component"; diff --git a/apps/web/src/app/organizations/tools/unsecured-websites-report.component.ts b/apps/web/src/app/organizations/tools/unsecured-websites-report.component.ts index dbb5e08be54..4323f82cb00 100644 --- a/apps/web/src/app/organizations/tools/unsecured-websites-report.component.ts +++ b/apps/web/src/app/organizations/tools/unsecured-websites-report.component.ts @@ -7,7 +7,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; // eslint-disable-next-line no-restricted-imports import { UnsecuredWebsitesReportComponent as BaseUnsecuredWebsitesReportComponent } from "../../reports/pages/unsecured-websites-report.component"; diff --git a/apps/web/src/app/organizations/tools/weak-passwords-report.component.ts b/apps/web/src/app/organizations/tools/weak-passwords-report.component.ts index 3b8cc1490a0..af2345918b9 100644 --- a/apps/web/src/app/organizations/tools/weak-passwords-report.component.ts +++ b/apps/web/src/app/organizations/tools/weak-passwords-report.component.ts @@ -9,7 +9,7 @@ import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwo import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; // eslint-disable-next-line no-restricted-imports import { WeakPasswordsReportComponent as BaseWeakPasswordsReportComponent } from "../../reports/pages/weak-passwords-report.component"; diff --git a/apps/web/src/app/organizations/users/enroll-master-password-reset.component.ts b/apps/web/src/app/organizations/users/enroll-master-password-reset.component.ts index ae700771a52..1a7661fc364 100644 --- a/apps/web/src/app/organizations/users/enroll-master-password-reset.component.ts +++ b/apps/web/src/app/organizations/users/enroll-master-password-reset.component.ts @@ -12,7 +12,7 @@ import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.ab import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { Utils } from "@bitwarden/common/misc/utils"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organizationUserResetPasswordEnrollmentRequest"; +import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organization-user-reset-password-enrollment.request"; import { Verification } from "@bitwarden/common/types/verification"; @Component({ diff --git a/apps/web/src/app/organizations/vault/add-edit.component.ts b/apps/web/src/app/organizations/vault/add-edit.component.ts index e3943ef2a5e..f45ccc939f7 100644 --- a/apps/web/src/app/organizations/vault/add-edit.component.ts +++ b/apps/web/src/app/organizations/vault/add-edit.component.ts @@ -16,11 +16,11 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { CipherData } from "@bitwarden/common/models/data/cipherData"; +import { CipherData } from "@bitwarden/common/models/data/cipher.data"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CipherCreateRequest } from "@bitwarden/common/models/request/cipherCreateRequest"; -import { CipherRequest } from "@bitwarden/common/models/request/cipherRequest"; +import { CipherCreateRequest } from "@bitwarden/common/models/request/cipher-create.request"; +import { CipherRequest } from "@bitwarden/common/models/request/cipher.request"; import { AddEditComponent as BaseAddEditComponent } from "../../vault/add-edit.component"; diff --git a/apps/web/src/app/organizations/vault/attachments.component.ts b/apps/web/src/app/organizations/vault/attachments.component.ts index aac10c8d8ef..79ed8e67b84 100644 --- a/apps/web/src/app/organizations/vault/attachments.component.ts +++ b/apps/web/src/app/organizations/vault/attachments.component.ts @@ -8,10 +8,10 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { CipherData } from "@bitwarden/common/models/data/cipherData"; +import { CipherData } from "@bitwarden/common/models/data/cipher.data"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { AttachmentView } from "@bitwarden/common/models/view/attachmentView"; +import { AttachmentView } from "@bitwarden/common/models/view/attachment.view"; import { AttachmentsComponent as BaseAttachmentsComponent } from "../../vault/attachments.component"; diff --git a/apps/web/src/app/organizations/vault/ciphers.component.ts b/apps/web/src/app/organizations/vault/ciphers.component.ts index 29b10d67a51..558c09d5e30 100644 --- a/apps/web/src/app/organizations/vault/ciphers.component.ts +++ b/apps/web/src/app/organizations/vault/ciphers.component.ts @@ -13,7 +13,7 @@ import { StateService } from "@bitwarden/common/abstractions/state.service"; import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CiphersComponent as BaseCiphersComponent } from "../../vault/ciphers.component"; diff --git a/apps/web/src/app/organizations/vault/collections.component.ts b/apps/web/src/app/organizations/vault/collections.component.ts index d724828e3bc..59fb4c8d15f 100644 --- a/apps/web/src/app/organizations/vault/collections.component.ts +++ b/apps/web/src/app/organizations/vault/collections.component.ts @@ -6,10 +6,10 @@ import { CollectionService } from "@bitwarden/common/abstractions/collection.ser import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { CipherData } from "@bitwarden/common/models/data/cipherData"; +import { CipherData } from "@bitwarden/common/models/data/cipher.data"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CipherCollectionsRequest } from "@bitwarden/common/models/request/cipherCollectionsRequest"; +import { CipherCollectionsRequest } from "@bitwarden/common/models/request/cipher-collections.request"; import { CollectionsComponent as BaseCollectionsComponent } from "../../vault/collections.component"; diff --git a/apps/web/src/app/organizations/vault/vault.component.ts b/apps/web/src/app/organizations/vault/vault.component.ts index 1566d2e1535..7de36e65318 100644 --- a/apps/web/src/app/organizations/vault/vault.component.ts +++ b/apps/web/src/app/organizations/vault/vault.component.ts @@ -22,7 +22,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { VaultService } from "../../vault/shared/vault.service"; import { EntityEventsComponent } from "../manage/entity-events.component"; diff --git a/apps/web/src/app/reports/pages/breach-report.component.ts b/apps/web/src/app/reports/pages/breach-report.component.ts index 154624c211f..7e3c80fcbbb 100644 --- a/apps/web/src/app/reports/pages/breach-report.component.ts +++ b/apps/web/src/app/reports/pages/breach-report.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from "@angular/core"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { BreachAccountResponse } from "@bitwarden/common/models/response/breachAccountResponse"; +import { BreachAccountResponse } from "@bitwarden/common/models/response/breach-account.response"; @Component({ selector: "app-breach-report", diff --git a/apps/web/src/app/reports/pages/cipher-report.component.ts b/apps/web/src/app/reports/pages/cipher-report.component.ts index 44d7cae619a..baf2ceb5635 100644 --- a/apps/web/src/app/reports/pages/cipher-report.component.ts +++ b/apps/web/src/app/reports/pages/cipher-report.component.ts @@ -6,7 +6,7 @@ import { PasswordRepromptService } from "@bitwarden/common/abstractions/password import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType"; import { Organization } from "@bitwarden/common/models/domain/organization"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { AddEditComponent as OrgAddEditComponent } from "../../organizations/vault/add-edit.component"; import { AddEditComponent } from "../../vault/add-edit.component"; diff --git a/apps/web/src/app/reports/pages/exposed-passwords-report.component.ts b/apps/web/src/app/reports/pages/exposed-passwords-report.component.ts index 443f03453cf..99a707da5d2 100644 --- a/apps/web/src/app/reports/pages/exposed-passwords-report.component.ts +++ b/apps/web/src/app/reports/pages/exposed-passwords-report.component.ts @@ -7,7 +7,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CipherReportComponent } from "./cipher-report.component"; diff --git a/apps/web/src/app/reports/pages/inactive-two-factor-report.component.ts b/apps/web/src/app/reports/pages/inactive-two-factor-report.component.ts index 03047f36cd7..f84050b9001 100644 --- a/apps/web/src/app/reports/pages/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/reports/pages/inactive-two-factor-report.component.ts @@ -8,7 +8,7 @@ import { PasswordRepromptService } from "@bitwarden/common/abstractions/password import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CipherReportComponent } from "./cipher-report.component"; diff --git a/apps/web/src/app/reports/pages/reused-passwords-report.component.ts b/apps/web/src/app/reports/pages/reused-passwords-report.component.ts index d2330bfcffc..83e9229341f 100644 --- a/apps/web/src/app/reports/pages/reused-passwords-report.component.ts +++ b/apps/web/src/app/reports/pages/reused-passwords-report.component.ts @@ -6,7 +6,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CipherReportComponent } from "./cipher-report.component"; diff --git a/apps/web/src/app/reports/pages/unsecured-websites-report.component.ts b/apps/web/src/app/reports/pages/unsecured-websites-report.component.ts index ed8eb68df22..22e2c1ddede 100644 --- a/apps/web/src/app/reports/pages/unsecured-websites-report.component.ts +++ b/apps/web/src/app/reports/pages/unsecured-websites-report.component.ts @@ -6,7 +6,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CipherReportComponent } from "./cipher-report.component"; diff --git a/apps/web/src/app/reports/pages/weak-passwords-report.component.ts b/apps/web/src/app/reports/pages/weak-passwords-report.component.ts index f18cff53bbd..dabb835d725 100644 --- a/apps/web/src/app/reports/pages/weak-passwords-report.component.ts +++ b/apps/web/src/app/reports/pages/weak-passwords-report.component.ts @@ -7,7 +7,7 @@ import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwo import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { CipherType } from "@bitwarden/common/enums/cipherType"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { CipherReportComponent } from "./cipher-report.component"; diff --git a/apps/web/src/app/send/access.component.ts b/apps/web/src/app/send/access.component.ts index 7f4c6bbab8e..002523b90f7 100644 --- a/apps/web/src/app/send/access.component.ts +++ b/apps/web/src/app/send/access.component.ts @@ -10,13 +10,13 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { SEND_KDF_ITERATIONS } from "@bitwarden/common/enums/kdfType"; import { SendType } from "@bitwarden/common/enums/sendType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncArrayBuffer } from "@bitwarden/common/models/domain/encArrayBuffer"; -import { SendAccess } from "@bitwarden/common/models/domain/sendAccess"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { SendAccessRequest } from "@bitwarden/common/models/request/sendAccessRequest"; -import { ErrorResponse } from "@bitwarden/common/models/response/errorResponse"; -import { SendAccessResponse } from "@bitwarden/common/models/response/sendAccessResponse"; -import { SendAccessView } from "@bitwarden/common/models/view/sendAccessView"; +import { EncArrayBuffer } from "@bitwarden/common/models/domain/enc-array-buffer"; +import { SendAccess } from "@bitwarden/common/models/domain/send-access"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { SendAccessRequest } from "@bitwarden/common/models/request/send-access.request"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { SendAccessResponse } from "@bitwarden/common/models/response/send-access.response"; +import { SendAccessView } from "@bitwarden/common/models/view/send-access.view"; @Component({ selector: "app-send-access", diff --git a/apps/web/src/app/send/send.component.html b/apps/web/src/app/send/send.component.html index ddf7e63d79e..a5460a7dfae 100644 --- a/apps/web/src/app/send/send.component.html +++ b/apps/web/src/app/send/send.component.html @@ -23,7 +23,7 @@
  • - @@ -37,24 +37,14 @@
    • -
    • - diff --git a/apps/web/src/app/send/send.component.ts b/apps/web/src/app/send/send.component.ts index 2719d904564..c5022ad5eaf 100644 --- a/apps/web/src/app/send/send.component.ts +++ b/apps/web/src/app/send/send.component.ts @@ -10,7 +10,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; -import { SendView } from "@bitwarden/common/models/view/sendView"; +import { SendView } from "@bitwarden/common/models/view/send.view"; import { AddEditComponent } from "./add-edit.component"; diff --git a/apps/web/src/app/settings/add-credit.component.ts b/apps/web/src/app/settings/add-credit.component.ts index 3d33df2d3ee..ccaf7314f23 100644 --- a/apps/web/src/app/settings/add-credit.component.ts +++ b/apps/web/src/app/settings/add-credit.component.ts @@ -15,7 +15,7 @@ import { OrganizationService } from "@bitwarden/common/abstractions/organization import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; -import { BitPayInvoiceRequest } from "@bitwarden/common/models/request/bitPayInvoiceRequest"; +import { BitPayInvoiceRequest } from "@bitwarden/common/models/request/bit-pay-invoice.request"; @Component({ selector: "app-add-credit", diff --git a/apps/web/src/app/settings/adjust-payment.component.ts b/apps/web/src/app/settings/adjust-payment.component.ts index 4e9338081fa..dc4bf17e0b3 100644 --- a/apps/web/src/app/settings/adjust-payment.component.ts +++ b/apps/web/src/app/settings/adjust-payment.component.ts @@ -6,7 +6,7 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; -import { PaymentRequest } from "@bitwarden/common/models/request/paymentRequest"; +import { PaymentRequest } from "@bitwarden/common/models/request/payment.request"; import { PaymentComponent } from "./payment.component"; import { TaxInfoComponent } from "./tax-info.component"; diff --git a/apps/web/src/app/settings/adjust-storage.component.ts b/apps/web/src/app/settings/adjust-storage.component.ts index 6931ad9d10b..20c93ced41c 100644 --- a/apps/web/src/app/settings/adjust-storage.component.ts +++ b/apps/web/src/app/settings/adjust-storage.component.ts @@ -6,8 +6,8 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { StorageRequest } from "@bitwarden/common/models/request/storageRequest"; -import { PaymentResponse } from "@bitwarden/common/models/response/paymentResponse"; +import { StorageRequest } from "@bitwarden/common/models/request/storage.request"; +import { PaymentResponse } from "@bitwarden/common/models/response/payment.response"; import { PaymentComponent } from "./payment.component"; diff --git a/apps/web/src/app/settings/api-key.component.ts b/apps/web/src/app/settings/api-key.component.ts index c0e976ea087..ae376ffd69c 100644 --- a/apps/web/src/app/settings/api-key.component.ts +++ b/apps/web/src/app/settings/api-key.component.ts @@ -2,8 +2,8 @@ import { Component } from "@angular/core"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; -import { SecretVerificationRequest } from "@bitwarden/common/models/request/secretVerificationRequest"; -import { ApiKeyResponse } from "@bitwarden/common/models/response/apiKeyResponse"; +import { SecretVerificationRequest } from "@bitwarden/common/models/request/secret-verification.request"; +import { ApiKeyResponse } from "@bitwarden/common/models/response/api-key.response"; import { Verification } from "@bitwarden/common/types/verification"; @Component({ diff --git a/apps/web/src/app/settings/billing-sync-key.component.ts b/apps/web/src/app/settings/billing-sync-key.component.ts index fb992abd662..70929ed8081 100644 --- a/apps/web/src/app/settings/billing-sync-key.component.ts +++ b/apps/web/src/app/settings/billing-sync-key.component.ts @@ -3,10 +3,10 @@ import { Component } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationConnectionType } from "@bitwarden/common/enums/organizationConnectionType"; -import { BillingSyncConfigApi } from "@bitwarden/common/models/api/billingSyncConfigApi"; -import { BillingSyncConfigRequest } from "@bitwarden/common/models/request/billingSyncConfigRequest"; -import { OrganizationConnectionRequest } from "@bitwarden/common/models/request/organizationConnectionRequest"; -import { OrganizationConnectionResponse } from "@bitwarden/common/models/response/organizationConnectionResponse"; +import { BillingSyncConfigApi } from "@bitwarden/common/models/api/billing-sync-config.api"; +import { BillingSyncConfigRequest } from "@bitwarden/common/models/request/billing-sync-config.request"; +import { OrganizationConnectionRequest } from "@bitwarden/common/models/request/organization-connection.request"; +import { OrganizationConnectionResponse } from "@bitwarden/common/models/response/organization-connection.response"; @Component({ selector: "app-billing-sync-key", diff --git a/apps/web/src/app/settings/change-email.component.ts b/apps/web/src/app/settings/change-email.component.ts index 5dd0528ac93..2c41bd0b78b 100644 --- a/apps/web/src/app/settings/change-email.component.ts +++ b/apps/web/src/app/settings/change-email.component.ts @@ -8,8 +8,8 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { EmailRequest } from "@bitwarden/common/models/request/emailRequest"; -import { EmailTokenRequest } from "@bitwarden/common/models/request/emailTokenRequest"; +import { EmailTokenRequest } from "@bitwarden/common/models/request/email-token.request"; +import { EmailRequest } from "@bitwarden/common/models/request/email.request"; @Component({ selector: "app-change-email", diff --git a/apps/web/src/app/settings/change-kdf.component.ts b/apps/web/src/app/settings/change-kdf.component.ts index 60820b594be..f6193d018b3 100644 --- a/apps/web/src/app/settings/change-kdf.component.ts +++ b/apps/web/src/app/settings/change-kdf.component.ts @@ -8,7 +8,7 @@ import { MessagingService } from "@bitwarden/common/abstractions/messaging.servi import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { DEFAULT_KDF_ITERATIONS, KdfType } from "@bitwarden/common/enums/kdfType"; -import { KdfRequest } from "@bitwarden/common/models/request/kdfRequest"; +import { KdfRequest } from "@bitwarden/common/models/request/kdf.request"; @Component({ selector: "app-change-kdf", diff --git a/apps/web/src/app/settings/change-password.component.ts b/apps/web/src/app/settings/change-password.component.ts index 45672940f15..e6e1709d229 100644 --- a/apps/web/src/app/settings/change-password.component.ts +++ b/apps/web/src/app/settings/change-password.component.ts @@ -20,15 +20,15 @@ import { StateService } from "@bitwarden/common/abstractions/state.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { EmergencyAccessStatusType } from "@bitwarden/common/enums/emergencyAccessStatusType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { CipherWithIdRequest } from "@bitwarden/common/models/request/cipherWithIdRequest"; -import { EmergencyAccessUpdateRequest } from "@bitwarden/common/models/request/emergencyAccessUpdateRequest"; -import { FolderWithIdRequest } from "@bitwarden/common/models/request/folderWithIdRequest"; -import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organizationUserResetPasswordEnrollmentRequest"; -import { PasswordRequest } from "@bitwarden/common/models/request/passwordRequest"; -import { SendWithIdRequest } from "@bitwarden/common/models/request/sendWithIdRequest"; -import { UpdateKeyRequest } from "@bitwarden/common/models/request/updateKeyRequest"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { CipherWithIdRequest } from "@bitwarden/common/models/request/cipher-with-id.request"; +import { EmergencyAccessUpdateRequest } from "@bitwarden/common/models/request/emergency-access-update.request"; +import { FolderWithIdRequest } from "@bitwarden/common/models/request/folder-with-id.request"; +import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organization-user-reset-password-enrollment.request"; +import { PasswordRequest } from "@bitwarden/common/models/request/password.request"; +import { SendWithIdRequest } from "@bitwarden/common/models/request/send-with-id.request"; +import { UpdateKeyRequest } from "@bitwarden/common/models/request/update-key.request"; @Component({ selector: "app-change-password", diff --git a/apps/web/src/app/settings/delete-account.component.ts b/apps/web/src/app/settings/delete-account.component.ts index db58f27b814..1162945864b 100644 --- a/apps/web/src/app/settings/delete-account.component.ts +++ b/apps/web/src/app/settings/delete-account.component.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; import { FormBuilder } from "@angular/forms"; -import { AccountService } from "@bitwarden/common/abstractions/account/account.service.abstraction"; +import { AccountApiService } from "@bitwarden/common/abstractions/account/account-api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -22,14 +22,14 @@ export class DeleteAccountComponent { private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private formBuilder: FormBuilder, - private accountService: AccountService, + private accountApiService: AccountApiService, private logService: LogService ) {} async submit() { try { const verification = this.deleteForm.get("verification").value; - this.formPromise = this.accountService.delete(verification); + this.formPromise = this.accountApiService.deleteAccount(verification); await this.formPromise; this.platformUtilsService.showToast( "success", diff --git a/apps/web/src/app/settings/domain-rules.component.ts b/apps/web/src/app/settings/domain-rules.component.ts index 2224f329554..5f95a06ac5e 100644 --- a/apps/web/src/app/settings/domain-rules.component.ts +++ b/apps/web/src/app/settings/domain-rules.component.ts @@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; -import { UpdateDomainsRequest } from "@bitwarden/common/models/request/updateDomainsRequest"; +import { UpdateDomainsRequest } from "@bitwarden/common/models/request/update-domains.request"; @Component({ selector: "app-domain-rules", diff --git a/apps/web/src/app/settings/emergency-access-add-edit.component.ts b/apps/web/src/app/settings/emergency-access-add-edit.component.ts index 522feeb3033..aad2a957ff3 100644 --- a/apps/web/src/app/settings/emergency-access-add-edit.component.ts +++ b/apps/web/src/app/settings/emergency-access-add-edit.component.ts @@ -5,8 +5,8 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { EmergencyAccessType } from "@bitwarden/common/enums/emergencyAccessType"; -import { EmergencyAccessInviteRequest } from "@bitwarden/common/models/request/emergencyAccessInviteRequest"; -import { EmergencyAccessUpdateRequest } from "@bitwarden/common/models/request/emergencyAccessUpdateRequest"; +import { EmergencyAccessInviteRequest } from "@bitwarden/common/models/request/emergency-access-invite.request"; +import { EmergencyAccessUpdateRequest } from "@bitwarden/common/models/request/emergency-access-update.request"; @Component({ selector: "emergency-access-add-edit", diff --git a/apps/web/src/app/settings/emergency-access-attachments.component.ts b/apps/web/src/app/settings/emergency-access-attachments.component.ts index 525a332f144..383078e3368 100644 --- a/apps/web/src/app/settings/emergency-access-attachments.component.ts +++ b/apps/web/src/app/settings/emergency-access-attachments.component.ts @@ -9,7 +9,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { AttachmentView } from "@bitwarden/common/models/view/attachmentView"; +import { AttachmentView } from "@bitwarden/common/models/view/attachment.view"; @Component({ selector: "emergency-access-attachments", diff --git a/apps/web/src/app/settings/emergency-access-takeover.component.ts b/apps/web/src/app/settings/emergency-access-takeover.component.ts index 5731dc8b891..618c134b567 100644 --- a/apps/web/src/app/settings/emergency-access-takeover.component.ts +++ b/apps/web/src/app/settings/emergency-access-takeover.component.ts @@ -1,4 +1,5 @@ -import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { takeUntil } from "rxjs"; import { ChangePasswordComponent } from "@bitwarden/angular/components/change-password.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; @@ -11,17 +12,21 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { KdfType } from "@bitwarden/common/enums/kdfType"; -import { PolicyData } from "@bitwarden/common/models/data/policyData"; +import { PolicyData } from "@bitwarden/common/models/data/policy.data"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { EmergencyAccessPasswordRequest } from "@bitwarden/common/models/request/emergencyAccessPasswordRequest"; -import { PolicyResponse } from "@bitwarden/common/models/response/policyResponse"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { EmergencyAccessPasswordRequest } from "@bitwarden/common/models/request/emergency-access-password.request"; +import { PolicyResponse } from "@bitwarden/common/models/response/policy.response"; @Component({ selector: "emergency-access-takeover", templateUrl: "emergency-access-takeover.component.html", }) -export class EmergencyAccessTakeoverComponent extends ChangePasswordComponent implements OnInit { +// eslint-disable-next-line rxjs-angular/prefer-takeuntil +export class EmergencyAccessTakeoverComponent + extends ChangePasswordComponent + implements OnInit, OnDestroy +{ @Output() onDone = new EventEmitter(); @Input() emergencyAccessId: string; @Input() name: string; @@ -59,12 +64,19 @@ export class EmergencyAccessTakeoverComponent extends ChangePasswordComponent im const policies = response.data.map( (policyResponse: PolicyResponse) => new Policy(new PolicyData(policyResponse)) ); - this.enforcedPolicyOptions = await this.policyService.getMasterPasswordPolicyOptions( - policies - ); + + this.policyService + .masterPasswordPolicyOptions$(policies) + .pipe(takeUntil(this.destroy$)) + .subscribe((enforcedPolicyOptions) => (this.enforcedPolicyOptions = enforcedPolicyOptions)); } } + // eslint-disable-next-line rxjs-angular/prefer-takeuntil + ngOnDestroy(): void { + super.ngOnDestroy(); + } + async submit() { if (!(await this.strongPassword())) { return; diff --git a/apps/web/src/app/settings/emergency-access-view.component.ts b/apps/web/src/app/settings/emergency-access-view.component.ts index f40113a5ad6..6c314aabc31 100644 --- a/apps/web/src/app/settings/emergency-access-view.component.ts +++ b/apps/web/src/app/settings/emergency-access-view.component.ts @@ -5,11 +5,11 @@ import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CipherService } from "@bitwarden/common/abstractions/cipher.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { CipherData } from "@bitwarden/common/models/data/cipherData"; +import { CipherData } from "@bitwarden/common/models/data/cipher.data"; import { Cipher } from "@bitwarden/common/models/domain/cipher"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { EmergencyAccessViewResponse } from "@bitwarden/common/models/response/emergencyAccessResponse"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { EmergencyAccessViewResponse } from "@bitwarden/common/models/response/emergency-access.response"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { EmergencyAccessAttachmentsComponent } from "./emergency-access-attachments.component"; import { EmergencyAddEditComponent } from "./emergency-add-edit.component"; diff --git a/apps/web/src/app/settings/emergency-access.component.ts b/apps/web/src/app/settings/emergency-access.component.ts index e640e070367..64a2680ba89 100644 --- a/apps/web/src/app/settings/emergency-access.component.ts +++ b/apps/web/src/app/settings/emergency-access.component.ts @@ -13,11 +13,11 @@ import { StateService } from "@bitwarden/common/abstractions/state.service"; import { EmergencyAccessStatusType } from "@bitwarden/common/enums/emergencyAccessStatusType"; import { EmergencyAccessType } from "@bitwarden/common/enums/emergencyAccessType"; import { Utils } from "@bitwarden/common/misc/utils"; -import { EmergencyAccessConfirmRequest } from "@bitwarden/common/models/request/emergencyAccessConfirmRequest"; +import { EmergencyAccessConfirmRequest } from "@bitwarden/common/models/request/emergency-access-confirm.request"; import { EmergencyAccessGranteeDetailsResponse, EmergencyAccessGrantorDetailsResponse, -} from "@bitwarden/common/models/response/emergencyAccessResponse"; +} from "@bitwarden/common/models/response/emergency-access.response"; import { EmergencyAccessAddEditComponent } from "./emergency-access-add-edit.component"; import { EmergencyAccessConfirmComponent } from "./emergency-access-confirm.component"; diff --git a/apps/web/src/app/settings/organization-plans.component.ts b/apps/web/src/app/settings/organization-plans.component.ts index 485afd12b15..ad1c01d235e 100644 --- a/apps/web/src/app/settings/organization-plans.component.ts +++ b/apps/web/src/app/settings/organization-plans.component.ts @@ -1,6 +1,15 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from "@angular/core"; +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, +} from "@angular/core"; import { UntypedFormBuilder, Validators } from "@angular/forms"; import { Router } from "@angular/router"; +import { Subject, takeUntil } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; @@ -16,13 +25,13 @@ import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; import { PlanType } from "@bitwarden/common/enums/planType"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { ProductType } from "@bitwarden/common/enums/productType"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; -import { OrganizationCreateRequest } from "@bitwarden/common/models/request/organizationCreateRequest"; -import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organizationKeysRequest"; -import { OrganizationUpgradeRequest } from "@bitwarden/common/models/request/organizationUpgradeRequest"; -import { ProviderOrganizationCreateRequest } from "@bitwarden/common/models/request/provider/providerOrganizationCreateRequest"; -import { PlanResponse } from "@bitwarden/common/models/response/planResponse"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-crypto-key"; +import { OrganizationCreateRequest } from "@bitwarden/common/models/request/organization-create.request"; +import { OrganizationKeysRequest } from "@bitwarden/common/models/request/organization-keys.request"; +import { OrganizationUpgradeRequest } from "@bitwarden/common/models/request/organization-upgrade.request"; +import { ProviderOrganizationCreateRequest } from "@bitwarden/common/models/request/provider/provider-organization-create.request"; +import { PlanResponse } from "@bitwarden/common/models/response/plan.response"; import { PaymentComponent } from "./payment.component"; import { TaxInfoComponent } from "./tax-info.component"; @@ -35,7 +44,7 @@ interface OnSuccessArgs { selector: "app-organization-plans", templateUrl: "organization-plans.component.html", }) -export class OrganizationPlansComponent implements OnInit { +export class OrganizationPlansComponent implements OnInit, OnDestroy { @ViewChild(PaymentComponent) paymentComponent: PaymentComponent; @ViewChild(TaxInfoComponent) taxComponent: TaxInfoComponent; @@ -73,6 +82,8 @@ export class OrganizationPlansComponent implements OnInit { plans: PlanResponse[]; + private destroy$ = new Subject(); + constructor( private apiService: ApiService, private i18nService: I18nService, @@ -114,9 +125,21 @@ export class OrganizationPlansComponent implements OnInit { this.formGroup.controls.billingEmail.addValidators(Validators.required); } + this.policyService + .policyAppliesToActiveUser$(PolicyType.SingleOrg) + .pipe(takeUntil(this.destroy$)) + .subscribe((policyAppliesToActiveUser) => { + this.singleOrgPolicyBlock = policyAppliesToActiveUser; + }); + this.loading = false; } + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + get createOrganization() { return this.organizationId == null; } @@ -288,8 +311,6 @@ export class OrganizationPlansComponent implements OnInit { } async submit() { - this.singleOrgPolicyBlock = await this.userHasBlockingSingleOrgPolicy(); - if (this.singleOrgPolicyBlock) { return; } @@ -353,10 +374,6 @@ export class OrganizationPlansComponent implements OnInit { } } - private async userHasBlockingSingleOrgPolicy() { - return this.policyService.policyAppliesToUser(PolicyType.SingleOrg); - } - private async updateOrganization(orgId: string) { const request = new OrganizationUpgradeRequest(); request.businessName = this.formGroup.controls.businessOwned.value diff --git a/apps/web/src/app/settings/payment-method.component.ts b/apps/web/src/app/settings/payment-method.component.ts index 2cf9a179112..4dd20180953 100644 --- a/apps/web/src/app/settings/payment-method.component.ts +++ b/apps/web/src/app/settings/payment-method.component.ts @@ -5,7 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; -import { BillingPaymentResponse } from "@bitwarden/common/models/response/billingPaymentResponse"; +import { BillingPaymentResponse } from "@bitwarden/common/models/response/billing-payment.response"; @Component({ selector: "app-payment-method", diff --git a/apps/web/src/app/settings/profile.component.ts b/apps/web/src/app/settings/profile.component.ts index fc7a56632ea..229f2f5b007 100644 --- a/apps/web/src/app/settings/profile.component.ts +++ b/apps/web/src/app/settings/profile.component.ts @@ -7,8 +7,8 @@ import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { UpdateProfileRequest } from "@bitwarden/common/models/request/updateProfileRequest"; -import { ProfileResponse } from "@bitwarden/common/models/response/profileResponse"; +import { UpdateProfileRequest } from "@bitwarden/common/models/request/update-profile.request"; +import { ProfileResponse } from "@bitwarden/common/models/response/profile.response"; @Component({ selector: "app-profile", diff --git a/apps/web/src/app/settings/tax-info.component.ts b/apps/web/src/app/settings/tax-info.component.ts index 216a0d030a1..fdebdbd5a22 100644 --- a/apps/web/src/app/settings/tax-info.component.ts +++ b/apps/web/src/app/settings/tax-info.component.ts @@ -4,10 +4,10 @@ import { ActivatedRoute } from "@angular/router"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/abstractions/organization/organization-api.service.abstraction"; -import { OrganizationTaxInfoUpdateRequest } from "@bitwarden/common/models/request/organizationTaxInfoUpdateRequest"; -import { TaxInfoUpdateRequest } from "@bitwarden/common/models/request/taxInfoUpdateRequest"; -import { TaxInfoResponse } from "@bitwarden/common/models/response/taxInfoResponse"; -import { TaxRateResponse } from "@bitwarden/common/models/response/taxRateResponse"; +import { OrganizationTaxInfoUpdateRequest } from "@bitwarden/common/models/request/organization-tax-info-update.request"; +import { TaxInfoUpdateRequest } from "@bitwarden/common/models/request/tax-info-update.request"; +import { TaxInfoResponse } from "@bitwarden/common/models/response/tax-info.response"; +import { TaxRateResponse } from "@bitwarden/common/models/response/tax-rate.response"; type TaxInfoView = Omit & { includeTaxId: boolean; diff --git a/apps/web/src/app/settings/two-factor-authenticator.component.ts b/apps/web/src/app/settings/two-factor-authenticator.component.ts index 569a95621fb..652ee24a144 100644 --- a/apps/web/src/app/settings/two-factor-authenticator.component.ts +++ b/apps/web/src/app/settings/two-factor-authenticator.component.ts @@ -7,8 +7,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { UpdateTwoFactorAuthenticatorRequest } from "@bitwarden/common/models/request/updateTwoFactorAuthenticatorRequest"; -import { TwoFactorAuthenticatorResponse } from "@bitwarden/common/models/response/twoFactorAuthenticatorResponse"; +import { UpdateTwoFactorAuthenticatorRequest } from "@bitwarden/common/models/request/update-two-factor-authenticator.request"; +import { TwoFactorAuthenticatorResponse } from "@bitwarden/common/models/response/two-factor-authenticator.response"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorBaseComponent } from "./two-factor-base.component"; diff --git a/apps/web/src/app/settings/two-factor-base.component.ts b/apps/web/src/app/settings/two-factor-base.component.ts index d54092aebd2..992861d4fcc 100644 --- a/apps/web/src/app/settings/two-factor-base.component.ts +++ b/apps/web/src/app/settings/two-factor-base.component.ts @@ -7,8 +7,8 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; import { VerificationType } from "@bitwarden/common/enums/verificationType"; -import { SecretVerificationRequest } from "@bitwarden/common/models/request/secretVerificationRequest"; -import { TwoFactorProviderRequest } from "@bitwarden/common/models/request/twoFactorProviderRequest"; +import { SecretVerificationRequest } from "@bitwarden/common/models/request/secret-verification.request"; +import { TwoFactorProviderRequest } from "@bitwarden/common/models/request/two-factor-provider.request"; import { AuthResponseBase } from "@bitwarden/common/types/authResponse"; @Directive() diff --git a/apps/web/src/app/settings/two-factor-duo.component.ts b/apps/web/src/app/settings/two-factor-duo.component.ts index 46c62b1bc58..be3f40a89fa 100644 --- a/apps/web/src/app/settings/two-factor-duo.component.ts +++ b/apps/web/src/app/settings/two-factor-duo.component.ts @@ -6,8 +6,8 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { UpdateTwoFactorDuoRequest } from "@bitwarden/common/models/request/updateTwoFactorDuoRequest"; -import { TwoFactorDuoResponse } from "@bitwarden/common/models/response/twoFactorDuoResponse"; +import { UpdateTwoFactorDuoRequest } from "@bitwarden/common/models/request/update-two-factor-duo.request"; +import { TwoFactorDuoResponse } from "@bitwarden/common/models/response/two-factor-duo.response"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorBaseComponent } from "./two-factor-base.component"; diff --git a/apps/web/src/app/settings/two-factor-email.component.ts b/apps/web/src/app/settings/two-factor-email.component.ts index 968695812b9..a5a6f35b7fd 100644 --- a/apps/web/src/app/settings/two-factor-email.component.ts +++ b/apps/web/src/app/settings/two-factor-email.component.ts @@ -7,9 +7,9 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { TwoFactorEmailRequest } from "@bitwarden/common/models/request/twoFactorEmailRequest"; -import { UpdateTwoFactorEmailRequest } from "@bitwarden/common/models/request/updateTwoFactorEmailRequest"; -import { TwoFactorEmailResponse } from "@bitwarden/common/models/response/twoFactorEmailResponse"; +import { TwoFactorEmailRequest } from "@bitwarden/common/models/request/two-factor-email.request"; +import { UpdateTwoFactorEmailRequest } from "@bitwarden/common/models/request/update-two-factor-email.request"; +import { TwoFactorEmailResponse } from "@bitwarden/common/models/response/two-factor-email.response"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorBaseComponent } from "./two-factor-base.component"; diff --git a/apps/web/src/app/settings/two-factor-recovery.component.ts b/apps/web/src/app/settings/two-factor-recovery.component.ts index c5cd76b329a..d7bb2a4a658 100644 --- a/apps/web/src/app/settings/two-factor-recovery.component.ts +++ b/apps/web/src/app/settings/two-factor-recovery.component.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { TwoFactorRecoverResponse } from "@bitwarden/common/models/response/twoFactorRescoverResponse"; +import { TwoFactorRecoverResponse } from "@bitwarden/common/models/response/two-factor-recover.response"; @Component({ selector: "app-two-factor-recovery", diff --git a/apps/web/src/app/settings/two-factor-setup.component.html b/apps/web/src/app/settings/two-factor-setup.component.html index b846fdb9816..27fc2990e60 100644 --- a/apps/web/src/app/settings/two-factor-setup.component.html +++ b/apps/web/src/app/settings/two-factor-setup.component.html @@ -55,40 +55,6 @@
-
-
-
-

- {{ "deviceVerification" | i18n }} -

-
-
- - -
- {{ "deviceVerificationDesc" | i18n }} -
- -
-
-
diff --git a/apps/web/src/app/settings/two-factor-setup.component.ts b/apps/web/src/app/settings/two-factor-setup.component.ts index 13e3cbecea8..72daa52039e 100644 --- a/apps/web/src/app/settings/two-factor-setup.component.ts +++ b/apps/web/src/app/settings/two-factor-setup.component.ts @@ -1,17 +1,14 @@ -import { Component, OnInit, Type, ViewChild, ViewContainerRef } from "@angular/core"; +import { Component, OnDestroy, OnInit, Type, ViewChild, ViewContainerRef } from "@angular/core"; +import { Subject, takeUntil } from "rxjs"; import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; import { PolicyType } from "@bitwarden/common/enums/policyType"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { DeviceVerificationRequest } from "@bitwarden/common/models/request/deviceVerificationRequest"; import { TwoFactorProviders } from "@bitwarden/common/services/twoFactor.service"; import { TwoFactorAuthenticatorComponent } from "./two-factor-authenticator.component"; @@ -25,8 +22,7 @@ import { TwoFactorYubiKeyComponent } from "./two-factor-yubikey.component"; selector: "app-two-factor-setup", templateUrl: "two-factor-setup.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class TwoFactorSetupComponent implements OnInit { +export class TwoFactorSetupComponent implements OnInit, OnDestroy { @ViewChild("recoveryTemplate", { read: ViewContainerRef, static: true }) recoveryModalRef: ViewContainerRef; @ViewChild("authenticatorTemplate", { read: ViewContainerRef, static: true }) @@ -44,32 +40,22 @@ export class TwoFactorSetupComponent implements OnInit { canAccessPremium: boolean; showPolicyWarning = false; loading = true; - enableDeviceVerification: boolean; - isDeviceVerificationSectionEnabled: boolean; modal: ModalRef; formPromise: Promise; + private destroy$ = new Subject(); + private twoFactorAuthPolicyAppliesToActiveUser: boolean; + constructor( protected apiService: ApiService, protected modalService: ModalService, protected messagingService: MessagingService, protected policyService: PolicyService, - private stateService: StateService, - private platformUtilsService: PlatformUtilsService, - private i18nService: I18nService, - private logService: LogService + private stateService: StateService ) {} async ngOnInit() { this.canAccessPremium = await this.stateService.getCanAccessPremium(); - try { - const deviceVerificationSettings = await this.apiService.getDeviceVerificationSettings(); - this.isDeviceVerificationSectionEnabled = - deviceVerificationSettings.isDeviceVerificationSectionEnabled; - this.enableDeviceVerification = deviceVerificationSettings.unknownDeviceVerificationEnabled; - } catch (e) { - this.logService.error(e); - } for (const key in TwoFactorProviders) { // eslint-disable-next-line @@ -93,9 +79,22 @@ export class TwoFactorSetupComponent implements OnInit { } this.providers.sort((a: any, b: any) => a.sort - b.sort); + + this.policyService + .policyAppliesToActiveUser$(PolicyType.TwoFactorAuthentication) + .pipe(takeUntil(this.destroy$)) + .subscribe((policyAppliesToActiveUser) => { + this.twoFactorAuthPolicyAppliesToActiveUser = policyAppliesToActiveUser; + }); + await this.load(); } + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + async load() { this.loading = true; const providerList = await this.getTwoFactorProviders(); @@ -203,44 +202,9 @@ export class TwoFactorSetupComponent implements OnInit { private async evaluatePolicies() { if (this.organizationId == null && this.providers.filter((p) => p.enabled).length === 1) { - this.showPolicyWarning = await this.policyService.policyAppliesToUser( - PolicyType.TwoFactorAuthentication - ); + this.showPolicyWarning = this.twoFactorAuthPolicyAppliesToActiveUser; } else { this.showPolicyWarning = false; } } - - async submit() { - try { - if (this.enableDeviceVerification) { - const email = await this.stateService.getEmail(); - const confirmed = await this.platformUtilsService.showDialog( - this.i18nService.t( - "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX", - email - ), - this.i18nService.t("deviceVerification"), - this.i18nService.t("yes"), - this.i18nService.t("no"), - "warning" - ); - if (!confirmed) { - return; - } - } - - this.formPromise = this.apiService.putDeviceVerificationSettings( - new DeviceVerificationRequest(this.enableDeviceVerification) - ); - await this.formPromise; - this.platformUtilsService.showToast( - "success", - null, - this.i18nService.t("updatedDeviceVerification") - ); - } catch (e) { - this.logService.error(e); - } - } } diff --git a/apps/web/src/app/settings/two-factor-verify.component.ts b/apps/web/src/app/settings/two-factor-verify.component.ts index 5e8b91fd774..53da0d8fe16 100644 --- a/apps/web/src/app/settings/two-factor-verify.component.ts +++ b/apps/web/src/app/settings/two-factor-verify.component.ts @@ -5,7 +5,7 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; import { VerificationType } from "@bitwarden/common/enums/verificationType"; -import { SecretVerificationRequest } from "@bitwarden/common/models/request/secretVerificationRequest"; +import { SecretVerificationRequest } from "@bitwarden/common/models/request/secret-verification.request"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorResponse } from "@bitwarden/common/types/twoFactorResponse"; import { Verification } from "@bitwarden/common/types/verification"; diff --git a/apps/web/src/app/settings/two-factor-webauthn.component.ts b/apps/web/src/app/settings/two-factor-webauthn.component.ts index 4180b957543..e6e35652778 100644 --- a/apps/web/src/app/settings/two-factor-webauthn.component.ts +++ b/apps/web/src/app/settings/two-factor-webauthn.component.ts @@ -6,13 +6,13 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { SecretVerificationRequest } from "@bitwarden/common/models/request/secretVerificationRequest"; -import { UpdateTwoFactorWebAuthnDeleteRequest } from "@bitwarden/common/models/request/updateTwoFactorWebAuthnDeleteRequest"; -import { UpdateTwoFactorWebAuthnRequest } from "@bitwarden/common/models/request/updateTwoFactorWebAuthnRequest"; +import { SecretVerificationRequest } from "@bitwarden/common/models/request/secret-verification.request"; +import { UpdateTwoFactorWebAuthnDeleteRequest } from "@bitwarden/common/models/request/update-two-factor-web-authn-delete.request"; +import { UpdateTwoFactorWebAuthnRequest } from "@bitwarden/common/models/request/update-two-factor-web-authn.request"; import { ChallengeResponse, TwoFactorWebAuthnResponse, -} from "@bitwarden/common/models/response/twoFactorWebAuthnResponse"; +} from "@bitwarden/common/models/response/two-factor-web-authn.response"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorBaseComponent } from "./two-factor-base.component"; diff --git a/apps/web/src/app/settings/two-factor-yubikey.component.ts b/apps/web/src/app/settings/two-factor-yubikey.component.ts index a6f75af1f88..d6d5234e7fb 100644 --- a/apps/web/src/app/settings/two-factor-yubikey.component.ts +++ b/apps/web/src/app/settings/two-factor-yubikey.component.ts @@ -6,8 +6,8 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/enums/twoFactorProviderType"; -import { UpdateTwoFactorYubioOtpRequest } from "@bitwarden/common/models/request/updateTwoFactorYubioOtpRequest"; -import { TwoFactorYubiKeyResponse } from "@bitwarden/common/models/response/twoFactorYubiKeyResponse"; +import { UpdateTwoFactorYubioOtpRequest } from "@bitwarden/common/models/request/update-two-factor-yubio-otp.request"; +import { TwoFactorYubiKeyResponse } from "@bitwarden/common/models/response/two-factor-yubi-key.response"; import { AuthResponse } from "@bitwarden/common/types/authResponse"; import { TwoFactorBaseComponent } from "./two-factor-base.component"; diff --git a/apps/web/src/app/settings/update-key.component.ts b/apps/web/src/app/settings/update-key.component.ts index 52a22d13e95..5ebd432fb4b 100644 --- a/apps/web/src/app/settings/update-key.component.ts +++ b/apps/web/src/app/settings/update-key.component.ts @@ -10,10 +10,10 @@ import { LogService } from "@bitwarden/common/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; -import { EncString } from "@bitwarden/common/models/domain/encString"; -import { CipherWithIdRequest } from "@bitwarden/common/models/request/cipherWithIdRequest"; -import { FolderWithIdRequest } from "@bitwarden/common/models/request/folderWithIdRequest"; -import { UpdateKeyRequest } from "@bitwarden/common/models/request/updateKeyRequest"; +import { EncString } from "@bitwarden/common/models/domain/enc-string"; +import { CipherWithIdRequest } from "@bitwarden/common/models/request/cipher-with-id.request"; +import { FolderWithIdRequest } from "@bitwarden/common/models/request/folder-with-id.request"; +import { UpdateKeyRequest } from "@bitwarden/common/models/request/update-key.request"; @Component({ selector: "app-update-key", diff --git a/apps/web/src/app/settings/user-billing-history.component.ts b/apps/web/src/app/settings/user-billing-history.component.ts index dfc3216d2fe..30682e03b4b 100644 --- a/apps/web/src/app/settings/user-billing-history.component.ts +++ b/apps/web/src/app/settings/user-billing-history.component.ts @@ -6,7 +6,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { PaymentMethodType } from "@bitwarden/common/enums/paymentMethodType"; import { TransactionType } from "@bitwarden/common/enums/transactionType"; -import { BillingHistoryResponse } from "@bitwarden/common/models/response/billingHistoryResponse"; +import { BillingHistoryResponse } from "@bitwarden/common/models/response/billing-history.response"; @Component({ selector: "app-user-billing", diff --git a/apps/web/src/app/settings/user-subscription.component.ts b/apps/web/src/app/settings/user-subscription.component.ts index 5eb1442bf5a..88f3dd20f6a 100644 --- a/apps/web/src/app/settings/user-subscription.component.ts +++ b/apps/web/src/app/settings/user-subscription.component.ts @@ -7,7 +7,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { SubscriptionResponse } from "@bitwarden/common/models/response/subscriptionResponse"; +import { SubscriptionResponse } from "@bitwarden/common/models/response/subscription.response"; @Component({ selector: "app-user-subscription", diff --git a/apps/web/src/app/shared/shared.module.ts b/apps/web/src/app/shared/shared.module.ts index c0a076e545e..f8c79ebb5e4 100644 --- a/apps/web/src/app/shared/shared.module.ts +++ b/apps/web/src/app/shared/shared.module.ts @@ -14,6 +14,7 @@ import { FormFieldModule, MenuModule, IconModule, + AsyncActionsModule, } from "@bitwarden/components"; // Register the locales for the application @@ -47,6 +48,7 @@ import "./locales"; ], exports: [ CommonModule, + AsyncActionsModule, DragDropModule, FormsModule, InfiniteScrollModule, diff --git a/apps/web/src/app/tools/import-export/import.component.html b/apps/web/src/app/tools/import-export/import.component.html index 26d820b5189..15c1109654d 100644 --- a/apps/web/src/app/tools/import-export/import.component.html +++ b/apps/web/src/app/tools/import-export/import.component.html @@ -1,7 +1,7 @@ - + {{ "personalOwnershipPolicyInEffectImports" | i18n }}
@@ -14,7 +14,7 @@ name="Format" [(ngModel)]="format" class="form-control" - [disabled]="importBlockedByPolicy" + [disabled]="importBlockedByPolicy$ | async" required > @@ -291,12 +291,25 @@
+
+
+ + {{ this.fileSelected ? this.fileSelected.name : ("noFileChosen" | i18n) }} +
@@ -308,14 +321,14 @@ class="form-control" name="FileContents" [(ngModel)]="fileContents" - [disabled]="importBlockedByPolicy" + [disabled]="importBlockedByPolicy$ | async" > + + + + + + diff --git a/apps/web/src/app/vault/vault-filter/organization-filter/organization-options.component.ts b/apps/web/src/app/vault/vault-filter/organization-filter/organization-options.component.ts index fb1009fa515..06b88bd0e49 100644 --- a/apps/web/src/app/vault/vault-filter/organization-filter/organization-options.component.ts +++ b/apps/web/src/app/vault/vault-filter/organization-filter/organization-options.component.ts @@ -1,4 +1,5 @@ -import { Component, Input } from "@angular/core"; +import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { map, Subject, takeUntil } from "rxjs"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; @@ -11,7 +12,7 @@ import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.ab import { PolicyType } from "@bitwarden/common/enums/policyType"; import { Organization } from "@bitwarden/common/models/domain/organization"; import { Policy } from "@bitwarden/common/models/domain/policy"; -import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organizationUserResetPasswordEnrollmentRequest"; +import { OrganizationUserResetPasswordEnrollmentRequest } from "@bitwarden/common/models/request/organization-user-reset-password-enrollment.request"; import { EnrollMasterPasswordReset } from "../../../organizations/users/enroll-master-password-reset.component"; @@ -19,13 +20,15 @@ import { EnrollMasterPasswordReset } from "../../../organizations/users/enroll-m selector: "app-organization-options", templateUrl: "organization-options.component.html", }) -export class OrganizationOptionsComponent { +export class OrganizationOptionsComponent implements OnInit, OnDestroy { actionPromise: Promise; policies: Policy[]; loaded = false; @Input() organization: Organization; + private destroy$ = new Subject(); + constructor( private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, @@ -38,12 +41,20 @@ export class OrganizationOptionsComponent { ) {} async ngOnInit() { - await this.load(); + this.policyService.policies$ + .pipe( + map((policies) => policies.filter((policy) => policy.type === PolicyType.ResetPassword)), + takeUntil(this.destroy$) + ) + .subscribe((policies) => { + this.policies = policies; + this.loaded = true; + }); } - async load() { - this.policies = await this.policyService.getAll(PolicyType.ResetPassword); - this.loaded = true; + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); } allowEnrollmentChanges(org: Organization): boolean { @@ -83,7 +94,6 @@ export class OrganizationOptionsComponent { }); await this.actionPromise; this.platformUtilsService.showToast("success", null, "Unlinked SSO"); - await this.load(); } catch (e) { this.logService.error(e); } @@ -105,7 +115,6 @@ export class OrganizationOptionsComponent { this.actionPromise = this.organizationApiService.leave(org.id); await this.actionPromise; this.platformUtilsService.showToast("success", null, this.i18nService.t("leftOrganization")); - await this.load(); } catch (e) { this.logService.error(e); } diff --git a/apps/web/src/app/vault/vault-filter/shared/vault-filter.service.ts b/apps/web/src/app/vault/vault-filter/shared/vault-filter.service.ts index d8bb48ce663..9ae665b8984 100644 --- a/apps/web/src/app/vault/vault-filter/shared/vault-filter.service.ts +++ b/apps/web/src/app/vault/vault-filter/shared/vault-filter.service.ts @@ -11,10 +11,10 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/abstractions/policy/policy.service.abstraction"; import { StateService } from "@bitwarden/common/abstractions/state.service"; -import { CollectionData } from "@bitwarden/common/models/data/collectionData"; +import { CollectionData } from "@bitwarden/common/models/data/collection.data"; import { Collection } from "@bitwarden/common/models/domain/collection"; -import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collectionResponse"; -import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { CollectionDetailsResponse } from "@bitwarden/common/models/response/collection.response"; +import { CollectionView } from "@bitwarden/common/models/view/collection.view"; @Injectable() export class VaultFilterService extends BaseVaultFilterService { diff --git a/apps/web/src/app/vault/vault.component.ts b/apps/web/src/app/vault/vault.component.ts index 892a4fac8dc..a511d44e36d 100644 --- a/apps/web/src/app/vault/vault.component.ts +++ b/apps/web/src/app/vault/vault.component.ts @@ -23,7 +23,7 @@ import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUti import { StateService } from "@bitwarden/common/abstractions/state.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; import { TokenService } from "@bitwarden/common/abstractions/token.service"; -import { CipherView } from "@bitwarden/common/models/view/cipherView"; +import { CipherView } from "@bitwarden/common/models/view/cipher.view"; import { UpdateKeyComponent } from "../settings/update-key.component"; diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 7980942bf48..25ba8a4911d 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -570,16 +570,16 @@ "message": "Teken aan of skep ’n nuwe rekening vir toegang tot u beveiligde kluis." }, "loginWithDevice": { - "message": "Log in with device" + "message": "Teken aan met toestel" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "Teken aan met toestel moet in die instellings van die Bitwarden-toep geaktiveer word. Kort u nog ’n opsie?" }, "createAccount": { "message": "Skep rekening" }, "newAroundHere": { - "message": "New around here?" + "message": "Nuut hier rond?" }, "startTrial": { "message": "Start Trial" @@ -609,7 +609,7 @@ "message": "Die hoofwagwoord is die wagwoord wat u gaan gebruik vir toegang tot u kluis. Dit is baie belangrik dat u u hoofwagwoord onthou. Daar is geen manier om dit terug te kry ingeval u dit vergeet het nie." }, "masterPassImportant": { - "message": "Master passwords cannot be recovered if you forget it!" + "message": "Hoofwagwoorde kan nie herstel word indien u dit vergeet nie!" }, "masterPassHintDesc": { "message": "’n Hoofwagwoordwenk kan u help om u wagwoord te onthou, sou u dit vergeet." @@ -642,13 +642,13 @@ "message": "Ongeldige e-posadres." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "Hoofwagwoord word vereis." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Hoofwagwoord moet weer ingevoer word." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Hoofwagwoord moet ten minste 8 karakters lank wees." }, "masterPassDoesntMatch": { "message": "Hoofwagwoordbevestiging stem nie ooreen nie." @@ -657,7 +657,7 @@ "message": "U nuwe rekening is geskep! U kan nou aanteken." }, "trialAccountCreated": { - "message": "Account created successfully." + "message": "Rekening suksesvol geskep." }, "masterPassSent": { "message": "Ons het ’n e-pos gestuur met u hoofwagwoordwenk." @@ -718,7 +718,7 @@ "message": "U behoort aan geen organisasies nie. Organisasies laat u toe om items op beveiligde wyse met ander gebruikers te deel." }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "’n Kennisgewing is na u toestel gestuur." }, "versionNumber": { "message": "Weergawe $VERSION_NUMBER$", @@ -915,16 +915,16 @@ "message": "This password will be used to export and import this file" }, "confirmMasterPassword": { - "message": "Confirm Master Password" + "message": "Bevestig hoofwagwoord" }, "confirmFormat": { - "message": "Confirm Format" + "message": "Bevestig formaat" }, "filePassword": { - "message": "File Password" + "message": "Lêerwagwoord" }, "confirmFilePassword": { - "message": "Confirm File Password" + "message": "Bevestig lêerwagwoord" }, "accountBackupOptionDescription": { "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." @@ -933,19 +933,19 @@ "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "fileTypeHeading": { - "message": "File Type" + "message": "Lêertipe" }, "accountBackup": { - "message": "Account Backup" + "message": "Rekeningrugsteun" }, "passwordProtected": { "message": "Password Protected" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm File Password“ do not match." + "message": "“Lêerwagwoord” en “Bevestig lêerwagwoord” stem nie ooreen nie." }, "confirmVaultImport": { - "message": "Confirm Vault Import" + "message": "Bevestig kluisinvoer" }, "confirmVaultImportDesc": { "message": "This file is password-protected. Please enter the file password to import data." @@ -1169,7 +1169,7 @@ "message": "Data is suksesvol na u kluis ingevoer." }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "U voer data in na $ORGANIZATION$. U data kan met ander lede van hierdie organisasie gedeel word. Wil u voortgaan?", "placeholders": { "organization": { "content": "$1", @@ -2272,7 +2272,7 @@ "message": "Jaarliks" }, "annual": { - "message": "Annual" + "message": "Jaarliks" }, "basePrice": { "message": "Basisprys" @@ -2695,7 +2695,7 @@ } }, "removeUserIdAccess": { - "message": "Remove $ID$ access", + "message": "Verwyder $ID$ toegang", "placeholders": { "id": { "content": "$1", @@ -2704,7 +2704,7 @@ } }, "revokedUserId": { - "message": "Revoked organization access for $ID$.", + "message": "Toegang tot die organisasie vir $ID$ is teruggetrek.", "placeholders": { "id": { "content": "$1", @@ -2713,7 +2713,7 @@ } }, "restoredUserId": { - "message": "Restored organization access for $ID$.", + "message": "Toegang tot die organisasie vir $ID$ is teruggestel.", "placeholders": { "id": { "content": "$1", @@ -2722,7 +2722,7 @@ } }, "revokeUserId": { - "message": "Revoke $ID$ access", + "message": "Trek $ID$ toegang terug", "placeholders": { "id": { "content": "$1", @@ -3313,6 +3313,10 @@ "message": "Bygewerk", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Wagwoord Bygewerk", "description": "ex. Date this password was updated" @@ -5261,7 +5265,7 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "Kontak hulle asseblief vir verdere hulp", "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": { @@ -5318,18 +5322,18 @@ "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimApiKeyHelperText": { - "message": "This API key has access to manage users within your organization. It should be kept secret." + "message": "Hierdie API-sleutel het toegang tot die beheer van gebruikers in u organisasie. Dit moet ’n geheim gehou word." }, "copyScimKey": { - "message": "Copy the SCIM API Key to your clipboard", + "message": "Kopieer die SCIM-API-sleutel na u knipbord", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKey": { - "message": "Rotate the SCIM API Key", + "message": "Roteer die SCIM-API-sleutel", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKeyWarning": { - "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", + "message": "Is u seker u wil die SCIM-API-sleutel roteer? Die huidige sleutel sal nie meer werk vir enige bestaande integrasies nie.", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateKey": { @@ -5383,12 +5387,24 @@ "message": "Turn on" }, "on": { - "message": "On" + "message": "Aan" }, "cardBrandMir": { "message": "Mir" }, "numberOfUsers": { "message": "Aantal gebruikers" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 43b82336bfc..b4111eff7d5 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index d1dec240f28..09dcba1b557 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -3313,6 +3313,10 @@ "message": "Güncəlləndi", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Yaradıldı", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parol güncəlləndi", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "İstifadəçi sayı" + }, + "multiSelectPlaceholder": { + "message": "-- Filtrləmək üçün yazın --" + }, + "multiSelectLoading": { + "message": "Seçimlər alınır..." + }, + "multiSelectNotFound": { + "message": "Heç bir element tapılmadı" + }, + "multiSelectClearAll": { + "message": "Hamısını təmizlə" } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index c478bf41e34..8dcc9756563 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -3313,6 +3313,10 @@ "message": "Абноўлена", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль абноўлены", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Колькасць карыстальнікаў" + }, + "multiSelectPlaceholder": { + "message": "- Увядзіце для фільтрацыі -" + }, + "multiSelectLoading": { + "message": "Атрыманне параметраў..." + }, + "multiSelectNotFound": { + "message": "Элементаў не знойдзена" + }, + "multiSelectClearAll": { + "message": "Ачысціць усё" } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 71ab848dae1..e6032bde0b7 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -3313,6 +3313,10 @@ "message": "Обновена", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Създадено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Обновена парола", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Брой потребители" + }, + "multiSelectPlaceholder": { + "message": "-- Пишете тук за филтриране --" + }, + "multiSelectLoading": { + "message": "Зареждане на опциите…" + }, + "multiSelectNotFound": { + "message": "Няма намерени записи" + }, + "multiSelectClearAll": { + "message": "Изчистване на всичко" } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 4208da88078..8f5fe1a120c 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -3313,6 +3313,10 @@ "message": "হালনাগাদকৃত", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "পাসওয়ার্ড হালনাগাদকৃত", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 6e252cf11b0..ad21e8fdc12 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Broj korisnika" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index e29962bc3e0..63e6d634a4a 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -570,16 +570,16 @@ "message": "Inicieu sessió o creeu un compte nou per accedir a la caixa forta." }, "loginWithDevice": { - "message": "Log in with device" + "message": "Inicieu sessió amb el dispositiu" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "L'inici de sessió amb el dispositiu ha d'estar activat a la configuració de l'aplicació mòbil Bitwarden. Necessiteu una altra opció?" }, "createAccount": { "message": "Crea un compte" }, "newAroundHere": { - "message": "New around here?" + "message": "Nou per ací?" }, "startTrial": { "message": "Comença la prova" @@ -588,7 +588,7 @@ "message": "Inicia sessió" }, "logInInitiated": { - "message": "Log in initiated" + "message": "S'ha iniciat la sessió" }, "submit": { "message": "Envia" @@ -648,7 +648,7 @@ "message": "Cal tornar a escriure la contrasenya mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "La contrasenya mestra ha de contenir almenys 8 caràcters." }, "masterPassDoesntMatch": { "message": "La confirmació de la contrasenya mestra no coincideix." @@ -718,7 +718,7 @@ "message": "No pertanyeu a cap organització. Les organitzacions permeten compartir elements amb altres usuaris de forma segura." }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "S'ha enviat una notificació al vostre dispositiu." }, "versionNumber": { "message": "Versió $VERSION_NUMBER$", @@ -2548,7 +2548,7 @@ } }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Veure totes les opcions d'inici de sessió" }, "viewedItemId": { "message": "$ID$ de l'element vist.", @@ -3313,6 +3313,10 @@ "message": "Actualitzat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contrasenya actualitzada", "description": "ex. Date this password was updated" @@ -3391,10 +3395,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "Assegureu-vos que la vostra caixa forta estiga desbloquejada i que la frase d'empremta digital coincidisca amb l'altre dispositiu." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Frase d'empremta digital" }, "dontAskFingerprintAgain": { "message": "No sol·liciteu tornar a comprovar la frase de les empremtes dactilars (No recomanat)", @@ -4397,7 +4401,7 @@ "message": "Tornar a enviar invitacions" }, "resendNotification": { - "message": "Resend notification" + "message": "Torna a enviar la notificació" }, "noSelectedUsersApplicable": { "message": "Aquesta acció no és aplicable a cap dels usuaris seleccionats." @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Nombre d'usuaris" + }, + "multiSelectPlaceholder": { + "message": "-- Escriviu per filtrar --" + }, + "multiSelectLoading": { + "message": "Obtenint opcions..." + }, + "multiSelectNotFound": { + "message": "No s'ha trobat cap element" + }, + "multiSelectClearAll": { + "message": "Esborra-ho tot" } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 7110b323a0c..f9a7477edd0 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -3313,6 +3313,10 @@ "message": "Upraveno", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bylo změněno", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 19a2e9955fa..63aa53eaeeb 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -573,7 +573,7 @@ "message": "Log ind med enhed" }, "loginWithDeviceEnabledInfo": { - "message": "Log ind med enhed skal være aktiveret i Bitwarden mobil-appindstillingerne. Brug for en anden mulighed?" + "message": "Log ind med enhed skal være aktiveret i indstillingerne for Bitwarden-mobilappen. Har du brug for en anden mulighed?" }, "createAccount": { "message": "Opret konto" @@ -588,7 +588,7 @@ "message": "Log ind" }, "logInInitiated": { - "message": "Indlogning initieret" + "message": "Indlogning påbegyndt" }, "submit": { "message": "Indsend" @@ -648,7 +648,7 @@ "message": "Hovedadgangskode kræves angivet igen." }, "masterPasswordMinlength": { - "message": "Hovedadgangskode skal udgøre minimum 8 tegn." + "message": "Hovedadgangskoden skal være på mindst 8 tegn." }, "masterPassDoesntMatch": { "message": "De to hovedadgangskoder matcher ikke." @@ -3313,6 +3313,10 @@ "message": "Opdateret", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Oprettet", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Adgangskode opdateret", "description": "ex. Date this password was updated" @@ -3391,7 +3395,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Sørg for, at din Boks er oplåst, og at Fingeraftrykssætningen matcher den anden enhed." + "message": "Sørg for, at din boks er låst op, og at fingeraftrykssætningen matcher den anden enhed." }, "fingerprintPhraseHeader": { "message": "Fingeraftrykssætning" @@ -4082,7 +4086,7 @@ "message": "Tilladelser" }, "managerPermissions": { - "message": "Håndtér rettigheder" + "message": "Bestyrer-tilladelser" }, "adminPermissions": { "message": "Admin-tilladelser" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Antal brugere" + }, + "multiSelectPlaceholder": { + "message": "-- Type at filtrere --" + }, + "multiSelectLoading": { + "message": "Henter indstillinger..." + }, + "multiSelectNotFound": { + "message": "Ingen emner fundet" + }, + "multiSelectClearAll": { + "message": "Ryd alt" } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 53de20ac8f8..c9ed0f008eb 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -3313,6 +3313,10 @@ "message": "Aktualisiert", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Erstellt", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passwort aktualisiert", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Anzahl der Benutzer" + }, + "multiSelectPlaceholder": { + "message": "-- Typ zum Filtern --" + }, + "multiSelectLoading": { + "message": "Optionen werden abgerufen..." + }, + "multiSelectNotFound": { + "message": "Keine Einträge gefunden" + }, + "multiSelectClearAll": { + "message": "Alles löschen" } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index a1f5ab49ecd..1d532bacd1b 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -3313,6 +3313,10 @@ "message": "Ενημερώθηκε", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Ο Κωδικός Ενημερώθηκε", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Αριθμός χρηστών" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index efced93ca43..2a5646424fc 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -38,7 +38,7 @@ "message": "Password" }, "newPassword": { - "message": "New Password" + "message": "New password" }, "passphrase": { "message": "Passphrase" @@ -47,10 +47,10 @@ "message": "Notes" }, "customFields": { - "message": "Custom Fields" + "message": "Custom fields" }, "cardholderName": { - "message": "Cardholder Name" + "message": "Cardholder name" }, "number": { "message": "Number" @@ -62,22 +62,22 @@ "message": "Expiration" }, "securityCode": { - "message": "Security Code (CVV)" + "message": "Security code (CVV)" }, "identityName": { - "message": "Identity Name" + "message": "Identity name" }, "company": { "message": "Company" }, "ssn": { - "message": "Social Security Number" + "message": "Social Security number" }, "passportNumber": { - "message": "Passport Number" + "message": "Passport number" }, "licenseNumber": { - "message": "License Number" + "message": "License number" }, "email": { "message": "Email" @@ -137,19 +137,19 @@ "message": "Dr" }, "expirationMonth": { - "message": "Expiration Month" + "message": "Expiration month" }, "expirationYear": { - "message": "Expiration Year" + "message": "Expiration year" }, "authenticatorKeyTotp": { - "message": "Authenticator Key (TOTP)" + "message": "Authenticator key (TOTP)" }, "folder": { "message": "Folder" }, "newCustomField": { - "message": "New Custom Field" + "message": "New custom field" }, "value": { "message": "Value" @@ -177,22 +177,22 @@ "message": "Unassigned" }, "noneFolder": { - "message": "No Folder", + "message": "No folder", "description": "This is the folder for uncategorized items" }, "addFolder": { - "message": "Add Folder" + "message": "Add folder" }, "editFolder": { - "message": "Edit Folder" + "message": "Edit folder" }, "baseDomain": { "message": "Base domain", - "description": "Domain name. Ex. website.com" + "description": "Domain name. Example: website.com" }, "domainName": { - "message": "Domain Name", - "description": "Domain name. Ex. website.com" + "message": "Domain name", + "description": "Domain name. Example: website.com" }, "host": { "message": "Host", @@ -209,7 +209,7 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Match Detection", + "message": "Match detection", "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { @@ -220,14 +220,14 @@ "message": "Never" }, "toggleVisibility": { - "message": "Toggle Visibility" + "message": "Toggle visibility" }, "toggleCollapse": { - "message": "Toggle Collapse", + "message": "Toggle collapse", "description": "Toggling an expand/collapse state." }, "generatePassword": { - "message": "Generate Password" + "message": "Generate password" }, "checkPassword": { "message": "Check if password has been exposed." @@ -269,23 +269,23 @@ "message": "Edit" }, "searchCollection": { - "message": "Search Collection" + "message": "Search collection" }, "searchFolder": { - "message": "Search Folder" + "message": "Search folder" }, "searchFavorites": { - "message": "Search Favorites" + "message": "Search favorites" }, "searchType": { - "message": "Search Type", + "message": "Search type", "description": "Search item type" }, "searchVault": { - "message": "Search Vault" + "message": "Search vault" }, "allItems": { - "message": "All Items" + "message": "All items" }, "favorites": { "message": "Favorites" @@ -303,7 +303,7 @@ "message": "Identity" }, "typeSecureNote": { - "message": "Secure Note" + "message": "Secure note" }, "typeLoginPlural": { "message": "Logins" @@ -315,7 +315,7 @@ "message": "Identities" }, "typeSecureNotePlural": { - "message": "Secure Notes" + "message": "Secure notes" }, "folders": { "message": "Folders" @@ -324,16 +324,16 @@ "message": "Collections" }, "firstName": { - "message": "First Name" + "message": "First name" }, "middleName": { - "message": "Middle Name" + "message": "Middle name" }, "lastName": { - "message": "Last Name" + "message": "Last name" }, "fullName": { - "message": "Full Name" + "message": "Full name" }, "address1": { "message": "Address 1" @@ -351,7 +351,7 @@ "message": "State / Province" }, "zipPostalCode": { - "message": "Zip / Postal Code" + "message": "Zip / Postal code" }, "country": { "message": "Country" @@ -366,13 +366,13 @@ "message": "Select" }, "addItem": { - "message": "Add Item" + "message": "Add item" }, "editItem": { - "message": "Edit Item" + "message": "Edit item" }, "viewItem": { - "message": "View Item" + "message": "View item" }, "ex": { "message": "ex.", @@ -385,7 +385,7 @@ "message": "Share" }, "moveToOrganization": { - "message": "Move to Organization" + "message": "Move to organization" }, "valueCopied": { "message": "$VALUE$ copied", @@ -398,23 +398,23 @@ } }, "copyValue": { - "message": "Copy Value", + "message": "Copy value", "description": "Copy value to clipboard" }, "copyPassword": { - "message": "Copy Password", + "message": "Copy password", "description": "Copy password to clipboard" }, "copyUsername": { - "message": "Copy Username", + "message": "Copy username", "description": "Copy username to clipboard" }, "copyNumber": { - "message": "Copy Number", + "message": "Copy number", "description": "Copy credit card number" }, "copySecurityCode": { - "message": "Copy Security Code", + "message": "Copy security code", "description": "Copy credit card security code (CVV)" }, "copyUri": { @@ -425,10 +425,10 @@ "message": "Me" }, "myVault": { - "message": "My Vault" + "message": "My vault" }, "allVaults": { - "message": "All Vaults" + "message": "All vaults" }, "vault": { "message": "Vault" @@ -437,28 +437,28 @@ "message": "Vaults" }, "vaultItems": { - "message": "Vault Items" + "message": "Vault items" }, "moveSelectedToOrg": { - "message": "Move Selected to Organization" + "message": "Move selected to organization" }, "deleteSelected": { - "message": "Delete Selected" + "message": "Delete selected" }, "moveSelected": { - "message": "Move Selected" + "message": "Move selected" }, "selectAll": { - "message": "Select All" + "message": "Select all" }, "unselectAll": { - "message": "Unselect All" + "message": "Unselect all" }, "launch": { "message": "Launch" }, "newAttachment": { - "message": "Add New Attachment" + "message": "Add new attachment" }, "deletedAttachment": { "message": "Deleted attachment" @@ -467,7 +467,7 @@ "message": "Are you sure you want to delete this attachment?" }, "attachmentSaved": { - "message": "The attachment has been saved." + "message": "Attachment saved" }, "file": { "message": "File" @@ -482,10 +482,10 @@ "message": "You cannot use this feature until you update your encryption key." }, "addedItem": { - "message": "Added item" + "message": "Item added" }, "editedItem": { - "message": "Edited item" + "message": "Item saved" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -510,13 +510,13 @@ } }, "deleteItem": { - "message": "Delete Item" + "message": "Delete item" }, "deleteFolder": { - "message": "Delete Folder" + "message": "Delete folder" }, "deleteAttachment": { - "message": "Delete Attachment" + "message": "Delete attachment" }, "deleteItemConfirmation": { "message": "Do you really want to send to the trash?" @@ -528,22 +528,22 @@ "message": "Items sent to trash" }, "movedItems": { - "message": "Moved items" + "message": "Items moved" }, "overwritePasswordConfirmation": { "message": "Are you sure you want to overwrite the current password?" }, "editedFolder": { - "message": "Edited folder" + "message": "Folder saved" }, "addedFolder": { - "message": "Added folder" + "message": "Folder added" }, "deleteFolderConfirmation": { "message": "Are you sure you want to delete this folder?" }, "deletedFolder": { - "message": "Deleted folder" + "message": "Folder deleted" }, "loggedOut": { "message": "Logged out" @@ -573,19 +573,19 @@ "message": "Log in with device" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "Log in with device must be set up in the settings of the Bitwarden mobile app. Need another option?" }, "createAccount": { - "message": "Create Account" + "message": "Create account" }, "newAroundHere": { "message": "New around here?" }, "startTrial": { - "message": "Start Trial" + "message": "Start trial" }, "logIn": { - "message": "Log In" + "message": "Log in" }, "logInInitiated": { "message": "Log in initiated" @@ -597,13 +597,13 @@ "message": "You'll use your email address to log in." }, "yourName": { - "message": "Your Name" + "message": "Your name" }, "yourNameDesc": { "message": "What should we call you?" }, "masterPass": { - "message": "Master Password" + "message": "Master password" }, "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." @@ -615,19 +615,19 @@ "message": "A master password hint can help you remember your password if you forget it." }, "reTypeMasterPass": { - "message": "Re-type Master Password" + "message": "Re-type master password" }, "masterPassHint": { - "message": "Master Password Hint (optional)" + "message": "Master password hint (optional)" }, "masterPassHintLabel": { - "message": "Master Password Hint" + "message": "Master password hint" }, "settings": { "message": "Settings" }, "passwordHint": { - "message": "Password Hint" + "message": "Password hint" }, "enterEmailToGetHint": { "message": "Enter your account email address to receive your master password hint." @@ -666,7 +666,7 @@ "message": "An unexpected error has occurred." }, "emailAddress": { - "message": "Email Address" + "message": "Email address" }, "yourVaultIsLocked": { "message": "Your vault is locked. Verify your master password to continue." @@ -694,7 +694,7 @@ "message": "Invalid file password, please use the password you entered when you created the export file." }, "lockNow": { - "message": "Lock Now" + "message": "Lock now" }, "noItemsInList": { "message": "There are no items to list." @@ -712,7 +712,7 @@ "message": "There are no events to list." }, "newOrganization": { - "message": "New Organization" + "message": "New organization" }, "noOrganizationsList": { "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." @@ -766,32 +766,32 @@ "message": "Insert your security key into your computer's USB port. If it has a button, touch it." }, "loginUnavailable": { - "message": "Login Unavailable" + "message": "Login unavailable" }, "noTwoStepProviders": { - "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser." + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." }, "noTwoStepProviders2": { "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." }, "twoStepOptions": { - "message": "Two-step Login Options" + "message": "Two-step login options" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account." + "message": "Lost access to all of your two-step login providers? Use your recovery code to turn off all two-step login providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery Code" + "message": "Recovery code" }, "authenticatorAppTitle": { - "message": "Authenticator App" + "message": "Authenticator app" }, "authenticatorAppDesc": { "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "YubiKey OTP security key" }, "yubiKeyDesc": { "message": "Use a YubiKey to access your account. Works with YubiKey 4 series, 5 series, and NEO devices." @@ -805,16 +805,16 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "Use any FIDO U2F enabled security key to access your account." + "message": "Use any FIDO U2F compatible security key to access your account." }, "u2fTitle": { - "message": "FIDO U2F Security Key" + "message": "FIDO U2F security key" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn enabled security key to access your account." + "message": "Use any WebAuthn compatible security key to access your account." }, "webAuthnMigrated": { "message": "(Migrated from FIDO)" @@ -879,16 +879,16 @@ } }, "verificationCodeTotp": { - "message": "Verification Code (TOTP)" + "message": "Verification code (TOTP)" }, "copyVerificationCode": { - "message": "Copy Verification Code" + "message": "Copy verification code" }, "warning": { "message": "Warning" }, "confirmVaultExport": { - "message": "Confirm Vault Export" + "message": "Confirm vault export" }, "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." @@ -903,10 +903,10 @@ "message": "Export" }, "exportVault": { - "message": "Export Vault" + "message": "Export vault" }, "fileFormat": { - "message": "File Format" + "message": "File format" }, "fileEncryptedExportWarningDesc": { "message": "This file export will be password protected and require the file password to decrypt." @@ -915,16 +915,16 @@ "message": "This password will be used to export and import this file" }, "confirmMasterPassword": { - "message": "Confirm Master Password" + "message": "Confirm master password" }, "confirmFormat": { - "message": "Confirm Format" + "message": "Confirm format" }, "filePassword": { - "message": "File Password" + "message": "File password" }, "confirmFilePassword": { - "message": "Confirm File Password" + "message": "Confirm file password" }, "accountBackupOptionDescription": { "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." @@ -933,44 +933,44 @@ "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." }, "fileTypeHeading": { - "message": "File Type" + "message": "File type" }, "accountBackup": { - "message": "Account Backup" + "message": "Account backup" }, "passwordProtected": { - "message": "Password Protected" + "message": "Password protected" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm File Password“ do not match." + "message": "“File password” and “Confirm file password“ do not match." }, "confirmVaultImport": { - "message": "Confirm Vault Import" + "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." + "message": "Vault data exported" }, "passwordGenerator": { "message": "Password generator" }, "minComplexityScore": { - "message": "Minimum Complexity Score" + "message": "Minimum complexity score" }, "minNumbers": { - "message": "Minimum Numbers" + "message": "Minimum numbers" }, "minSpecial": { - "message": "Minimum Special", - "description": "Minimum Special Characters" + "message": "Minimum special", + "description": "Minimum special characters" }, "ambiguous": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid ambiguous characters" }, "regeneratePassword": { - "message": "Regenerate Password" + "message": "Regenerate password" }, "length": { "message": "Length" @@ -987,42 +987,42 @@ "message": "Numbers (0-9)" }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)" }, "numWords": { - "message": "Number of Words" + "message": "Number of words" }, "wordSeparator": { - "message": "Word Separator" + "message": "Word separator" }, "capitalize": { "message": "Capitalize", - "description": "Make the first letter of a work uppercase." + "description": "Make the first letter of a word uppercase." }, "includeNumber": { - "message": "Include Number" + "message": "Include number" }, "passwordHistory": { - "message": "Password History" + "message": "Password history" }, "noPasswordsInList": { "message": "There are no passwords to list." }, "clear": { "message": "Clear", - "description": "To clear something out. example: To clear browser history." + "description": "To clear something out. Example: To clear browser history." }, "accountUpdated": { - "message": "Account Updated" + "message": "Account saved" }, "changeEmail": { - "message": "Change Email" + "message": "Change email" }, "changeEmailTwoFactorWarning": { - "message": "Proceeding will change your account email address. It will not change the email address used for two-factor authentication. You can change this email address in the Two-Step Login settings." + "message": "Proceeding will change your account email address. It will not change the email address used for two-step login authentication. You can change this email address in the two-step login settings." }, "newEmail": { - "message": "New Email" + "message": "New email" }, "code": { "message": "Code" @@ -1040,7 +1040,7 @@ "message": "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." }, "emailChanged": { - "message": "Email Changed" + "message": "Email saved" }, "logBackIn": { "message": "Please log back in." @@ -1049,28 +1049,28 @@ "message": "Please log back in. If you are using other Bitwarden applications log out and back in to those as well." }, "changeMasterPassword": { - "message": "Change Master Password" + "message": "Change master password" }, "masterPasswordChanged": { - "message": "Master Password Changed" + "message": "Master password saved" }, "currentMasterPass": { - "message": "Current Master Password" + "message": "Current master password" }, "newMasterPass": { - "message": "New Master Password" + "message": "New master password" }, "confirmNewMasterPass": { - "message": "Confirm New Master Password" + "message": "Confirm new master password" }, "encKeySettings": { - "message": "Encryption Key Settings" + "message": "Encryption key settings" }, "kdfAlgorithm": { - "message": "KDF Algorithm" + "message": "KDF algorithm" }, "kdfIterations": { - "message": "KDF Iterations" + "message": "KDF iterations" }, "kdfIterationsDesc": { "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker. We recommend a value of $VALUE$ or more.", @@ -1094,34 +1094,34 @@ "message": "Change KDF" }, "encKeySettingsChanged": { - "message": "Encryption Key Settings Changed" + "message": "Encryption key settings saved" }, "dangerZone": { - "message": "Danger Zone" + "message": "Danger zone" }, "dangerZoneDesc": { "message": "Careful, these actions are not reversible!" }, "deauthorizeSessions": { - "message": "Deauthorize Sessions" + "message": "Deauthorize sessions" }, "deauthorizeSessionsDesc": { "message": "Concerned your account is logged in on another device? Proceed below to deauthorize all computers or devices that you have previously used. This security step is recommended if you previously used a public computer or accidentally saved your password on a device that isn't yours. This step will also clear all previously remembered two-step login sessions." }, "deauthorizeSessionsWarning": { - "message": "Proceeding will also log you out of your current session, requiring you to log back in. You will also be prompted for two-step login again, if enabled. Active sessions on other devices may continue to remain active for up to one hour." + "message": "Proceeding will also log you out of your current session, requiring you to log back in. You will also be prompted for two-step login again, if set up. Active sessions on other devices may continue to remain active for up to one hour." }, "sessionsDeauthorized": { - "message": "All Sessions Deauthorized" + "message": "All sessions deauthorized" }, "purgeVault": { - "message": "Purge Vault" + "message": "Purge vault" }, "purgedOrganizationVault": { "message": "Purged organization vault." }, "vaultAccessedByProvider": { - "message": "Vault accessed by provider." + "message": "Vault accessed by Provider." }, "purgeVaultDesc": { "message": "Proceed below to delete all items and folders in your vault. Items that belong to an organization that you share with will not be deleted." @@ -1133,10 +1133,10 @@ "message": "Purging your vault is permanent. It cannot be undone." }, "vaultPurged": { - "message": "Your vault has been purged." + "message": "Vault purged." }, "deleteAccount": { - "message": "Delete Account" + "message": "Delete account" }, "deleteAccountDesc": { "message": "Proceed below to delete your account and all vault data." @@ -1145,28 +1145,28 @@ "message": "Deleting your account is permanent. It cannot be undone." }, "accountDeleted": { - "message": "Account Deleted" + "message": "Account deleted" }, "accountDeletedDesc": { "message": "Your account has been closed and all associated data has been deleted." }, "myAccount": { - "message": "My Account" + "message": "My account" }, "tools": { "message": "Tools" }, "importData": { - "message": "Import Data" + "message": "Import data" }, "importError": { - "message": "Import Error" + "message": "Import error" }, "importErrorDesc": { "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." }, "importSuccess": { - "message": "Data has been successfully imported into your vault." + "message": "Data successfully imported" }, "importWarning": { "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", @@ -1192,6 +1192,12 @@ "selectImportFile": { "message": "Select the import file" }, + "chooseFile": { + "message": "Choose File" + }, + "noFileChosen": { + "message": "No file chosen" + }, "orCopyPasteFileContents": { "message": "or copy/paste the import file contents" }, @@ -1215,7 +1221,7 @@ "message": "Customize your web vault experience." }, "preferencesUpdated": { - "message": "Preferences updated" + "message": "Preferences saved" }, "language": { "message": "Language" @@ -1247,16 +1253,16 @@ "message": "Default" }, "domainRules": { - "message": "Domain Rules" + "message": "Domain rules" }, "domainRulesDesc": { "message": "If you have the same login across multiple different website domains, you can mark the website as \"equivalent\". \"Global\" domains are ones already created for you by Bitwarden." }, "globalEqDomains": { - "message": "Global Equivalent Domains" + "message": "Global equivalent domains" }, "customEqDomains": { - "message": "Custom Equivalent Domains" + "message": "Custom equivalent domains" }, "exclude": { "message": "Exclude" @@ -1268,13 +1274,13 @@ "message": "Customize" }, "newCustomDomain": { - "message": "New Custom Domain" + "message": "New custom domain" }, "newCustomDomainDesc": { "message": "Enter a list of domains separated by commas. Only \"base\" domains are allowed. Do not enter subdomains. For example, enter \"google.com\" instead of \"www.google.com\". You can also enter \"androidapp://package.name\" to associate an android app with other website domains." }, "customDomainX": { - "message": "Custom Domain $INDEX$", + "message": "Custom domain $INDEX$", "placeholders": { "index": { "content": "$1", @@ -1283,7 +1289,7 @@ } }, "domainsUpdated": { - "message": "Domains updated" + "message": "Domains saved" }, "twoStepLogin": { "message": "Two-step login" @@ -1295,54 +1301,54 @@ "message": "Require two-step login for your organization's users by configuring providers at the organization level." }, "twoStepLoginRecoveryWarning": { - "message": "Enabling two-step login can permanently lock you out of your Bitwarden account. A recovery code allows you to access your account in the event that you can no longer use your normal two-step login provider (ex. you lose your device). Bitwarden support will not be able to assist you if you lose access to your account. We recommend you write down or print the recovery code and keep it in a safe place." + "message": "Setting up two-step login can permanently lock you out of your Bitwarden account. A recovery code allows you to access your account in the event that you can no longer use your normal two-step login provider (example: you lose your device). Bitwarden support will not be able to assist you if you lose access to your account. We recommend you write down or print the recovery code and keep it in a safe place." }, "viewRecoveryCode": { - "message": "View Recovery Code" + "message": "View recovery code" }, "providers": { "message": "Providers", "description": "Two-step login providers such as YubiKey, Duo, Authenticator apps, Email, etc." }, "enable": { - "message": "Enable" + "message": "Turn on" }, "enabled": { - "message": "Enabled" + "message": "Turned on" }, "restoreAccess": { - "message": "Restore Access" + "message": "Restore access" }, "premium": { "message": "Premium", - "description": "Premium Membership" + "description": "Premium membership" }, "premiumMembership": { - "message": "Premium Membership" + "message": "Premium membership" }, "premiumRequired": { - "message": "Premium Required" + "message": "Premium required" }, "premiumRequiredDesc": { - "message": "A premium membership is required to use this feature." + "message": "A Premium membership is required to use this feature." }, "youHavePremiumAccess": { - "message": "You have premium access" + "message": "You have Premium access" }, "alreadyPremiumFromOrg": { - "message": "You already have access to premium features because of an organization you are a member of." + "message": "You already have access to Premium features because of an organization you are a member of." }, "manage": { "message": "Manage" }, "disable": { - "message": "Disable" + "message": "Turn off" }, "revokeAccess": { - "message": "Revoke Access" + "message": "Revoke access" }, "twoStepLoginProviderEnabled": { - "message": "This two-step login provider is enabled on your account." + "message": "This two-step login provider is active on your account." }, "twoStepLoginAuthDesc": { "message": "Enter your master password to modify two-step login settings." @@ -1381,10 +1387,10 @@ "message": "In case you need to add it to another device, below is the QR code (or key) required by your authenticator app." }, "twoStepDisableDesc": { - "message": "Are you sure you want to disable this two-step login provider?" + "message": "Are you sure you want to turn off this two-step login provider?" }, "twoStepDisabled": { - "message": "Two-step login provider disabled." + "message": "Two-step login provider turned off." }, "twoFactorYubikeyAdd": { "message": "Add a new YubiKey to your account" @@ -1402,7 +1408,7 @@ "message": "Save the form." }, "twoFactorYubikeyWarning": { - "message": "Due to platform limitations, YubiKeys cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when YubiKeys cannot be used. Supported platforms:" + "message": "Due to platform limitations, YubiKeys cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when YubiKeys cannot be used. Supported platforms:" }, "twoFactorYubikeySupportUsb": { "message": "Web vault, desktop application, CLI, and all browser extensions on a device with a USB port that can accept your YubiKey." @@ -1450,19 +1456,19 @@ "message": "YubiKeys updated" }, "disableAllKeys": { - "message": "Disable All Keys" + "message": "Deactivate all keys" }, "twoFactorDuoDesc": { "message": "Enter the Bitwarden application information from your Duo Admin panel." }, "twoFactorDuoIntegrationKey": { - "message": "Integration Key" + "message": "Integration key" }, "twoFactorDuoSecretKey": { - "message": "Secret Key" + "message": "Secret key" }, "twoFactorDuoApiHostname": { - "message": "API Hostname" + "message": "API hostname" }, "twoFactorEmailDesc": { "message": "Follow these steps to set up two-step login with email:" @@ -1474,7 +1480,7 @@ "message": "Enter the resulting 6 digit verification code from the email" }, "sendEmail": { - "message": "Send Email" + "message": "Send email" }, "twoFactorU2fAdd": { "message": "Add a FIDO U2F security key to your account" @@ -1486,7 +1492,7 @@ "message": "Add a WebAuthn security key to your account" }, "readKey": { - "message": "Read Key" + "message": "Read key" }, "keyCompromised": { "message": "Key is compromised." @@ -1504,34 +1510,34 @@ "message": "Save the form." }, "twoFactorU2fWarning": { - "message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:" + "message": "Due to platform limitations, FIDO U2F cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when FIDO U2F cannot be used. Supported platforms:" }, "twoFactorU2fSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a U2F enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "message": "Web vault and browser extensions on a desktop/laptop with a U2F supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." }, "twoFactorU2fWaiting": { "message": "Waiting for you to touch the button on your security key" }, "twoFactorU2fClickSave": { - "message": "Click the \"Save\" button below to enable this security key for two-step login." + "message": "Use the \"Save\" button below to activate this security key for two-step login." }, "twoFactorU2fProblemReadingTryAgain": { "message": "There was a problem reading the security key. Try again." }, "twoFactorWebAuthnWarning": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should enable another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" + "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used. Supported platforms:" }, "twoFactorWebAuthnSupportWeb": { - "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn enabled browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F enabled)." + "message": "Web vault and browser extensions on a desktop/laptop with a WebAuthn supported browser (Chrome, Opera, Vivaldi, or Firefox with FIDO U2F turned on)." }, "twoFactorRecoveryYourCode": { "message": "Your Bitwarden two-step login recovery code" }, "twoFactorRecoveryNoCode": { - "message": "You have not enabled any two-step login providers yet. After you have enabled a two-step login provider you can check back here for your recovery code." + "message": "You have not set up any two-step login providers yet. After you have set up a two-step login provider you can check back here for your recovery code." }, "printCode": { - "message": "Print Code", + "message": "Print code", "description": "Print 2FA recovery code" }, "reports": { @@ -1539,16 +1545,16 @@ }, "reportsDesc": { "message": "Identify and close security gaps in your online accounts by clicking the reports below.", - "description": "Vault Health Reports can be used to evaluate the security of your Bitwarden Personal or Organization Vault." + "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { - "message": "Unsecure Websites" + "message": "Unsecure websites" }, "unsecuredWebsitesReportDesc": { - "message": "URLs that start with http:// don’t use the best available encryption. Change the Login URIs for these accounts to https:// for safer browsing." + "message": "URLs that start with http:// don’t use the best available encryption. Change the login URIs for these accounts to https:// for safer browsing." }, "unsecuredWebsitesFound": { - "message": "Unsecured Websites Found" + "message": "Unsecured websites found" }, "unsecuredWebsitesFoundDesc": { "message": "We found $COUNT$ items in your vault with unsecured URIs. You should change their URI scheme to https:// if the website allows it.", @@ -1563,16 +1569,16 @@ "message": "No items in your vault have unsecured URIs." }, "inactive2faReport": { - "message": "Inactive Two-step Login" + "message": "Inactive two-step login" }, "inactive2faReportDesc": { - "message": "Two-step Login adds a layer of protection to your accounts. Turn on Two-Step Login using Bitwarden Authenticator for these accounts or use an alternative method." + "message": "Two-step login adds a layer of protection to your accounts. Set up two-step login using Bitwarden authenticator for these accounts or use an alternative method." }, "inactive2faFound": { - "message": "Logins Without 2FA Found" + "message": "Logins without two-step login found" }, "inactive2faFoundDesc": { - "message": "We found $COUNT$ website(s) in your vault that may not be configured with two-factor authentication (according to 2fa.directory). To further protect these accounts, you should enable two-factor authentication.", + "message": "We found $COUNT$ website(s) in your vault that may not be configured with two-step login (according to 2fa.directory). To further protect these accounts, you should set up two-step login.", "placeholders": { "count": { "content": "$1", @@ -1581,19 +1587,19 @@ } }, "noInactive2fa": { - "message": "No websites were found in your vault with a missing two-factor authentication configuration." + "message": "No websites were found in your vault with a missing two-step login configuration." }, "instructions": { "message": "Instructions" }, "exposedPasswordsReport": { - "message": "Exposed Passwords" + "message": "Exposed passwords" }, "exposedPasswordsReportDesc": { "message": "Passwords exposed in a data breach are easy targets for attackers. Change these passwords to prevent potential break-ins." }, "exposedPasswordsFound": { - "message": "Exposed Passwords Found" + "message": "Exposed passwords found" }, "exposedPasswordsFoundDesc": { "message": "We found $COUNT$ items in your vault that have passwords that were exposed in known data breaches. You should change them to use a new password.", @@ -1608,7 +1614,7 @@ "message": "No items in your vault have passwords that have been exposed in known data breaches." }, "checkExposedPasswords": { - "message": "Check Exposed Passwords" + "message": "Check exposed passwords" }, "exposedXTimes": { "message": "Exposed $COUNT$ time(s)", @@ -1620,13 +1626,13 @@ } }, "weakPasswordsReport": { - "message": "Weak Passwords" + "message": "Weak passwords" }, "weakPasswordsReportDesc": { - "message": "Weak passwords can be easily guessed by attackers. Change these passwords to strong ones using the Password Generator." + "message": "Weak passwords can be easily guessed by attackers. Change these passwords to strong ones using the password generator." }, "weakPasswordsFound": { - "message": "Weak Passwords Found" + "message": "Weak passwords found" }, "weakPasswordsFoundDesc": { "message": "We found $COUNT$ items in your vault with passwords that are not strong. You should update them to use stronger passwords.", @@ -1641,13 +1647,13 @@ "message": "No items in your vault have weak passwords." }, "reusedPasswordsReport": { - "message": "Reused Passwords" + "message": "Reused passwords" }, "reusedPasswordsReportDesc": { "message": "Reusing passwords makes it easier for attackers to break into multiple accounts. Change these passwords so that each is unique." }, "reusedPasswordsFound": { - "message": "Reused Passwords Found" + "message": "Reused passwords found" }, "reusedPasswordsFoundDesc": { "message": "We found $COUNT$ passwords that are being reused in your vault. You should change them to a unique value.", @@ -1671,7 +1677,7 @@ } }, "dataBreachReport": { - "message": "Data Breach" + "message": "Data breach" }, "breachDesc": { "message": "Breached accounts can expose your personal information. Secure breached accounts by enabling 2FA or creating a stronger password." @@ -1680,7 +1686,7 @@ "message": "Check any usernames or email addresses that you use." }, "checkBreaches": { - "message": "Check Breaches" + "message": "Check breaches" }, "breachUsernameNotFound": { "message": "$USERNAME$ was not found in any known data breaches.", @@ -1692,7 +1698,7 @@ } }, "goodNews": { - "message": "Good News", + "message": "Good news", "description": "ex. Good News, No Breached Accounts Found!" }, "breachUsernameFound": { @@ -1709,7 +1715,7 @@ } }, "breachFound": { - "message": "Breached Accounts Found" + "message": "Breached accounts found" }, "compromisedData": { "message": "Compromised data" @@ -1718,13 +1724,13 @@ "message": "Website" }, "affectedUsers": { - "message": "Affected Users" + "message": "Affected users" }, "breachOccurred": { - "message": "Breach Occurred" + "message": "Breach occurred" }, "breachReported": { - "message": "Breach Reported" + "message": "Breach reported" }, "reportError": { "message": "An error occurred trying to load the report. Try again" @@ -1733,21 +1739,21 @@ "message": "Billing" }, "billingPlanLabel": { - "message": "Billing Plan" + "message": "Billing plan" }, "paymentType": { - "message": "Payment Type" + "message": "Payment type" }, "accountCredit": { - "message": "Account Credit", + "message": "Account credit", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "accountBalance": { - "message": "Account Balance", + "message": "Account balance", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "addCredit": { - "message": "Add Credit", + "message": "Add credit", "description": "Add more credit to your account's balance." }, "amount": { @@ -1765,13 +1771,13 @@ }, "goPremium": { "message": "Go Premium", - "description": "Another way of saying \"Get a premium membership\"" + "description": "Another way of saying \"Get a Premium membership\"" }, "premiumUpdated": { - "message": "You've upgraded to premium." + "message": "You've upgraded to Premium." }, "premiumUpgradeUnlockFeatures": { - "message": "Upgrade your account to a premium membership and unlock some great additional features." + "message": "Upgrade your account to a Premium membership and unlock some great additional features." }, "premiumSignUpStorage": { "message": "1 GB encrypted storage for file attachments." @@ -1780,7 +1786,7 @@ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." }, "premiumSignUpEmergency": { - "message": "Emergency Access" + "message": "Emergency access" }, "premiumSignUpReports": { "message": "Password hygiene, account health, and data breach reports to keep your vault safe." @@ -1792,7 +1798,7 @@ "message": "Priority customer support." }, "premiumSignUpFuture": { - "message": "All future premium features. More coming soon!" + "message": "All future Premium features. More coming soon!" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -1807,10 +1813,10 @@ "message": "Addons" }, "premiumAccess": { - "message": "Premium Access" + "message": "Premium access" }, "premiumAccessDesc": { - "message": "You can add premium access to all members of your organization for $PRICE$ /$INTERVAL$.", + "message": "You can add Premium access to all members of your organization for $PRICE$ /$INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -1823,7 +1829,7 @@ } }, "additionalStorageGb": { - "message": "Additional Storage (GB)" + "message": "Additional storage (GB)" }, "additionalStorageGbDesc": { "message": "# of additional GB" @@ -1880,34 +1886,34 @@ "message": "Your plan comes with a free 7 day trial. Your payment method will not be charged until the trial has ended. You may cancel at any time." }, "paymentInformation": { - "message": "Payment Information" + "message": "Payment information" }, "billingInformation": { - "message": "Billing Information" + "message": "Billing information" }, "billingTrialSubLabel": { "message": "Your payment method will not be charged during the 7 day free trial." }, "creditCard": { - "message": "Credit Card" + "message": "Credit card" }, "paypalClickSubmit": { - "message": "Click the PayPal button to log into your PayPal account, then click the Submit button below to continue." + "message": "Select the PayPal button to log into your PayPal account, then click the Submit button below to continue." }, "cancelSubscription": { - "message": "Cancel Subscription" + "message": "Cancel subscription" }, "subscriptionCanceled": { "message": "The subscription has been canceled." }, "pendingCancellation": { - "message": "Pending Cancellation" + "message": "Pending cancellation" }, "subscriptionPendingCanceled": { "message": "The subscription has been marked for cancellation at the end of the current billing period." }, "reinstateSubscription": { - "message": "Reinstate Subscription" + "message": "Reinstate subscription" }, "reinstateConfirmation": { "message": "Are you sure you want to remove the pending cancellation request and reinstate your subscription?" @@ -1919,40 +1925,40 @@ "message": "Are you sure you want to cancel? You will lose access to all of this subscription's features at the end of this billing cycle." }, "canceledSubscription": { - "message": "The subscription has been canceled." + "message": "Subscription canceled" }, "neverExpires": { - "message": "Never Expires" + "message": "Never expires" }, "status": { "message": "Status" }, "nextCharge": { - "message": "Next Charge" + "message": "Next charge" }, "details": { "message": "Details" }, "downloadLicense": { - "message": "Download License" + "message": "Download license" }, "updateLicense": { - "message": "Update License" + "message": "Update license" }, "updatedLicense": { "message": "Updated license" }, "manageSubscription": { - "message": "Manage Subscription" + "message": "Manage subscription" }, "storage": { "message": "Storage" }, "addStorage": { - "message": "Add Storage" + "message": "Add storage" }, "removeStorage": { - "message": "Remove Storage" + "message": "Remove storage" }, "subscriptionStorage": { "message": "Your subscription has a total of $MAX_STORAGE$ GB of encrypted file storage. You are currently using $USED_STORAGE$.", @@ -1968,16 +1974,16 @@ } }, "paymentMethod": { - "message": "Payment Method" + "message": "Payment method" }, "noPaymentMethod": { "message": "No payment method on file." }, "addPaymentMethod": { - "message": "Add Payment Method" + "message": "Add payment method" }, "changePaymentMethod": { - "message": "Change Payment Method" + "message": "Change payment method" }, "invoices": { "message": "Invoices" @@ -2018,10 +2024,10 @@ } }, "gbStorageAdd": { - "message": "GB of Storage To Add" + "message": "GB of storage to add" }, "gbStorageRemove": { - "message": "GB of Storage To Remove" + "message": "GB of storage to remove" }, "storageAddNote": { "message": "Adding storage will result in adjustments to your billing totals and immediately charge your payment method on file. The first charge will be prorated for the remainder of the current billing cycle." @@ -2039,7 +2045,7 @@ } }, "contactSupport": { - "message": "Contact Customer Support" + "message": "Contact customer support" }, "updatedPaymentMethod": { "message": "Updated payment method." @@ -2048,7 +2054,7 @@ "message": "Purchase Premium" }, "licenseFile": { - "message": "License File" + "message": "License file" }, "licenseFileDesc": { "message": "Your license file will be named something like $FILE_NAME$", @@ -2060,7 +2066,7 @@ } }, "uploadLicenseFilePremium": { - "message": "To upgrade your account to a premium membership you need to upload a valid license file." + "message": "To upgrade your account to a Premium membership you need to upload a valid license file." }, "uploadLicenseFileOrg": { "message": "To create an on-premises hosted organization you need to upload a valid license file." @@ -2072,31 +2078,31 @@ "message": "Organizations allow you to share parts of your vault with others as well as manage related users for a specific entity such as a family, small team, or large company." }, "generalInformation": { - "message": "General Information" + "message": "General information" }, "organizationName": { - "message": "Organization Name" + "message": "Organization name" }, "accountOwnedBusiness": { "message": "This account is owned by a business." }, "billingEmail": { - "message": "Billing Email" + "message": "Billing email" }, "businessName": { - "message": "Business Name" + "message": "Business name" }, "chooseYourPlan": { - "message": "Choose Your Plan" + "message": "Choose your plan" }, "users": { "message": "Users" }, "userSeats": { - "message": "User Seats" + "message": "User seats" }, "additionalUserSeats": { - "message": "Additional User Seats" + "message": "Additional user seats" }, "userSeatsDesc": { "message": "# of user seats" @@ -2149,7 +2155,7 @@ "message": "For businesses and other large organizations." }, "freeForever": { - "message": "Free Forever" + "message": "Free forever" }, "includesXUsers": { "message": "includes $COUNT$ users", @@ -2161,7 +2167,7 @@ } }, "additionalUsers": { - "message": "Additional Users" + "message": "Additional users" }, "costPerUser": { "message": "$COST$ per user", @@ -2203,7 +2209,7 @@ "message": "Add and share with unlimited users" }, "createUnlimitedCollections": { - "message": "Create unlimited Collections" + "message": "Create unlimited collections" }, "gbEncryptedFileStorage": { "message": "$SIZE$ encrypted file storage", @@ -2218,13 +2224,13 @@ "message": "On-premise hosting (optional)" }, "usersGetPremium": { - "message": "Users get access to Premium Features" + "message": "Users get access to Premium features" }, "controlAccessWithGroups": { - "message": "Control user access with Groups" + "message": "Control user access with groups" }, "syncUsersFromDirectory": { - "message": "Sync your users and Groups from a directory" + "message": "Sync your users and groups from a directory" }, "trackAuditLogs": { "message": "Track user actions with audit logs" @@ -2275,16 +2281,16 @@ "message": "Annual" }, "basePrice": { - "message": "Base Price" + "message": "Base price" }, "organizationCreated": { - "message": "Organization Created" + "message": "Organization created" }, "organizationReadyToGo": { "message": "Your new organization is ready to go!" }, "organizationUpgraded": { - "message": "Your organization has been upgraded." + "message": "Organization upgraded" }, "leave": { "message": "Leave" @@ -2293,22 +2299,22 @@ "message": "Are you sure you want to leave this organization?" }, "leftOrganization": { - "message": "You have left the organization." + "message": "You left the organization" }, "defaultCollection": { - "message": "Default Collection" + "message": "Default collection" }, "getHelp": { - "message": "Get Help" + "message": "Get help" }, "getApps": { - "message": "Get the Apps" + "message": "Get the apps" }, "loggedInAs": { "message": "Logged in as" }, "eventLogs": { - "message": "Event Logs" + "message": "Event logs" }, "people": { "message": "People" @@ -2317,22 +2323,22 @@ "message": "Policies" }, "singleSignOn": { - "message": "Single Sign-On" + "message": "Single sign-on" }, "editPolicy": { - "message": "Edit Policy" + "message": "Edit policy" }, "groups": { "message": "Groups" }, "newGroup": { - "message": "New Group" + "message": "New group" }, "addGroup": { - "message": "Add Group" + "message": "Add group" }, "editGroup": { - "message": "Edit Group" + "message": "Edit group" }, "deleteGroupConfirmation": { "message": "Are you sure you want to delete this group?" @@ -2347,16 +2353,16 @@ "message": "When a member is revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab." }, "removeUserConfirmationKeyConnector": { - "message": "Warning! This user requires Key Connector to manage their encryption. Removing this user from your organization will permanently disable their account. This action cannot be undone. Do you want to proceed?" + "message": "Warning! This user requires Key Connector to manage their encryption. Removing this user from your organization will permanently deactivate their account. This action cannot be undone. Do you want to proceed?" }, "externalId": { - "message": "External Id" + "message": "External id" }, "externalIdDesc": { "message": "The external id can be used as a reference or to link this resource to an external system such as a user directory." }, "accessControl": { - "message": "Access Control" + "message": "Access control" }, "groupAccessAllItems": { "message": "This group can access and modify all items." @@ -2365,25 +2371,25 @@ "message": "This group can access only the selected collections." }, "readOnly": { - "message": "Read Only" + "message": "Read only" }, "newCollection": { - "message": "New Collection" + "message": "New collection" }, "addCollection": { - "message": "Add Collection" + "message": "Add collection" }, "editCollection": { - "message": "Edit Collection" + "message": "Edit collection" }, "deleteCollectionConfirmation": { "message": "Are you sure you want to delete this collection?" }, "editUser": { - "message": "Edit User" + "message": "Edit user" }, "inviteUser": { - "message": "Invite User" + "message": "Invite user" }, "inviteUserDesc": { "message": "Invite a new user to your organization by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." @@ -2419,7 +2425,7 @@ "message": "Confirmed" }, "clientOwnerEmail": { - "message": "Client Owner Email" + "message": "Client owner email" }, "owner": { "message": "Owner" @@ -2464,7 +2470,7 @@ "message": "Unknown" }, "loadMore": { - "message": "Load More" + "message": "Load more" }, "mobile": { "message": "Mobile", @@ -2479,22 +2485,22 @@ "description": "Desktop app" }, "webVault": { - "message": "Web Vault" + "message": "Web vault" }, "loggedIn": { - "message": "Logged in." + "message": "Logged in" }, "changedPassword": { - "message": "Changed account password." + "message": "Account password saved" }, "enabledUpdated2fa": { - "message": "Enabled/updated two-step login." + "message": "Two-step login saved" }, "disabled2fa": { - "message": "Disabled two-step login." + "message": "Two-step login turned off" }, "recovered2fa": { - "message": "Recovered account from two-step login." + "message": "Account recovered from two-step login" }, "failedLogin": { "message": "Login attempt failed with incorrect password." @@ -2503,13 +2509,13 @@ "message": "Login attempt failed with incorrect two-step login." }, "exportedVault": { - "message": "Exported vault." + "message": "Vault exported" }, "exportedOrganizationVault": { - "message": "Exported organization vault." + "message": "Organization vault exported" }, "editedOrgSettings": { - "message": "Edited organization settings." + "message": "Organization settings saved" }, "createdItemId": { "message": "Created item $ID$.", @@ -2851,28 +2857,28 @@ "message": "An error has occurred." }, "userAccess": { - "message": "User Access" + "message": "User access" }, "userType": { - "message": "User Type" + "message": "User type" }, "groupAccess": { - "message": "Group Access" + "message": "Group access" }, "groupAccessUserDesc": { "message": "Edit the groups that this user belongs to." }, "invitedUsers": { - "message": "Invited user(s)." + "message": "User(s) invited" }, "resendInvitation": { - "message": "Resend Invitation" + "message": "Resend invitation" }, "resendEmail": { - "message": "Resend Email" + "message": "Resend email" }, "hasBeenReinvited": { - "message": "$USER$ has been reinvited.", + "message": "$USER$ reinvited", "placeholders": { "user": { "content": "$1", @@ -2884,10 +2890,10 @@ "message": "Confirm" }, "confirmUser": { - "message": "Confirm User" + "message": "Confirm user" }, "hasBeenConfirmed": { - "message": "$USER$ has been confirmed.", + "message": "$USER$ confirmed.", "placeholders": { "user": { "content": "$1", @@ -2896,19 +2902,19 @@ } }, "confirmUsers": { - "message": "Confirm Users" + "message": "Confirm users" }, "usersNeedConfirmed": { "message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the organization until they are confirmed." }, "startDate": { - "message": "Start Date" + "message": "Start date" }, "endDate": { - "message": "End Date" + "message": "End date" }, "verifyEmail": { - "message": "Verify Email" + "message": "Verify email" }, "verifyEmailDesc": { "message": "Verify your account's email address to unlock access to all features." @@ -2920,31 +2926,31 @@ "message": "Check your email inbox for a verification link." }, "emailVerified": { - "message": "Your email has been verified." + "message": "Account email verified" }, "emailVerifiedFailed": { "message": "Unable to verify your email. Try sending a new verification email." }, "emailVerificationRequired": { - "message": "Email Verification Required" + "message": "Email verification required" }, "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature." }, "updateBrowser": { - "message": "Update Browser" + "message": "Update browser" }, "updateBrowserDesc": { "message": "You are using an unsupported web browser. The web vault may not function properly." }, "joinOrganization": { - "message": "Join Organization" + "message": "Join organization" }, "joinOrganizationDesc": { "message": "You've been invited to join the organization listed above. To accept the invitation, you need to log in or create a new Bitwarden account." }, "inviteAccepted": { - "message": "Invitation Accepted" + "message": "Invitation accepted" }, "inviteAcceptedDesc": { "message": "You can access this organization once an administrator confirms your membership. We'll send you an email when that happens." @@ -2957,7 +2963,7 @@ "placeholders": { "description": { "content": "$1", - "example": "You must enable 2FA on your user account before you can join this organization." + "example": "You must set up 2FA on your user account before you can join this organization." } } }, @@ -2965,13 +2971,13 @@ "message": "Remember email" }, "recoverAccountTwoStepDesc": { - "message": "If you cannot access your account through your normal two-step login methods, you can use your two-step login recovery code to disable all two-step providers on your account." + "message": "If you cannot access your account through your normal two-step login methods, you can use your two-step login recovery code to turn off all two-step providers on your account." }, "recoverAccountTwoStep": { - "message": "Recover Account Two-Step Login" + "message": "Recover account two-step login" }, "twoStepRecoverDisabled": { - "message": "Two-step login has been disabled on your account." + "message": "Two-step login turned off on your account." }, "learnMore": { "message": "Learn more" @@ -2983,13 +2989,13 @@ "message": "If your account exists, we've sent you an email with further instructions." }, "deleteRecoverConfirmDesc": { - "message": "You have requested to delete your Bitwarden account. Click the button below to confirm." + "message": "You have requested to delete your Bitwarden account. Use the button below to confirm." }, "myOrganization": { - "message": "My Organization" + "message": "My organization" }, "deleteOrganization": { - "message": "Delete Organization" + "message": "Delete organization" }, "deletingOrganizationContentWarning": { "message": "Enter the master password to confirm deletion of $ORGANIZATION$ and all associated data. Vault data in $ORGANIZATION$ includes:", @@ -3013,31 +3019,31 @@ } }, "organizationDeleted": { - "message": "Organization Deleted" + "message": "Organization deleted" }, "organizationDeletedDesc": { "message": "The organization and all associated data has been deleted." }, "organizationUpdated": { - "message": "Organization updated" + "message": "Organization saved" }, "taxInformation": { - "message": "Tax Information" + "message": "Tax information" }, "taxInformationDesc": { "message": "For customers within the US, ZIP code is required to satisfy sales tax requirements, for other countries you may optionally provide a tax identification number (VAT/GST) and/or address to appear on your invoices." }, "billingPlan": { "message": "Plan", - "description": "A billing plan/package. For example: families, teams, enterprise, etc." + "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { - "message": "Upgrade Plan", - "description": "A billing plan/package. For example: families, teams, enterprise, etc." + "message": "Upgrade plan", + "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlanUpgrade": { "message": "Upgrade your account to another plan by providing the information below. Please ensure that you have an active payment method added to the account.", - "description": "A billing plan/package. For example: families, teams, enterprise, etc." + "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "invoiceNumber": { "message": "Invoice #$NUMBER$", @@ -3050,13 +3056,13 @@ } }, "viewInvoice": { - "message": "View Invoice" + "message": "View invoice" }, "downloadInvoice": { - "message": "Download Invoice" + "message": "Download invoice" }, "verifyBankAccount": { - "message": "Verify Bank Account" + "message": "Verify bank account" }, "verifyBankAccountDesc": { "message": "We have made two micro-deposits to your bank account (it may take 1-2 business days to show up). Enter these amounts to verify the bank account." @@ -3065,13 +3071,13 @@ "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make two micro-deposits within the next 1-2 business days. Enter these amounts on the organization's billing page to verify the bank account." }, "verifyBankAccountFailureWarning": { - "message": "Failure to verify the bank account will result in a missed payment and your subscription being disabled." + "message": "Failure to verify the bank account will result in a missed payment and your subscription being suspended." }, "verifiedBankAccount": { - "message": "Bank account has been verified." + "message": "Bank account verified" }, "bankAccount": { - "message": "Bank Account" + "message": "Bank account" }, "amountX": { "message": "Amount $COUNT$", @@ -3084,23 +3090,23 @@ } }, "routingNumber": { - "message": "Routing Number", + "message": "Routing number", "description": "Bank account routing number" }, "accountNumber": { - "message": "Account Number" + "message": "Account number" }, "accountHolderName": { - "message": "Account Holder Name" + "message": "Account holder name" }, "bankAccountType": { - "message": "Account Type" + "message": "Account type" }, "bankAccountTypeCompany": { - "message": "Company (Business)" + "message": "Company (business)" }, "bankAccountTypeIndividual": { - "message": "Individual (Personal)" + "message": "Individual (personal)" }, "enterInstallationId": { "message": "Enter your installation id" @@ -3109,18 +3115,18 @@ "message": "Set a seat limit for your subscription. Once this limit is reached, you will not be able to invite new users." }, "maxSeatLimit": { - "message": "Maximum Seat Limit (optional)", + "message": "Seat Limit (optional)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { "message": "Max potential seat cost" }, "addSeats": { - "message": "Add Seats", + "message": "Add seats", "description": "Seat = User Seat" }, "removeSeats": { - "message": "Remove Seats", + "message": "Remove seats", "description": "Seat = User Seat" }, "subscriptionDesc": { @@ -3136,16 +3142,16 @@ } }, "limitSubscription": { - "message": "Limit Subscription (Optional)" + "message": "Limit subscription (optional)" }, "subscriptionSeats": { - "message": "Subscription Seats" + "message": "Subscription seats" }, "subscriptionUpdated": { "message": "Subscription updated" }, "additionalOptions": { - "message": "Additional Options" + "message": "Additional options" }, "additionalOptionsDesc": { "message": "For additional help in managing your subscription, please contact Customer Support." @@ -3199,10 +3205,10 @@ } }, "seatsToAdd": { - "message": "Seats To Add" + "message": "Seats to add" }, "seatsToRemove": { - "message": "Seats To Remove" + "message": "Seats to remove" }, "seatsAddNote": { "message": "Adding user seats will result in adjustments to your billing totals and immediately charge your payment method on file. The first charge will be prorated for the remainder of the current billing cycle." @@ -3220,13 +3226,13 @@ } }, "keyUpdated": { - "message": "Key Updated" + "message": "Key updated" }, "updateKeyTitle": { - "message": "Update Key" + "message": "Update key" }, "updateEncryptionKey": { - "message": "Update Encryption Key" + "message": "Update encryption key" }, "updateEncryptionKeyShortDesc": { "message": "You are currently using an outdated encryption scheme." @@ -3250,13 +3256,13 @@ "message": "Upgrade" }, "upgradeOrganization": { - "message": "Upgrade Organization" + "message": "Upgrade organization" }, "upgradeOrganizationDesc": { "message": "This feature is not available for free organizations. Switch to a paid plan to unlock more features." }, "createOrganizationStep1": { - "message": "Create Organization: Step 1" + "message": "Create organization: Step 1" }, "createOrganizationCreatePersonalAccount": { "message": "Before creating your organization, you first need to create a free personal account." @@ -3313,15 +3319,19 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { - "message": "Password Updated", + "message": "Password updated", "description": "ex. Date this password was updated" }, "organizationIsDisabled": { - "message": "Organization is disabled." + "message": "Organization suspended" }, "disabledOrganizationFilterError": { - "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." }, "licenseIsExpired": { "message": "License is expired." @@ -3355,7 +3365,7 @@ "description": "ex. A very weak password. Scale: Very Weak -> Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak Master Password" + "message": "Weak master password" }, "weakMasterPasswordDesc": { "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" @@ -3364,7 +3374,7 @@ "message": "Also rotate my account's encryption key" }, "rotateEncKeyTitle": { - "message": "Rotate Encryption Key" + "message": "Rotate encryption key" }, "rotateEncKeyConfirmation": { "message": "Are you sure you want to rotate your account's encryption key?" @@ -3397,7 +3407,7 @@ "message": "Fingerprint phrase" }, "dontAskFingerprintAgain": { - "message": "Never prompt to verify fingerprint phrases for invited users (Not recommended)", + "message": "Never prompt to verify fingerprint phrases for invited users (not recommended)", "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." }, "free": { @@ -3427,10 +3437,10 @@ "description": "'OAuth 2.0' is a programming protocol. It should probably not be translated." }, "viewApiKey": { - "message": "View API Key" + "message": "View API key" }, "rotateApiKey": { - "message": "Rotate API Key" + "message": "Rotate API key" }, "selectOneCollection": { "message": "You must select at least one collection." @@ -3439,7 +3449,7 @@ "message": "We were not able to charge your card. Please view and pay the unpaid invoice listed below." }, "inAppPurchase": { - "message": "In-app Purchase" + "message": "In-app purchase" }, "cannotPerformInAppPurchase": { "message": "You cannot perform this action while using an in-app purchase payment method." @@ -3448,7 +3458,7 @@ "message": "You must manage your subscription from the store where your in-app purchase was made." }, "minLength": { - "message": "Minimum Length" + "message": "Minimum length" }, "clone": { "message": "Clone" @@ -3466,10 +3476,10 @@ "message": "Require members to set up two-step login." }, "twoStepLoginPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and do not have two-step login turned on for their account will be removed from the organization and will receive an email notifying them about the change." + "message": "Organization members who are not owners or admins and do not have two-step login setup for their account will be removed from the organization and will receive an email notifying them about the change." }, "twoStepLoginPolicyUserWarning": { - "message": "You are a member of an organization that requires two-step login to be enabled on your user account. If you disable all two-step login providers you will be automatically removed from these organizations." + "message": "You are a member of an organization that requires two-step login to be setup on your user account. If you turn off all two-step login providers you will be automatically removed from these organizations." }, "passwordGeneratorPolicyDesc": { "message": "Set requirements for password generator." @@ -3520,13 +3530,13 @@ "message": "Your new master password does not meet the policy requirements." }, "minimumNumberOfWords": { - "message": "Minimum Number of Words" + "message": "Minimum number of words" }, "defaultType": { - "message": "Default Type" + "message": "Default type" }, "userPreference": { - "message": "User Preference" + "message": "User preference" }, "vaultTimeoutAction": { "message": "Vault timeout action" @@ -3546,25 +3556,25 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "Search Trash" + "message": "Search trash" }, "permanentlyDelete": { - "message": "Permanently Delete" + "message": "Permanently delete" }, "permanentlyDeleteSelected": { - "message": "Permanently Delete Selected" + "message": "Permanently delete selected" }, "permanentlyDeleteItem": { - "message": "Permanently Delete Item" + "message": "Permanently delete item" }, "permanentlyDeleteItemConfirmation": { "message": "Are you sure you want to permanently delete this item?" }, "permanentlyDeletedItem": { - "message": "Permanently Deleted item" + "message": "Item permanently deleted" }, "permanentlyDeletedItems": { - "message": "Permanently Deleted items" + "message": "Items permanently deleted" }, "permanentlyDeleteSelectedItemsDesc": { "message": "You have selected $COUNT$ item(s) to permanently delete. Are you sure you want to permanently delete all of these items?", @@ -3576,7 +3586,7 @@ } }, "permanentlyDeletedItemId": { - "message": "Permanently Deleted item $ID$.", + "message": "Item $ID$ permanently deleted", "placeholders": { "id": { "content": "$1", @@ -3588,16 +3598,16 @@ "message": "Restore" }, "restoreSelected": { - "message": "Restore Selected" + "message": "Restore selected" }, "restoreItem": { - "message": "Restore Item" + "message": "Restore item" }, "restoredItem": { - "message": "Restored Item" + "message": "Item restored" }, "restoredItems": { - "message": "Restored Items" + "message": "Items restored" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" @@ -3615,7 +3625,7 @@ } }, "restoredItemId": { - "message": "Restored item $ID$.", + "message": "Item $ID$ restored", "placeholders": { "id": { "content": "$1", @@ -3627,10 +3637,10 @@ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout Action Confirmation" + "message": "Timeout action confirmation" }, "hidePasswords": { - "message": "Hide Passwords" + "message": "Hide passwords" }, "countryPostalCodeRequiredDesc": { "message": "We require this information for calculating sales tax and financial reporting only." @@ -3645,7 +3655,7 @@ "message": "Tax information updated." }, "setMasterPassword": { - "message": "Set Master Password" + "message": "Set master password" }, "ssoCompleteRegistration": { "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." @@ -3654,13 +3664,13 @@ "message": "Identifier" }, "organizationIdentifier": { - "message": "Organization Identifier" + "message": "Organization identifier" }, "ssoLogInWithOrgIdentifier": { "message": "Log in using your organization's single sign-on portal. Please enter your organization's identifier to begin." }, "enterpriseSingleSignOn": { - "message": "Enterprise Single Sign-On" + "message": "Enterprise single sign-on" }, "ssoHandOff": { "message": "You may now close this tab and continue in the extension." @@ -3672,13 +3682,13 @@ "message": "SSO Authentication via SAML2.0 and OpenID Connect" }, "includeEnterprisePolicies": { - "message": "Enterprise Policies" + "message": "Enterprise policies" }, "ssoValidationFailed": { - "message": "SSO Validation Failed" + "message": "SSO validation failed" }, "ssoIdentifierRequired": { - "message": "Organization Identifier is required." + "message": "Organization identifier is required." }, "unlinkSso": { "message": "Unlink SSO" @@ -3699,25 +3709,25 @@ "message": "Your current organization has a policy that does not allow you to join more than one organization. Please contact your organization admins or sign up from a different Bitwarden account." }, "singleOrgPolicyWarning": { - "message": "Organization members who are not Owners or Administrators and are already a member of another organization will be removed from your organization." + "message": "Organization members who are not owners or admins and are already a member of another organization will be removed from your organization." }, "requireSso": { "message": "Require single sign-on authentication" }, "requireSsoPolicyDesc": { - "message": "Require members to log in with the Enterprise Single Sign-On method." + "message": "Require members to log in with the Enterprise single sign-on method." }, "prerequisite": { "message": "Prerequisite" }, "requireSsoPolicyReq": { - "message": "The Single Organization enterprise policy must be turned on before activating this policy." + "message": "The single organization Enterprise policy must be turned on before activating this policy." }, "requireSsoPolicyReqError": { - "message": "Single Organization policy not enabled." + "message": "Single organization policy not set up." }, "requireSsoExemption": { - "message": "Organization Owners and Administrators are exempt from this policy's enforcement." + "message": "Organization owners and admins are exempt from this policy's enforcement." }, "sendTypeFile": { "message": "File" @@ -3726,7 +3736,7 @@ "message": "Text" }, "createSend": { - "message": "Create New Send", + "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -3734,15 +3744,15 @@ "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 saved", "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 saved", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "Deleted Send", + "message": "Send deleted", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { @@ -3758,28 +3768,28 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { - "message": "Deletion Date" + "message": "Deletion date" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration Date" + "message": "Expiration date" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "Maximum Access Count" + "message": "Maximum access count" }, "maxAccessCountDesc": { "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", "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": "Current access count" }, "sendPasswordDesc": { "message": "Optionally require a password for users to access this Send.", @@ -3800,14 +3810,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLink": { - "message": "Copy Send Link", + "message": "Copy Send link", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { - "message": "Remove Password" + "message": "Remove password" }, "removedPassword": { - "message": "Removed Password" + "message": "Password removed" }, "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" @@ -3816,7 +3826,7 @@ "message": "Hide my email address from recipients." }, "disableThisSend": { - "message": "Disable this Send so that no one can access it.", + "message": "Deactivate this Send so that no one can access it.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "allSends": { @@ -3841,15 +3851,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { - "message": "Don't know the password? Ask the Sender for the password needed to access this Send.", + "message": "Don't know the password? Ask the sender for the password needed to access this Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendHiddenByDefault": { - "message": "This send is hidden by default. You can toggle its visibility using the button below.", + "message": "This Send is hidden by default. You can toggle its visibility using the button below.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "downloadFile": { - "message": "Download File" + "message": "Download file" }, "sendAccessUnavailable": { "message": "The Send you are trying to access does not exist or is no longer available.", @@ -3864,13 +3874,13 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "emergencyAccess": { - "message": "Emergency Access" + "message": "Emergency access" }, "emergencyAccessDesc": { "message": "Grant and manage emergency access for trusted contacts. Trusted contacts may request access to either View or Takeover your account in case of an emergency. Visit our help page for more information and details into how zero knowledge sharing works." }, "emergencyAccessOwnerWarning": { - "message": "You are an Owner of one or more organizations. If you give takeover access to an emergency contact, they will be able to use all your permissions as Owner after a takeover." + "message": "You are an owner of one or more organizations. If you give takeover access to an emergency contact, they will be able to use all your permissions as owner after a takeover." }, "trustedEmergencyContacts": { "message": "Trusted emergency contacts" @@ -3897,10 +3907,10 @@ "message": "Invite a new emergency contact by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." }, "emergencyAccessRecoveryInitiated": { - "message": "Emergency Access Initiated" + "message": "Emergency access initiated" }, "emergencyAccessRecoveryApproved": { - "message": "Emergency Access Approved" + "message": "Emergency access approved" }, "viewDesc": { "message": "Can view all items in your own vault." @@ -3912,7 +3922,7 @@ "message": "Can reset your account with a new master password." }, "waitTime": { - "message": "Wait Time" + "message": "Wait time" }, "waitTimeDesc": { "message": "Time required before automatically granting access." @@ -3943,7 +3953,7 @@ "placeholders": { "description": { "content": "$1", - "example": "You must enable 2FA on your user account before you can join this organization." + "example": "You must set up 2FA on your user account before you can join this organization." } } }, @@ -3991,7 +4001,7 @@ } }, "emergencyApproved": { - "message": "Emergency access approved." + "message": "Emergency access approved" }, "emergencyRejected": { "message": "Emergency access rejected" @@ -4012,27 +4022,27 @@ "message": "Require members to save items to an organization by removing the individual vault option." }, "personalOwnershipExemption": { - "message": "Organization Owners and Administrators are exempt from this policy's enforcement." + "message": "Organization owners and administrators are exempt from this policy's enforcement." }, "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": "Due to an Enterprise policy, you are restricted from saving items to your individual vault. Change the ownership option to an organization and choose from available collections." }, "disableSend": { "message": "Remove Send" }, "disableSendPolicyDesc": { - "message": "Do not allow members to create or edit sends.", + "message": "Do not allow members to create or edit Sends.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "sendDisabled": { - "message": "Send disabled", + "message": "Send removed", "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": "Due to an Enterprise policy, you are only able to delete an existing Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { @@ -4047,7 +4057,7 @@ "message": "Organization users that can manage the organization's policies are exempt from this policy's enforcement." }, "disableHideEmail": { - "message": "Always show member’s email address with recipients when creating or editing a send.", + "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyInEffect": { @@ -4088,55 +4098,55 @@ "message": "Admin Permissions" }, "accessEventLogs": { - "message": "Access Event Logs" + "message": "Access event logs" }, "accessImportExport": { - "message": "Access Import/Export" + "message": "Access import/export" }, "accessReports": { - "message": "Access Reports" + "message": "Access reports" }, "missingPermissions": { "message": "You lack the necessary permissions to perform this action." }, "manageAllCollections": { - "message": "Manage All Collections" + "message": "Manage all collections" }, "createNewCollections": { - "message": "Create New Collections" + "message": "Create new collections" }, "editAnyCollection": { - "message": "Edit Any Collection" + "message": "Edit any collection" }, "deleteAnyCollection": { - "message": "Delete Any Collection" + "message": "Delete any collection" }, "manageAssignedCollections": { - "message": "Manage Assigned Collections" + "message": "Manage assigned collections" }, "editAssignedCollections": { - "message": "Edit Assigned Collections" + "message": "Edit assigned collections" }, "deleteAssignedCollections": { - "message": "Delete Assigned Collections" + "message": "Delete assigned collections" }, "manageGroups": { - "message": "Manage Groups" + "message": "Manage groups" }, "managePolicies": { - "message": "Manage Policies" + "message": "Manage policies" }, "manageSso": { "message": "Manage SSO" }, "manageUsers": { - "message": "Manage Users" + "message": "Manage users" }, "manageResetPassword": { - "message": "Manage Password Reset" + "message": "Manage password reset" }, "disableRequiredError": { - "message": "You must manually disable the $POLICYNAME$ policy before this policy can be disabled.", + "message": "You must manually turn the $POLICYNAME$ policy before this policy can be turned off.", "placeholders": { "policyName": { "content": "$1", @@ -4148,10 +4158,10 @@ "message": "An organization policy is affecting your ownership options." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has disabled importing items into your personal vault." + "message": "An organization policy has blocked importing items into your individual vault." }, "personalOwnershipCheckboxDesc": { - "message": "Disable personal ownership for organization users" + "message": "Remove individual ownership for organization users" }, "textHiddenByDefault": { "message": "When accessing the Send, hide the text by default", @@ -4162,10 +4172,10 @@ "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": "The text you want to Send." }, "sendFileDesc": { - "message": "The file you want to send." + "message": "The file you want to Send." }, "copySendLinkOnSave": { "message": "Copy the link to share this Send to my clipboard upon save." @@ -4265,13 +4275,13 @@ "message": "Your password hint cannot be the same as your password." }, "enrollPasswordReset": { - "message": "Enroll in Password Reset" + "message": "Enroll in password reset" }, "enrolledPasswordReset": { - "message": "Enrolled in Password Reset" + "message": "Enrolled in password reset" }, "withdrawPasswordReset": { - "message": "Withdraw from Password Reset" + "message": "Withdraw from password reset" }, "enrollPasswordResetSuccess": { "message": "Enrollment success!" @@ -4307,7 +4317,7 @@ } }, "eventResetSsoLink": { - "message": "Reset Sso link for user $ID$", + "message": "Reset SSO link for user $ID$", "placeholders": { "id": { "content": "$1", @@ -4325,7 +4335,7 @@ } }, "resetPassword": { - "message": "Reset Password" + "message": "Reset password" }, "resetPasswordLoggedOutWarning": { "message": "Proceeding will log $NAME$ out of their current session, requiring them to log back in. Active sessions on other devices may continue to remain active for up to one hour.", @@ -4358,7 +4368,7 @@ "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic Enrollment" + "message": "Automatic enrollment" }, "resetPasswordPolicyAutoEnrollDescription": { "message": "All users will be automatically enrolled in password reset once their invite is accepted and will not be allowed to withdraw." @@ -4370,19 +4380,19 @@ "message": "Require new users to be enrolled automatically" }, "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": "This organization has an Enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." }, "resetPasswordOrgKeysError": { - "message": "Organization Keys response is null" + "message": "Organization keys response is null" }, "resetPasswordDetailsError": { - "message": "Reset Password Details response is null" + "message": "Reset password details response is null" }, "trashCleanupWarning": { - "message": "Items that have been in Trash more than 30 days will be automatically deleted." + "message": "Items that have been in trash more than 30 days will be automatically deleted." }, "trashCleanupWarningSelfHosted": { - "message": "Items that have been in Trash for a while will be automatically deleted." + "message": "Items that have been in trash for a while will be automatically deleted." }, "passwordPrompt": { "message": "Master password re-prompt" @@ -4394,7 +4404,7 @@ "message": "This action is protected. To continue, please re-enter your master password to verify your identity." }, "reinviteSelected": { - "message": "Resend Invitations" + "message": "Resend invitations" }, "resendNotification": { "message": "Resend notification" @@ -4418,7 +4428,7 @@ "message": "Choose a theme for your web vault." }, "themeSystem": { - "message": "Use System Theme" + "message": "Use system theme" }, "themeDark": { "message": "Dark" @@ -4427,16 +4437,16 @@ "message": "Light" }, "confirmSelected": { - "message": "Confirm Selected" + "message": "Confirm selected" }, "bulkConfirmStatus": { "message": "Bulk action status" }, "bulkConfirmMessage": { - "message": "Confirmed successfully." + "message": "Confirmed successfully" }, "bulkReinviteMessage": { - "message": "Reinvited successfully." + "message": "Reinvited successfully" }, "bulkRemovedMessage": { "message": "Removed successfully" @@ -4448,85 +4458,85 @@ "message": "Restored organization access successfully" }, "bulkFilteredMessage": { - "message": "Excluded, not applicable for this action." + "message": "Excluded, not applicable for this action" }, "fingerprint": { "message": "Fingerprint" }, "removeUsers": { - "message": "Remove Users" + "message": "Remove users" }, "revokeUsers": { - "message": "Revoke Users" + "message": "Revoke users" }, "restoreUsers": { - "message": "Restore Users" + "message": "Restore users" }, "error": { "message": "Error" }, "resetPasswordManageUsers": { - "message": "Manage Users must also be enabled with the Manage Password Reset permission" + "message": "Manage users must also be granted with the manage password reset permission" }, "setupProvider": { - "message": "Provider Setup" + "message": "Provider setup" }, "setupProviderLoginDesc": { - "message": "You've been invited to setup a new provider. To continue, you need to log in or create a new Bitwarden account." + "message": "You've been invited to setup a new Provider. To continue, you need to log in or create a new Bitwarden account." }, "setupProviderDesc": { - "message": "Please enter the details below to complete the provider setup. Contact Customer Support if you have any questions." + "message": "Please enter the details below to complete the Provider setup. Contact Customer Support if you have any questions." }, "providerName": { - "message": "Provider Name" + "message": "Provider name" }, "providerSetup": { - "message": "The provider has been set up." + "message": "Provider successfully set up" }, "clients": { "message": "Clients" }, "providerAdmin": { - "message": "Provider Admin" + "message": "Provider admin" }, "providerAdminDesc": { - "message": "The highest access user that can manage all aspects of your provider as well as access and manage client organizations." + "message": "The highest access user that can manage all aspects of your Provider as well as access and manage client organizations." }, "serviceUser": { - "message": "Service User" + "message": "Service user" }, "serviceUserDesc": { "message": "Service users can access and manage all client organizations." }, "providerInviteUserDesc": { - "message": "Invite a new user to your provider by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." + "message": "Invite a new user to your Provider by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." }, "joinProvider": { "message": "Join Provider" }, "joinProviderDesc": { - "message": "You've been invited to join the provider listed above. To accept the invitation, you need to log in or create a new Bitwarden account." + "message": "You've been invited to join the Provider listed above. To accept the invitation, you need to log in or create a new Bitwarden account." }, "providerInviteAcceptFailed": { - "message": "Unable to accept invitation. Ask a provider admin to send a new invitation." + "message": "Unable to accept invitation. Ask a Provider admin to send a new invitation." }, "providerInviteAcceptedDesc": { - "message": "You can access this provider once an administrator confirms your membership. We'll send you an email when that happens." + "message": "You can access this Provider once an administrator confirms your membership. We'll send you an email when that happens." }, "providerUsersNeedConfirmed": { - "message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the provider until they are confirmed." + "message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the Provider until they are confirmed." }, "provider": { "message": "Provider" }, "newClientOrganization": { - "message": "New Client Organization" + "message": "New client organization" }, "newClientOrganizationDesc": { - "message": "Create a new client organization that will be associated with you as the provider. You will be able to access and manage this organization." + "message": "Create a new client organization that will be associated with you as the Provider. You will be able to access and manage this organization." }, "addExistingOrganization": { - "message": "Add Existing Organization" + "message": "Add existing organization" }, "myProvider": { "message": "My Provider" @@ -4545,10 +4555,10 @@ } }, "organizationJoinedProvider": { - "message": "Organization was successfully added to the provider" + "message": "Organization was successfully added to the Provider" }, "accessingUsingProvider": { - "message": "Accessing organization using provider $PROVIDER$", + "message": "Accessing organization using Provider $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -4557,13 +4567,13 @@ } }, "providerIsDisabled": { - "message": "Provider is disabled." + "message": "Provider suspended" }, "providerUpdated": { - "message": "Provider updated" + "message": "Provider saved" }, "yourProviderIs": { - "message": "Your provider is $PROVIDER$. They have administrative and billing privileges for your organization.", + "message": "Your Provider is $PROVIDER$. They have administrative and billing privileges for your organization.", "placeholders": { "provider": { "content": "$1", @@ -4572,7 +4582,7 @@ } }, "detachedOrganization": { - "message": "The organization $ORGANIZATION$ has been detached from your provider.", + "message": "The organization $ORGANIZATION$ has been detached from your Provider.", "placeholders": { "organization": { "content": "$1", @@ -4581,22 +4591,22 @@ } }, "detachOrganizationConfirmation": { - "message": "Are you sure you want to detach this organization? The organization will continue to exist but will no longer be managed by the provider." + "message": "Are you sure you want to detach this organization? The organization will continue to exist but will no longer be managed by the Provider." }, "add": { "message": "Add" }, "updatedMasterPassword": { - "message": "Updated Master Password" + "message": "Master password saved" }, "updateMasterPassword": { - "message": "Update Master Password" + "message": "Update master password" }, "updateMasterPasswordWarning": { - "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update your Master Password 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": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update your master password 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." }, "masterPasswordInvalidWarning": { - "message": "Your Master Password does not meet the policy requirements of this organization. In order to join the organization, you must update your Master Password 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": "Your master password does not meet the policy requirements of this organization. In order to join the organization, you must update your master password 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." }, "maximumVaultTimeout": { "message": "Vault timeout" @@ -4605,10 +4615,10 @@ "message": "Set a maximum vault timeout for members." }, "maximumVaultTimeoutLabel": { - "message": "Maximum Vault Timeout" + "message": "Maximum vault timeout" }, "invalidMaximumVaultTimeout": { - "message": "Invalid Maximum Vault Timeout." + "message": "Invalid maximum vault timeout." }, "hours": { "message": "Hours" @@ -4617,7 +4627,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)", "placeholders": { "hours": { "content": "$1", @@ -4630,7 +4640,7 @@ } }, "customVaultTimeout": { - "message": "Custom Vault Timeout" + "message": "Custom vault timeout" }, "vaultTimeoutToLarge": { "message": "Your vault timeout exceeds the restriction set by your organization." @@ -4639,7 +4649,7 @@ "message": "Minimum custom timeout is 1 minute." }, "vaultTimeoutRangeError": { - "message": "Vault Timeout is not within allowed range." + "message": "Vault timeout is not within allowed range." }, "disablePersonalVaultExport": { "message": "Remove individual vault export" @@ -4648,31 +4658,31 @@ "message": "Do not allow members to export their individual vault data." }, "vaultExportDisabled": { - "message": "Vault Export Disabled" + "message": "Vault export removed" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your personal vault." + "message": "One or more organization policies prevents you from exporting your individual vault." }, "selectType": { - "message": "Select SSO Type" + "message": "Select SSO type" }, "type": { "message": "Type" }, "openIdConnectConfig": { - "message": "OpenID Connect Configuration" + "message": "OpenID connect configuration" }, "samlSpConfig": { - "message": "SAML Service Provider Configuration" + "message": "SAML service provider configuration" }, "samlIdpConfig": { - "message": "SAML Identity Provider Configuration" + "message": "SAML identity provider configuration" }, "callbackPath": { - "message": "Callback Path" + "message": "Callback path" }, "signedOutCallbackPath": { - "message": "Signed Out Callback Path" + "message": "Signed out callback path" }, "authority": { "message": "Authority" @@ -4681,55 +4691,55 @@ "message": "Client ID" }, "clientSecret": { - "message": "Client Secret" + "message": "Client secret" }, "metadataAddress": { - "message": "Metadata Address" + "message": "Metadata address" }, "oidcRedirectBehavior": { - "message": "OIDC Redirect Behavior" + "message": "OIDC redirect behavior" }, "getClaimsFromUserInfoEndpoint": { "message": "Get claims from user info endpoint" }, "additionalScopes": { - "message": "Custom Scopes" + "message": "Custom scopes" }, "additionalUserIdClaimTypes": { - "message": "Custom User ID Claim Types" + "message": "Custom user ID claim types" }, "additionalEmailClaimTypes": { - "message": "Email Claim Types" + "message": "Email claim types" }, "additionalNameClaimTypes": { - "message": "Custom Name Claim Types" + "message": "Custom name claim types" }, "acrValues": { - "message": "Requested Authentication Context Class Reference values" + "message": "Requested authentication context class reference values" }, "expectedReturnAcrValue": { - "message": "Expected \"acr\" Claim Value In Response" + "message": "Expected \"acr\" claim value in response" }, "spEntityId": { - "message": "SP Entity ID" + "message": "SP entity ID" }, "spMetadataUrl": { - "message": "SAML 2.0 Metadata URL" + "message": "SAML 2.0 metadata URL" }, "spAcsUrl": { - "message": "Assertion Consumer Service (ACS) URL" + "message": "Assertion consumer service (ACS) URL" }, "spNameIdFormat": { - "message": "Name ID Format" + "message": "Name ID format" }, "spOutboundSigningAlgorithm": { - "message": "Outbound Signing Algorithm" + "message": "Outbound signing algorithm" }, "spSigningBehavior": { - "message": "Signing Behavior" + "message": "Signing behavior" }, "spMinIncomingSigningAlgorithm": { - "message": "Minimum Incoming Signing Algorithm" + "message": "Minimum incoming signing algorithm" }, "spWantAssertionsSigned": { "message": "Expect signed assertions" @@ -4741,19 +4751,19 @@ "message": "Entity ID" }, "idpBindingType": { - "message": "Binding Type" + "message": "Binding type" }, "idpSingleSignOnServiceUrl": { - "message": "Single Sign On Service URL" + "message": "Single sign-on service URL" }, "idpSingleLogoutServiceUrl": { - "message": "Single Log Out Service URL" + "message": "Single log-out service URL" }, "idpX509PublicCert": { - "message": "X509 Public Certificate" + "message": "X509 public certificate" }, "idpOutboundSigningAlgorithm": { - "message": "Outbound Signing Algorithm" + "message": "Outbound signing algorithm" }, "idpAllowUnsolicitedAuthnResponse": { "message": "Allow unsolicited authentication response" @@ -4765,7 +4775,7 @@ "message": "Sign authentication requests" }, "ssoSettingsSaved": { - "message": "Single Sign-On configuration was saved." + "message": "Single sign-on configuration saved" }, "sponsoredFamilies": { "message": "Free Bitwarden Families" @@ -4810,17 +4820,17 @@ "message": "Accept offer for an existing organization or create a new Families organization." }, "setupSponsoredFamiliesLoginDesc": { - "message": "You've been offered a free Bitwarden Families Plan Organization. To continue, you need to log in to the account that received the offer." + "message": "You've been offered a free Bitwarden Families plan organization. To continue, you need to log in to the account that received the offer." }, "sponsoredFamiliesAcceptFailed": { - "message": "Unable to accept offer. Please resend the offer email from your enterprise account and try again." + "message": "Unable to accept offer. Please resend the offer email from your Enterprise account and try again." }, "sponsoredFamiliesAcceptFailedShort": { "message": "Unable to accept offer. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", - "example": "You must have at least one existing Families Organization." + "example": "You must have at least one existing Families organization." } } }, @@ -4834,7 +4844,7 @@ "message": "Redeemed" }, "redeemedAccount": { - "message": "Redeemed Account" + "message": "Account redeemed" }, "revokeAccount": { "message": "Revoke account $NAME$", @@ -4846,7 +4856,7 @@ } }, "resendEmailLabel": { - "message": "Resend Sponsorship email to $NAME$ sponsorship", + "message": "Resend sponsorship email to $NAME$ sponsorship", "placeholders": { "name": { "content": "$1", @@ -4855,31 +4865,31 @@ } }, "freeFamiliesPlan": { - "message": "Free Families Plan" + "message": "Free Families plan" }, "redeemNow": { - "message": "Redeem Now" + "message": "Redeem now" }, "recipient": { "message": "Recipient" }, "removeSponsorship": { - "message": "Remove Sponsorship" + "message": "Remove sponsorship" }, "removeSponsorshipConfirmation": { "message": "After removing a sponsorship, you will be responsible for this subscription and related invoices. Are you sure you want to continue?" }, "sponsorshipCreated": { - "message": "Sponsorship Created" + "message": "Sponsorship created" }, "emailSent": { - "message": "Email Sent" + "message": "Email sent" }, "revokeSponsorshipConfirmation": { "message": "After removing this account, the Families plan sponsorship will expire at the end of the billing period. You will not be able to redeem a new sponsorship offer until the existing one expires. Are you sure you want to continue?" }, "removeSponsorshipSuccess": { - "message": "Sponsorship Removed" + "message": "Sponsorship removed" }, "ssoKeyConnectorError": { "message": "Key Connector error: make sure Key Connector is available and working correctly." @@ -4891,13 +4901,13 @@ "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send Code" + "message": "Send code" }, "codeSent": { - "message": "Code Sent" + "message": "Code sent" }, "verificationCode": { - "message": "Verification Code" + "message": "Verification code" }, "confirmIdentity": { "message": "Confirm your identity to continue." @@ -4918,13 +4928,13 @@ } }, "leaveOrganization": { - "message": "Leave Organization" + "message": "Leave organization" }, "removeMasterPassword": { - "message": "Remove Master Password" + "message": "Remove master password" }, "removedMasterPassword": { - "message": "Master password removed." + "message": "Master password removed" }, "allowSso": { "message": "Allow SSO authentication" @@ -4948,34 +4958,34 @@ "message": "The require SSO authentication and single organization policies are required to set up Key Connector decryption." }, "memberDecryptionOption": { - "message": "Member Decryption Options" + "message": "Member decryption options" }, "memberDecryptionPassDesc": { - "message": "Once authenticated, members will decrypt vault data using their Master Passwords." + "message": "Once authenticated, members will decrypt vault data using their master passwords." }, "keyConnector": { "message": "Key Connector" }, "memberDecryptionKeyConnectorDesc": { - "message": "Connect Login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their Master Passwords to decrypt vault data. Contact Bitwarden Support for set up assistance." + "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. Contact Bitwarden Support for set up assistance." }, "keyConnectorPolicyRestriction": { - "message": "\"Login with SSO and Key Connector Decryption\" is enabled. This policy will only apply to Owners and Admins." + "message": "\"Login with SSO and Key Connector Decryption\" is activated. This policy will only apply to owners and admins." }, "enabledSso": { - "message": "Enabled SSO" + "message": "SSO turned on" }, "disabledSso": { - "message": "Disabled SSO" + "message": "SSO turned on" }, "enabledKeyConnector": { - "message": "Enabled Key Connector" + "message": "Key Connector activated" }, "disabledKeyConnector": { - "message": "Disabled Key Connector" + "message": "Key Connector deactivated" }, "keyConnectorWarning": { - "message": "Once members begin using Key Connector, your Organization cannot revert to Master Password decryption. Proceed only if you are comfortable deploying and managing a key server." + "message": "Once members begin using Key Connector, your organization cannot revert to master password decryption. Proceed only if you are comfortable deploying and managing a key server." }, "migratedKeyConnector": { "message": "Migrated to Key Connector" @@ -4987,13 +4997,13 @@ "message": "The sponsorship offer has expired. You may delete the organization you created to avoid a charge at the end of your 7 day trial. Otherwise you may close this prompt to keep the organization and assume billing responsibility." }, "newFamiliesOrganization": { - "message": "New Families Organization" + "message": "New Families organization" }, "acceptOffer": { - "message": "Accept Offer" + "message": "Accept offer" }, "sponsoringOrg": { - "message": "Sponsoring Organization" + "message": "Sponsoring organization" }, "keyConnectorTest": { "message": "Test" @@ -5011,55 +5021,55 @@ "message": "FREE with sponsorship" }, "viewBillingSyncToken": { - "message": "View Billing Sync Token" + "message": "View billing sync token" }, "generateBillingSyncToken": { - "message": "Generate Billing Sync Token" + "message": "Generate billing sync token" }, "copyPasteBillingSync": { - "message": "Copy and paste this token into the Billing Sync settings of your self-hosted organization." + "message": "Copy and paste this token into the billing sync settings of your self-hosted organization." }, "billingSyncCanAccess": { - "message": "Your Billing Sync token can access and edit this organization's subscription settings." + "message": "Your billing sync token can access and edit this organization's subscription settings." }, "manageBillingSync": { - "message": "Manage Billing Sync" + "message": "Manage billing sync" }, "setUpBillingSync": { - "message": "Set Up Billing Sync" + "message": "Set up billing sync" }, "generateToken": { - "message": "Generate Token" + "message": "Generate token" }, "rotateToken": { - "message": "Rotate Token" + "message": "Rotate token" }, "rotateBillingSyncTokenWarning": { "message": "If you proceed, you will need to re-setup billing sync on your self-hosted server." }, "rotateBillingSyncTokenTitle": { - "message": "Rotating the Billing Sync Token will invalidate the previous token." + "message": "Rotating the billing sync token will invalidate the previous token." }, "selfHostingTitle": { - "message": "Self-Hosting" + "message": "Self-hosting" }, "selfHostingEnterpriseOrganizationSectionCopy": { "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." }, "billingSyncApiKeyRotated": { - "message": "Token rotated." + "message": "Token rotated" }, "billingSync": { - "message": "Billing Sync" + "message": "Billing sync" }, "billingSyncDesc": { - "message": "Billing Sync provides Free Families plans for members and advanced billing capabilities by linking your self-hosted Bitwarden to the Bitwarden cloud server." + "message": "Billing sync provides Free Families plans for members and advanced billing capabilities by linking your self-hosted Bitwarden to the Bitwarden cloud server." }, "billingSyncKeyDesc": { - "message": "A Billing Sync Token from your cloud organization's subscription settings is required to complete this form." + "message": "A billing sync token from your cloud organization's subscription settings is required to complete this form." }, "billingSyncKey": { - "message": "Billing Sync Token" + "message": "Billing sync token" }, "active": { "message": "Active" @@ -5068,13 +5078,13 @@ "message": "Inactive" }, "sentAwaitingSync": { - "message": "Sent (Awaiting Sync)" + "message": "Sent (awaiting sync)" }, "sent": { "message": "Sent" }, "requestRemoved": { - "message": "Removed (Awaiting Sync)" + "message": "Removed (awaiting sync)" }, "requested": { "message": "Requested" @@ -5107,7 +5117,7 @@ "message": "Required if Entity ID is not a URL." }, "openIdOptionalCustomizations": { - "message": "Optional Customizations" + "message": "Optional customizations" }, "openIdAuthorityRequired": { "message": "Required if Authority is not valid." @@ -5119,13 +5129,13 @@ "message": "Your session has timed out. Please go back and try logging in again." }, "exportingPersonalVaultTitle": { - "message": "Exporting Personal Vault" + "message": "Exporting individual vault" }, "exportingOrganizationVaultTitle": { - "message": "Exporting Organization Vault" + "message": "Exporting organization vault" }, "exportingPersonalVaultDescription": { - "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", "placeholders": { "email": { "content": "$1", @@ -5134,7 +5144,7 @@ } }, "exportingOrganizationVaultDescription": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Personal vault items and items from other organizations will not be included.", + "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Individual vault items and items from other organizations will not be included.", "placeholders": { "organization": { "content": "$1", @@ -5143,10 +5153,10 @@ } }, "accessDenied": { - "message": "Access Denied. You do not have permission to view this page." + "message": "Access denied. You do not have permission to view this page." }, "masterPassword": { - "message": "Master Password" + "message": "Master password" }, "security": { "message": "Security" @@ -5155,10 +5165,10 @@ "message": "Keys" }, "billingHistory": { - "message": "Billing History" + "message": "Billing history" }, "backToReports": { - "message": "Back to Reports" + "message": "Back to reports" }, "organizationPicker": { "message": "Organization picker" @@ -5168,7 +5178,7 @@ "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountSettings": { - "message": "Account Settings" + "message": "Account settings" }, "generator": { "message": "Generator" @@ -5177,26 +5187,26 @@ "message": "What would you like to generate?" }, "passwordType": { - "message": "Password Type" + "message": "Password type" }, "regenerateUsername": { - "message": "Regenerate Username" + "message": "Regenerate username" }, "generateUsername": { - "message": "Generate Username" + "message": "Generate username" }, "usernameType": { - "message": "Username Type" + "message": "Username type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email", + "message": "Plus addressed email", "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." }, "catchallEmail": { - "message": "Catch-all Email" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Use your domain's configured catch-all inbox." @@ -5206,13 +5216,13 @@ "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Random Word" + "message": "Random word" }, "service": { "message": "Service" }, "unknownCipher": { - "message": "Unknown Item, you may need to request permission to access this item." + "message": "Unknown item, you may need to request permission to access this item." }, "cannotSponsorSelf": { "message": "You cannot redeem for the active account. Enter a different email." @@ -5245,7 +5255,7 @@ } }, "lastSync": { - "message": "Last Sync", + "message": "Last sync", "Description": "Used as a prefix to indicate the last time a sync occured. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { @@ -5265,7 +5275,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": "Forwarded Email Alias" + "message": "Forwarded email alias" }, "forwardedEmailDesc": { "message": "Generate an email alias with an external forwarding service." @@ -5275,22 +5285,22 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API Access Token" + "message": "API access token" }, "deviceVerification": { - "message": "Device Verification" + "message": "Device verification" }, "enableDeviceVerification": { - "message": "Enable Device Verification" + "message": "Turn on device verification" }, "deviceVerificationDesc": { - "message": "When enabled, verification codes are sent to your email address when logging in from an unrecognized device" + "message": "Verification codes are sent to your email address when logging in from an unrecognized device" }, "updatedDeviceVerification": { - "message": "Updated Device Verification" + "message": "Updated device verification" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Are you sure you want to enable Device Verification? The verification code emails will arrive at: $EMAIL$", + "message": "Are you sure you want to turn on device verification? The verification code emails will arrive at: $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -5302,7 +5312,7 @@ "message": "Premium subscription required" }, "scim": { - "message": "SCIM Provisioning", + "message": "SCIM provisioning", "description": "The text, 'SCIM', is an acronymn and should not be translated." }, "scimDescription": { @@ -5321,11 +5331,11 @@ "message": "This API key has access to manage users within your organization. It should be kept secret." }, "copyScimKey": { - "message": "Copy the SCIM API Key to your clipboard", + "message": "Copy the SCIM API key to your clipboard", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKey": { - "message": "Rotate the SCIM API Key", + "message": "Rotate the SCIM API key", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKeyWarning": { @@ -5333,10 +5343,10 @@ "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateKey": { - "message": "Rotate Key" + "message": "Rotate key" }, "scimApiKey": { - "message": "SCIM API Key", + "message": "SCIM API key", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "copyScimUrl": { @@ -5348,18 +5358,18 @@ "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimApiKeyRotated": { - "message": "The SCIM API Key has been successfully rotated", + "message": "SCIM API key successfully rotated", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "scimSettingsSaved": { - "message": "SCIM settings have been saved successfully", + "message": "SCIM settings saved", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "inputRequired": { "message": "Input is required." }, "inputEmail": { - "message": "Input is not an email-address." + "message": "Input is not an email address." }, "inputMinLength": { "message": "Input must be at least $COUNT$ characters long.", @@ -5390,5 +5400,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 3a711cd61d6..288da49ea39 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 08ac0bef9fb..20aed93a304 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 8220166df90..53e1ee88790 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -3313,6 +3313,10 @@ "message": "Ĝisdatigita", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Pasvorto Ĝisdatigita", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Nombro de uzantoj" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index d4ca589fd38..7cdfe450c71 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -3313,6 +3313,10 @@ "message": "Actualizada", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Contraseña actualizada", "description": "ex. Date this password was updated" @@ -4729,7 +4733,7 @@ "message": "Comportamiento de firma" }, "spMinIncomingSigningAlgorithm": { - "message": "Minimum Incoming Signing Algorithm" + "message": "Algoritmo mínimo de firma entrante" }, "spWantAssertionsSigned": { "message": "Expect signed assertions" @@ -5053,7 +5057,7 @@ "message": "Facturación sincronizada" }, "billingSyncDesc": { - "message": "Billing Sync provides Free Families plans for members and advanced billing capabilities by linking your self-hosted Bitwarden to the Bitwarden cloud server." + "message": "La sincronización de facturación proveé planes Famliares gratuitos para los miembros y facilidades de facturación avanzada, conectando la bóveda autoalojada de Bitwarden al servidor en la nube de Bitwarden." }, "billingSyncKeyDesc": { "message": "A Billing Sync Token from your cloud organization's subscription settings is required to complete this form." @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Número de usuarios" + }, + "multiSelectPlaceholder": { + "message": "-- Escriba para filtrar --" + }, + "multiSelectLoading": { + "message": "Recuperando opciones..." + }, + "multiSelectNotFound": { + "message": "No hay elementos" + }, + "multiSelectClearAll": { + "message": "Borrar todo" } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index d67eb9d05ea..37d9ca76281 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -3313,6 +3313,10 @@ "message": "Uuendatud", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parool on uuendatud", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Kasutajate arv" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index e171c277a63..391e28356ae 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -3313,6 +3313,10 @@ "message": "Eguneratua", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Pasahitza eguneratu da", "description": "ex. Date this password was updated" @@ -3391,10 +3395,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "Mesedez, ziurtatu kutxa gotorra desblokeatuta dagoela eta hatz-marka digitalaren esaldia bat datorrela beste gailuarekin." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Hatz-marka digitalaren esaldia" }, "dontAskFingerprintAgain": { "message": "Inoiz ez da beharrezkoa gonbidatutako erabiltzaileentzat hatz-marka esaldiak egiaztatzea (ez da gomendatzen)", @@ -4082,10 +4086,10 @@ "message": "Baimenak" }, "managerPermissions": { - "message": "Manager Permissions" + "message": "Kudeatu baimenak" }, "adminPermissions": { - "message": "Admin Permissions" + "message": "Kudeatzailearen baimenak" }, "accessEventLogs": { "message": "Sarreren erregistroak" @@ -4397,7 +4401,7 @@ "message": "Birbidali gonbidapenak" }, "resendNotification": { - "message": "Resend notification" + "message": "Berbidali jakinarazpena" }, "noSelectedUsersApplicable": { "message": "Ekintza hau ezin zaie hautatutako erabiltzaileei aplikatu." @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Erabiltzaile kopurua" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 8607d1e279b..dd3537fafd6 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -461,13 +461,13 @@ "message": "Lisää uusi tiedostoliite" }, "deletedAttachment": { - "message": "Tiedostoliite poistettu" + "message": "Tiedostoliite poistettiin" }, "deleteAttachmentConfirmation": { "message": "Haluatko varmasti poistaa liitteen?" }, "attachmentSaved": { - "message": "Tiedostoliite tallennettu." + "message": "Tiedostoliite tallennettiin" }, "file": { "message": "Tiedosto" @@ -482,10 +482,10 @@ "message": "Et voi käyttää tätä toimintoa ennen kuin päivität salausavaimesi." }, "addedItem": { - "message": "Kohde lisätty" + "message": "Kohde lisättiin" }, "editedItem": { - "message": "Kohdetta muokattu" + "message": "Kohdetta muokattiin" }, "movedItemToOrg": { "message": "$ITEMNAME$ siirrettiin organisaatiolle $ORGNAME$", @@ -534,7 +534,7 @@ "message": "Haluatko varmasti korvata nykyisen salasanan?" }, "editedFolder": { - "message": "Kansiota muokattu" + "message": "Kansiota muokattiin" }, "addedFolder": { "message": "Kansio lisätty" @@ -543,7 +543,7 @@ "message": "Haluatko varmasti poistaa kansion?" }, "deletedFolder": { - "message": "Kansio poistettu" + "message": "Kansio poistettiin" }, "loggedOut": { "message": "Kirjauduttu ulos" @@ -573,7 +573,7 @@ "message": "Laitteella kirjautuminen" }, "loginWithDeviceEnabledInfo": { - "message": "Laitteella kirjautuminen oltava käytössä Biwarden-mobiilisovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" + "message": "Laitteella kirjautuminen otettava käyttöön Bitwardenin mobiilisovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" }, "createAccount": { "message": "Luo tili" @@ -1040,7 +1040,7 @@ "message": "Jatkamalla kirjaudut ulos nykyisestä istunnostasi ja joudut kirjautumaan uudelleen. Aktiiviset istunnot toisilla laitteilla saattavat pysyä aktiivisina vielä tunnin ajan." }, "emailChanged": { - "message": "Sähköpostiosoite vaihdettu" + "message": "Sähköpostiosoite vaihdettiin" }, "logBackIn": { "message": "Kirjaudu sisään uudelleen." @@ -1052,7 +1052,7 @@ "message": "Vaihda pääsalasana" }, "masterPasswordChanged": { - "message": "Pääsalasana vaihdettu" + "message": "Pääsalasana vaihdettiin" }, "currentMasterPass": { "message": "Nykyinen pääsalasana" @@ -1094,7 +1094,7 @@ "message": "Vaihda KDF-asetuksia" }, "encKeySettingsChanged": { - "message": "Salausavaimen asetukset muutettu" + "message": "Salausavaimen asetuksia muutettiin" }, "dangerZone": { "message": "Vaaravyöhyke" @@ -1112,7 +1112,7 @@ "message": "Jatkamalla kirjaudut ulos nykyisestä istunnostasi ja joudut kirjautumaan uudelleen. Myös kaksivaiheinen kirjautuminen on tehtävä uudelleen. Aktiiviset istunnot toisilla laitteilla saattavat pysyä aktiivisina vielä tunnin ajan." }, "sessionsDeauthorized": { - "message": "Kaikki istunnot mitätöity" + "message": "Kaikki istunnot mitätöitiin" }, "purgeVault": { "message": "Tyhjennä holvi" @@ -1566,7 +1566,7 @@ "message": "Tunnusten 2FA-tila" }, "inactive2faReportDesc": { - "message": "Kaksivaiheinen kirjautuminen (2FA) lisää tileillesi yhden suojaustason. Voit käyttää kaksivaiheiseen kirjautumiseen Bitwarden-todentajaa tai vaihtoehtoisia menetelmiä." + "message": "Kaksivaiheinen kirjautuminen (2FA) lisää tileillesi yhden suojaustason. Voit käyttää kaksivaiheiseen kirjautumiseen Bitwardenin todentajaa tai vaihtoehtoisia menetelmiä." }, "inactive2faFound": { "message": "Tunnuksia ilman kaksivaiheista kirjautumista löytyi" @@ -2386,7 +2386,7 @@ "message": "Kutsu käyttäjä" }, "inviteUserDesc": { - "message": "Kutsu organisaatioosi uusi käyttäjä syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, heitä pyydetään luomaan uusi tili." + "message": "Kutsu organisaatioosi uusi käyttäjä syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, heitä pyydetään luomaan uusi." }, "inviteMultipleEmailDesc": { "message": "Voit kutsua korkeintaan $COUNT$ käyttäjää kerrallaan, erottelemalla listan sähköpostiosoitteista pilkuilla.", @@ -2983,7 +2983,7 @@ "message": "Jos tilisi on olemassa, olemme lähettäneet sinulle lisäohjeita sähköpostitse." }, "deleteRecoverConfirmDesc": { - "message": "Olet pyytänyt Bitwarden-tilisi poistoa. Paina alla olevaa painiketta vahvistaaksesi." + "message": "Olet pyytänyt Bitwarden-tilisi poistoa. Vahvista painamalla alla olevaa painiketta." }, "myOrganization": { "message": "Oma organisaatio" @@ -3313,6 +3313,10 @@ "message": "Päivitetty", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Luotu", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Salasana päivitetty", "description": "ex. Date this password was updated" @@ -3391,7 +3395,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Varmista, että holvisi on avattu ja tunnistelauseke vastaa kyseistä laitetta." + "message": "Varmista, että holvisi on avattu ja tunnistelauseke vastaa toista laitetta." }, "fingerprintPhraseHeader": { "message": "Tunnistelauseke" @@ -3779,7 +3783,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Nykyinen käyttökertojen määrä" + "message": "Käyttökertojen nykyinen määrä" }, "sendPasswordDesc": { "message": "Halutessasi, vaadi käyttäjiä syöttämään salasana Sendin avaamiseksi.", @@ -3894,7 +3898,7 @@ "message": "Muokkaa varmuuskontaktia" }, "inviteEmergencyContactDesc": { - "message": "Kutsu uusi varmuuskontakti syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, heitä pyydetään luomaan uusi tili." + "message": "Kutsu uusi varmuuskontakti syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, heitä pyydetään luomaan uusi." }, "emergencyAccessRecoveryInitiated": { "message": "Varmuuskäyttö aloitettu" @@ -4472,7 +4476,7 @@ "message": "Todentajan määritys" }, "setupProviderLoginDesc": { - "message": "Sinut on kutsuttu määrittämään uusi todentaja. Jatkaaksesi, sinun on kirjauduttava Bitwarden-tilillesi tai luotava uusi tili." + "message": "Sinut on kutsuttu määrittämään uusi todentaja. Jatkaaksesi, sinun on kirjauduttava tilillesi tai luotava uusi Bitwarden-tili." }, "setupProviderDesc": { "message": "Syötä alla pyydetyt tiedot viimeistelläksesi todentajan määrityksen. Jos sinulla on kysyttävää, ota yhteyttä asiakaspalveluun." @@ -4499,13 +4503,13 @@ "message": "Palvelun käyttäjät voivat käyttää ja hallita kaikkia asiakasorganisaatioita." }, "providerInviteUserDesc": { - "message": "Kutsu todentajallesi uusi käyttäjä syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, pyydetään heitä luomaan uusi tili." + "message": "Kutsu todentajallesi uusi käyttäjä syöttämällä alle heidän Bitwarden-tilinsä sähköpostiosoite. Jos heillä ei vielä ole Bitwarden-tiliä, pyydetään heitä luomaan uusi." }, "joinProvider": { "message": "Liity todennustarjoajaan" }, "joinProviderDesc": { - "message": "Sinut on kutsuttu liittymään yllä mainittuun todentajaan. Hyväksyäksesi kutsun, sinun tulee kirjautua tilillesi tai luoda uusi Bitwarden-tili." + "message": "Sinut on kutsuttu liittymään yllä mainittuun todentajaan. Hyväksyäksesi kutsun, sinun on kirjauduttava tilillesi tai luotava uusi Bitwarden-tili." }, "providerInviteAcceptFailed": { "message": "Kutsua ei voitu hyväksyä. Pyydä todentajan ylläpitäjää lähettämään uusi kutsu." @@ -5278,19 +5282,19 @@ "message": "API-käyttötunniste" }, "deviceVerification": { - "message": "Laitetodennus" + "message": "Laitevahvistus" }, "enableDeviceVerification": { - "message": "Käytä laitetodennusta" + "message": "Käytä laitevahvistus" }, "deviceVerificationDesc": { - "message": "Kun käytössä, lähetetään todennuskoodit sähköpostitse, kun kirjaudutaan tuntemattomasta laitteesta" + "message": "Kun käytössä, todennuskoodit lähetetään sinulle sähköpostitse kirjauduttaessa tuntemattomasta laitteesta." }, "updatedDeviceVerification": { - "message": "Laitetodennus päivitettiin" + "message": "Laitevahvostus päivitettiin" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Haluatko varmasti käyttää laitetodennusta? Todennuskoodit lähetetään sähköpostiosoitteeseen $EMAIL$", + "message": "Haluatko varmasti käyttää laitevahvistusta? Todennuskoodit lähetetään sähköpostiosoitteeseen $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Käyttäjien määrä" + }, + "multiSelectPlaceholder": { + "message": "-- Suodatettava tyyppi --" + }, + "multiSelectLoading": { + "message": "Noudetaan vaihtoehtoja..." + }, + "multiSelectNotFound": { + "message": "Kohteita ei löytynyt" + }, + "multiSelectClearAll": { + "message": "Tyhjennä kaikki" } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index a59eac00207..57947151f89 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 0c91379b73b..dcc39b5d6f2 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -3313,6 +3313,10 @@ "message": "Mis à jour", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Créé", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Mot de passe mis à jour", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Nombre d’utilisateurs" + }, + "multiSelectPlaceholder": { + "message": "-- Tapez pour Filtrer --" + }, + "multiSelectLoading": { + "message": "Récupération des options..." + }, + "multiSelectNotFound": { + "message": "Aucun élément trouvé" + }, + "multiSelectClearAll": { + "message": "Effacer tout" } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 26a68564655..5062c48d3f9 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -3313,6 +3313,10 @@ "message": "עודכן", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "הסיסמה עודכנה", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index b0f0aff0248..137ea553bda 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index ac035f88cda..749cc7eb047 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -3313,6 +3313,10 @@ "message": "Ažurirano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lozinka ažurirana", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index 51a7169184d..8d16c032b5c 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -3313,6 +3313,10 @@ "message": "A frissítés megtörtént.", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Létrehozva", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "A jelszó frissítésre került.", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Felhasználók száma" + }, + "multiSelectPlaceholder": { + "message": "-- Szűrendő típus --" + }, + "multiSelectLoading": { + "message": "Az opciók beolvasása folyamatban can..." + }, + "multiSelectNotFound": { + "message": "Nem található elem." + }, + "multiSelectClearAll": { + "message": "Összes törlése" } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index f9a0072e362..dbe662d51ac 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -3313,6 +3313,10 @@ "message": "Di perbarui", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Kata Sandi Diperbarui", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Jumplah pengguna" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index f1f633d75bd..af4a69de263 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -570,16 +570,16 @@ "message": "Accedi o crea un nuovo account per accedere alla tua cassaforte." }, "loginWithDevice": { - "message": "Log in with device" + "message": "Accedi con il dispositivo" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "Il login con il dispositivo deve essere abilitato nelle impostazioni dell'app mobile Bitwarden. Hai bisogno di un'altra opzione?" }, "createAccount": { "message": "Crea account" }, "newAroundHere": { - "message": "New around here?" + "message": "Nuovo da queste parti?" }, "startTrial": { "message": "Inizia il periodo di prova" @@ -588,7 +588,7 @@ "message": "Accedi" }, "logInInitiated": { - "message": "Log in initiated" + "message": "Login avviato" }, "submit": { "message": "Invia" @@ -648,7 +648,7 @@ "message": "È necessario reinserire la password principale." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "La password principale deve essere lunga almeno 8 caratteri." }, "masterPassDoesntMatch": { "message": "La conferma della password principale non corrisponde." @@ -718,7 +718,7 @@ "message": "Non appartieni ad alcuna organizzazione. Le organizzazioni ti consentono di condividere oggetti in modo sicuro con altri utenti." }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "Una notifica è stata inviata al tuo dispositivo." }, "versionNumber": { "message": "Versione $VERSION_NUMBER$", @@ -2548,7 +2548,7 @@ } }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Visualizza tutte le opzioni di accesso" }, "viewedItemId": { "message": "Elemento visualizzato $ID$.", @@ -3313,6 +3313,10 @@ "message": "Aggiornato", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password aggiornata", "description": "ex. Date this password was updated" @@ -3391,10 +3395,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "Assicurati che la tua cassaforte sia sbloccata e che la \"frase impronta\" corrisponda sull'altro dispositivo." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Frase impronta" }, "dontAskFingerprintAgain": { "message": "Non chiedere di verificare di nuovo la frase impronta", @@ -4082,10 +4086,10 @@ "message": "Permessi" }, "managerPermissions": { - "message": "Manager Permissions" + "message": "Permessi del Manager" }, "adminPermissions": { - "message": "Admin Permissions" + "message": "Permessi dell'Amministratore" }, "accessEventLogs": { "message": "Accedi ai log degli eventi" @@ -4397,7 +4401,7 @@ "message": "Invia nuovamente l'invito" }, "resendNotification": { - "message": "Resend notification" + "message": "Invia nuova notifica" }, "noSelectedUsersApplicable": { "message": "Questa azione non è applicabile a nessuno degli utenti selezionati." @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Numero di utenti" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index fcb86f77272..cdccdf2aba2 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -3313,6 +3313,10 @@ "message": "更新日", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "作成日", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "パスワード更新日", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "ユーザー数" + }, + "multiSelectPlaceholder": { + "message": "-- 入力して絞り込み --" + }, + "multiSelectLoading": { + "message": "オプションを取得中..." + }, + "multiSelectNotFound": { + "message": "アイテムが見つかりません" + }, + "multiSelectClearAll": { + "message": "すべてクリア" } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 5b7f4edc504..075c72bc948 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index 5b7f4edc504..075c72bc948 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 69f614cc70f..fea74deecb2 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -3313,6 +3313,10 @@ "message": "ನವೀಕರಿಸಲಾಗಿದೆ", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "ಪಾಸ್ವರ್ಡ್ ನವೀಕರಿಸಲಾಗಿದೆ", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 0b3adb96d84..1c8eed81d88 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -3313,6 +3313,10 @@ "message": "업데이트됨", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "비밀번호 업데이트됨", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 68c5c27eac6..dfc55ec2cdf 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -573,7 +573,7 @@ "message": "Pierakstīties ar ierīci" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "Pierakstīšanās ar ierīci ir jābūt iespējotai Bitwarden lietotnes iestatījumos. Nepieciešama cita iespēja?" }, "createAccount": { "message": "Izveidot kontu" @@ -1311,7 +1311,7 @@ "message": "Iespējots" }, "restoreAccess": { - "message": "Restore Access" + "message": "Atjaunot piekļuvi" }, "premium": { "message": "Premium", @@ -1339,7 +1339,7 @@ "message": "Atspējot" }, "revokeAccess": { - "message": "Revoke Access" + "message": "Atsaukt piekļuvi" }, "twoStepLoginProviderEnabled": { "message": "Šis divpakāpju pierakstīšanās nodrošinātājs ir iespējots kontā." @@ -2695,7 +2695,7 @@ } }, "removeUserIdAccess": { - "message": "Remove $ID$ access", + "message": "Noņemt piekļuvi $ID$", "placeholders": { "id": { "content": "$1", @@ -3313,6 +3313,10 @@ "message": "Atjaunināts", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Izveidots", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parole atjaunināta", "description": "ex. Date this password was updated" @@ -3793,7 +3797,7 @@ "message": "Atspējots" }, "revoked": { - "message": "Revoked" + "message": "Atsaukts" }, "sendLink": { "message": "\"Send\" saite", @@ -4457,10 +4461,10 @@ "message": "Noņemt lietotājus" }, "revokeUsers": { - "message": "Revoke Users" + "message": "Atsaukt lietotāju piekļuvi" }, "restoreUsers": { - "message": "Restore Users" + "message": "Atjaunot lietotāju piekļuvi" }, "error": { "message": "Kļūda" @@ -5302,45 +5306,45 @@ "message": "Nepieciešams Premium abonements" }, "scim": { - "message": "SCIM Provisioning", + "message": "SCIM nodrošināšana", "description": "The text, 'SCIM', is an acronymn and should not be translated." }, "scimDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", + "message": "Automātiski nodrošina lietotājus un kopas ar vēlamo identitātes nodrošinātāju, izmantojot SCIM nodrošināšanu", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimEnabledCheckboxDesc": { - "message": "Enable SCIM", + "message": "Iespējot SCIM", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimEnabledCheckboxDescHelpText": { - "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", + "message": "Uzstādīt vēlamo identitātes nodrošinātāju ar URL un SCIM API atslēgas iestatīšanu", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "scimApiKeyHelperText": { - "message": "This API key has access to manage users within your organization. It should be kept secret." + "message": "Šai API atslēgai ir piekļuve pāŗvaldīt apvienības lietotājus. Tā ir jātur noslēpumā." }, "copyScimKey": { - "message": "Copy the SCIM API Key to your clipboard", + "message": "Ievietot SCIM API atslēgu starpliktuvē", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKey": { - "message": "Rotate the SCIM API Key", + "message": "Nomainīt SCIM API atslēgu", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateScimKeyWarning": { - "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", + "message": "Vai tiešām nomainīt SCIM API atslēgu? Pašreizējā atslēga vairs nedarbosies nekur, kur tā ir norādīta.", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateKey": { - "message": "Rotate Key" + "message": "Mainīt atslēgu" }, "scimApiKey": { - "message": "SCIM API Key", + "message": "SCIM API atslēga", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "copyScimUrl": { - "message": "Copy the SCIM endpoint URL to your clipboard", + "message": "Ievietot SCIM galapunkta URL starpliktuvē", "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimUrl": { @@ -5348,11 +5352,11 @@ "description": "the text, 'SCIM' and 'URL', are acronymns and should not be translated." }, "scimApiKeyRotated": { - "message": "The SCIM API Key has been successfully rotated", + "message": "SCIM API atslēga ir veiksmīgi nomainīta", "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "scimSettingsSaved": { - "message": "SCIM settings have been saved successfully", + "message": "SCIM iestatījumi ir veiksmīgi saglabāti", "description": "the text, 'SCIM', is an acronymn and should not be translated." }, "inputRequired": { @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Lietotāju skaits" + }, + "multiSelectPlaceholder": { + "message": "-- Rakstīt, lai atlasītu --" + }, + "multiSelectLoading": { + "message": "Iegūst iespējas..." + }, + "multiSelectNotFound": { + "message": "Netika atrasti vienumi" + }, + "multiSelectClearAll": { + "message": "Notīrīt visu" } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index d2a735807a4..eb850bade65 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -3313,6 +3313,10 @@ "message": "പുതുക്കിയത്", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "പാസ്‍വേഡ് പുതുക്കി", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index cd4edb5470e..f4eefceb487 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -3313,6 +3313,10 @@ "message": "Oppdatert den", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Passordet ble oppdatert den", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index b58849e84e2..7a88342f1d7 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -3313,6 +3313,10 @@ "message": "Bijgewerkt", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Aangemaakt", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Wachtwoord bijgewerkt", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Aantal gebruikers" + }, + "multiSelectPlaceholder": { + "message": "-- Type om te filteren --" + }, + "multiSelectLoading": { + "message": "Opties ophalen..." + }, + "multiSelectNotFound": { + "message": "Geen items gevonden" + }, + "multiSelectClearAll": { + "message": "Alles wissen" } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index eac9d32f1f5..6444e9b1c0e 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index ddde7c52e35..b214fb91fe7 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -3313,6 +3313,10 @@ "message": "Zaktualizowano", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Utworzono", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Aktualizacja hasła", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Liczba użytkowników" + }, + "multiSelectPlaceholder": { + "message": "-- Pisz, aby filtrować --" + }, + "multiSelectLoading": { + "message": "Pobieranie opcji..." + }, + "multiSelectNotFound": { + "message": "Nie znaleziono żadnych pozycji" + }, + "multiSelectClearAll": { + "message": "Wyczyść wszystko" } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index b7b4391cc69..0ba45d912b7 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -3313,6 +3313,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Criado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Senha Atualizada", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Número de usuários" + }, + "multiSelectPlaceholder": { + "message": "-- Digite para filtrar --" + }, + "multiSelectLoading": { + "message": "Carrgando Opções..." + }, + "multiSelectNotFound": { + "message": "Nenhum item encontrado" + }, + "multiSelectClearAll": { + "message": "Limpar todos" } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index ccdead830c7..d07ac80607e 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -3151,10 +3151,10 @@ "message": "Para ajuda adicional no gerenciamento da sua assinatura, entre em contato com o suporte ao cliente." }, "subscriptionUserSeatsUnlimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited users exceed your subscription seats, you will immediately receive a prorated charge for the additional users." + "message": "Os ajustes à sua assinatura resultarão em alterações repartidas nos totais de faturamento. Se os utilizadores recém-convidados excederem o número de utilizadores na sua assinatura, receberá imediatamente uma cobrança proporcional pelos utilizadores adicionais." }, "subscriptionUserSeatsLimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited users exceed your subscription seats, you will immediately receive a prorated charge for the additional users until your $MAX$ seat limit is reached.", + "message": "Os ajustes à sua assinatura resultarão em alterações repartidas nos totais de faturamento. Se os utilizadores recém-convidados excederem os seus assentos de assinatura, receberá imediatamente uma cobrança proporcional por utilizador adicional até que o seu limite de $MAX$ seja atingido.", "placeholders": { "max": { "content": "$1", @@ -3313,6 +3313,10 @@ "message": "Atualizado", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Criado", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Palavra-passe atualizada", "description": "ex. Date this password was updated" @@ -3663,7 +3667,7 @@ "message": "Início de Sessão Único da Empresa" }, "ssoHandOff": { - "message": "You may now close this tab and continue in the extension." + "message": "Pode fechar esta aba e continuar na extensão." }, "includeAllTeamsFeatures": { "message": "Todas as funcionalidades de Equipas, mais:" @@ -3936,10 +3940,10 @@ "message": "You've been invited to become an emergency contact for the user listed above. To accept the invitation, you need to log in or create a new Bitwarden account." }, "emergencyInviteAcceptFailed": { - "message": "Unable to accept invitation. Ask the user to send a new invitation." + "message": "Não é possível aceitar o convite. Peça ao utilizador para enviar um novo convite." }, "emergencyInviteAcceptFailedShort": { - "message": "Unable to accept invitation. $DESCRIPTION$", + "message": "Não é possível aceitar o convite. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -4145,7 +4149,7 @@ } }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Uma política de organização está a afetar as suas opções de propriedade." }, "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has disabled importing items into your personal vault." @@ -4289,7 +4293,7 @@ } }, "eventWithdrawPasswordReset": { - "message": "User $ID$ withdrew from password reset assistance.", + "message": "Utilizador $ID$ removeu-se da ajuda para redefinir senha.", "placeholders": { "id": { "content": "$1", @@ -4316,7 +4320,7 @@ } }, "firstSsoLogin": { - "message": "$ID$ logged in using Sso for the first time", + "message": "$ID$ conectou-se usando o Sso pela primeira vez", "placeholders": { "id": { "content": "$1", @@ -4352,7 +4356,7 @@ "message": "Redefinir Senha Mestra" }, "resetPasswordPolicyDescription": { - "message": "Allow admins to reset master passwords for members." + "message": "Permitir que administradores redefinam senhas mestres dos membros." }, "resetPasswordPolicyWarning": { "message": "Users in the organization will need to self-enroll or be auto-enrolled before administrators can reset their master password." @@ -4361,7 +4365,7 @@ "message": "Inscrição Automática" }, "resetPasswordPolicyAutoEnrollDescription": { - "message": "All users will be automatically enrolled in password reset once their invite is accepted and will not be allowed to withdraw." + "message": "Todos os utilizadores serão inscritos automaticamente na redefinição de senha assim que o convite for aceito e não será possível anular." }, "resetPasswordPolicyAutoEnrollWarning": { "message": "Users already in the organization will not be retroactively enrolled in password reset. They will need to self-enroll before administrators can reset their master password." @@ -4373,13 +4377,13 @@ "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." }, "resetPasswordOrgKeysError": { - "message": "Organization Keys response is null" + "message": "Resposta das chaves da organização é nula" }, "resetPasswordDetailsError": { - "message": "Reset Password Details response is null" + "message": "Redefinir senha de resposta é nula" }, "trashCleanupWarning": { - "message": "Items that have been in Trash more than 30 days will be automatically deleted." + "message": "Os registos que tenham sido enviados para a Lixeira, por mais que %d dias serão automaticamente excluídos." }, "trashCleanupWarningSelfHosted": { "message": "Items that have been in Trash for a while will be automatically deleted." @@ -4400,7 +4404,7 @@ "message": "Reenviar notificação" }, "noSelectedUsersApplicable": { - "message": "This action is not applicable to any of the selected users." + "message": "Esta ação não é aplicável a nenhum dos utilizadores selecionados." }, "removeUsersWarning": { "message": "Are you sure you want to remove the following users? The process may take a few seconds to complete and cannot be interrupted or canceled." @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Número de utilizadores" + }, + "multiSelectPlaceholder": { + "message": "-- Escreva para Filtrar --" + }, + "multiSelectLoading": { + "message": "A recuperar opções..." + }, + "multiSelectNotFound": { + "message": "Nenhum item encontrado" + }, + "multiSelectClearAll": { + "message": "Limpar tudo" } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 75e6e69554e..1491ed8ec0e 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -3313,6 +3313,10 @@ "message": "S-a actualizat", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Creată", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parola s-a actualizat", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Număr de utilizatori" + }, + "multiSelectPlaceholder": { + "message": "-- Introduceți pentru a filtra --" + }, + "multiSelectLoading": { + "message": "Recuperarea opțiunilor..." + }, + "multiSelectNotFound": { + "message": "Niciun element găsit" + }, + "multiSelectClearAll": { + "message": "Ștergeți tot" } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 15093d36403..2ba0800745c 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -3313,6 +3313,10 @@ "message": "Обновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Создан", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль обновлен", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Количество пользователей" + }, + "multiSelectPlaceholder": { + "message": "-- Тип фильтра --" + }, + "multiSelectLoading": { + "message": "Получение параметров..." + }, + "multiSelectNotFound": { + "message": "Элементов не найдено" + }, + "multiSelectClearAll": { + "message": "Очистить все" } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 26d759eadc8..73eb21fe161 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 38c624d1a38..3ed924a51e2 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -3313,6 +3313,10 @@ "message": "Aktualizované", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Vytvorené", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Heslo bolo aktualizované", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Počet používateľov" + }, + "multiSelectPlaceholder": { + "message": "-- Začnite písať pre filtrovanie --" + }, + "multiSelectLoading": { + "message": "Načítavajú sa možnosti..." + }, + "multiSelectNotFound": { + "message": "Nenašli sa žiadne položky" + }, + "multiSelectClearAll": { + "message": "Vyčistiť všetko" } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index c59098e98f4..e075410d2fb 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index e50c2c78bad..5cde70b0fee 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -570,16 +570,16 @@ "message": "Пријавите се или креирајте нови налог за приступ Сефу." }, "loginWithDevice": { - "message": "Log in with device" + "message": "Пријавите се са уређајем" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "Пријава помоћу уређаја мора бити омогућена у подешавањима Bitwarden апликације. Потребна је друга опција?" }, "createAccount": { "message": "Креирај налог" }, "newAroundHere": { - "message": "New around here?" + "message": "Нов овде?" }, "startTrial": { "message": "Почетак пробе" @@ -588,7 +588,7 @@ "message": "Пријавите се" }, "logInInitiated": { - "message": "Log in initiated" + "message": "Пријава је покренута" }, "submit": { "message": "Пошаљи" @@ -648,7 +648,7 @@ "message": "Поновно уписивање главне лозинке је неопходно." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "Главна лозинка треба имати барем 8 карактера." }, "masterPassDoesntMatch": { "message": "Потврђена Главна Лозинка се не подудара." @@ -691,7 +691,7 @@ "message": "Погрешна главна лозинка" }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "Неважећа лозинка за датотеку, користите лозинку коју сте унели када сте креирали датотеку за извоз." }, "lockNow": { "message": "Закључај одмах" @@ -718,7 +718,7 @@ "message": "Не припадате ниједној организацији. Организације вам омогућавају да безбедно делите ставке са другим корисницима." }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "Обавештење је послато на ваш уређај." }, "versionNumber": { "message": "Верзија $VERSION_NUMBER$", @@ -909,46 +909,46 @@ "message": "Формат датотеке" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "Овај извоз ће бити заштићен лозинком и захтеваће лозинку датотеке за дешифровање." }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "Ова лозинка ће се користити за извоз и увоз ове датотеке" }, "confirmMasterPassword": { - "message": "Confirm Master Password" + "message": "Потрдити Главну Лозинку" }, "confirmFormat": { - "message": "Confirm Format" + "message": "Потврдити формат" }, "filePassword": { - "message": "File Password" + "message": "Лозинка датотеке" }, "confirmFilePassword": { - "message": "Confirm File Password" + "message": "Потврдити лозинку датотеке" }, "accountBackupOptionDescription": { - "message": "Use your account encryption key to encrypt the export and restrict import to only the current Bitwarden account." + "message": "Користите кључ за шифровање налога да шифрујете извоз и ограничите увоз само на тренутни Bitwarden налогу." }, "passwordProtectedOptionDescription": { - "message": "Set a password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "Подесите лозинку за шифровање извоза и увоз у било који Bitwarden налог користећи лозинку за дешифровање." }, "fileTypeHeading": { - "message": "File Type" + "message": "Тип датотеке" }, "accountBackup": { - "message": "Account Backup" + "message": "Резервна копија налога" }, "passwordProtected": { - "message": "Password Protected" + "message": "Заштићено лозинком" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm File Password“ do not match." + "message": "Унете лозинке се не подударају." }, "confirmVaultImport": { - "message": "Confirm Vault Import" + "message": "Потврдите увоз сефа" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "Ова датотека је заштићена лозинком. Унесите лозинку датотеке да бисте увезли податке." }, "exportSuccess": { "message": "Податци сефа су извежени." @@ -2548,7 +2548,7 @@ } }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Погледајте сав извештај у опције" }, "viewedItemId": { "message": "Прогледана ставка $ID$.", @@ -3313,6 +3313,10 @@ "message": "Промењено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Лозинка ажурирана", "description": "ex. Date this password was updated" @@ -3394,7 +3398,7 @@ "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Сигурносна фраза сефа" }, "dontAskFingerprintAgain": { "message": "Не питај више за проверу Сигурносне Фразе Сефа", @@ -4082,10 +4086,10 @@ "message": "Дозволе" }, "managerPermissions": { - "message": "Manager Permissions" + "message": "Менаџер созвола" }, "adminPermissions": { - "message": "Admin Permissions" + "message": "Админ дозволе" }, "accessEventLogs": { "message": "Приступе извештаја догађаја" @@ -4397,7 +4401,7 @@ "message": "Поновно послати позивнице" }, "resendNotification": { - "message": "Resend notification" + "message": "Поново ослати обавештење" }, "noSelectedUsersApplicable": { "message": "Ова акција није применљива на било који од одабраних корисника." @@ -5333,7 +5337,7 @@ "description": "the text, 'SCIM' and 'API', are acronymns and should not be translated." }, "rotateKey": { - "message": "Rotate Key" + "message": "Променити кључ" }, "scimApiKey": { "message": "SCIM API Key", @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Број корисника" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 9249d93ad34..db35f1e46de 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Password Updated", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Number of users" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 61500c683d0..ec1e6e0646b 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -3313,6 +3313,10 @@ "message": "Uppdaterades", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Lösenordet uppdaterades", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Antal användare" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 28ec7bf050e..b7244830c20 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -3313,6 +3313,10 @@ "message": "Güncelleme", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Oluşturma", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Parola güncelleme", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Kullanıcı sayısı" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Seçenekler alınıyor..." + }, + "multiSelectNotFound": { + "message": "Hiç kayıt bulunamadı" + }, + "multiSelectClearAll": { + "message": "Tümünü temizle" } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index a2ea167cdb3..a7dbd058ef9 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -522,10 +522,10 @@ "message": "Ви дійсно хочете перенести до смітника?" }, "deletedItem": { - "message": "Запис перенесено до смітника" + "message": "Запис переміщено до смітника" }, "deletedItems": { - "message": "Записи перенесено до смітника" + "message": "Записи переміщено до смітника" }, "movedItems": { "message": "Записи переміщено" @@ -537,7 +537,7 @@ "message": "Тека відредагована" }, "addedFolder": { - "message": "Додано теку" + "message": "Теку додано" }, "deleteFolderConfirmation": { "message": "Ви дійсно хочете видалити цю теку?" @@ -1321,10 +1321,10 @@ "message": "Преміум статус" }, "premiumRequired": { - "message": "Необхідний преміум статус" + "message": "Необхідна передплата преміум" }, "premiumRequiredDesc": { - "message": "Для використання цієї функції необхідний преміум статус." + "message": "Для використання цієї функції необхідна передплата преміум." }, "youHavePremiumAccess": { "message": "У вас є преміум-доступ" @@ -1792,7 +1792,7 @@ "message": "Пріоритетну технічну підтримку." }, "premiumSignUpFuture": { - "message": "Всі майбутні функції преміум статусу. Їх буде більше!" + "message": "Усі майбутні преміумфункції. Їх буде більше!" }, "premiumPrice": { "message": "Всього лише $PRICE$ / за рік!", @@ -2530,7 +2530,7 @@ } }, "deletedItemId": { - "message": "Запис $ID$ перенесено до смітника.", + "message": "Запис $ID$ переміщено до смітника.", "placeholders": { "id": { "content": "$1", @@ -3313,6 +3313,10 @@ "message": "Оновлено", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Створено", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Пароль оновлено", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Кількість користувачів" + }, + "multiSelectPlaceholder": { + "message": "-- Введіть для фільтрування --" + }, + "multiSelectLoading": { + "message": "Параметри отримання..." + }, + "multiSelectNotFound": { + "message": "Нічого не знайдено" + }, + "multiSelectClearAll": { + "message": "Очистити все" } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 5de8b0b6525..ac9fa51ab4a 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -3313,6 +3313,10 @@ "message": "Updated", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "Mật khẩu đã cập nhật", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "Số lượng người dùng" + }, + "multiSelectPlaceholder": { + "message": "-- Type to Filter --" + }, + "multiSelectLoading": { + "message": "Retrieving options..." + }, + "multiSelectNotFound": { + "message": "No items found" + }, + "multiSelectClearAll": { + "message": "Clear all" } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 411965fcc35..554f2c12f27 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -573,7 +573,7 @@ "message": "使用设备登录" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be enabled in the settings of the Bitwarden mobile app. Need another option?" + "message": "设备登录必须在 Bitwarden 移动应用程序的设置中启用。需要其他选项吗?" }, "createAccount": { "message": "创建账户" @@ -3313,6 +3313,10 @@ "message": "更新于", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "创建于", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密码更新于", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "用户数量" + }, + "multiSelectPlaceholder": { + "message": "-- 键入以筛选 --" + }, + "multiSelectLoading": { + "message": "正在获取选项..." + }, + "multiSelectNotFound": { + "message": "未找到任何项目" + }, + "multiSelectClearAll": { + "message": "清除全部" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index c291747652f..0389b1987a3 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -3310,9 +3310,13 @@ "message": "於瀏覽器重新整理時" }, "dateUpdated": { - "message": "已更新", + "message": "更新於", "description": "ex. Date this item was updated" }, + "dateCreated": { + "message": "建立於", + "description": "ex. Date this item was created" + }, "datePasswordUpdated": { "message": "密碼更新於", "description": "ex. Date this password was updated" @@ -5390,5 +5394,17 @@ }, "numberOfUsers": { "message": "使用者數量" + }, + "multiSelectPlaceholder": { + "message": "-- 輸入以進行篩選 --" + }, + "multiSelectLoading": { + "message": "正在取得選項…" + }, + "multiSelectNotFound": { + "message": "找不到任何項目" + }, + "multiSelectClearAll": { + "message": "全部清除" } } diff --git a/apps/web/src/scss/styles.scss b/apps/web/src/scss/styles.scss index dc1c740b4b2..ab99056dae3 100644 --- a/apps/web/src/scss/styles.scss +++ b/apps/web/src/scss/styles.scss @@ -2,6 +2,7 @@ @import "./variables"; @import "../../../../libs/angular/src/scss/bwicons/styles/style.scss"; @import "../../../../libs/angular/src/scss/icons.scss"; +@import "../../../../libs/components/src/multi-select/scss/bw.theme"; @import "@angular/cdk/overlay-prebuilt.css"; //@import "~bootstrap/scss/bootstrap"; diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js index 0382f428709..a7a75b0d5d0 100644 --- a/apps/web/webpack.config.js +++ b/apps/web/webpack.config.js @@ -234,6 +234,7 @@ const devServer = 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'sha256-JVRXyYPueLWdwGwY9m/7u4QlZ1xeQdqUj2t8OVIzZE4=' 'sha256-or0p3LaHetJ4FRq+flVORVFFNsOjQGWrDvX8Jf7ACWg=' + 'sha256-Oca9ZYU1dwNscIhdNV7tFBsr4oqagBhZx9/p4w8GOcg=' ;img-src 'self' data: @@ -268,6 +269,7 @@ const devServer = https://client-analytics.braintreegateway.com https://*.braintree-api.com https://*.blob.core.windows.net + http://127.0.0.1:10000 https://app.simplelogin.io/api/alias/random/new https://quack.duckduckgo.com/api/email/addresses https://app.anonaddy.com/api/v1/aliases diff --git a/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html index 3d27448753f..5dafe8c536d 100644 --- a/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html +++ b/bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html @@ -52,7 +52,22 @@ {{ "scimApiKey" | i18n }} - + + + + +``` + +## Usage: Standalone form buttons + +Adding async actions to standalone form buttons requires the following 3 steps. + +### 1. Add a handler to your `Component` + +A handler is a function that returns a promise or an observable. Functions that return `void` are also supported which is +useful for aborting an action. + +**NOTE:** Defining the handlers as arrow-functions assigned to variables is mandatory if the handler needs access to the parent +component using the variable `this`. + +```ts +@Component({...}) +class Component { + formGroup = this.formBuilder.group({...}); + + submit = async () => { + // not relevant for this example + } + + // action can also return Observable instead of Promise + handler = async () => { + if (/* perform guard check */) { + return; + } + + await this.apiService.post(/* ... */); + }; +} +``` + +### 2. Add directive to the `form` element + +The `bitSubmit` directive is required beacuse of its coordinating role. + +```html +
...
+``` + +### 3. Add directives to the `button` element + +Add `bitButton`, `bitFormButton`, `bitAction` directives to the button. Make sure to supply a handler. + +```html + + +``` diff --git a/libs/components/src/async-actions/in-forms.stories.ts b/libs/components/src/async-actions/in-forms.stories.ts new file mode 100644 index 00000000000..b492032df12 --- /dev/null +++ b/libs/components/src/async-actions/in-forms.stories.ts @@ -0,0 +1,149 @@ +import { Component } from "@angular/core"; +import { FormsModule, ReactiveFormsModule, Validators, FormBuilder } from "@angular/forms"; +import { action } from "@storybook/addon-actions"; +import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { delay, of } from "rxjs"; + +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; +import { I18nService } from "@bitwarden/common/src/abstractions/i18n.service"; + +import { ButtonModule } from "../button"; +import { FormFieldModule } from "../form-field"; +import { IconButtonModule } from "../icon-button"; +import { InputModule } from "../input/input.module"; +import { I18nMockService } from "../utils/i18n-mock.service"; + +import { BitActionDirective } from "./bit-action.directive"; +import { BitSubmitDirective } from "./bit-submit.directive"; +import { BitFormButtonDirective } from "./form-button.directive"; + +const template = ` +
+ + Name + + + + + Email + + + + + + + +
`; + +@Component({ + selector: "app-promise-example", + template, +}) +class PromiseExampleComponent { + formObj = this.formBuilder.group({ + name: ["", [Validators.required]], + email: ["", [Validators.required, Validators.email]], + }); + + constructor(private formBuilder: FormBuilder) {} + + submit = async () => { + this.formObj.markAllAsTouched(); + + if (!this.formObj.valid) { + return; + } + + await new Promise((resolve, reject) => { + setTimeout(resolve, 2000); + }); + }; + + delete = async () => { + await new Promise((resolve, reject) => { + setTimeout(resolve, 2000); + }); + }; +} + +@Component({ + selector: "app-observable-example", + template, +}) +class ObservableExampleComponent { + formObj = this.formBuilder.group({ + name: ["", [Validators.required]], + email: ["", [Validators.required, Validators.email]], + }); + + constructor(private formBuilder: FormBuilder) {} + + submit = () => { + this.formObj.markAllAsTouched(); + + if (!this.formObj.valid) { + return undefined; + } + + return of("fake observable").pipe(delay(2000)); + }; + + delete = () => { + return of("fake observable").pipe(delay(2000)); + }; +} + +export default { + title: "Component Library/Async Actions/In Forms", + decorators: [ + moduleMetadata({ + declarations: [ + BitSubmitDirective, + BitFormButtonDirective, + PromiseExampleComponent, + ObservableExampleComponent, + BitActionDirective, + ], + imports: [ + FormsModule, + ReactiveFormsModule, + FormFieldModule, + InputModule, + ButtonModule, + IconButtonModule, + ], + providers: [ + { + provide: I18nService, + useFactory: () => { + return new I18nMockService({ + required: "required", + inputRequired: "Input is required.", + inputEmail: "Input is not an email-address.", + }); + }, + }, + { + provide: ValidationService, + useValue: { + showError: action("ValidationService.showError"), + } as Partial, + }, + ], + }), + ], +} as Meta; + +const PromiseTemplate: Story = (args: PromiseExampleComponent) => ({ + props: args, + template: ``, +}); + +export const UsingPromise = PromiseTemplate.bind({}); + +const ObservableTemplate: Story = (args: PromiseExampleComponent) => ({ + props: args, + template: ``, +}); + +export const UsingObservable = ObservableTemplate.bind({}); diff --git a/libs/components/src/async-actions/index.ts b/libs/components/src/async-actions/index.ts new file mode 100644 index 00000000000..6515ffc47ca --- /dev/null +++ b/libs/components/src/async-actions/index.ts @@ -0,0 +1,3 @@ +export * from "./async-actions.module"; +export * from "./bit-action.directive"; +export * from "./form-button.directive"; diff --git a/libs/components/src/async-actions/overview.stories.mdx b/libs/components/src/async-actions/overview.stories.mdx new file mode 100644 index 00000000000..9ec792aefdd --- /dev/null +++ b/libs/components/src/async-actions/overview.stories.mdx @@ -0,0 +1,26 @@ +import { Meta } from "@storybook/addon-docs"; + + + +# Async Actions + +The directives in this module makes it easier for developers to reflect the progress of async actions in the UI when using +buttons, while also providing robust and standardized error handling. + +These buttons can either be standalone (such as Refresh buttons), submit buttons for forms or as standalone buttons +that are part of a form (such as Delete buttons). + +These directives are meant to replace the older `appApiAction` directive, providing the option to use `observables` and reduce +clutter inside our view `components`. + +## When to use? + +When building a button that triggers a long running task in the background eg. server API calls. + +## Why? + +To better visualize that the application is processing their request. + +## What does it do? + +It disables buttons and show a spinning animation. diff --git a/libs/components/src/async-actions/standalone.stories.mdx b/libs/components/src/async-actions/standalone.stories.mdx new file mode 100644 index 00000000000..7ed5c46ffde --- /dev/null +++ b/libs/components/src/async-actions/standalone.stories.mdx @@ -0,0 +1,63 @@ +import { Meta } from "@storybook/addon-docs"; + + + +# Standalone Async Actions + +These directives should be used when building a standalone button that triggers a long running task in the background, +eg. Refresh buttons. For non-submit buttons that are associated with forms see [Async Actions In Forms](?path=/story/component-library-async-actions-in-forms-documentation--page). + +## Usage + +Adding async actions to standalone buttons requires the following 2 steps + +### 1. Add a handler to your `Component` + +A handler is a function that returns a promise or an observable. Functions that return `void` are also supported which is +useful for aborting an action. + +**NOTE:** Defining the handlers as arrow-functions assigned to variables is mandatory if the handler needs access to the parent +component using the variable `this`. + +#### Example using promises + +```ts +@Component({...}) +class PromiseExampleComponent { + handler = async () => { + if (/* perform guard check */) { + return; + } + + await this.apiService.post(/* ... */); + }; +} +``` + +#### Example using observables + +```ts +@Component({...}) +class Component { + handler = () => { + if (/* perform guard check */) { + return; + } + + return this.apiService.post$(/* ... */); + }; +} +``` + +### 2. Add directive to the DOM element + +Add the `bitAction` directive and supply the handler defined in step 1. + +**NOTE:** The `directive` is defined using the input syntax: `[input]="handler"`. +This is different from how click handlers are usually defined with the output syntax `(click)="handler()"`. + +```html + + +`; +``` diff --git a/libs/components/src/async-actions/standalone.stories.ts b/libs/components/src/async-actions/standalone.stories.ts new file mode 100644 index 00000000000..cd0c6239b06 --- /dev/null +++ b/libs/components/src/async-actions/standalone.stories.ts @@ -0,0 +1,97 @@ +import { Component } from "@angular/core"; +import { action } from "@storybook/addon-actions"; +import { Meta, moduleMetadata, Story } from "@storybook/angular"; +import { delay, of } from "rxjs"; + +import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; + +import { ButtonModule } from "../button"; +import { IconButtonModule } from "../icon-button"; + +import { BitActionDirective } from "./bit-action.directive"; + +const template = ` + + `; + +@Component({ + template, + selector: "app-promise-example", +}) +class PromiseExampleComponent { + action = async () => { + await new Promise((resolve, reject) => { + setTimeout(resolve, 2000); + }); + }; +} + +@Component({ + template, + selector: "app-observable-example", +}) +class ObservableExampleComponent { + action = () => { + return of("fake observable").pipe(delay(2000)); + }; +} + +@Component({ + template, + selector: "app-rejected-promise-example", +}) +class RejectedPromiseExampleComponent { + action = async () => { + await new Promise((resolve, reject) => { + setTimeout(() => reject(new Error("Simulated error")), 2000); + }); + }; +} + +export default { + title: "Component Library/Async Actions/Standalone", + decorators: [ + moduleMetadata({ + declarations: [ + BitActionDirective, + PromiseExampleComponent, + ObservableExampleComponent, + RejectedPromiseExampleComponent, + ], + imports: [ButtonModule, IconButtonModule], + providers: [ + { + provide: ValidationService, + useValue: { + showError: action("ValidationService.showError"), + } as Partial, + }, + ], + }), + ], +} as Meta; + +const PromiseTemplate: Story = (args: PromiseExampleComponent) => ({ + props: args, + template: ``, +}); + +export const UsingPromise = PromiseTemplate.bind({}); + +const ObservableTemplate: Story = ( + args: ObservableExampleComponent +) => ({ + template: ``, +}); + +export const UsingObservable = ObservableTemplate.bind({}); + +const RejectedPromiseTemplate: Story = ( + args: ObservableExampleComponent +) => ({ + template: ``, +}); + +export const RejectedPromise = RejectedPromiseTemplate.bind({}); diff --git a/libs/components/src/banner/banner.stories.ts b/libs/components/src/banner/banner.stories.ts index 693731e372b..19421da9768 100644 --- a/libs/components/src/banner/banner.stories.ts +++ b/libs/components/src/banner/banner.stories.ts @@ -37,7 +37,10 @@ export default { const Template: Story = (args: BannerComponent) => ({ props: args, template: ` - Content Really Long Text Lorem Ipsum Ipsum Ipsum + + Content Really Long Text Lorem Ipsum Ipsum Ipsum + + `, }); diff --git a/libs/components/src/button/button.component.html b/libs/components/src/button/button.component.html index 4875c159e92..ee4d150dfcc 100644 --- a/libs/components/src/button/button.component.html +++ b/libs/components/src/button/button.component.html @@ -2,7 +2,10 @@ - - + + diff --git a/libs/components/src/button/button.component.ts b/libs/components/src/button/button.component.ts index eeba83b8156..9a27bfdd9ed 100644 --- a/libs/components/src/button/button.component.ts +++ b/libs/components/src/button/button.component.ts @@ -1,5 +1,7 @@ import { Input, HostBinding, Component } from "@angular/core"; +import { ButtonLikeAbstraction } from "../shared/button-like.abstraction"; + export type ButtonTypes = "primary" | "secondary" | "danger"; const buttonStyles: Record = { @@ -41,8 +43,9 @@ const buttonStyles: Record = { @Component({ selector: "button[bitButton], a[bitButton]", templateUrl: "button.component.html", + providers: [{ provide: ButtonLikeAbstraction, useExisting: ButtonComponent }], }) -export class ButtonComponent { +export class ButtonComponent implements ButtonLikeAbstraction { @HostBinding("class") get classList() { return [ "tw-font-semibold", diff --git a/libs/components/src/form-field/form-field-control.ts b/libs/components/src/form-field/form-field-control.ts new file mode 100644 index 00000000000..ee63407a8bd --- /dev/null +++ b/libs/components/src/form-field/form-field-control.ts @@ -0,0 +1,8 @@ +export abstract class BitFormFieldControl { + ariaDescribedBy: string; + id: string; + labelForId: string; + required: boolean; + hasError: boolean; + error: [string, any]; +} diff --git a/libs/components/src/form-field/form-field.component.html b/libs/components/src/form-field/form-field.component.html index cf638ce1c77..5c46fb557b4 100644 --- a/libs/components/src/form-field/form-field.component.html +++ b/libs/components/src/form-field/form-field.component.html @@ -1,4 +1,4 @@ -