From e37af18359949424464b42d2ad94a23e75caa596 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2024 14:39:28 +0000
Subject: [PATCH 19/36] Autosync the updated translations (#10957)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/desktop/src/locales/az/messages.json | 16 +-
apps/desktop/src/locales/et/messages.json | 452 +++++++++++-----------
2 files changed, 234 insertions(+), 234 deletions(-)
diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json
index f56a342d375..8c31a6e7029 100644
--- a/apps/desktop/src/locales/az/messages.json
+++ b/apps/desktop/src/locales/az/messages.json
@@ -865,7 +865,7 @@
"message": "Bizi izləyin"
},
"syncVault": {
- "message": "Anbarı eyniləşdir"
+ "message": "Anbarı sinxronlaşdır"
},
"changeMasterPass": {
"message": "Ana parolu dəyişdir"
@@ -894,10 +894,10 @@
"message": "Brauzer uzantısını al"
},
"syncingComplete": {
- "message": "Eyniləşdirmə tamamlandı"
+ "message": "Sinxr tamamlandı"
},
"syncingFailed": {
- "message": "Uğursuz eyniləşdirmə"
+ "message": "Sinxr uğursuz oldu"
},
"yourVaultIsLocked": {
"message": "Anbarınız kilidlənib. Davam etmək üçün kimliyinizi doğrulayın."
@@ -928,10 +928,10 @@
"message": "İki mərhələli giriş"
},
"vaultTimeout": {
- "message": "Anbara müraciət bitəcək"
+ "message": "Anbar vaxtının bitməsi"
},
"vaultTimeoutDesc": {
- "message": "Anbara müraciətin bitəcəyi vaxtı seçin və seçilən əməliyyatı icra edin."
+ "message": "Anbarın vaxt bitmə əməliyyatını nə vaxt icra edəcəyini seçin."
},
"immediately": {
"message": "Dərhal"
@@ -1617,13 +1617,13 @@
"message": "Bir və ya daha çox təşkilat siyasətləri yaradıcı seçimlərinizə təsir edir."
},
"vaultTimeoutAction": {
- "message": "Anbara müraciət vaxtının bitmə əməliyyatı"
+ "message": "Anbar vaxtının bitmə əməliyyatı"
},
"vaultTimeoutActionLockDesc": {
- "message": "Kilidli bir anbar, təkrar müraciət etmək üçün ana parolunuzu yenidən yazmağınızı tələb edir."
+ "message": "Anbarınıza təkrar müraciət etmək üçün ana parol və ya digər kilid açma üsulu tələb olunur."
},
"vaultTimeoutActionLogOutDesc": {
- "message": "Anbarınıza yenidən müraciət etmək üçün təkrar kimlik doğrulama tələb olunur."
+ "message": "Anbarınıza təkrar müraciət etmək üçün təkrar kimlik doğrulama tələb olunur."
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
"message": "Anbar vaxt bitməsi əməliyyatınızı dəyişdirmək üçün bir kilid açma üsulu quraşdırın."
diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json
index 2d661f6db49..033da99272d 100644
--- a/apps/desktop/src/locales/et/messages.json
+++ b/apps/desktop/src/locales/et/messages.json
@@ -404,7 +404,7 @@
"message": "Pikkus"
},
"passwordMinLength": {
- "message": "Minimum password length"
+ "message": "Parooli miinimumpikkus"
},
"uppercase": {
"message": "Suurtäht (A-Z)"
@@ -479,7 +479,7 @@
"message": "Maksimaalne faili suurus on 500 MB."
},
"encryptionKeyMigrationRequired": {
- "message": "Encryption key migration required. Please login through the web vault to update your encryption key."
+ "message": "Krüpteerimisvõtme ühendamine nõutud. Palun logi sisse läbi veebibrauseri, et uuendada enda krüpteerimisvõtit."
},
"editedFolder": {
"message": "Kaust on muudetud"
@@ -500,10 +500,10 @@
"message": "Konto loomine"
},
"setAStrongPassword": {
- "message": "Set a strong password"
+ "message": "Määra tugev parool"
},
"finishCreatingYourAccountBySettingAPassword": {
- "message": "Finish creating your account by setting a password"
+ "message": "Lõpeta konto loomine määrates parooli"
},
"logIn": {
"message": "Logi sisse"
@@ -527,7 +527,7 @@
"message": "Ülemparooli vihje (ei ole kohustuslik)"
},
"masterPassHintText": {
- "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.",
+ "message": "Kui sa unustad oma parooli, saad saata parooli vihje e-mailile.\n$CURRENT$/$MAXIMUM$ tähepiirang.",
"placeholders": {
"current": {
"content": "$1",
@@ -540,22 +540,22 @@
}
},
"masterPassword": {
- "message": "Master password"
+ "message": "Ülemparool"
},
"masterPassImportant": {
- "message": "Your master password cannot be recovered if you forget it!"
+ "message": "Ülemparooli ei saa taastada, kui sa selle unustama peaksid!"
},
"confirmMasterPassword": {
- "message": "Confirm master password"
+ "message": "Kinnita ülemparool"
},
"masterPassHintLabel": {
- "message": "Master password hint"
+ "message": "Ülemparooli vihje"
},
"joinOrganization": {
- "message": "Join organization"
+ "message": "Liitu organisatsiooniga"
},
"finishJoiningThisOrganizationBySettingAMasterPassword": {
- "message": "Finish joining this organization by setting a master password."
+ "message": "Lõpeta organisatsiooniga liitumine määrates ülemparool."
},
"settings": {
"message": "Seaded"
@@ -592,10 +592,10 @@
}
},
"youSuccessfullyLoggedIn": {
- "message": "You successfully logged in"
+ "message": "Sisselogimine õnnestus"
},
"youMayCloseThisWindow": {
- "message": "You may close this window"
+ "message": "Võid selle akna sulgeda"
},
"masterPassDoesntMatch": {
"message": "Ülemparoolid ei ühti."
@@ -604,10 +604,10 @@
"message": "Sinu konto on loodud! Võid nüüd sisse logida."
},
"newAccountCreated2": {
- "message": "Your new account has been created!"
+ "message": "Uus konto loodud!"
},
"youHaveBeenLoggedIn": {
- "message": "You have been logged in!"
+ "message": "Olete sisse logitud!"
},
"masterPassSent": {
"message": "Ülemparooli vihje saadeti Sinu e-postile."
@@ -640,7 +640,7 @@
"message": "Nõutav on kinnituskood."
},
"webauthnCancelOrTimeout": {
- "message": "The authentication was cancelled or took too long. Please try again."
+ "message": "Autentimine tühistati või kestis liiga kaua aega. Palun proovi uuesti."
},
"invalidVerificationCode": {
"message": "Vale kinnituskood"
@@ -694,17 +694,17 @@
"message": "Autentimise rakendus"
},
"authenticatorAppDescV2": {
- "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.",
+ "message": "Sisesta oma autentikaatori (näiteks Bitwarden Authenticator) genereeritud kood.",
"description": "'Bitwarden Authenticator' is a product name and should not be translated."
},
"yubiKeyTitleV2": {
- "message": "Yubico OTP security key"
+ "message": "Yubico OTP turvavõti"
},
"yubiKeyDesc": {
"message": "Kasuta kontole ligipääsemiseks YubiKey-d. See töötab YubiKey 4, 4 Nano, 4C ja NEO seadmetega."
},
"duoDescV2": {
- "message": "Enter a code generated by Duo Security.",
+ "message": "Sisesta Duo Security genereeritud kood.",
"description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
},
"duoOrganizationDesc": {
@@ -721,7 +721,7 @@
"message": "E-post"
},
"emailDescV2": {
- "message": "Enter a code sent to your email."
+ "message": "Sisesta oma emailile saadetud kood."
},
"loginUnavailable": {
"message": "Sisselogimine ei ole saadaval"
@@ -742,13 +742,13 @@
"message": "Specify the base URL of your on-premise hosted bitwarden installation."
},
"selfHostedBaseUrlHint": {
- "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com"
+ "message": "Sisesta enda ise-majutatud Bitwardeni serveri nimi (base URL). Näiteks: https://bitwarden.company.com"
},
"selfHostedCustomEnvHeader": {
- "message": "For advanced configuration, you can specify the base URL of each service independently."
+ "message": "Täpsemaks seadistamiseks võid määrata serveri nime (base URL) igale teenusele eraldi."
},
"selfHostedEnvFormInvalid": {
- "message": "You must add either the base Server URL or at least one custom environment."
+ "message": "Sa pead lisama serveri nime (base URL) või vähemalt ühe iseseadistatud keskkonna."
},
"customEnvironment": {
"message": "Kohandatud keskkond"
@@ -799,22 +799,22 @@
"message": "Välja logitud"
},
"loggedOutDesc": {
- "message": "You have been logged out of your account."
+ "message": "Kontolt edukalt välja logitud."
},
"loginExpired": {
"message": "Sessioon on aegunud."
},
"restartRegistration": {
- "message": "Restart registration"
+ "message": "Alusta registreerimist uuesti"
},
"expiredLink": {
- "message": "Expired link"
+ "message": "Aegunud link"
},
"pleaseRestartRegistrationOrTryLoggingIn": {
- "message": "Please restart registration or try logging in."
+ "message": "Palun alusta registreerimist uuesti või proovi sisse logida."
},
"youMayAlreadyHaveAnAccount": {
- "message": "You may already have an account"
+ "message": "Sul on juba võib-olla konto"
},
"logOutConfirmation": {
"message": "Oled kindel, et soovid välja logida?"
@@ -871,10 +871,10 @@
"message": "Muuda ülemparooli"
},
"continueToWebApp": {
- "message": "Continue to web app?"
+ "message": "Jätka veebibrauseris?"
},
"changeMasterPasswordOnWebConfirmation": {
- "message": "You can change your master password on the Bitwarden web app."
+ "message": "Ülemparooli saab muuta Bitwardeni veebirakenduses."
},
"fingerprintPhrase": {
"message": "Unikaalne sõnajada",
@@ -1160,7 +1160,7 @@
"message": "1 GB ulatuses krüpteeritud salvestusruum."
},
"premiumSignUpTwoStepOptions": {
- "message": "Proprietary two-step login options such as YubiKey and Duo."
+ "message": "Eraomanduses kaheastmelise logimise valikud, nagu näiteks YubiKey ja Duo."
},
"premiumSignUpReports": {
"message": "Parooli hügieen, konto seisukord ja andmelekete raportid aitavad hoidlat turvalisena hoida."
@@ -1181,7 +1181,7 @@
"message": "Saad Preemium versiooni osta bitwarden.com veebihoidlas. Soovid seda kohe teha?"
},
"premiumPurchaseAlertV2": {
- "message": "You can purchase Premium from your account settings on the Bitwarden web app."
+ "message": "Sa saad hankida Preemiumi oma konto seadetes veebibrauseris."
},
"premiumCurrentMember": {
"message": "Oled preemium kasutaja!"
@@ -1286,10 +1286,10 @@
}
},
"errorRefreshingAccessToken": {
- "message": "Access Token Refresh Error"
+ "message": "Juurdepääsukoodi Värskendamine Ebaõnnestus"
},
"errorRefreshingAccessTokenDesc": {
- "message": "No refresh token or API keys found. Please try logging out and logging back in."
+ "message": "Ei leidnud värskendamise koodi või API võtit. Palun proovi logida välja ja uuesti sisse."
},
"help": {
"message": "Abi"
@@ -1379,7 +1379,7 @@
"description": "ex. Date this password was updated"
},
"exportFrom": {
- "message": "Export from"
+ "message": "Ekspordi asukohast"
},
"exportVault": {
"message": "Ekspordi hoidla"
@@ -1388,31 +1388,31 @@
"message": "Failivorming"
},
"fileEncryptedExportWarningDesc": {
- "message": "This file export will be password protected and require the file password to decrypt."
+ "message": "See eksporditav fail on parooliga kaitstud ja nõuab dekrüpteerimiseks parooli."
},
"filePassword": {
- "message": "File password"
+ "message": "Faili parool"
},
"exportPasswordDescription": {
- "message": "This password will be used to export and import this file"
+ "message": "Seda parooli kasutatakse selle faili eksportimiseks ja importimiseks"
},
"accountRestrictedOptionDescription": {
- "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account."
+ "message": "Kasuta oma konto krüpteerimise võtit, mis koosneb sinu kasutajanimest ja ülemparoolist, et krüpteerida fail ja takistada selle importimine teistesse kontodesse."
},
"passwordProtected": {
- "message": "Password protected"
+ "message": "Parooliga kaitstud"
},
"passwordProtectedOptionDescription": {
- "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption."
+ "message": "Määra faili parool, et see krüpteerida ja importida teise Bitwardeni kontosse kasutates seda parooli dekrüpteerimiseks."
},
"exportTypeHeading": {
- "message": "Export type"
+ "message": "Ekspordi tüüp"
},
"accountRestricted": {
- "message": "Account restricted"
+ "message": "Kontosisene"
},
"filePasswordAndConfirmFilePasswordDoNotMatch": {
- "message": "“File password” and “Confirm file password“ do not match."
+ "message": "\"Faili parool\" ja \"Faili parooli kinnitus\" ei kattu."
},
"hCaptchaUrl": {
"message": "hCaptcha Url",
@@ -1511,28 +1511,28 @@
"message": "Vale PIN kood."
},
"tooManyInvalidPinEntryAttemptsLoggingOut": {
- "message": "Too many invalid PIN entry attempts. Logging out."
+ "message": "Liiga palju ebaõnnestunud katseid. Login välja."
},
"unlockWithWindowsHello": {
"message": "Lukusta lahti Windows Helloga"
},
"additionalWindowsHelloSettings": {
- "message": "Additional Windows Hello settings"
+ "message": "Windows Hello lisaseaded"
},
"unlockWithPolkit": {
- "message": "Unlock with system authentication"
+ "message": "Ava arvuti autentimissüsteemiga"
},
"windowsHelloConsentMessage": {
"message": "Kinnita Bitwardenisse sisselogimine."
},
"polkitConsentMessage": {
- "message": "Authenticate to unlock Bitwarden."
+ "message": "Autentiteeri ennast Bitwardeni avamiseks."
},
"unlockWithTouchId": {
"message": "Lukusta lahti Touch ID-ga"
},
"additionalTouchIdSettings": {
- "message": "Additional Touch ID settings"
+ "message": "Muud Touch ID seaded"
},
"touchIdConsentMessage": {
"message": "Kinnita Bitwardenisse sisselogimine."
@@ -1541,16 +1541,16 @@
"message": "Küsi avamisel Windows Hello tuvastust"
},
"autoPromptPolkit": {
- "message": "Ask for system authentication on launch"
+ "message": "Kasuta käivitamisel arvuti autentimissüsteemi"
},
"autoPromptTouchId": {
"message": "Küsi avamisel Touch ID tuvastust"
},
"requirePasswordOnStart": {
- "message": "Require password or PIN on app start"
+ "message": "Nõua parooli või PINi rakenduse kävitumisel"
},
"recommendedForSecurity": {
- "message": "Recommended for security."
+ "message": "Soovitatud turvalisuse huvides."
},
"lockWithMasterPassOnRestart": {
"message": "Lukusta ülemparooliga, kui rakendus taaskäivitatakse"
@@ -1626,7 +1626,7 @@
"message": "Hoidlast väljalogimine nõuab taaskordseks ligipääsuks uut autentimist."
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
- "message": "Set up an unlock method to change your vault timeout action."
+ "message": "Hoidla ajalõpu muutmiseks vali esmalt lahtilukustamise meetod."
},
"lock": {
"message": "Lukusta",
@@ -1667,15 +1667,15 @@
"message": "Määra ülemparool"
},
"orgPermissionsUpdatedMustSetPassword": {
- "message": "Your organization permissions were updated, requiring you to set a master password.",
+ "message": "Teie organisatsiooni seadeid värskendati, mistõttu peate määrama ülemparooli.",
"description": "Used as a card title description on the set password page to explain why the user is there"
},
"orgRequiresYouToSetPassword": {
- "message": "Your organization requires you to set a master password.",
+ "message": "Sinu organisatsioon nõuab sult ülemparooli seadistamist.",
"description": "Used as a card title description on the set password page to explain why the user is there"
},
"verificationRequired": {
- "message": "Verification required",
+ "message": "Tuvastamine vajalik",
"description": "Default title for the user verification dialog."
},
"currentMasterPass": {
@@ -1730,19 +1730,19 @@
"message": "Uus ülemparool ei vasta eeskirjades väljatoodud tingimustele."
},
"receiveMarketingEmailsV2": {
- "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox."
+ "message": "Soovin saada nõuandeid, uudiseid ja pakkumisi Bitwardenilt oma postkasti."
},
"unsubscribe": {
- "message": "Unsubscribe"
+ "message": "Lõpeta tellimus"
},
"atAnyTime": {
- "message": "at any time."
+ "message": "iga hetk."
},
"byContinuingYouAgreeToThe": {
- "message": "By continuing, you agree to the"
+ "message": "Jätkates nõustud sa"
},
"and": {
- "message": "and"
+ "message": "ja"
},
"acceptPolicies": {
"message": "Märkeruudu markeerimisel nõustud järgnevaga:"
@@ -1766,10 +1766,10 @@
"message": "Brauseri integratsioon ei ole toetatud"
},
"browserIntegrationErrorTitle": {
- "message": "Error enabling browser integration"
+ "message": "Brauseriga ühendamine ebaõnnestus"
},
"browserIntegrationErrorDesc": {
- "message": "An error has occurred while enabling browser integration."
+ "message": "Midagi läks valesti brauseriga ühendamisel."
},
"browserIntegrationMasOnlyDesc": {
"message": "Paraku on brauseri integratsioon hetkel toetatud ainult Mac App Store'i versioonis."
@@ -1787,10 +1787,10 @@
"message": "See seadistus võimaldab täiendavat kaitset, küsides brauseriga ühendamisel teie unikaalset sõnajada. Sisselülitamisel nõuab see seadistus iga kord kasutaja kinnitust, kui luuakse ühendus brauseri ja töölaua rakenduse vahel."
},
"enableHardwareAcceleration": {
- "message": "Use hardware acceleration"
+ "message": "Kasuta riistvaralist kiirendamist"
},
"enableHardwareAccelerationDesc": {
- "message": "By default this setting is ON. Turn OFF only if you experience graphical issues. Restart is required."
+ "message": "See seade on vaikimisi SEES. Lülita see VÄLJA kui sul tekib probleeme graafikaga. Arvuti tuleb pärast seda taaskäivitada."
},
"approve": {
"message": "Kinnita"
@@ -1823,10 +1823,10 @@
"message": "Selleks, et kasutada biomeetriat brauseris, peab selle esmalt Bitwardeni töölaua rakenduse seadetes sisse lülitama."
},
"biometricsManualSetupTitle": {
- "message": "Automatic setup not available"
+ "message": "Automaatne seadistamine ei ole saadaval"
},
"biometricsManualSetupDesc": {
- "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?"
+ "message": "Tänu sinu installimise meetodile ei õnnestunud automaatselt biomeetria sisse lülitada. Kas soovid avada juhise kuidas seda käsitsi teha?"
},
"personalOwnershipSubmitError": {
"message": "Ettevõtte poliitika tõttu ei saa sa andmeid oma personaalsesse Hoidlasse salvestada. Vali Omanikuks organisatsioon ja vali mõni saadavaolevatest Kogumikest."
@@ -1838,7 +1838,7 @@
"message": "Organisatsiooni poliitika on seadnud omaniku valikutele piirangu."
},
"personalOwnershipPolicyInEffectImports": {
- "message": "An organization policy has blocked importing items into your individual vault."
+ "message": "Kirjete importimine isiklikku hoidlasse on organisatsiooni poolt keelatud."
},
"allSends": {
"message": "Kõik Sendid",
@@ -2013,7 +2013,7 @@
"message": "Vajalik on e-posti kinnitamine"
},
"emailVerifiedV2": {
- "message": "Email verified"
+ "message": "Email kinnitatud"
},
"emailVerificationRequiredDesc": {
"message": "Enne selle funktsiooni kasutamist pead oma e-posti kinnitama."
@@ -2040,43 +2040,43 @@
"message": "Sinu ülemparool ei vasta ühele või rohkemale organisatsiooni poolt seatud poliitikale. Hoidlale ligipääsemiseks pead oma ülemaprooli uuendama. Jätkamisel logitakse sind praegusest sessioonist välja, mistõttu pead uuesti sisse logima. Teistes seadmetes olevad aktiivsed sessioonid aeguvad umbes ühe tunni jooksul."
},
"tdeDisabledMasterPasswordRequired": {
- "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault."
+ "message": "Sinu organisatsioon on keelanud ära krüpteerimisvõtmete hoiustamise arvutites. Palun määra ülemparool oma hoidlale ligi pääsemiseks."
},
"tryAgain": {
- "message": "Try again"
+ "message": "Proovi uuesti"
},
"verificationRequiredForActionSetPinToContinue": {
- "message": "Verification required for this action. Set a PIN to continue."
+ "message": "Selle muudatuse jõustamiseks on vaja teid kinnitada. Jätkamiseks sisestage PIN."
},
"setPin": {
- "message": "Set PIN"
+ "message": "Määra PIN"
},
"verifyWithBiometrics": {
- "message": "Verify with biometrics"
+ "message": "Kinnita biomeetriaga"
},
"awaitingConfirmation": {
- "message": "Awaiting confirmation"
+ "message": "Ootan kinnitust"
},
"couldNotCompleteBiometrics": {
- "message": "Could not complete biometrics."
+ "message": "Biomeetria kasutamine ebaõnnestus."
},
"needADifferentMethod": {
- "message": "Need a different method?"
+ "message": "Soovid kasutada teist võimalust?"
},
"useMasterPassword": {
- "message": "Use master password"
+ "message": "Kasuta ülemparooli"
},
"usePin": {
- "message": "Use PIN"
+ "message": "Kasuta PIN-koodi"
},
"useBiometrics": {
- "message": "Use biometrics"
+ "message": "Kasuta biomeetriat"
},
"enterVerificationCodeSentToEmail": {
- "message": "Enter the verification code that was sent to your email."
+ "message": "Sisesta oma e-posti aadressile saadetud kinnituskood."
},
"resendCode": {
- "message": "Resend code"
+ "message": "Saada kood uuesti"
},
"hours": {
"message": "Tundi"
@@ -2127,7 +2127,7 @@
"message": "Valitud hoidla ajalõpp ei ole organisatsiooni poolt määratud reeglitega kooskõlas."
},
"inviteAccepted": {
- "message": "Invitation accepted"
+ "message": "Kutse vastu võetud"
},
"resetPasswordPolicyAutoEnroll": {
"message": "Automaatne liitumine"
@@ -2199,7 +2199,7 @@
"message": "Vaheta kontot"
},
"alreadyHaveAccount": {
- "message": "Already have an account?"
+ "message": "On juba konto?"
},
"options": {
"message": "Valikud"
@@ -2220,10 +2220,10 @@
}
},
"exportingOrganizationVaultTitle": {
- "message": "Exporting organization vault"
+ "message": "Ekspordin organisatsiooni hoidlat"
},
"exportingOrganizationVaultDesc": {
- "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.",
+ "message": "Ainult organisatsiooniga $ORGANIZATION$ seotud kirjed eksportidakse. Personaalsete hoidlate ja teiste organisatsioonide kirjeid ei ekspordita.",
"placeholders": {
"organization": {
"content": "$1",
@@ -2310,11 +2310,11 @@
}
},
"forwarderGeneratedBy": {
- "message": "Generated by Bitwarden.",
+ "message": "Genereeritud Bitwardeni poolt.",
"description": "Displayed with the address on the forwarding service's configuration screen."
},
"forwarderGeneratedByWithWebsite": {
- "message": "Website: $WEBSITE$. Generated by Bitwarden.",
+ "message": "Veebisait: $WEBSITE$. Genereeritud Bitwardeni poolt.",
"description": "Displayed with the address on the forwarding service's configuration screen.",
"placeholders": {
"WEBSITE": {
@@ -2324,7 +2324,7 @@
}
},
"forwaderInvalidToken": {
- "message": "Invalid $SERVICENAME$ API token",
+ "message": "Vigane $SERVICENAME$ API võti",
"description": "Displayed when the user's API token is empty or rejected by the forwarding service.",
"placeholders": {
"servicename": {
@@ -2334,7 +2334,7 @@
}
},
"forwaderInvalidTokenWithMessage": {
- "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$",
+ "message": "Vigane $SERVICENAME$ API võti: $ERRORMESSAGE$",
"description": "Displayed when the user's API token is rejected by the forwarding service with an error message.",
"placeholders": {
"servicename": {
@@ -2348,7 +2348,7 @@
}
},
"forwarderNoAccountId": {
- "message": "Unable to obtain $SERVICENAME$ masked email account ID.",
+ "message": "Ei õnnestunud hankida pakkuja $SERVICENAME$ maskeeritud emaili konto ID-d.",
"description": "Displayed when the forwarding service fails to return an account ID.",
"placeholders": {
"servicename": {
@@ -2358,7 +2358,7 @@
}
},
"forwarderNoDomain": {
- "message": "Invalid $SERVICENAME$ domain.",
+ "message": "Vigane $SERVICENAME$ domeen.",
"description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.",
"placeholders": {
"servicename": {
@@ -2368,7 +2368,7 @@
}
},
"forwarderNoUrl": {
- "message": "Invalid $SERVICENAME$ url.",
+ "message": "Vigane $SERVICENAME$ URL.",
"description": "Displayed when the url of the forwarding service wasn't supplied.",
"placeholders": {
"servicename": {
@@ -2378,7 +2378,7 @@
}
},
"forwarderUnknownError": {
- "message": "Unknown $SERVICENAME$ error occurred.",
+ "message": "Tundmatu error pakkujaga $SERVICENAME$.",
"description": "Displayed when the forwarding service failed due to an unknown error.",
"placeholders": {
"servicename": {
@@ -2388,7 +2388,7 @@
}
},
"forwarderUnknownForwarder": {
- "message": "Unknown forwarder: '$SERVICENAME$'.",
+ "message": "Tundmatu edastaja: '$SERVICENAME$'.",
"description": "Displayed when the forwarding service is not supported.",
"placeholders": {
"servicename": {
@@ -2450,7 +2450,7 @@
"message": "Logi sisse läbi teise seadme"
},
"loginInitiated": {
- "message": "Login initiated"
+ "message": "Alustan sisselogimist"
},
"notificationSentDevice": {
"message": "Sinu seadmesse saadeti teavitus."
@@ -2548,25 +2548,25 @@
"message": "Sisselogimise päring on saadetud"
},
"creatingAccountOn": {
- "message": "Creating account on"
+ "message": "Loon kontot asukohas"
},
"checkYourEmail": {
- "message": "Check your email"
+ "message": "Kontrollige oma postkasti"
},
"followTheLinkInTheEmailSentTo": {
- "message": "Follow the link in the email sent to"
+ "message": "Ava sulle emailiga saadetud link"
},
"andContinueCreatingYourAccount": {
- "message": "and continue creating your account."
+ "message": "ja jätka konto loomist."
},
"noEmail": {
- "message": "No email?"
+ "message": "Pole emaili?"
},
"goBack": {
- "message": "Go back"
+ "message": "Tagasi"
},
"toEditYourEmailAddress": {
- "message": "to edit your email address."
+ "message": "et muuta oma meiliaadressi."
},
"exposedMasterPassword": {
"message": "Ülemparool on haavatav"
@@ -2587,10 +2587,10 @@
"message": "Tähtis:"
},
"accessTokenUnableToBeDecrypted": {
- "message": "You have been logged out because your access token could not be decrypted. Please log in again to resolve this issue."
+ "message": "Sind logiti välja, sest sinu juurdepääsuvõtit (access token) ei õnnestunud dekrüpteerida. Probleemi lahendamiseks palun logige uuesti sisse."
},
"refreshTokenSecureStorageRetrievalFailure": {
- "message": "You have been logged out because your refresh token could not be retrieved. Please log in again to resolve this issue."
+ "message": "Sind logiti välja, sest sinu uuendamisvõtit (refresh token) ei õnnestunud saada. Probleemi lahendamiseks palun logige uuesti sisse."
},
"masterPasswordHint": {
"message": "Ülemparooli ei saa taastada, kui sa selle unustama peaksid!"
@@ -2605,83 +2605,83 @@
}
},
"windowsBiometricUpdateWarning": {
- "message": "Bitwarden recommends updating your biometric settings to require your master password (or PIN) on the first unlock. Would you like to update your settings now?"
+ "message": "Bitwarden soovitab muuta oma biomeetria seadeid, et nõuda esimesel sisselogimisel ülemparooli (või PINi). Kas soovid uuendada oma seadeid kohe?"
},
"windowsBiometricUpdateWarningTitle": {
- "message": "Recommended Settings Update"
+ "message": "Soovitatud Muudatus Seadetes"
},
"deviceApprovalRequired": {
- "message": "Device approval required. Select an approval option below:"
+ "message": "Seadme kinnitamine on nõutud. Palun vali kuidas soovid seda teha:"
},
"rememberThisDevice": {
- "message": "Remember this device"
+ "message": "Hoia see seade meeles"
},
"uncheckIfPublicDevice": {
- "message": "Uncheck if using a public device"
+ "message": "Lülita see välja, kui oled avalikus seadmes"
},
"approveFromYourOtherDevice": {
- "message": "Approve from your other device"
+ "message": "Kinnita teises seadmes"
},
"requestAdminApproval": {
- "message": "Request admin approval"
+ "message": "Küsi administraatori nõusolekut"
},
"approveWithMasterPassword": {
- "message": "Approve with master password"
+ "message": "Kinnita ülemparooliga"
},
"region": {
- "message": "Region"
+ "message": "Piirkond"
},
"ssoIdentifierRequired": {
- "message": "Organization SSO identifier is required."
+ "message": "Organisatsiooni SSO identifikaator on nõutud."
},
"eu": {
- "message": "EU",
+ "message": "EL",
"description": "European Union"
},
"loggingInOn": {
- "message": "Logging in on"
+ "message": "Login sisse aadressil"
},
"selfHostedServer": {
- "message": "self-hosted"
+ "message": "ise majutatud"
},
"accessDenied": {
- "message": "Access denied. You do not have permission to view this page."
+ "message": "Ligipääs keelatud. Sul pole lubatud seda lehekülge vaadata."
},
"accountSuccessfullyCreated": {
- "message": "Account successfully created!"
+ "message": "Konto edukalt loodud!"
},
"adminApprovalRequested": {
- "message": "Admin approval requested"
+ "message": "Taotlus administraatorile saadetud"
},
"adminApprovalRequestSentToAdmins": {
- "message": "Your request has been sent to your admin."
+ "message": "Sinu taotlus saadeti administraatorile."
},
"youWillBeNotifiedOnceApproved": {
- "message": "You will be notified once approved."
+ "message": "Kinnitamise järel saad selle kohta teavituse."
},
"troubleLoggingIn": {
- "message": "Trouble logging in?"
+ "message": "Ei õnnestu sisse logida?"
},
"loginApproved": {
- "message": "Login approved"
+ "message": "Sisselogimine kinnitatud"
},
"userEmailMissing": {
- "message": "User email missing"
+ "message": "Kasutaja email puudub"
},
"deviceTrusted": {
- "message": "Device trusted"
+ "message": "Usaldusväärne seade"
},
"inputRequired": {
- "message": "Input is required."
+ "message": "Sisend on nõutud."
},
"required": {
- "message": "required"
+ "message": "nõutud"
},
"search": {
- "message": "Search"
+ "message": "Otsi"
},
"inputMinLength": {
- "message": "Input must be at least $COUNT$ characters long.",
+ "message": "Sisend peab olema vähemalt $COUNT$ tähemärki pikk.",
"placeholders": {
"count": {
"content": "$1",
@@ -2690,7 +2690,7 @@
}
},
"inputMaxLength": {
- "message": "Input must not exceed $COUNT$ characters in length.",
+ "message": "Sisend ei tohi olla üle $COUNT$ tähemärgi pikkune.",
"placeholders": {
"count": {
"content": "$1",
@@ -2699,7 +2699,7 @@
}
},
"inputForbiddenCharacters": {
- "message": "The following characters are not allowed: $CHARACTERS$",
+ "message": "Järgnevad märgid pole lubatud: $CHARACTERS$",
"placeholders": {
"characters": {
"content": "$1",
@@ -2708,7 +2708,7 @@
}
},
"inputMinValue": {
- "message": "Input value must be at least $MIN$.",
+ "message": "Selle väärtus peab olema vähemalt $MIN$.",
"placeholders": {
"min": {
"content": "$1",
@@ -2717,7 +2717,7 @@
}
},
"inputMaxValue": {
- "message": "Input value must not exceed $MAX$.",
+ "message": "Selle väärtus ei tohi ületada $MAX$.",
"placeholders": {
"max": {
"content": "$1",
@@ -2726,17 +2726,17 @@
}
},
"multipleInputEmails": {
- "message": "1 or more emails are invalid"
+ "message": "Üks või rohkem emaili on vigased"
},
"inputTrimValidator": {
- "message": "Input must not contain only whitespace.",
+ "message": "Sisend ei tohi koosneda ainult tühikutest.",
"description": "Notification to inform the user that a form's input can't contain only whitespace."
},
"inputEmail": {
- "message": "Input is not an email address."
+ "message": "See pole e-posti aadress."
},
"fieldsNeedAttention": {
- "message": "$COUNT$ field(s) above need your attention.",
+ "message": "$COUNT$ välja nõuab tähelepanu.",
"placeholders": {
"count": {
"content": "$1",
@@ -2745,22 +2745,22 @@
}
},
"selectPlaceholder": {
- "message": "-- Select --"
+ "message": "-- Vali --"
},
"multiSelectPlaceholder": {
- "message": "-- Type to filter --"
+ "message": "-- Filtreerimiseks trüki siia --"
},
"multiSelectLoading": {
- "message": "Retrieving options..."
+ "message": "Valikute hankimine..."
},
"multiSelectNotFound": {
- "message": "No items found"
+ "message": "Ühtki kirjet ei leitud"
},
"multiSelectClearAll": {
- "message": "Clear all"
+ "message": "Tühjenda kõik"
},
"plusNMore": {
- "message": "+ $QUANTITY$ more",
+ "message": "+ $QUANTITY$ veel",
"placeholders": {
"quantity": {
"content": "$1",
@@ -2769,47 +2769,47 @@
}
},
"submenu": {
- "message": "Submenu"
+ "message": "Alammenüü"
},
"toggleSideNavigation": {
- "message": "Toggle side navigation"
+ "message": "Lülita sisse külgpaneel"
},
"skipToContent": {
- "message": "Skip to content"
+ "message": "Sisu juurde"
},
"typePasskey": {
- "message": "Passkey"
+ "message": "Pääsuvõti"
},
"passkeyNotCopied": {
- "message": "Passkey will not be copied"
+ "message": "Pääsuvõtit ei kopeerita"
},
"passkeyNotCopiedAlert": {
- "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?"
+ "message": "Pääsukoodi ei kopeerita kloonitud kirjele. Oled kindel, et soovid jätkata?"
},
"aliasDomain": {
- "message": "Alias domain"
+ "message": "Varidomeen"
},
"importData": {
- "message": "Import data",
+ "message": "Impordi andmed",
"description": "Used for the desktop menu item and the header of the import dialog"
},
"importError": {
- "message": "Import error"
+ "message": "Tõrge importimisel"
},
"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."
+ "message": "Andmete importimisel ilmnes tõrge. Paranda originaalfailis olevad vead (kuvatud all) ning proovi uuesti."
},
"resolveTheErrorsBelowAndTryAgain": {
- "message": "Resolve the errors below and try again."
+ "message": "Lahenda allolevad probleemid ja proovi uuesti."
},
"description": {
- "message": "Description"
+ "message": "Kirjeldus"
},
"importSuccess": {
- "message": "Data successfully imported"
+ "message": "Andmed edukalt imporditud"
},
"importSuccessNumberOfItems": {
- "message": "A total of $AMOUNT$ items were imported.",
+ "message": "Kokku imporditi $AMOUNT$ kirjet.",
"placeholders": {
"amount": {
"content": "$1",
@@ -2818,10 +2818,10 @@
}
},
"total": {
- "message": "Total"
+ "message": "Kokku"
},
"importWarning": {
- "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?",
+ "message": "Impordid andmeid organisatsiooni $ORGANIZATION$. Neid andmeid võidakse jagada teiste organisatsiooni liikmetega. Soovid jätkata?",
"placeholders": {
"organization": {
"content": "$1",
@@ -2830,43 +2830,43 @@
}
},
"duoHealthCheckResultsInNullAuthUrlError": {
- "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance."
+ "message": "Duo teenustega ühendamine ebaõnnestus. Kasuta teist kahe-astmelise sisselogimise meetodit või kontakteeru Duoga."
},
"launchDuoAndFollowStepsToFinishLoggingIn": {
- "message": "Launch Duo and follow the steps to finish logging in."
+ "message": "Käivita Duo ja järgi juhiseid, et lõpetada sisselogimine."
},
"duoRequiredByOrgForAccount": {
- "message": "Duo two-step login is required for your account."
+ "message": "Duo kahe-astmeline sisselogimine on sinu kontol nõutud."
},
"launchDuo": {
- "message": "Launch Duo in Browser"
+ "message": "Käivita Duo brauseris"
},
"importFormatError": {
- "message": "Data is not formatted correctly. Please check your import file and try again."
+ "message": "Andmed ei ole korrektsed. Palun kontrollige imporditavat faili ja proovige uuesti."
},
"importNothingError": {
- "message": "Nothing was imported."
+ "message": "Ei imporditud midagi."
},
"importEncKeyError": {
- "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data."
+ "message": "Eksporditud faili dekrüpteerimine nurjus. Sinu krüpteerimisvõti ei ühti selle võtmega, mida kasutati andmete eksportimisel."
},
"invalidFilePassword": {
- "message": "Invalid file password, please use the password you entered when you created the export file."
+ "message": "Vale parool, palun kasuta seda parooli mille sisestasid eksportfaili loomisel."
},
"destination": {
- "message": "Destination"
+ "message": "Sihtkoht"
},
"learnAboutImportOptions": {
- "message": "Learn about your import options"
+ "message": "Lisainfo importimise valikute kohta"
},
"selectImportFolder": {
- "message": "Select a folder"
+ "message": "Vali kaust"
},
"selectImportCollection": {
- "message": "Select a collection"
+ "message": "Vali kogumik"
},
"importTargetHint": {
- "message": "Select this option if you want the imported file contents moved to a $DESTINATION$",
+ "message": "Tee siin valik, kui soovid, et imporditud faili sisu liigutatakse asukohta $DESTINATION$",
"description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.",
"placeholders": {
"destination": {
@@ -2876,25 +2876,25 @@
}
},
"importUnassignedItemsError": {
- "message": "File contains unassigned items."
+ "message": "Fail sisaldab määramata kirjeid."
},
"selectFormat": {
- "message": "Select the format of the import file"
+ "message": "Vali imporditava faili formaat"
},
"selectImportFile": {
- "message": "Select the import file"
+ "message": "Vali imporditav fail"
},
"chooseFile": {
- "message": "Choose File"
+ "message": "Vali fail"
},
"noFileChosen": {
- "message": "No file chosen"
+ "message": "Ühtegi faili pole valitud"
},
"orCopyPasteFileContents": {
- "message": "or copy/paste the import file contents"
+ "message": "või kopeeri/kleebi imporditava faili sisu"
},
"instructionsFor": {
- "message": "$NAME$ Instructions",
+ "message": "$NAME$ Kasutusjuhend",
"description": "The title for the import tool instructions.",
"placeholders": {
"name": {
@@ -2904,120 +2904,120 @@
}
},
"confirmVaultImport": {
- "message": "Confirm vault import"
+ "message": "Kinnita hoidla importimine"
},
"confirmVaultImportDesc": {
- "message": "This file is password-protected. Please enter the file password to import data."
+ "message": "Fail on parooliga kaitstud. Palun sisesta faili importimiseks selle parool."
},
"confirmFilePassword": {
- "message": "Confirm file password"
+ "message": "Kinnita faili parool"
},
"exportSuccess": {
- "message": "Vault data exported"
+ "message": "Hoidla sisu edukalt eksporditud"
},
"multifactorAuthenticationCancelled": {
- "message": "Multifactor authentication cancelled"
+ "message": "Mitmeastmeline autentiteerimine tühistatud"
},
"noLastPassDataFound": {
- "message": "No LastPass data found"
+ "message": "Ei leidnud LastPassi andmeid"
},
"incorrectUsernameOrPassword": {
- "message": "Incorrect username or password"
+ "message": "Vale kasutajanimi või parool"
},
"incorrectPassword": {
- "message": "Incorrect password"
+ "message": "Vale parool"
},
"incorrectCode": {
- "message": "Incorrect code"
+ "message": "Vale kood"
},
"incorrectPin": {
- "message": "Incorrect PIN"
+ "message": "Vale PIN-kood"
},
"multifactorAuthenticationFailed": {
- "message": "Multifactor authentication failed"
+ "message": "Mitmeastmeline autentiteerimine ebaõnnestus"
},
"includeSharedFolders": {
- "message": "Include shared folders"
+ "message": "Lisa ka jagatud kaustad"
},
"lastPassEmail": {
- "message": "LastPass Email"
+ "message": "LastPassi Email"
},
"importingYourAccount": {
- "message": "Importing your account..."
+ "message": "Impordin sinu kontot..."
},
"lastPassMFARequired": {
- "message": "LastPass multifactor authentication required"
+ "message": "LastPassi mitmeastmeline autentiteerimine nõutud"
},
"lastPassMFADesc": {
- "message": "Enter your one-time passcode from your authentication app"
+ "message": "Sisesta oma ühekordne kood autentiteerimise rakendusest"
},
"lastPassOOBDesc": {
- "message": "Approve the login request in your authentication app or enter a one-time passcode."
+ "message": "Kinnita sisselogimistaotlus oma autentiteerimisrakenduses või sisesta ühekordne kood."
},
"passcode": {
- "message": "Passcode"
+ "message": "Pääsukood"
},
"lastPassMasterPassword": {
- "message": "LastPass master password"
+ "message": "LastPassi ülemparool"
},
"lastPassAuthRequired": {
- "message": "LastPass authentication required"
+ "message": "LastPassi autentiteerimine nõutud"
},
"awaitingSSO": {
- "message": "Awaiting SSO authentication"
+ "message": "Ootan SSO autentiteerimise kinnitamist"
},
"awaitingSSODesc": {
- "message": "Please continue to log in using your company credentials."
+ "message": "Sisselogimiseks palun jätka kasutades oma firma andmeid."
},
"seeDetailedInstructions": {
- "message": "See detailed instructions on our help site at",
+ "message": "Vaata täpsemaid juhiseid meie veebilehel",
"description": "This is followed a by a hyperlink to the help website."
},
"importDirectlyFromLastPass": {
- "message": "Import directly from LastPass"
+ "message": "Impordi otse LastPassist"
},
"importFromCSV": {
- "message": "Import from CSV"
+ "message": "Impordi CSV-st"
},
"lastPassTryAgainCheckEmail": {
- "message": "Try again or look for an email from LastPass to verify it's you."
+ "message": "Proovi uuesti või kinnita sulle LastPassilt saadetud kirjas, et see oled sina."
},
"collection": {
- "message": "Collection"
+ "message": "Kogumik"
},
"lastPassYubikeyDesc": {
- "message": "Insert the YubiKey associated with your LastPass account into your computer's USB port, then touch its button."
+ "message": "Sisesta sinu LastPassi kontoga seotud YubiKey oma arvuti USB porti ja vajuta nuppu selle peal."
},
"commonImportFormats": {
- "message": "Common formats",
+ "message": "Tüüpilised meetodid",
"description": "Label indicating the most common import formats"
},
"success": {
- "message": "Success"
+ "message": "Tehtud"
},
"troubleshooting": {
- "message": "Troubleshooting"
+ "message": "Tõrkeotsing"
},
"disableHardwareAccelerationRestart": {
- "message": "Disable hardware acceleration and restart"
+ "message": "Lülita riistavara kiirendus välja ja tee taaskäivitus"
},
"enableHardwareAccelerationRestart": {
- "message": "Enable hardware acceleration and restart"
+ "message": "Lülita riistavara kiirendus sisse ja tee taaskäivitus"
},
"removePasskey": {
- "message": "Remove passkey"
+ "message": "Eemalda pääsuvõti"
},
"passkeyRemoved": {
- "message": "Passkey removed"
+ "message": "Pääsuvõti eemaldatud"
},
"errorAssigningTargetCollection": {
- "message": "Error assigning target collection."
+ "message": "Sihtkogumikku määramine ebaõnnestus."
},
"errorAssigningTargetFolder": {
- "message": "Error assigning target folder."
+ "message": "Sihtkausta määramine ebaõnnestus."
},
"viewItemsIn": {
- "message": "View items in $NAME$",
+ "message": "Vaata kirjeid asukohas $NAME$",
"description": "Button to view the contents of a folder or collection",
"placeholders": {
"name": {
@@ -3027,7 +3027,7 @@
}
},
"backTo": {
- "message": "Back to $NAME$",
+ "message": "Tagasi asukohta $NAME$",
"description": "Navigate back to a previous folder or collection",
"placeholders": {
"name": {
@@ -3037,11 +3037,11 @@
}
},
"back": {
- "message": "Back",
+ "message": "Tagasi",
"description": "Button text to navigate back"
},
"removeItem": {
- "message": "Remove $NAME$",
+ "message": "Eemalda $NAME$",
"description": "Remove a selected option, such as a folder or collection",
"placeholders": {
"name": {
@@ -3051,15 +3051,15 @@
}
},
"data": {
- "message": "Data"
+ "message": "Andmed"
},
"fileSends": {
- "message": "File Sends"
+ "message": "Kõik Send Failid"
},
"textSends": {
- "message": "Text Sends"
+ "message": "Kõik Tekst-Sendid"
},
"ssoError": {
- "message": "No free ports could be found for the sso login."
+ "message": "SSO-ga sisselogimiseks ei leitud ühtegi vaba porti."
}
}
From bf7a490a76e81dd8120ac941517504c431c28a41 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2024 14:55:53 +0000
Subject: [PATCH 20/36] Autosync the updated translations (#10959)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/web/src/locales/af/messages.json | 7 +-
apps/web/src/locales/ar/messages.json | 7 +-
apps/web/src/locales/az/messages.json | 7 +-
apps/web/src/locales/be/messages.json | 7 +-
apps/web/src/locales/bg/messages.json | 7 +-
apps/web/src/locales/bn/messages.json | 7 +-
apps/web/src/locales/bs/messages.json | 7 +-
apps/web/src/locales/ca/messages.json | 7 +-
apps/web/src/locales/cs/messages.json | 7 +-
apps/web/src/locales/cy/messages.json | 7 +-
apps/web/src/locales/da/messages.json | 7 +-
apps/web/src/locales/de/messages.json | 21 +-
apps/web/src/locales/el/messages.json | 7 +-
apps/web/src/locales/en_GB/messages.json | 7 +-
apps/web/src/locales/en_IN/messages.json | 7 +-
apps/web/src/locales/eo/messages.json | 7 +-
apps/web/src/locales/es/messages.json | 7 +-
apps/web/src/locales/et/messages.json | 293 ++++++++++++-----------
apps/web/src/locales/eu/messages.json | 7 +-
apps/web/src/locales/fa/messages.json | 7 +-
apps/web/src/locales/fi/messages.json | 7 +-
apps/web/src/locales/fil/messages.json | 7 +-
apps/web/src/locales/fr/messages.json | 7 +-
apps/web/src/locales/gl/messages.json | 7 +-
apps/web/src/locales/he/messages.json | 7 +-
apps/web/src/locales/hi/messages.json | 7 +-
apps/web/src/locales/hr/messages.json | 21 +-
apps/web/src/locales/hu/messages.json | 7 +-
apps/web/src/locales/id/messages.json | 7 +-
apps/web/src/locales/it/messages.json | 7 +-
apps/web/src/locales/ja/messages.json | 7 +-
apps/web/src/locales/ka/messages.json | 7 +-
apps/web/src/locales/km/messages.json | 7 +-
apps/web/src/locales/kn/messages.json | 7 +-
apps/web/src/locales/ko/messages.json | 7 +-
apps/web/src/locales/lv/messages.json | 7 +-
apps/web/src/locales/ml/messages.json | 7 +-
apps/web/src/locales/mr/messages.json | 7 +-
apps/web/src/locales/my/messages.json | 7 +-
apps/web/src/locales/nb/messages.json | 7 +-
apps/web/src/locales/ne/messages.json | 7 +-
apps/web/src/locales/nl/messages.json | 7 +-
apps/web/src/locales/nn/messages.json | 7 +-
apps/web/src/locales/or/messages.json | 7 +-
apps/web/src/locales/pl/messages.json | 7 +-
apps/web/src/locales/pt_BR/messages.json | 7 +-
apps/web/src/locales/pt_PT/messages.json | 7 +-
apps/web/src/locales/ro/messages.json | 7 +-
apps/web/src/locales/ru/messages.json | 11 +-
apps/web/src/locales/si/messages.json | 7 +-
apps/web/src/locales/sk/messages.json | 21 +-
apps/web/src/locales/sl/messages.json | 7 +-
apps/web/src/locales/sr/messages.json | 7 +-
apps/web/src/locales/sr_CS/messages.json | 7 +-
apps/web/src/locales/sv/messages.json | 7 +-
apps/web/src/locales/te/messages.json | 7 +-
apps/web/src/locales/th/messages.json | 7 +-
apps/web/src/locales/tr/messages.json | 7 +-
apps/web/src/locales/uk/messages.json | 21 +-
apps/web/src/locales/vi/messages.json | 7 +-
apps/web/src/locales/zh_CN/messages.json | 7 +-
apps/web/src/locales/zh_TW/messages.json | 7 +-
62 files changed, 483 insertions(+), 297 deletions(-)
diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json
index 20b77c53fb9..f5f39bd0223 100644
--- a/apps/web/src/locales/af/messages.json
+++ b/apps/web/src/locales/af/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json
index 3556df1e13f..b8747656223 100644
--- a/apps/web/src/locales/ar/messages.json
+++ b/apps/web/src/locales/ar/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json
index 78876040eb8..b19ac2c3913 100644
--- a/apps/web/src/locales/az/messages.json
+++ b/apps/web/src/locales/az/messages.json
@@ -9050,8 +9050,11 @@
"message": "Hər kəsə açıq API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Əlavə məzmun əlçatandır"
+ "showCharacterCount": {
+ "message": "Xarakter sayını göstər"
+ },
+ "hideCharacterCount": {
+ "message": "Xarakter sayını gizlət"
},
"editAccess": {
"message": "Müraciətə düzəliş et"
diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json
index 607d633da56..340b7fb1f4e 100644
--- a/apps/web/src/locales/be/messages.json
+++ b/apps/web/src/locales/be/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json
index a877a5edf10..dda600ce091 100644
--- a/apps/web/src/locales/bg/messages.json
+++ b/apps/web/src/locales/bg/messages.json
@@ -9050,8 +9050,11 @@
"message": "Публичен ППИ",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Има налично допълнително съдържание"
+ "showCharacterCount": {
+ "message": "Показване на броя знаци"
+ },
+ "hideCharacterCount": {
+ "message": "Скриване на броя знаци"
},
"editAccess": {
"message": "Редактиране на достъпа"
diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json
index 59016f510ed..c7112cc6c1a 100644
--- a/apps/web/src/locales/bn/messages.json
+++ b/apps/web/src/locales/bn/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json
index 25404f49daf..829615cc551 100644
--- a/apps/web/src/locales/bs/messages.json
+++ b/apps/web/src/locales/bs/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json
index 6b3ee609bfc..26794588127 100644
--- a/apps/web/src/locales/ca/messages.json
+++ b/apps/web/src/locales/ca/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json
index 914bc3471c5..6f7367b8033 100644
--- a/apps/web/src/locales/cs/messages.json
+++ b/apps/web/src/locales/cs/messages.json
@@ -9050,8 +9050,11 @@
"message": "Veřejné API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Je k dispozici další obsah"
+ "showCharacterCount": {
+ "message": "Zobrazit počet znaků"
+ },
+ "hideCharacterCount": {
+ "message": "Skrýt počet znaků"
},
"editAccess": {
"message": "Upravit přístup"
diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json
index c88b9519d3f..5e1de3971d7 100644
--- a/apps/web/src/locales/cy/messages.json
+++ b/apps/web/src/locales/cy/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json
index 23b588f5314..fae10f4eef0 100644
--- a/apps/web/src/locales/da/messages.json
+++ b/apps/web/src/locales/da/messages.json
@@ -9050,8 +9050,11 @@
"message": "Offentlig API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Yderligere indhold er tilgængeligt"
+ "showCharacterCount": {
+ "message": "Vis tegnantal"
+ },
+ "hideCharacterCount": {
+ "message": "Skjul tegnantal"
},
"editAccess": {
"message": "Redigér adgang"
diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json
index c6d0b2caec0..9e83c16860a 100644
--- a/apps/web/src/locales/de/messages.json
+++ b/apps/web/src/locales/de/messages.json
@@ -49,19 +49,19 @@
"message": "Zugangsdaten"
},
"personalDetails": {
- "message": "Personal details"
+ "message": "Persönliche Details"
},
"identification": {
- "message": "Identification"
+ "message": "Identifikation"
},
"contactInfo": {
- "message": "Contact info"
+ "message": "Kontaktinformation"
},
"cardDetails": {
- "message": "Card details"
+ "message": "Kartendetails"
},
"cardBrandDetails": {
- "message": "$BRAND$ details",
+ "message": "$BRAND$-Details",
"placeholders": {
"brand": {
"content": "$1",
@@ -70,7 +70,7 @@
}
},
"itemHistory": {
- "message": "Item history"
+ "message": "Eintragsverlauf"
},
"authenticatorKey": {
"message": "Authenticator-Schlüssel"
@@ -464,7 +464,7 @@
"message": "Vollständiger Name"
},
"address": {
- "message": "Address"
+ "message": "Adresse"
},
"address1": {
"message": "Adresse 1"
@@ -9050,8 +9050,11 @@
"message": "Öffentliche API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Zusätzlicher Inhalt ist verfügbar"
+ "showCharacterCount": {
+ "message": "Zeichenanzahl anzeigen"
+ },
+ "hideCharacterCount": {
+ "message": "Zeichenanzahl ausblenden"
},
"editAccess": {
"message": "Zugriff bearbeiten"
diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json
index 7f79cbd162a..cfe7d180e52 100644
--- a/apps/web/src/locales/el/messages.json
+++ b/apps/web/src/locales/el/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json
index 13d23f14593..aab1efb7c5e 100644
--- a/apps/web/src/locales/en_GB/messages.json
+++ b/apps/web/src/locales/en_GB/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json
index 90293bb066f..7ccd08f86b1 100644
--- a/apps/web/src/locales/en_IN/messages.json
+++ b/apps/web/src/locales/en_IN/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json
index 495b9c6e78c..b7615fe4471 100644
--- a/apps/web/src/locales/eo/messages.json
+++ b/apps/web/src/locales/eo/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json
index 639c0f34e63..a9458b47176 100644
--- a/apps/web/src/locales/es/messages.json
+++ b/apps/web/src/locales/es/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json
index 72ad36be3e2..9a54611285d 100644
--- a/apps/web/src/locales/et/messages.json
+++ b/apps/web/src/locales/et/messages.json
@@ -52,10 +52,10 @@
"message": "Isikuandmed"
},
"identification": {
- "message": "Identification"
+ "message": "Tuvastamine"
},
"contactInfo": {
- "message": "Contact info"
+ "message": "Kontaktinfo"
},
"cardDetails": {
"message": "Pangakaardi detailid"
@@ -756,7 +756,7 @@
"message": "Aegunud link"
},
"pleaseRestartRegistrationOrTryLoggingIn": {
- "message": "Please restart registration or try logging in."
+ "message": "Palun alusta uuesti registreerimist või proovi sisse logida."
},
"youMayAlreadyHaveAnAccount": {
"message": "Sul on võib-olla juba konto"
@@ -837,7 +837,7 @@
"message": "Kasuta hoidla krüpteerimiseks"
},
"useForVaultEncryptionInfo": {
- "message": "Log in and unlock on supported devices without your master password. Follow the prompts from your browser to finalize setup."
+ "message": "Kasuta toetatud seadmetel sisselogimis- ja avamisfunktsioone ilma ülemparoolita. Järgi brauseri juhiseid, et lõpetada seadistus."
},
"useForVaultEncryptionErrorReadingPasskey": {
"message": "Ei õnnestunud pääsuvõtit lugeda. Proovi uuesti või tühjendage see valik."
@@ -849,7 +849,7 @@
"message": "Seadista krüpteerimine"
},
"usedForEncryption": {
- "message": "Used for encryption"
+ "message": "Kasutatakse krüpteerimiseks"
},
"loginWithPasskeyEnabled": {
"message": "Logi sisse pääsuvõti sisse lülitatult"
@@ -1253,10 +1253,10 @@
"message": "Kopeeri UUID"
},
"errorRefreshingAccessToken": {
- "message": "Access Token Refresh Error"
+ "message": "Juurdepääsukoodi Värskendamine Ebaõnnestus"
},
"errorRefreshingAccessTokenDesc": {
- "message": "No refresh token or API keys found. Please try logging out and logging back in."
+ "message": "Ei leidnud värskendamise koodi või API võtit. Palun proovi logida välja ja uuesti sisse."
},
"warning": {
"message": "Hoiatus"
@@ -1283,7 +1283,7 @@
"message": "Ekspordi"
},
"exportFrom": {
- "message": "Ekspordi vorm"
+ "message": "Export from"
},
"exportVault": {
"message": "Hoidla sisu eksportimine"
@@ -2474,7 +2474,7 @@
"message": "Tellimuse haldamine"
},
"launchCloudSubscription": {
- "message": "Launch Cloud Subscription"
+ "message": "Ühenda Tasuline Tellimus"
},
"storage": {
"message": "Salvestusruum"
@@ -2573,7 +2573,7 @@
"message": "Võta klienditoega ühendust"
},
"contactSupportShort": {
- "message": "Võta kasutajatoega ühendust"
+ "message": "Klienditugi"
},
"updatedPaymentMethod": {
"message": "Maksemeetod on muudetud."
@@ -3001,7 +3001,7 @@
"message": "Anna Juurdepääs"
},
"addAccessFilter": {
- "message": "Add Access Filter"
+ "message": "Piira Juurdepääsu"
},
"refresh": {
"message": "Värskenda"
@@ -3451,7 +3451,7 @@
"message": "Seade"
},
"creatingAccountOn": {
- "message": "Creating account on"
+ "message": "Konto loomise asukoht"
},
"checkYourEmail": {
"message": "Kontrolli oma e-posti"
@@ -3586,7 +3586,7 @@
"message": "Pääsed organisatsiooni kirjetele ligi niipea, kui administraator sinu liikmelisuse kinnitab. Teavitame sind sellest e-posti teel."
},
"inviteInitAcceptedDesc": {
- "message": "You can now access this organization."
+ "message": "Sul on nüüd ligipääs sellele organisatsioonile."
},
"inviteAcceptFailed": {
"message": "Kutse vastuvõtmine nurjus. Palu organisatsiooni administraatoril uus kutse saata."
@@ -3625,7 +3625,7 @@
"message": "Oled avaldanud soovi oma Bitwardeni konto kustutamiseks. Selle kinnitamiseks kliki allolevale nupule."
},
"deleteRecoverOrgConfirmDesc": {
- "message": "You have requested to delete your Bitwarden organization."
+ "message": "Kas sa oled kindel, et soovid kustudada oma Bitwardeni organisatsiooni?"
},
"myOrganization": {
"message": "Minu organisatsioon"
@@ -3754,14 +3754,14 @@
"message": "Määra maksimaalne kasutajate limiit. Limiidi täitumisel ei saa enam uusi kasutajaid kutsuda."
},
"limitSmSubscriptionDesc": {
- "message": "Set a seat limit for your Secrets Manager subscription. Once this limit is reached, you will not be able to invite new members."
+ "message": "Määra maksimaalne Secrets Manageri kasutajate limiit. Limiidi täitumisel ei saa enam uusi liikmeid kutsuda."
},
"maxSeatLimit": {
- "message": "Maksimaalne kasutajate limiit (valikuline)",
+ "message": "Kasutajate limiit (valikuline)",
"description": "Upper limit of seats to allow through autoscaling"
},
"maxSeatCost": {
- "message": "Max potential seat cost"
+ "message": "Suurim võimalik hind inimese kohta"
},
"addSeats": {
"message": "Lisa kasutajaid",
@@ -3772,7 +3772,7 @@
"description": "Seat = User Seat"
},
"subscriptionDesc": {
- "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": "Muudatused sinu tellimusele kajastuvad arve lõppsummas. Kui sinu kasutajate arv ületab tellimuse kohtade arvu, saad kohe arve uute kasutajate eest."
},
"subscriptionUserSeats": {
"message": "Sinu tellimus lubab kasutada/luua kokku $COUNT$ kasutajakontot.",
@@ -3784,34 +3784,34 @@
}
},
"limitSubscription": {
- "message": "Limit subscription (optional)"
+ "message": "Määra kasutajate ülempiir (valikuline)"
},
"subscriptionSeats": {
- "message": "Subscription seats"
+ "message": "Tellimuse kasutajate arv"
},
"subscriptionUpdated": {
- "message": "Subscription updated"
+ "message": "Tellimus uuendatud"
},
"subscribedToSecretsManager": {
- "message": "Subscription updated. You now have access to Secrets Manager."
+ "message": "Tellimus uuendatud. Nüüd on sul ligipääs Secrets Managerile."
},
"additionalOptions": {
"message": "Lisavalikud"
},
"additionalOptionsDesc": {
- "message": "For additional help in managing your subscription, please contact Customer Support."
+ "message": "Küsimustega seoses oma tellimuse haldamisega kontakteeruge Kasutajatoega."
},
"subscriptionUserSeatsUnlimitedAutoscale": {
- "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members."
+ "message": "Muudatused sinu tellimusele kajastuvad arve lõppsummas. Kui sinu liikmete arv ületab tellimuse kohtade arvu, saad kohe arve uute liikmete eest."
},
"smStandaloneTrialSeatCountUpdateMessageFragment1": {
- "message": "If you want to add additional"
+ "message": "Kui sa soovid lisada tootesse"
},
"smStandaloneTrialSeatCountUpdateMessageFragment2": {
- "message": "seats without the bundled offer, please contact"
+ "message": "teisi liikmeid ilma teiste pakkumisteta, võta ühendust osakonnaga"
},
"subscriptionUserSeatsLimitedAutoscale": {
- "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members until your $MAX$ seat limit is reached.",
+ "message": "Muudatused sinu tellimusele kajastuvad arve lõppsummas. Kui sinu liikmete arv ületab tellimuse kohtade arvu, saad kohe arve uute liikmete eest, kuni su maksimaalne liikmete arv ($MAX$) on saavutatud.",
"placeholders": {
"max": {
"content": "$1",
@@ -3820,7 +3820,7 @@
}
},
"subscriptionUserSeatsWithoutAdditionalSeatsOption": {
- "message": "You can invite up to $COUNT$ members for no additional charge. Contact Customer Support to upgrade your plan and invite more members.",
+ "message": "Sa saad kutsuda tasuta kuni $COUNT$ liiget. Kontakteeru kasutajatoega, et muuta oma tellimust ja kutsuda veel rohkem liikmeid.",
"placeholders": {
"count": {
"content": "$1",
@@ -3829,7 +3829,7 @@
}
},
"subscriptionFreePlan": {
- "message": "You cannot invite more than $COUNT$ members without upgrading your plan.",
+ "message": "Sa ei saa kutsuda rohkem kui $COUNT$ liiget ilma oma tellimust muutmata.",
"placeholders": {
"count": {
"content": "$1",
@@ -3838,7 +3838,7 @@
}
},
"subscriptionUpgrade": {
- "message": "You cannot invite more than $COUNT$ members without upgrading your plan.",
+ "message": "Sa ei saa kutsuda rohkem kui $COUNT$ liiget ilma oma tellimust muutmata.",
"placeholders": {
"count": {
"content": "$1",
@@ -3847,7 +3847,7 @@
}
},
"subscriptionSponsoredFamiliesPlan": {
- "message": "Your subscription allows for a total of $COUNT$ members. Your plan is sponsored and billed to an external organization.",
+ "message": "Sinu tellimust saab kasutada korraga kuni $COUNT$ liiget. Seda tellimust haldab väline organisatsioon.",
"placeholders": {
"count": {
"content": "$1",
@@ -3856,7 +3856,7 @@
}
},
"subscriptionMaxReached": {
- "message": "Adjustments to your subscription will result in prorated changes to your billing totals. You cannot invite more than $COUNT$ members without increasing your subscription seats.",
+ "message": "Muudatused sinu tellimusele kajastuvad arve lõppsummas. Sa ei saa kutsuda rohkem kui $COUNT$ liiget ilma oma tellimuse kasutajate arvu suurendamata.",
"placeholders": {
"count": {
"content": "$1",
@@ -3865,7 +3865,7 @@
}
},
"subscriptionSeatMaxReached": {
- "message": "You cannot invite more than $COUNT$ members without increasing your subscription seats.",
+ "message": "Sa ei saa kutsuda rohkem kui $COUNT$ liiget ilma oma tellimuse kasutajate arvu muutmata.",
"placeholders": {
"count": {
"content": "$1",
@@ -4009,19 +4009,19 @@
"description": "ex. Date this password was updated"
},
"organizationIsDisabled": {
- "message": "Organisatsioon on välja lülitatud."
+ "message": "Organisatsioon on määramata ajaks peatatud"
},
"secretsAccessSuspended": {
- "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance."
+ "message": "Peatatud organisatsioonidele ei ole võimalik ligi pääseda. Palun kontakteeruge oma organisatsiooni haldajaga."
},
"secretsCannotCreate": {
- "message": "Secrets cannot be created in suspended organizations. Please contact your organization owner for assistance."
+ "message": "Peatatud organisatsioonidesse ei ole võimalik salvestada uusi IT-saladusi. Palun kontakteeruge oma organisatsiooni haldajaga."
},
"projectsCannotCreate": {
- "message": "Projects cannot be created in suspended organizations. Please contact your organization owner for assistance."
+ "message": "Peatatud organisatsioonides ei ole võimalik luua uusi projekte. Palun kontakteeruge oma organisatsiooni haldajaga."
},
"serviceAccountsCannotCreate": {
- "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance."
+ "message": "Peatatud organisatsioonides ei ole võimalik luua uusi kontosid. Palun kontakteeruge oma organisatsiooni haldajaga."
},
"disabledOrganizationFilterError": {
"message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga."
@@ -4923,64 +4923,64 @@
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'"
},
"developmentDevOpsAndITTeamsChooseBWSecret": {
- "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets."
+ "message": "Arendus- ja IT-tiimid kasutavad Bitwarden Secrets Manageri, et turvaliselt hallata ja hoiustada oma infrastruktuuri ja süsteemide saladusi."
},
"centralizeSecretsManagement": {
- "message": "Centralize secrets management."
+ "message": "Koguge IT-saladused ühte kohta."
},
"centralizeSecretsManagementDescription": {
- "message": "Securely store and manage secrets in one location to prevent secret sprawl across your organization."
+ "message": "Hoiusta ja halda ohutult IT-saladusi ühes asukohas, et vältida nende kadumist organisatsioonis laiali valgudes."
},
"preventSecretLeaks": {
- "message": "Prevent secret leaks."
+ "message": "Väldi saladuste lekkimist."
},
"preventSecretLeaksDescription": {
- "message": "Protect secrets with end-to-end encryption. No more hard coding secrets or sharing through .env files."
+ "message": "Kaitse IT-saladusi täieliku krüpteerimisega. Ütle ei nende koodibaasi lisamisele või jagamisele läbi .env failide."
},
"enhanceDeveloperProductivity": {
- "message": "Enhance developer productivity."
+ "message": "Paranda programmeerijate ja arendajate produktiivsust."
},
"enhanceDeveloperProductivityDescription": {
- "message": "Programmatically retrieve and deploy secrets at runtime so developers can focus on what matters most, like improving code quality."
+ "message": "Kasuta IT-saladusi otse läbi programmi ja loo uusi saladusi masinat peatamata, nii et arendajad saavad keskenduda sellele, mis on kõige tähtsam, näiteks vigade parandamisele."
},
"strengthenBusinessSecurity": {
- "message": "Strengthen business security."
+ "message": "Paranda firma turvalisust."
},
"strengthenBusinessSecurityDescription": {
- "message": "Maintain tight control over machine and human access to secrets with SSO integrations, event logs, and access rotation."
+ "message": "Säilita kontroll masinate ja inimeste ligipääsu üle IT-saladustele läbi SSO kasutamise, sündmuste ajaloo ja ligipääsu uuendamise."
},
"tryItNow": {
- "message": "Try it now"
+ "message": "Proovi kohe"
},
"sendRequest": {
- "message": "Send request"
+ "message": "Saada taotlus"
},
"addANote": {
- "message": "Add a note"
+ "message": "Lisa märge"
},
"bitwardenSecretsManager": {
"message": "Bitwarden Secrets Manager"
},
"moreProductsFromBitwarden": {
- "message": "More products from Bitwarden"
+ "message": "Veel tooteid Bitwardenilt"
},
"requestAccessToSecretsManager": {
- "message": "Request access to Secrets Manager"
+ "message": "Esita taotlus Secrets Manageri kasutamiseks"
},
"youNeedApprovalFromYourAdminToTrySecretsManager": {
- "message": "You need approval from your administrator to try Secrets Manager."
+ "message": "Sul on vaja enda administraatori nõusolekut Secrets Manageri proovimiseks."
},
"smAccessRequestEmailSent": {
- "message": "Access request for secrets manager email sent to admins."
+ "message": "Secrets Manageri kasutamise taotlus saadetud administraatorile."
},
"requestAccessSMDefaultEmailContent": {
- "message": "Hi,\n\nI am requesting a subscription to Bitwarden Secrets Manager for our team. Your support would mean a great deal!\n\nBitwarden Secrets Manager is an end-to-end encrypted secrets management solution for securely storing, sharing, and deploying machine credentials like API keys, database passwords, and authentication certificates.\n\nSecrets Manager will help us to:\n\n- Improve security\n- Streamline operations\n- Prevent costly secret leaks\n\nTo request a free trial for our team, please reach out to Bitwarden.\n\nThank you for your help!"
+ "message": "Tere!\n\nEsitan palve Bitwarden Secrets Manageri kasutamiseks meie tiimi jaoks. Teie toetus oleks meile suureks abiks!\n\nBitwarden Secrets Manager on täielikult krüpteeritud IT-saladuste (näiteks API võtmete, andmebaasi paroolide ja autentiteerimise sertifikaatide) haldamise lahendus, mis on mõeldud nende turvaliselt hoiustamiseks, jagamiseks ja kasutamiseks.\n\nSecrets Manager aitab meil:\n\n- Parandada turvalisust\n- Muuta toimingud sujuvamaks\n- Takistada võimalikke andmelekkeid\n\nEt esitada taotlus tasuta prooviajaks, palun kontakteeruge Bitwardeniga.\n\nSuur tänu teie abi eest!"
},
"giveMembersAccess": {
"message": "Give members access:"
},
"viewAndSelectTheMembers": {
- "message": "view and select the members you want to give access to Secrets Manager."
+ "message": "vaata ja vali liikmeid, kellele sa soovid anda ligipääsu Secrets Managerile."
},
"openYourOrganizations": {
"message": "Open your organization's"
@@ -5271,10 +5271,10 @@
"message": "Provider successfully set up"
},
"clients": {
- "message": "Clients"
+ "message": "Kliendid"
},
"client": {
- "message": "Client",
+ "message": "Klient",
"description": "This is used as a table header to describe which client application created an event log."
},
"providerAdmin": {
@@ -5354,7 +5354,7 @@
}
},
"providerIsDisabled": {
- "message": "Provider suspended"
+ "message": "Teenusepakkuja on peatatud määramata ajaks"
},
"providerUpdated": {
"message": "Provider saved"
@@ -5627,43 +5627,43 @@
"message": "Single sign-on configuration saved"
},
"sponsoredFamilies": {
- "message": "Free Bitwarden Families"
+ "message": "Tasuta Bitwarden Families pakett"
},
"sponsoredFamiliesEligible": {
- "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work."
+ "message": "Sina ja su pere olete valitud tasuta Bitwarden Families paketi saamiseks. Lunasta see läbi oma emaili, et hoida oma andmed ohutus kohas isegi kui sa ei ole tööl."
},
"sponsoredFamiliesEligibleCard": {
- "message": "Redeem your Free Bitwarden for Families plan today to keep your data secure even when you are not at work."
+ "message": "Lunasta tasuta pakett Bitwarden for Families juba täna, et kaitsta oma andmeid isegi siis, kui sa ei ole tööl."
},
"sponsoredFamiliesInclude": {
- "message": "The Bitwarden for Families plan include"
+ "message": "Pakett Bitwarden for Families sisaldab"
},
"sponsoredFamiliesPremiumAccess": {
- "message": "Premium access for up to 6 users"
+ "message": "Ligipääs Preemiumile kuni kuuele inimesele"
},
"sponsoredFamiliesSharedCollections": {
- "message": "Shared collections for Family secrets"
+ "message": "Jagatud kogumikud pere saladuste talletamiseks"
},
"badToken": {
- "message": "The link is no longer valid. Please have the sponsor resend the offer."
+ "message": "See link ei ole enam aktiivne. Uue lingi saamiseks kontakteeruge oma sponsoriga, et ta saadaks pakkumise uuesti."
},
"reclaimedFreePlan": {
- "message": "Reclaimed free plan"
+ "message": "Uuendatud tasuta pakett"
},
"redeem": {
- "message": "Redeem"
+ "message": "Lunasta"
},
"sponsoredFamiliesSelectOffer": {
- "message": "Select the organization you would like sponsored"
+ "message": "Vali organisatsioon, mida soovid sponsoreerida"
},
"familiesSponsoringOrgSelect": {
- "message": "Which Free Families offer would you like to redeem?"
+ "message": "Millist Free Families pakkumist soovid sa lunastada?"
},
"sponsoredFamiliesEmail": {
- "message": "Enter your personal email to redeem Bitwarden Families"
+ "message": "Sisesta oma isiklik email, et lunastada Bitwarden Families"
},
"sponsoredFamiliesLeaveCopy": {
- "message": "If you remove an offer or are removed from the sponsoring organization, your Families sponsorship will expire at the next renewal date."
+ "message": "Kui sa lõpetad pakkumise, või sind eemaldatakse sponsoreerivast organisatsioonist, siis sinu Families sponsorlus lõpetatakse perioodi lõpus."
},
"acceptBitwardenFamiliesHelp": {
"message": "Accept offer for an existing organization or create a new Families organization."
@@ -5723,13 +5723,13 @@
"message": "Recipient"
},
"removeSponsorship": {
- "message": "Remove sponsorship"
+ "message": "Eemalda sponsorlus"
},
"removeSponsorshipConfirmation": {
- "message": "After removing a sponsorship, you will be responsible for this subscription and related invoices. Are you sure you want to continue?"
+ "message": "Peale sponsorluse eemaldamist vastutad sa selle tellimusega seotud arvete eest. Kas oled kindel, et soovid jätkata?"
},
"sponsorshipCreated": {
- "message": "Sponsorship created"
+ "message": "Sponsorlus loodud"
},
"emailSent": {
"message": "E-kiri on saadetud"
@@ -5780,30 +5780,30 @@
}
},
"leaveOrganization": {
- "message": "Leave organization"
+ "message": "Lahku organisatsioonist"
},
"removeMasterPassword": {
- "message": "Remove master password"
+ "message": "Eemalda ülemparool"
},
"removedMasterPassword": {
- "message": "Master password removed"
+ "message": "Ülemparool eemaldatud"
},
"allowSso": {
- "message": "Allow SSO authentication"
+ "message": "Lülita SSO autentiteerimine sisse"
},
"allowSsoDesc": {
"message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials."
},
"ssoPolicyHelpStart": {
- "message": "Use the",
+ "message": "Kasuta",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'"
},
"ssoPolicyHelpAnchor": {
- "message": "require single sign-on authentication policy",
+ "message": "\"nõua ühekordse sisselogimise autentimise (SSO) kasutamist\",",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'"
},
"ssoPolicyHelpEnd": {
- "message": "to require all members to log in with SSO.",
+ "message": "et nõuda liikmetelt SSO kasutamist.",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'"
},
"memberDecryptionOption": {
@@ -5831,10 +5831,10 @@
"message": "\"Login with SSO and Key Connector Decryption\" is activated. This policy will only apply to owners and admins."
},
"enabledSso": {
- "message": "SSO turned on"
+ "message": "SSO sisse lülitatud"
},
"disabledSso": {
- "message": "SSO turned on"
+ "message": "SSO välja lülitatud"
},
"enabledKeyConnector": {
"message": "Key Connector activated"
@@ -5858,7 +5858,7 @@
"message": "New Families organization"
},
"acceptOffer": {
- "message": "Accept offer"
+ "message": "Nõustu pakkumisega"
},
"sponsoringOrg": {
"message": "Sponsoring organization"
@@ -5969,16 +5969,16 @@
"message": "Sent (awaiting sync)"
},
"sent": {
- "message": "Sent"
+ "message": "Saadetud"
},
"requestRemoved": {
"message": "Removed (awaiting sync)"
},
"requested": {
- "message": "Requested"
+ "message": "Taotlus esitatud"
},
"formErrorSummaryPlural": {
- "message": "$COUNT$ fields above need your attention.",
+ "message": "$COUNT$ välja nõuab tähelepanu.",
"placeholders": {
"count": {
"content": "$1",
@@ -5987,10 +5987,10 @@
}
},
"formErrorSummarySingle": {
- "message": "1 field above needs your attention."
+ "message": "1 väli nõuab tähelepanu."
},
"fieldRequiredError": {
- "message": "$FIELDNAME$ is required.",
+ "message": "$FIELDNAME$ on nõutud.",
"placeholders": {
"fieldname": {
"content": "$1",
@@ -5999,7 +5999,7 @@
}
},
"required": {
- "message": "required"
+ "message": "nõutud"
},
"charactersCurrentAndMaximum": {
"message": "$CURRENT$/$MAX$ character maximum",
@@ -6326,7 +6326,7 @@
"description": "Part of a URL."
},
"apiAccessToken": {
- "message": "API ligipääsu märk"
+ "message": "API võti"
},
"deviceVerification": {
"message": "Seadme kinnitamine"
@@ -6608,17 +6608,17 @@
"description": "Action to delete a single secret from the system."
},
"deleteSecrets": {
- "message": "Delete secrets",
+ "message": "Kustuta IT-saladusi",
"description": "The action to delete multiple secrets from the system."
},
"hardDeleteSecret": {
"message": "Permanently delete secret"
},
"hardDeleteSecrets": {
- "message": "Permanently delete secrets"
+ "message": "Kustuta valitud jäädavalt"
},
"secretProjectAssociationDescription": {
- "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.",
+ "message": "Vali projektid, millega see saladus seotud on. Seda saladust saavad vaadata ainult organisatsiooni kasutajad ligipääsuga nendele projektidele.",
"description": "A prompt explaining how secrets can be associated with projects."
},
"selectProjects": {
@@ -6630,7 +6630,7 @@
"description": "Label for the search bar used to search projects."
},
"project": {
- "message": "Project",
+ "message": "Projekt",
"description": "Similar to collections, projects can be used to group secrets."
},
"editProject": {
@@ -6662,11 +6662,11 @@
"description": "The title for the section that deals with service accounts."
},
"secrets": {
- "message": "Secrets",
+ "message": "IT-saladused",
"description": "The title for the section of the application that deals with secrets."
},
"nameValuePair": {
- "message": "Name/Value pair",
+ "message": "Nimi/Väärtus",
"description": "Title for a name/ value pair. Secrets typically consist of a name and value pair."
},
"secretEdited": {
@@ -6686,15 +6686,15 @@
"description": "Title for creating a new service account."
},
"secretsNoItemsTitle": {
- "message": "No secrets to show",
+ "message": "Siin ei ole ühtegi saladust",
"description": "Empty state to indicate that there are no secrets to display."
},
"secretsNoItemsMessage": {
- "message": "To get started, add a new secret or import secrets.",
+ "message": "Alustamiseks loo uus IT-saladus või kasuta meie importimise funktsiooni.",
"description": "Message to encourage the user to start adding secrets."
},
"secretsTrashNoItemsMessage": {
- "message": "There are no secrets in the trash."
+ "message": "Prügikast on tühi."
},
"serviceAccountsNoItemsMessage": {
"message": "Create a new service account to get started automating secret access.",
@@ -6705,7 +6705,7 @@
"description": "Title to indicate that there are no service accounts to display."
},
"searchSecrets": {
- "message": "Search secrets",
+ "message": "Otsi IT-saladusi",
"description": "Placeholder text for searching secrets."
},
"deleteServiceAccounts": {
@@ -6780,21 +6780,21 @@
"description": "Title for creating a new project."
},
"softDeleteSecretWarning": {
- "message": "Deleting secrets can affect existing integrations.",
+ "message": "IT-saladuste kustutamine võib mõjuta ühendatud süsteeme.",
"description": "Warns that deleting secrets can have consequences on integrations"
},
"softDeletesSuccessToast": {
- "message": "Secrets sent to trash",
+ "message": "IT-saladused prügikasti teisaldatud",
"description": "Notifies that the selected secrets have been moved to the trash"
},
"hardDeleteSecretConfirmation": {
"message": "Are you sure you want to permanently delete this secret?"
},
"hardDeleteSecretsConfirmation": {
- "message": "Are you sure you want to permanently delete these secrets?"
+ "message": "Kas sa oled kindel, et soovid kustutada need IT-saladused?"
},
"hardDeletesSuccessToast": {
- "message": "Secrets permanently deleted"
+ "message": "IT-saladused lõplikult kustutatud"
},
"smAccess": {
"message": "Access",
@@ -6817,7 +6817,7 @@
"description": "Notifies that a service account has been updated"
},
"newSaSelectAccess": {
- "message": "Type or select projects or secrets",
+ "message": "Trüki või vali mõni projekt või saladus",
"description": "Instructions for selecting projects or secrets for a new service account"
},
"newSaTypeToFilter": {
@@ -6881,7 +6881,7 @@
"description": "Empty state to be displayed when there are no projects to display in the list."
},
"projectsNoItemsMessage": {
- "message": "Add a new project to get started organizing secrets.",
+ "message": "Loo uus projekt, et alustada oma saladuste organiseerimisega.",
"description": "Message to be displayed when there are no projects to display in the list."
},
"smConfirmationRequired": {
@@ -6940,7 +6940,7 @@
"description": "Copies the generated access token to the user's clipboard."
},
"accessToken": {
- "message": "Access token",
+ "message": "Juurdepääsuvõti",
"description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets."
},
"accessTokenExpirationRequired": {
@@ -6952,7 +6952,7 @@
"description": "Notification to inform the user that the access token has been created and copied to the clipboard."
},
"revokeAccessToken": {
- "message": "Revoke access token",
+ "message": "Eemalda juurdepääsuvõti",
"description": "Invalidates / cancels an access token and as such removes access to secrets for the client application."
},
"revokeAccessTokens": {
@@ -7315,7 +7315,7 @@
"message": "Exporting Organization Secret Data"
},
"exportingOrganizationSecretDataDescription": {
- "message": "Only the Secrets Manager data associated with $ORGANIZATION$ will be exported. Items in other products or from other organizations will not be included.",
+ "message": "Ainult organisatsiooni $ORGANIZATION$ Secrets Manageri andmed eksporditakse. Kirjed teistes toodetes või organisatsioonides ei kuulu nende hulka.",
"placeholders": {
"ORGANIZATION": {
"content": "$1",
@@ -7423,10 +7423,10 @@
"message": "Secrets Manager"
},
"secretsManagerAccessDescription": {
- "message": "Activate user access to Secrets Manager."
+ "message": "Anna kasutajale juurdepääs Secrets Managerile."
},
"userAccessSecretsManagerGA": {
- "message": "This user can access Secrets Manager"
+ "message": "See kasutaja pääseb ligi Secrets Managerile"
},
"important": {
"message": "Important:"
@@ -7482,14 +7482,14 @@
"message": "Create a service account"
},
"downloadThe": {
- "message": "Download the",
+ "message": "Lae alla",
"description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI"
},
"smCLI": {
"message": "Secrets Manager CLI"
},
"importSecrets": {
- "message": "Import secrets"
+ "message": "Impordi saladusi"
},
"getStarted": {
"message": "Get started"
@@ -7511,19 +7511,19 @@
"message": "Restore secret"
},
"restoreSecrets": {
- "message": "Restore secrets"
+ "message": "Taasta saladusi"
},
"restoreSecretPrompt": {
"message": "Are you sure you want to restore this secret?"
},
"restoreSecretsPrompt": {
- "message": "Are you sure you want to restore these secrets?"
+ "message": "Kas sa oled kindel, et soovid taastada need saladused?"
},
"secretRestoredSuccessToast": {
"message": "Secret restored"
},
"secretsRestoredSuccessToast": {
- "message": "Secrets restored"
+ "message": "IT-saladused taastatud"
},
"selectionIsRequired": {
"message": "Selection is required."
@@ -7593,7 +7593,7 @@
"message": "This feature is not available for free organizations. Contact your organization owner to upgrade."
},
"smProjectSecretsNoItemsNoAccess": {
- "message": "Contact your organization's admin to manage secrets for this project.",
+ "message": "Kontakteeruge oma organisatsiooni administraatoriga, et hallata selle projekti saladusi.",
"description": "The message shown to the user under a project's secrets tab when the user only has read access to the project."
},
"enforceOnLoginDesc": {
@@ -7693,18 +7693,18 @@
"message": "User updated a password issued through account recovery."
},
"activatedAccessToSecretsManager": {
- "message": "Activated access to Secrets Manager",
+ "message": "Juurdepääs Secrets Managerile aktiveeritud",
"description": "Confirmation message that one or more users gained access to Secrets Manager"
},
"activateAccess": {
"message": "Activate access"
},
"bulkEnableSecretsManagerDescription": {
- "message": "Grant the following members access to Secrets Manager. The role granted in the Password Manager will apply to Secrets Manager.",
+ "message": "Anna järgnevatele inimestele ligipääs Secrets Managerile. Password Manageris antud roll kehtib ka Secrets Managerile.",
"description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager."
},
"activateSecretsManager": {
- "message": "Activate Secrets Manager"
+ "message": "Aktiveeri Secrets Manager"
},
"yourOrganizationsFingerprint": {
"message": "Sinu organisatsiooni unikaalne sõnajada",
@@ -7798,7 +7798,7 @@
}
},
"startYour7DayFreeTrialOfBitwardenSecretsManagerFor": {
- "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for $ORG$",
+ "message": "Alusta oma organisatsiooni $ORG$ 7-päevast tasuta Bitwarden Secrets Manageri katseperioodi",
"placeholders": {
"org": {
"content": "$1",
@@ -7851,7 +7851,7 @@
"message": "Invite Users"
},
"secretsManagerForPlan": {
- "message": "Secrets Manager for $PLAN$",
+ "message": "Secrets Manager plaanile $PLAN$",
"placeholders": {
"plan": {
"content": "$1",
@@ -7860,13 +7860,13 @@
}
},
"secretsManagerForPlanDesc": {
- "message": "For engineering and DevOps teams to manage secrets throughout the software development lifecycle."
+ "message": "Arendus- ja programmeerimistiimidele, et hallata saladusi läbi kogu tarkvara arendustsükli."
},
"free2PersonOrganization": {
"message": "Free 2-person Organizations"
},
"unlimitedSecrets": {
- "message": "Unlimited secrets"
+ "message": "Piiramatult IT-saladusi"
},
"unlimitedProjects": {
"message": "Unlimited projects"
@@ -7899,10 +7899,10 @@
}
},
"subscribeToSecretsManager": {
- "message": "Subscribe to Secrets Manager"
+ "message": "Telli Secrets Manager"
},
"addSecretsManagerUpgradeDesc": {
- "message": "Add Secrets Manager to your upgraded plan to maintain access to any secrets created with your previous plan."
+ "message": "Lisa Secrets Manager oma uude plaani, et säilitada juurdepääs kõigile eelmise plaaniga loodud saladustele."
},
"additionalServiceAccounts": {
"message": "Additional service accounts"
@@ -7944,10 +7944,10 @@
"message": "Password Manager plan price"
},
"secretsManagerPlanPrice": {
- "message": "Secrets Manager plan price"
+ "message": "Secrets Manageri plaani hind"
},
"passwordManager": {
- "message": "Password Manager"
+ "message": "Paroolihaldur"
},
"freeOrganization": {
"message": "Free Organization"
@@ -8086,7 +8086,7 @@
"message": "Confirmation details"
},
"smFreeTrialThankYou": {
- "message": "Thank you for signing up for Bitwarden Secrets Manager!"
+ "message": "Aitäh registreerimast Bitwarden Secrets Manageri!"
},
"smFreeTrialConfirmationEmail": {
"message": "We've sent a confirmation email to your email at "
@@ -8276,10 +8276,10 @@
"description": "The date header used when a subscription is cancelled."
},
"machineAccountsCannotCreate": {
- "message": "Machine accounts cannot be created in suspended organizations. Please contact your organization owner for assistance."
+ "message": "Peatatud organisatsioonides ei ole võimalik luua uusi kontosid arvutitele. Palun kontakteeruge oma organisatsiooni haldajaga."
},
"machineAccount": {
- "message": "Machine account",
+ "message": "Arvuti konto",
"description": "A machine user which can be used to automate processes and access secrets in the system."
},
"machineAccounts": {
@@ -8491,13 +8491,13 @@
"message": "Integrations"
},
"integrationsDesc": {
- "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service."
+ "message": "Sünkroniseeri enda Bitwarden Secrets Manageri saladusi kolmandate isikutega."
},
"sdks": {
"message": "SDKs"
},
"sdksDesc": {
- "message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications."
+ "message": "Kasuta Bitwarden Secrets Manageri SDK järgnevates programmeerimiskeeltes, millega saad ehitada enda rakendusi."
},
"setUpGithubActions": {
"message": "Set up Github Actions"
@@ -8590,16 +8590,16 @@
"message": "Start your 7-Day free trial of Bitwarden for Enterprise"
},
"startYour7DayFreeTrialOfBitwardenSecretsManager": {
- "message": "Start your 7-Day free trial of Bitwarden Secrets Manager"
+ "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageriga"
},
"startYour7DayFreeTrialOfBitwardenSecretsManagerForTeams": {
- "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Teams"
+ "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Teams"
},
"startYour7DayFreeTrialOfBitwardenSecretsManagerForFamilies": {
- "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Families"
+ "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Families"
},
"startYour7DayFreeTrialOfBitwardenSecretsManagerForEnterprise": {
- "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for Enterprise"
+ "message": "Alusta oma 7-päevast prooviaega Bitwarden Secrets Manageri ja plaaniga Enterprise"
},
"startYour7DayFreeTrialOfBitwardenPasswordManager": {
"message": "Start your 7-Day free trial of Bitwarden Password Manager"
@@ -8829,10 +8829,10 @@
"message": "Download CSV"
},
"monthlySubscriptionUserSeatsMessage": {
- "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. "
+ "message": "Muudatused sinu tellimusele kajastuvad järgmise perioodi arve lõppsummas. "
},
"annualSubscriptionUserSeatsMessage": {
- "message": "Adjustments to your subscription will result in prorated charges on a monthly billing cycle. "
+ "message": "Muudatused sinu tellimusele kajastuvad igakuiselt arvete lõppsummades. "
},
"billingHistoryDescription": {
"message": "Download a CSV to obtain client details for each billing date. Prorated charges are not included in the CSV and may vary from the linked invoice. For the most accurate billing details, refer to your monthly invoices.",
@@ -9023,7 +9023,7 @@
"message": "Custom roles"
},
"unlimitedSecretsStorage": {
- "message": "Unlimited secrets storage"
+ "message": "Piiramatult ruumi saladustele"
},
"unlimitedUsers": {
"message": "Unlimited users"
@@ -9038,7 +9038,7 @@
"message": "Current"
},
"secretsManagerSubInfo": {
- "message": "Your Secrets Manager subscription will upgrade base on the plan selected"
+ "message": "Sinu Secrets Manageri tellimus uueneb vastavalt sinu valitud plaanile"
},
"bitwardenPasswordManager": {
"message": "Bitwarden Password Manager"
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json
index dbabb5e4a2c..091d5c62f93 100644
--- a/apps/web/src/locales/eu/messages.json
+++ b/apps/web/src/locales/eu/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json
index 380bd9f5944..c977cc38f8d 100644
--- a/apps/web/src/locales/fa/messages.json
+++ b/apps/web/src/locales/fa/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json
index c9ebc389147..6952ef43b22 100644
--- a/apps/web/src/locales/fi/messages.json
+++ b/apps/web/src/locales/fi/messages.json
@@ -9050,8 +9050,11 @@
"message": "Julkinen API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Lisää sisältöä on saatavilla"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Muokkaa käyttöoikeuksia"
diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json
index 0f9f0dd212d..303f12643f8 100644
--- a/apps/web/src/locales/fil/messages.json
+++ b/apps/web/src/locales/fil/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json
index a0f58f9f58b..b1ac1951908 100644
--- a/apps/web/src/locales/fr/messages.json
+++ b/apps/web/src/locales/fr/messages.json
@@ -9050,8 +9050,11 @@
"message": "API publique",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Du contenu supplémentaire est disponible"
+ "showCharacterCount": {
+ "message": "Afficher le nombre de caractères"
+ },
+ "hideCharacterCount": {
+ "message": "Cacher le nombre de caractères"
},
"editAccess": {
"message": "Modifier l'accès"
diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json
index 3d105f01e0c..f7d33277076 100644
--- a/apps/web/src/locales/gl/messages.json
+++ b/apps/web/src/locales/gl/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json
index bef6306e921..c0f0f764a9c 100644
--- a/apps/web/src/locales/he/messages.json
+++ b/apps/web/src/locales/he/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json
index ee6caf70e15..65902135793 100644
--- a/apps/web/src/locales/hi/messages.json
+++ b/apps/web/src/locales/hi/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json
index 57e49d591c6..60c214ad181 100644
--- a/apps/web/src/locales/hr/messages.json
+++ b/apps/web/src/locales/hr/messages.json
@@ -49,19 +49,19 @@
"message": "Vjerodajnice za prijavu"
},
"personalDetails": {
- "message": "Personal details"
+ "message": "Osobni podaci"
},
"identification": {
- "message": "Identification"
+ "message": "Identifikacija"
},
"contactInfo": {
- "message": "Contact info"
+ "message": "Kontakt podaci"
},
"cardDetails": {
- "message": "Card details"
+ "message": "Detalji kartice"
},
"cardBrandDetails": {
- "message": "$BRAND$ details",
+ "message": "$BRAND$ detalji",
"placeholders": {
"brand": {
"content": "$1",
@@ -70,7 +70,7 @@
}
},
"itemHistory": {
- "message": "Item history"
+ "message": "Povijest stavke"
},
"authenticatorKey": {
"message": "Kôd za provjeru"
@@ -464,7 +464,7 @@
"message": "Ime i prezime"
},
"address": {
- "message": "Address"
+ "message": "Adresa"
},
"address1": {
"message": "Adresa 1"
@@ -9050,8 +9050,11 @@
"message": "Javni API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Dostupan je dodatni sadržaj"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Uredi pristup"
diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json
index a54509a011d..f216aaa91a6 100644
--- a/apps/web/src/locales/hu/messages.json
+++ b/apps/web/src/locales/hu/messages.json
@@ -9050,8 +9050,11 @@
"message": "Nyilvános API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Kiegészítő tartalom érhető el."
+ "showCharacterCount": {
+ "message": "Karakterszámláló megjelenítése"
+ },
+ "hideCharacterCount": {
+ "message": "Karakterszámláló elrejtése"
},
"editAccess": {
"message": "Hozzáférés szerkesztése"
diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json
index 5473dece733..30e1638a869 100644
--- a/apps/web/src/locales/id/messages.json
+++ b/apps/web/src/locales/id/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json
index 8d0d248adcb..b2849a20338 100644
--- a/apps/web/src/locales/it/messages.json
+++ b/apps/web/src/locales/it/messages.json
@@ -9050,8 +9050,11 @@
"message": "API pubblica",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Sono disponibili ulteriori contenuti"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Modifica accesso"
diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json
index 0cff337d393..88973293334 100644
--- a/apps/web/src/locales/ja/messages.json
+++ b/apps/web/src/locales/ja/messages.json
@@ -9050,8 +9050,11 @@
"message": "公開 API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "追加コンテンツが利用可能です"
+ "showCharacterCount": {
+ "message": "文字数を表示"
+ },
+ "hideCharacterCount": {
+ "message": "文字数を隠す"
},
"editAccess": {
"message": "編集権限"
diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json
index d096dc4d17b..67364dde68d 100644
--- a/apps/web/src/locales/ka/messages.json
+++ b/apps/web/src/locales/ka/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json
index 2127f7a553e..21e8cf62999 100644
--- a/apps/web/src/locales/km/messages.json
+++ b/apps/web/src/locales/km/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json
index 58014cce859..c9c9ab49f71 100644
--- a/apps/web/src/locales/kn/messages.json
+++ b/apps/web/src/locales/kn/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json
index 41aab58f69b..934929b1ee0 100644
--- a/apps/web/src/locales/ko/messages.json
+++ b/apps/web/src/locales/ko/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json
index cdfa7d28ca4..3fa2249bcd0 100644
--- a/apps/web/src/locales/lv/messages.json
+++ b/apps/web/src/locales/lv/messages.json
@@ -9050,8 +9050,11 @@
"message": "Publiskais API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Ir pieejams papildu saturs"
+ "showCharacterCount": {
+ "message": "Rādīt rakstzīmju skaitu"
+ },
+ "hideCharacterCount": {
+ "message": "Paslēpt rakstzīmju skaitu"
},
"editAccess": {
"message": "Labot piekļuvi"
diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json
index 5f34bbb176a..12d14414b5c 100644
--- a/apps/web/src/locales/ml/messages.json
+++ b/apps/web/src/locales/ml/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json
index 2127f7a553e..21e8cf62999 100644
--- a/apps/web/src/locales/mr/messages.json
+++ b/apps/web/src/locales/mr/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json
index 2127f7a553e..21e8cf62999 100644
--- a/apps/web/src/locales/my/messages.json
+++ b/apps/web/src/locales/my/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json
index 26319da87b3..a33e12c544b 100644
--- a/apps/web/src/locales/nb/messages.json
+++ b/apps/web/src/locales/nb/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json
index 01e22e16b00..f9ba74ae957 100644
--- a/apps/web/src/locales/ne/messages.json
+++ b/apps/web/src/locales/ne/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json
index 60f02836bf5..0f208d53fce 100644
--- a/apps/web/src/locales/nl/messages.json
+++ b/apps/web/src/locales/nl/messages.json
@@ -9050,8 +9050,11 @@
"message": "Openbare API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Extra inhoud beschikbaar"
+ "showCharacterCount": {
+ "message": "Aantal tekens weergeven"
+ },
+ "hideCharacterCount": {
+ "message": "Aantal tekens verbergen"
},
"editAccess": {
"message": "Toegang bewerken"
diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json
index 59e6bc8fc4e..ff329b1a781 100644
--- a/apps/web/src/locales/nn/messages.json
+++ b/apps/web/src/locales/nn/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json
index 2127f7a553e..21e8cf62999 100644
--- a/apps/web/src/locales/or/messages.json
+++ b/apps/web/src/locales/or/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json
index b5d5bacc6f4..205104c177b 100644
--- a/apps/web/src/locales/pl/messages.json
+++ b/apps/web/src/locales/pl/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json
index 27d0fcaca5e..2aecf452ea6 100644
--- a/apps/web/src/locales/pt_BR/messages.json
+++ b/apps/web/src/locales/pt_BR/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json
index 0217ec41278..50805349223 100644
--- a/apps/web/src/locales/pt_PT/messages.json
+++ b/apps/web/src/locales/pt_PT/messages.json
@@ -9050,8 +9050,11 @@
"message": "API pública",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Estão disponíveis conteúdos adicionais"
+ "showCharacterCount": {
+ "message": "Mostrar contagem de caracteres"
+ },
+ "hideCharacterCount": {
+ "message": "Ocultar contagem de caracteres"
},
"editAccess": {
"message": "Editar acesso"
diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json
index 629f1a24ade..7384da233f5 100644
--- a/apps/web/src/locales/ro/messages.json
+++ b/apps/web/src/locales/ro/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json
index a55ab9d52c2..b3e2c6efa77 100644
--- a/apps/web/src/locales/ru/messages.json
+++ b/apps/web/src/locales/ru/messages.json
@@ -222,7 +222,7 @@
"message": "Истек срок действия карты"
},
"cardExpiredMessage": {
- "message": "If you've renewed it, update the card's information"
+ "message": "Если вы заменили карту, обновите информацию о ней"
},
"expirationMonth": {
"message": "Месяц"
@@ -3754,7 +3754,7 @@
"message": "Установите лимит мест для вашей подписки. По достижении этого лимита вы не сможете приглашать новых пользователей."
},
"limitSmSubscriptionDesc": {
- "message": "Установите лимит мест для вашей подписки на Менеджер секретов. По достижении этого лимита вы не сможете приглашать новых пользователей."
+ "message": "Установите лимит мест для вашей подписки на Менеджер секретов. По достижении этого лимита вы не сможете приглашать новых пользователей.Менеджер секретов"
},
"maxSeatLimit": {
"message": "Предел мест (необязательно)",
@@ -9050,8 +9050,11 @@
"message": "Публичный API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Дополнительный контент доступен"
+ "showCharacterCount": {
+ "message": "Показать количество символов"
+ },
+ "hideCharacterCount": {
+ "message": "Скрыть количество символов"
},
"editAccess": {
"message": "Изменить доступ"
diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json
index fcc73af4a2c..f4585132675 100644
--- a/apps/web/src/locales/si/messages.json
+++ b/apps/web/src/locales/si/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json
index 7b42265fece..1d90ff61265 100644
--- a/apps/web/src/locales/sk/messages.json
+++ b/apps/web/src/locales/sk/messages.json
@@ -49,19 +49,19 @@
"message": "Prihlasovacie údaje"
},
"personalDetails": {
- "message": "Personal details"
+ "message": "Osobné údaje"
},
"identification": {
- "message": "Identification"
+ "message": "Identifikácia"
},
"contactInfo": {
- "message": "Contact info"
+ "message": "Kontaktné informácie"
},
"cardDetails": {
- "message": "Card details"
+ "message": "Podrobnosti o karte"
},
"cardBrandDetails": {
- "message": "$BRAND$ details",
+ "message": "Podrobnosti o $BRAND$",
"placeholders": {
"brand": {
"content": "$1",
@@ -70,7 +70,7 @@
}
},
"itemHistory": {
- "message": "Item history"
+ "message": "História položky"
},
"authenticatorKey": {
"message": "Kľúč overovacej aplikácie"
@@ -464,7 +464,7 @@
"message": "Celé meno"
},
"address": {
- "message": "Address"
+ "message": "Adresa"
},
"address1": {
"message": "Adresa 1"
@@ -9050,8 +9050,11 @@
"message": "Verejné API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "K dispozícii je ďalší obsah"
+ "showCharacterCount": {
+ "message": "Zobraziť počítadlo znakov"
+ },
+ "hideCharacterCount": {
+ "message": "Skryť počítadlo znakov"
},
"editAccess": {
"message": "Upraviť prístup"
diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json
index b804301bccb..6ff12ad4596 100644
--- a/apps/web/src/locales/sl/messages.json
+++ b/apps/web/src/locales/sl/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json
index 38efcf5e2a5..f0bea1eb573 100644
--- a/apps/web/src/locales/sr/messages.json
+++ b/apps/web/src/locales/sr/messages.json
@@ -9050,8 +9050,11 @@
"message": "Јавни API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json
index 5c5e0a9251d..5df939b84e7 100644
--- a/apps/web/src/locales/sr_CS/messages.json
+++ b/apps/web/src/locales/sr_CS/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json
index 0fc92e37fa7..5aab64e9cbe 100644
--- a/apps/web/src/locales/sv/messages.json
+++ b/apps/web/src/locales/sv/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Visa antal tecken"
+ },
+ "hideCharacterCount": {
+ "message": "Dölj antal tecken"
},
"editAccess": {
"message": "Redigera åtkomst"
diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json
index 2127f7a553e..21e8cf62999 100644
--- a/apps/web/src/locales/te/messages.json
+++ b/apps/web/src/locales/te/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json
index 3d7f0c4c9d9..9055bc1c9f8 100644
--- a/apps/web/src/locales/th/messages.json
+++ b/apps/web/src/locales/th/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json
index 95aff845125..640ddc5a5d6 100644
--- a/apps/web/src/locales/tr/messages.json
+++ b/apps/web/src/locales/tr/messages.json
@@ -9050,8 +9050,11 @@
"message": "Genel API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Ek içerikler mevcut"
+ "showCharacterCount": {
+ "message": "Karakter sayacını göster"
+ },
+ "hideCharacterCount": {
+ "message": "Karakter sayacını gizle"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json
index 61f5962e6e9..c8ae5f4b56e 100644
--- a/apps/web/src/locales/uk/messages.json
+++ b/apps/web/src/locales/uk/messages.json
@@ -49,19 +49,19 @@
"message": "Облікові дані для входу"
},
"personalDetails": {
- "message": "Personal details"
+ "message": "Особисті дані"
},
"identification": {
- "message": "Identification"
+ "message": "Ідентифікація"
},
"contactInfo": {
- "message": "Contact info"
+ "message": "Контактні дані"
},
"cardDetails": {
- "message": "Card details"
+ "message": "Подробиці картки"
},
"cardBrandDetails": {
- "message": "$BRAND$ details",
+ "message": "Подробиці $BRAND$",
"placeholders": {
"brand": {
"content": "$1",
@@ -70,7 +70,7 @@
}
},
"itemHistory": {
- "message": "Item history"
+ "message": "Історія запису"
},
"authenticatorKey": {
"message": "Ключ автентифікації"
@@ -464,7 +464,7 @@
"message": "Повне ім'я"
},
"address": {
- "message": "Address"
+ "message": "Адреса"
},
"address1": {
"message": "Адреса 1"
@@ -9050,8 +9050,11 @@
"message": "Відкритий API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Доступний додатковий вміст"
+ "showCharacterCount": {
+ "message": "Показати кількість символів"
+ },
+ "hideCharacterCount": {
+ "message": "Приховати кількість символів"
},
"editAccess": {
"message": "Редагувати доступ"
diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json
index 21f040dd0e9..90eca2660ec 100644
--- a/apps/web/src/locales/vi/messages.json
+++ b/apps/web/src/locales/vi/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json
index f6280a00110..34804b736ea 100644
--- a/apps/web/src/locales/zh_CN/messages.json
+++ b/apps/web/src/locales/zh_CN/messages.json
@@ -9050,8 +9050,11 @@
"message": "公共 API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "其他内容可用"
+ "showCharacterCount": {
+ "message": "显示字符计数"
+ },
+ "hideCharacterCount": {
+ "message": "隐藏字符计数"
},
"editAccess": {
"message": "编辑权限"
diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json
index 77d1dd696ff..680d3759829 100644
--- a/apps/web/src/locales/zh_TW/messages.json
+++ b/apps/web/src/locales/zh_TW/messages.json
@@ -9050,8 +9050,11 @@
"message": "Public API",
"description": "The text, 'API', is an acronymn and should not be translated."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"editAccess": {
"message": "Edit access"
From 55cd021471b0c27aa4ce3fd0875e101d8a847e72 Mon Sep 17 00:00:00 2001
From: Bitwarden DevOps
<106330231+bitwarden-devops-bot@users.noreply.github.com>
Date: Mon, 9 Sep 2024 10:57:25 -0400
Subject: [PATCH 21/36] Bumped client version(s) (#10960)
---
apps/browser/package.json | 2 +-
apps/browser/src/manifest.json | 2 +-
apps/browser/src/manifest.v3.json | 2 +-
apps/cli/package.json | 2 +-
apps/desktop/package.json | 2 +-
apps/desktop/src/package-lock.json | 4 ++--
apps/desktop/src/package.json | 2 +-
apps/web/package.json | 2 +-
package-lock.json | 8 ++++----
9 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/apps/browser/package.json b/apps/browser/package.json
index c5332a08016..b76a1e84126 100644
--- a/apps/browser/package.json
+++ b/apps/browser/package.json
@@ -1,6 +1,6 @@
{
"name": "@bitwarden/browser",
- "version": "2024.8.2",
+ "version": "2024.9.0",
"scripts": {
"build": "cross-env MANIFEST_VERSION=3 webpack",
"build:mv2": "webpack",
diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json
index 5792c10c053..f916555fef2 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": "2024.8.2",
+ "version": "2024.9.0",
"description": "__MSG_extDesc__",
"default_locale": "en",
"author": "Bitwarden Inc.",
diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json
index fe99c9e9889..12d501ba9ed 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": "2024.8.2",
+ "version": "2024.9.0",
"description": "__MSG_extDesc__",
"default_locale": "en",
"author": "Bitwarden Inc.",
diff --git a/apps/cli/package.json b/apps/cli/package.json
index 8fe0284ed7d..a7759043ff6 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": "2024.8.2",
+ "version": "2024.9.0",
"keywords": [
"bitwarden",
"password",
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 4562653978b..40ce2fec5d9 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": "2024.9.0",
+ "version": "2024.9.1",
"keywords": [
"bitwarden",
"password",
diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json
index 6823bddceb8..ce08dfde2cd 100644
--- a/apps/desktop/src/package-lock.json
+++ b/apps/desktop/src/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@bitwarden/desktop",
- "version": "2024.9.0",
+ "version": "2024.9.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@bitwarden/desktop",
- "version": "2024.9.0",
+ "version": "2024.9.1",
"license": "GPL-3.0",
"dependencies": {
"@bitwarden/desktop-napi": "file:../desktop_native/napi",
diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json
index 18a046d5bce..e34641f1e09 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": "2024.9.0",
+ "version": "2024.9.1",
"author": "Bitwarden Inc.
(https://bitwarden.com)",
"homepage": "https://bitwarden.com",
"license": "GPL-3.0",
diff --git a/apps/web/package.json b/apps/web/package.json
index de153ea1a23..08b8d182837 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,6 +1,6 @@
{
"name": "@bitwarden/web-vault",
- "version": "2024.8.3",
+ "version": "2024.9.0",
"scripts": {
"build:oss": "webpack",
"build:bit": "webpack -c ../../bitwarden_license/bit-web/webpack.config.js",
diff --git a/package-lock.json b/package-lock.json
index 15138a66967..2fb382d5e68 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -192,11 +192,11 @@
},
"apps/browser": {
"name": "@bitwarden/browser",
- "version": "2024.8.2"
+ "version": "2024.9.0"
},
"apps/cli": {
"name": "@bitwarden/cli",
- "version": "2024.8.2",
+ "version": "2024.9.0",
"license": "SEE LICENSE IN LICENSE.txt",
"dependencies": {
"@koa/multer": "3.0.2",
@@ -232,7 +232,7 @@
},
"apps/desktop": {
"name": "@bitwarden/desktop",
- "version": "2024.9.0",
+ "version": "2024.9.1",
"hasInstallScript": true,
"license": "GPL-3.0"
},
@@ -246,7 +246,7 @@
},
"apps/web": {
"name": "@bitwarden/web-vault",
- "version": "2024.8.3"
+ "version": "2024.9.0"
},
"libs/admin-console": {
"name": "@bitwarden/admin-console",
From 4624cd850673af10f1987c5628c9215f257f6abd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2024 14:58:13 +0000
Subject: [PATCH 22/36] Autosync the updated translations (#10958)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
---
apps/browser/src/_locales/ar/messages.json | 16 +-
apps/browser/src/_locales/az/messages.json | 16 +-
apps/browser/src/_locales/be/messages.json | 16 +-
apps/browser/src/_locales/bg/messages.json | 16 +-
apps/browser/src/_locales/bn/messages.json | 16 +-
apps/browser/src/_locales/bs/messages.json | 16 +-
apps/browser/src/_locales/ca/messages.json | 16 +-
apps/browser/src/_locales/cs/messages.json | 18 ++-
apps/browser/src/_locales/cy/messages.json | 16 +-
apps/browser/src/_locales/da/messages.json | 16 +-
apps/browser/src/_locales/de/messages.json | 24 ++-
apps/browser/src/_locales/el/messages.json | 16 +-
apps/browser/src/_locales/en_GB/messages.json | 16 +-
apps/browser/src/_locales/en_IN/messages.json | 16 +-
apps/browser/src/_locales/es/messages.json | 16 +-
apps/browser/src/_locales/et/messages.json | 146 ++++++++++--------
apps/browser/src/_locales/eu/messages.json | 16 +-
apps/browser/src/_locales/fa/messages.json | 16 +-
apps/browser/src/_locales/fi/messages.json | 16 +-
apps/browser/src/_locales/fil/messages.json | 16 +-
apps/browser/src/_locales/fr/messages.json | 16 +-
apps/browser/src/_locales/gl/messages.json | 16 +-
apps/browser/src/_locales/he/messages.json | 16 +-
apps/browser/src/_locales/hi/messages.json | 16 +-
apps/browser/src/_locales/hr/messages.json | 24 ++-
apps/browser/src/_locales/hu/messages.json | 16 +-
apps/browser/src/_locales/id/messages.json | 16 +-
apps/browser/src/_locales/it/messages.json | 16 +-
apps/browser/src/_locales/ja/messages.json | 16 +-
apps/browser/src/_locales/ka/messages.json | 16 +-
apps/browser/src/_locales/km/messages.json | 16 +-
apps/browser/src/_locales/kn/messages.json | 16 +-
apps/browser/src/_locales/ko/messages.json | 16 +-
apps/browser/src/_locales/lt/messages.json | 16 +-
apps/browser/src/_locales/lv/messages.json | 16 +-
apps/browser/src/_locales/ml/messages.json | 16 +-
apps/browser/src/_locales/mr/messages.json | 16 +-
apps/browser/src/_locales/my/messages.json | 16 +-
apps/browser/src/_locales/nb/messages.json | 16 +-
apps/browser/src/_locales/ne/messages.json | 16 +-
apps/browser/src/_locales/nl/messages.json | 16 +-
apps/browser/src/_locales/nn/messages.json | 16 +-
apps/browser/src/_locales/or/messages.json | 16 +-
apps/browser/src/_locales/pl/messages.json | 16 +-
apps/browser/src/_locales/pt_BR/messages.json | 60 ++++---
apps/browser/src/_locales/pt_PT/messages.json | 16 +-
apps/browser/src/_locales/ro/messages.json | 16 +-
apps/browser/src/_locales/ru/messages.json | 16 +-
apps/browser/src/_locales/si/messages.json | 16 +-
apps/browser/src/_locales/sk/messages.json | 16 +-
apps/browser/src/_locales/sl/messages.json | 16 +-
apps/browser/src/_locales/sr/messages.json | 16 +-
apps/browser/src/_locales/sv/messages.json | 16 +-
apps/browser/src/_locales/te/messages.json | 16 +-
apps/browser/src/_locales/th/messages.json | 16 +-
apps/browser/src/_locales/tr/messages.json | 16 +-
apps/browser/src/_locales/uk/messages.json | 24 ++-
apps/browser/src/_locales/vi/messages.json | 16 +-
apps/browser/src/_locales/zh_CN/messages.json | 16 +-
apps/browser/src/_locales/zh_TW/messages.json | 16 +-
apps/browser/store/locales/et/copy.resx | 52 +++----
apps/browser/store/locales/pt_BR/copy.resx | 55 ++++---
62 files changed, 992 insertions(+), 275 deletions(-)
diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json
index 8f7a71d086c..0090391fdba 100644
--- a/apps/browser/src/_locales/ar/messages.json
+++ b/apps/browser/src/_locales/ar/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "لا توجد كلمات مرور للعرض."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "إزالة"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json
index 788a7f05d07..341406772ee 100644
--- a/apps/browser/src/_locales/az/messages.json
+++ b/apps/browser/src/_locales/az/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Sadalanacaq heç bir parol yoxdur."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Çıxart"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi"
},
- "additionalContentAvailable": {
- "message": "Əlavə məzmun əlçatandır"
+ "showCharacterCount": {
+ "message": "Xarakter sayını göstər"
+ },
+ "hideCharacterCount": {
+ "message": "Xarakter sayını gizlət"
},
"itemsInTrash": {
"message": "Tullantıdakı elementlər"
diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json
index d38d44e1d9b..1a00659bbfb 100644
--- a/apps/browser/src/_locales/be/messages.json
+++ b/apps/browser/src/_locales/be/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "У спісе адсутнічаюць паролі."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Выдаліць"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json
index 5ac827b964a..bfc4fc04a17 100644
--- a/apps/browser/src/_locales/bg/messages.json
+++ b/apps/browser/src/_locales/bg/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Няма пароли за показване."
},
+ "clearHistory": {
+ "message": "Изчистване на историята"
+ },
+ "noPasswordsToShow": {
+ "message": "Няма пароли за показване"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "Скоро не сте генерирали пароли"
+ },
"remove": {
"message": "Премахване"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Изискванията на политиката за големи компании бяха приложени към тази настройка"
},
- "additionalContentAvailable": {
- "message": "Има налично допълнително съдържание"
+ "showCharacterCount": {
+ "message": "Показване на броя знаци"
+ },
+ "hideCharacterCount": {
+ "message": "Скриване на броя знаци"
},
"itemsInTrash": {
"message": "Елементи в кошчето"
diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json
index ec97da7daca..fd084ed359d 100644
--- a/apps/browser/src/_locales/bn/messages.json
+++ b/apps/browser/src/_locales/bn/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "তালিকার জন্য কোনও পাসওয়ার্ড নেই।"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "সরান"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json
index 1e7feb5e966..b80293fd04c 100644
--- a/apps/browser/src/_locales/bs/messages.json
+++ b/apps/browser/src/_locales/bs/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json
index 50e5f6673eb..2b7bc2198de 100644
--- a/apps/browser/src/_locales/ca/messages.json
+++ b/apps/browser/src/_locales/ca/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "No hi ha cap contrasenya a llistar."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Suprimeix"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json
index 6de62c8135e..c5d80fc8b33 100644
--- a/apps/browser/src/_locales/cs/messages.json
+++ b/apps/browser/src/_locales/cs/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Nejsou k dispozici žádná hesla."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Odebrat"
},
@@ -4125,7 +4134,7 @@
"message": "Použijte zaškrtávací políčka, pokud chcete automaticky vyplnit zaškrtávací políčko formuláře (např. pro zapamatování e-mailu)"
},
"linkedHelpText": {
- "message": "Použijte propojené pole, pokud máte problémy s automatickým vyplňováním na konkrétní webové stránce"
+ "message": "Použijte propojené pole, pokud máte problémy s automatickým vyplňováním na konkrétní webové stránce."
},
"linkedLabelHelpText": {
"message": "Zadejte ID pole z HTML, název, popisek nebo zástupný znak pole."
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Na toto nastavení byly uplatněny požadavky podnikových zásad"
},
- "additionalContentAvailable": {
- "message": "Je k dispozici další obsah"
+ "showCharacterCount": {
+ "message": "Zobrazit počet znaků"
+ },
+ "hideCharacterCount": {
+ "message": "Skrýt počet znaků"
},
"itemsInTrash": {
"message": "Položky v koši"
diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json
index 65e62517992..128894e754e 100644
--- a/apps/browser/src/_locales/cy/messages.json
+++ b/apps/browser/src/_locales/cy/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Does dim cyfrineiriau i'w rhestru."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Tynnu"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json
index b6d41eaf971..301e987dfd2 100644
--- a/apps/browser/src/_locales/da/messages.json
+++ b/apps/browser/src/_locales/da/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Der er ingen kodeord at vise."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Fjern"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Virksomhedspolitikkrav er anvendt på denne indstilling"
},
- "additionalContentAvailable": {
- "message": "Yderligere indhold er tilgængeligt"
+ "showCharacterCount": {
+ "message": "Vis tegnantal"
+ },
+ "hideCharacterCount": {
+ "message": "Skjul tegnantal"
},
"itemsInTrash": {
"message": "Emner i papirkurv"
diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json
index 3101829840d..8abbdae03ff 100644
--- a/apps/browser/src/_locales/de/messages.json
+++ b/apps/browser/src/_locales/de/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Keine Einträge zum Anzeigen vorhanden."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Entfernen"
},
@@ -3478,7 +3487,7 @@
"message": "Überprüfung durch die initiierende Website erforderlich. Diese Funktion ist noch nicht für Konten ohne Master-Passwort implementiert."
},
"logInWithPasskeyQuestion": {
- "message": "Log in with passkey?"
+ "message": "Mit Passkey anmelden?"
},
"passkeyAlreadyExists": {
"message": "Für diese Anwendung existiert bereits ein Passkey."
@@ -3490,7 +3499,7 @@
"message": "Du hast keinen passenden Zugangsdaten für diese Website."
},
"noMatchingLoginsForSite": {
- "message": "No matching logins for this site"
+ "message": "Keine passenden Zugangsdaten für diese Seite"
},
"confirm": {
"message": "Bestätigen"
@@ -3502,10 +3511,10 @@
"message": "Passkey als neue Zugangsdaten speichern"
},
"chooseCipherForPasskeySave": {
- "message": "Choose a login to save this passkey to"
+ "message": "Wähle die Zugangsdaten aus, in die dieser Passkey gespeichert werden soll"
},
"chooseCipherForPasskeyAuth": {
- "message": "Choose a passkey to log in with"
+ "message": "Wähle einen Passkey zum Anmelden"
},
"passkeyItem": {
"message": "Passkey-Eintrag"
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Unternehmens-Richtlinienanforderungen wurden auf diese Einstellung angewandt"
},
- "additionalContentAvailable": {
- "message": "Zusätzlicher Inhalt ist verfügbar"
+ "showCharacterCount": {
+ "message": "Zeichenanzahl anzeigen"
+ },
+ "hideCharacterCount": {
+ "message": "Zeichenanzahl ausblenden"
},
"itemsInTrash": {
"message": "Einträge im Papierkorb"
diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json
index 26dabf51dce..5b1ee6011bc 100644
--- a/apps/browser/src/_locales/el/messages.json
+++ b/apps/browser/src/_locales/el/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Δεν υπάρχουν κωδικοί στη λίστα."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Αφαίρεση"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση"
},
- "additionalContentAvailable": {
- "message": "Πρόσθετο περιεχόμενο είναι διαθέσιμο"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Αντικείμενα στον κάδο"
diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json
index b4fb303e6b5..153c3987da3 100644
--- a/apps/browser/src/_locales/en_GB/messages.json
+++ b/apps/browser/src/_locales/en_GB/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in the bin"
diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json
index 4eb6149bbf4..9c0200ab42a 100644
--- a/apps/browser/src/_locales/en_IN/messages.json
+++ b/apps/browser/src/_locales/en_IN/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in bin"
diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json
index 74a4809f986..fc98d5e2778 100644
--- a/apps/browser/src/_locales/es/messages.json
+++ b/apps/browser/src/_locales/es/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "No hay contraseñas que listar."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Eliminar"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Elementos en la papelera"
diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json
index 7d55eec4fde..43d894be6c4 100644
--- a/apps/browser/src/_locales/et/messages.json
+++ b/apps/browser/src/_locales/et/messages.json
@@ -14,7 +14,7 @@
"message": "Logi oma olemasolevasse kontosse sisse või loo uus konto."
},
"inviteAccepted": {
- "message": "Invitation accepted"
+ "message": "Kutse vastu võetud"
},
"createAccount": {
"message": "Konto loomine"
@@ -69,10 +69,10 @@
"message": "Ülemparooli vihje (ei ole kohustuslik)"
},
"joinOrganization": {
- "message": "Join organization"
+ "message": "Liitu organisatsiooniga"
},
"finishJoiningThisOrganizationBySettingAMasterPassword": {
- "message": "Finish joining this organization by setting a master password."
+ "message": "Lõpeta organisatsiooniga liitumine määrates ülemparool."
},
"tab": {
"message": "Kaart"
@@ -114,19 +114,19 @@
"message": "Kopeeri turvakood"
},
"copyName": {
- "message": "Copy name"
+ "message": "Kopeeri nimi"
},
"copyCompany": {
- "message": "Copy company"
+ "message": "Kopeeri firma nimi"
},
"copySSN": {
- "message": "Copy Social Security number"
+ "message": "Kopeeri isikukood"
},
"copyPassportNumber": {
- "message": "Copy passport number"
+ "message": "Kopeeri passi number"
},
"copyLicenseNumber": {
- "message": "Copy license number"
+ "message": "Kopeeri litsentsi number"
},
"autoFill": {
"message": "Automaatne täitmine"
@@ -225,7 +225,7 @@
"message": "Mine edasi veebilaienduste poodi?"
},
"continueToBrowserExtensionStoreDesc": {
- "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now."
+ "message": "Aita meil jõuda rohkemate inimesteni. Külasta enda laienduste veebipoodi ja jäta sinna positiivne hinnang."
},
"changeMasterPasswordOnWebConfirmation": {
"message": "Ülemparooli saab muuta Bitwardeni veebirakenduses."
@@ -251,7 +251,7 @@
"message": "Rakenduse info"
},
"moreFromBitwarden": {
- "message": "More from Bitwarden"
+ "message": "Rohkem Bitwardeni kohta"
},
"continueToBitwardenDotCom": {
"message": "Mine edasi bitwarden.com-i?"
@@ -263,25 +263,25 @@
"message": "Bitwarden Authenticator"
},
"continueToAuthenticatorPageDesc": {
- "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website"
+ "message": "Bitwardeni Autentiteerijaga saad sa hoiustada autentiteerimise võtmeid ja luua TOTP koode kaheastmeliseks kinnitamiseks. Uuri lähemalt veebilehelt bitwarden.com"
},
"bitwardenSecretsManager": {
"message": "Bitwarden Secrets Manager"
},
"continueToSecretsManagerPageDesc": {
- "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website."
+ "message": "Hoiusta, halda ja jaga turvaliselt arendajate saladusi läbi Bitwarden Secrets Manageri. Uuri lähemalt veebilehelt bitwarden.com."
},
"passwordlessDotDev": {
"message": "Passwordless.dev"
},
"continueToPasswordlessDotDevPageDesc": {
- "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website."
+ "message": "Loo sujuv ja turvaline kogemus sisselogimisel Passwordless.dev-iga ja ilma traditsiooniliste paroolideta. Uuri lähemalt veebilehelt bitwarden.com."
},
"freeBitwardenFamilies": {
"message": "Tasuta Bitwarden Peredele"
},
"freeBitwardenFamiliesPageDesc": {
- "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app."
+ "message": "Sul on võimalik saada endale tasuta Bitwarden Families plaan. Lunasta see pakkumine meie veebirakenduses."
},
"version": {
"message": "Versioon"
@@ -302,22 +302,22 @@
"message": "Muuda kausta"
},
"newFolder": {
- "message": "New folder"
+ "message": "Uus kaust"
},
"folderName": {
- "message": "Folder name"
+ "message": "Kausta nimi"
},
"folderHintText": {
- "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums"
+ "message": "Kausta teise kasuta panemiseks lisa sihtkausta nimi, millele järgneb \"/\". Näiteks: Sotsiaalmeedia/Foorumid"
},
"noFoldersAdded": {
- "message": "No folders added"
+ "message": "Ei lisanud ühtegi kausta"
},
"createFoldersToOrganize": {
- "message": "Create folders to organize your vault items"
+ "message": "Loo kaustasid, et oma hoidla kirjeid organiseerida"
},
"deleteFolderPermanently": {
- "message": "Are you sure you want to permanently delete this folder?"
+ "message": "Kas sa oled kindel, et soovid selle kausta jäädavalt kustutada?"
},
"deleteFolder": {
"message": "Kustuta Kaust"
@@ -400,11 +400,11 @@
"description": "deprecated. Use specialCharactersLabel instead."
},
"include": {
- "message": "Include",
+ "message": "Kasuta",
"description": "Card header for password generator include block"
},
"uppercaseDescription": {
- "message": "Include uppercase characters",
+ "message": "Kasuta trükitähti",
"description": "Tooltip for the password generator uppercase character checkbox"
},
"uppercaseLabel": {
@@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox"
},
"lowercaseDescription": {
- "message": "Include lowercase characters",
+ "message": "Kasuta kirjatähti",
"description": "Full description for the password generator lowercase character checkbox"
},
"lowercaseLabel": {
@@ -420,7 +420,7 @@
"description": "Label for the password generator lowercase character checkbox"
},
"numbersDescription": {
- "message": "Include numbers",
+ "message": "Kasuta numbreid",
"description": "Full description for the password generator numbers checkbox"
},
"numbersLabel": {
@@ -428,7 +428,7 @@
"description": "Label for the password generator numbers checkbox"
},
"specialCharactersDescription": {
- "message": "Include special characters",
+ "message": "Kasuta sümboleid",
"description": "Full description for the password generator special characters checkbox"
},
"specialCharactersLabel": {
@@ -459,7 +459,7 @@
"description": "deprecated. Use avoidAmbiguous instead."
},
"avoidAmbiguous": {
- "message": "Avoid ambiguous characters",
+ "message": "Väldi raskesti eristatavaid tähti ja sümboleid",
"description": "Label for the avoid ambiguous characters checkbox."
},
"searchVault": {
@@ -484,7 +484,7 @@
"message": "Parool"
},
"totp": {
- "message": "Authenticator secret"
+ "message": "Salajane autentikaatori võti"
},
"passphrase": {
"message": "Paroolifraas"
@@ -538,13 +538,13 @@
"message": "Muu"
},
"unlockMethods": {
- "message": "Unlock options"
+ "message": "Avamise valikud"
},
"unlockMethodNeededToChangeTimeoutActionDesc": {
"message": "Hoidla ajalõpu tegevuse muutmiseks vali esmalt lahtilukustamise meetod."
},
"unlockMethodNeeded": {
- "message": "Set up an unlock method in Settings"
+ "message": "Määra avamise meetod seadetes"
},
"sessionTimeoutHeader": {
"message": "Sessiooni ajalõpp"
@@ -684,10 +684,10 @@
"message": "Konto on loodud! Võid nüüd sisse logida."
},
"newAccountCreated2": {
- "message": "Your new account has been created!"
+ "message": "Uus konto loodud!"
},
"youHaveBeenLoggedIn": {
- "message": "You have been logged in!"
+ "message": "Olete sisse logitud!"
},
"youSuccessfullyLoggedIn": {
"message": "Sisselogimine õnnestus"
@@ -702,7 +702,7 @@
"message": "Nõutav on kinnituskood."
},
"webauthnCancelOrTimeout": {
- "message": "The authentication was cancelled or took too long. Please try again."
+ "message": "Autentimine tühistati või kestis liiga kaua aega. Palun proovi uuesti."
},
"invalidVerificationCode": {
"message": "Vale kinnituskood"
@@ -724,25 +724,25 @@
"message": "Ei õnnestunud skännida sellelt lehelt QR-kood"
},
"totpCaptureSuccess": {
- "message": "Authenticator key added"
+ "message": "Autentimise võti on lisatud"
},
"totpCapture": {
- "message": "Scan authenticator QR code from current webpage"
+ "message": "Skänneeri see QR-kood läbi autentikaatori"
},
"totpHelperTitle": {
- "message": "Make 2-step verification seamless"
+ "message": "Muuda 2-astmeline kinnitamine sujuvaks"
},
"totpHelper": {
- "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field."
+ "message": "Bitwarden saab hoiustada ja täita 2-astmelise kinnitamise koode. Kopeeri ja kleebi võti siia."
},
"totpHelperWithCapture": {
- "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field."
+ "message": "Bitwarden saab hoiustada ja täita 2-astmelise kinnitamise koode. Vajuta kaamera ikoonile, et teha ekraanipilt autentiteerimise QR koodist või kopeeri ja kleebi võti siia."
},
"learnMoreAboutAuthenticators": {
- "message": "Learn more about authenticators"
+ "message": "Uuri lähemalt autentikaatorite kohta"
},
"copyTOTP": {
- "message": "Copy Authenticator key (TOTP)"
+ "message": "Kopeeri autentiteerimise võti (TOTP)"
},
"loggedOut": {
"message": "Välja logitud"
@@ -754,16 +754,16 @@
"message": "Sessioon on aegunud."
},
"logIn": {
- "message": "Log in"
+ "message": "Logi sisse"
},
"restartRegistration": {
- "message": "Restart registration"
+ "message": "Alusta registreerimist uuesti"
},
"expiredLink": {
- "message": "Expired link"
+ "message": "Aegunud link"
},
"pleaseRestartRegistrationOrTryLoggingIn": {
- "message": "Please restart registration or try logging in."
+ "message": "Palun alusta registreerimist uuesti või proovi sisse logida."
},
"youMayAlreadyHaveAnAccount": {
"message": "You may already have an account"
@@ -1469,7 +1469,7 @@
"message": "Boolean"
},
"cfTypeCheckbox": {
- "message": "Checkbox"
+ "message": "Märkeruut"
},
"cfTypeLinked": {
"message": "Ühenduses",
@@ -1492,7 +1492,7 @@
"message": "Kuvab iga kirje kõrval lehekülje ikooni."
},
"faviconDescAlt": {
- "message": "Show a recognizable image next to each login. Applies to all logged in accounts."
+ "message": "Näita väikest tuttavat ikooni iga kirje kõrval. Kehtib ka sisselogitud kontodele."
},
"enableBadgeCounter": {
"message": "Kuva kirjete arvu"
@@ -1654,7 +1654,7 @@
"message": "Identiteet"
},
"newItemHeader": {
- "message": "New $TYPE$",
+ "message": "Uus $TYPE$",
"placeholders": {
"type": {
"content": "$1",
@@ -1690,7 +1690,7 @@
"message": "Kogumikud"
},
"nCollections": {
- "message": "$COUNT$ collections",
+ "message": "$COUNT$ kogumikku",
"placeholders": {
"count": {
"content": "$1",
@@ -1743,7 +1743,7 @@
"description": "Domain name. Ex. website.com"
},
"baseDomainOptionRecommended": {
- "message": "Base domain (recommended)",
+ "message": "Serveri nimi [base domain] (soovitatav)",
"description": "Domain name. Ex. website.com"
},
"domainName": {
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Puuduvad paroolid, mida kuvada."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Eemalda"
},
@@ -1864,7 +1873,7 @@
"message": "Vale PIN kood."
},
"tooManyInvalidPinEntryAttemptsLoggingOut": {
- "message": "Too many invalid PIN entry attempts. Logging out."
+ "message": "Liiga palju ebaõnnestunud katseid. Login välja."
},
"unlockWithBiometrics": {
"message": "Ava biomeetriaga"
@@ -1891,26 +1900,26 @@
"message": "Organisatsiooni seaded mõjutavad parooli genereerija sätteid."
},
"passwordGenerator": {
- "message": "Password generator"
+ "message": "Parooli genereerija"
},
"usernameGenerator": {
- "message": "Username generator"
+ "message": "Kasutajanime genereerija"
},
"useThisPassword": {
- "message": "Use this password"
+ "message": "Kasuta seda parooli"
},
"useThisUsername": {
- "message": "Use this username"
+ "message": "Kasuta seda kasutajanime"
},
"securePasswordGenerated": {
- "message": "Secure password generated! Don't forget to also update your password on the website."
+ "message": "Turvaline parool loodud! Ära unusta uuendata seda ka veebisaidil."
},
"useGeneratorHelpTextPartOne": {
- "message": "Use the generator",
+ "message": "Kasuta generaatorit",
"description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'"
},
"useGeneratorHelpTextPartTwo": {
- "message": "to create a strong unique password",
+ "message": "et luua tugev ja ainulaadne parool",
"description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'"
},
"vaultTimeoutAction": {
@@ -1943,7 +1952,7 @@
"message": "Kirje on taastatud"
},
"alreadyHaveAccount": {
- "message": "Already have an account?"
+ "message": "On juba konto?"
},
"vaultTimeoutLogOutConfirmation": {
"message": "Väljalogimine eemaldab hoidlale ligipääsu ning nõuab pärast ajalõpu perioodi uuesti autentimist. Oled kindel, et soovid seda valikut kasutada?"
@@ -1955,7 +1964,7 @@
"message": "Täida ja salvesta"
},
"fillAndSave": {
- "message": "Fill and save"
+ "message": "Täida ja salvesta"
},
"autoFillSuccessAndSavedUri": {
"message": "Kirje täideti ja URI salvestati"
@@ -2036,19 +2045,19 @@
"message": "Uus ülemparool ei vasta eeskirjades väljatoodud tingimustele."
},
"receiveMarketingEmailsV2": {
- "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox."
+ "message": "Soovin saada nõuandeid, uudiseid ja pakkumisi Bitwardenilt oma postkasti."
},
"unsubscribe": {
- "message": "Unsubscribe"
+ "message": "Lõpeta tellimus"
},
"atAnyTime": {
- "message": "at any time."
+ "message": "iga hetk."
},
"byContinuingYouAgreeToThe": {
- "message": "By continuing, you agree to the"
+ "message": "Jätkates nõustud sa"
},
"and": {
- "message": "and"
+ "message": "ja"
},
"acceptPolicies": {
"message": "Märkeruudu markeerimisel nõustud järgnevaga:"
@@ -2069,10 +2078,10 @@
"message": "Ok"
},
"errorRefreshingAccessToken": {
- "message": "Access Token Refresh Error"
+ "message": "Juurdepääsukoodi Värskendamine Ebaõnnestus"
},
"errorRefreshingAccessTokenDesc": {
- "message": "No refresh token or API keys found. Please try logging out and logging back in."
+ "message": "Ei leidnud värskendamise koodi või API võtit. Palun proovi logida välja ja uuesti sisse."
},
"desktopSyncVerificationTitle": {
"message": "Töölaua sünkroonimise kinnitamine"
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json
index 8c509fd7eda..175c5d305df 100644
--- a/apps/browser/src/_locales/eu/messages.json
+++ b/apps/browser/src/_locales/eu/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Ez dago erakusteko pasahitzik."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Ezabatu"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json
index 0b2a4bf9a36..45a01a0946a 100644
--- a/apps/browser/src/_locales/fa/messages.json
+++ b/apps/browser/src/_locales/fa/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "هیچ کلمه عبوری برای فهرست کردن وجود ندارد."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "حذف"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json
index 110264c6a03..07281c5df41 100644
--- a/apps/browser/src/_locales/fi/messages.json
+++ b/apps/browser/src/_locales/fi/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Ei näytettäviä salasanoja."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Poista"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen"
},
- "additionalContentAvailable": {
- "message": "Lisää sisältöä on saatavilla"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Roskakorin kohteet"
diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json
index d31c41f2280..cc1fb49eb96 100644
--- a/apps/browser/src/_locales/fil/messages.json
+++ b/apps/browser/src/_locales/fil/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Walang mga password na i-list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Alisin"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json
index e2b04da786e..66cd4bf6f85 100644
--- a/apps/browser/src/_locales/fr/messages.json
+++ b/apps/browser/src/_locales/fr/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Aucun mot de passe à afficher."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Supprimer"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Les exigences de la politique d'entreprise ont été appliquées à ce paramètre"
},
- "additionalContentAvailable": {
- "message": "Du contenu supplémentaire est disponible"
+ "showCharacterCount": {
+ "message": "Afficher le nombre de caractères"
+ },
+ "hideCharacterCount": {
+ "message": "Cacher le nombre de caractères"
},
"itemsInTrash": {
"message": "Éléments dans la corbeille"
diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json
index 420dd0b7894..50915596072 100644
--- a/apps/browser/src/_locales/gl/messages.json
+++ b/apps/browser/src/_locales/gl/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Non hai contrasinais que listar."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Eliminar"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json
index 658adcc6052..89f6719289d 100644
--- a/apps/browser/src/_locales/he/messages.json
+++ b/apps/browser/src/_locales/he/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "אין סיסמאות להצגה ברשימה."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "הסר"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json
index 5368a992c4c..b9bfa5b5959 100644
--- a/apps/browser/src/_locales/hi/messages.json
+++ b/apps/browser/src/_locales/hi/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "सूची के लिए कोई पासवर्ड नहीं हैं।"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "हटाएं"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "इस सेटिंग पर एंटरप्राइज़ नीति आवश्यकताएँ लागू की गई हैं"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json
index 2fd8b3f24d0..0c6ca6bef75 100644
--- a/apps/browser/src/_locales/hr/messages.json
+++ b/apps/browser/src/_locales/hr/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Nema lozinki na popisu."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Ukloni"
},
@@ -3478,7 +3487,7 @@
"message": "Ishodišna stranica zahtijeva verifikaciju. Ova značajka još nije implementirana za račune bez glavne lozinke."
},
"logInWithPasskeyQuestion": {
- "message": "Log in with passkey?"
+ "message": "Prijava pristupnim ključem?"
},
"passkeyAlreadyExists": {
"message": "Za ovu aplikaciju već postoji pristupni ključ."
@@ -3490,7 +3499,7 @@
"message": "Nema odgovarajuće prijavu za ovu stranicu."
},
"noMatchingLoginsForSite": {
- "message": "No matching logins for this site"
+ "message": "Nema prijava za ovu web stranicu"
},
"confirm": {
"message": "Autoriziraj"
@@ -3502,10 +3511,10 @@
"message": "Spremi pristupni ključ kao novu prijavu"
},
"chooseCipherForPasskeySave": {
- "message": "Choose a login to save this passkey to"
+ "message": "Odaberi za koju prijavu želiš spremiti ovaj pristupni ključ"
},
"chooseCipherForPasskeyAuth": {
- "message": "Choose a passkey to log in with"
+ "message": "Odaberi pristupni ključ za prijavu"
},
"passkeyItem": {
"message": "Stavka pristupnog ključa"
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Pravila tvrtke primijenjena su na ovu postavku"
},
- "additionalContentAvailable": {
- "message": "Dostupan je dodatni sadržaj"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Stavke u smeću"
diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json
index e304fe39362..17c6b7e5e44 100644
--- a/apps/browser/src/_locales/hu/messages.json
+++ b/apps/browser/src/_locales/hu/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Nincsenek listázható jelszavak."
},
+ "clearHistory": {
+ "message": "Előzmények törlése"
+ },
+ "noPasswordsToShow": {
+ "message": "Nincsenek megjeleníthető jelszavak."
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "Mostanában nem lett jelszó generálva."
+ },
"remove": {
"message": "Eltávolítás"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Erre a beállításra a vállalkozás rendszabály követelmények lettek alkalmazva."
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Karakterszámláló megjelenítése"
+ },
+ "hideCharacterCount": {
+ "message": "Karakterszámláló elrejtése"
},
"itemsInTrash": {
"message": "elem van a lomtárban."
diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json
index 2a3e44a9429..44dff3c8189 100644
--- a/apps/browser/src/_locales/id/messages.json
+++ b/apps/browser/src/_locales/id/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Tidak ada sandi yang dapat dicantumkan."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Hapus"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json
index fec8c6bc458..3bccac4121c 100644
--- a/apps/browser/src/_locales/it/messages.json
+++ b/apps/browser/src/_locales/it/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Non ci sono password da mostrare."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Rimuovi"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "I requisiti della policy aziendale sono stati applicati a questa impostazione"
},
- "additionalContentAvailable": {
- "message": "Sono disponibili ulteriori contenuti"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Elementi nel cestino"
diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json
index 631cd6a9361..40d8cef50c6 100644
--- a/apps/browser/src/_locales/ja/messages.json
+++ b/apps/browser/src/_locales/ja/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "表示するパスワードがありません"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "削除"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "エンタープライズポリシー要件がこの設定に適用されました"
},
- "additionalContentAvailable": {
- "message": "追加コンテンツが利用可能です"
+ "showCharacterCount": {
+ "message": "文字数を表示"
+ },
+ "hideCharacterCount": {
+ "message": "文字数を隠す"
},
"itemsInTrash": {
"message": "ゴミ箱にあるアイテム"
diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json
index 6c275ffb160..f277d76bfab 100644
--- a/apps/browser/src/_locales/ka/messages.json
+++ b/apps/browser/src/_locales/ka/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/km/messages.json
+++ b/apps/browser/src/_locales/km/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json
index db1a9ee3687..e8d36e6fffb 100644
--- a/apps/browser/src/_locales/kn/messages.json
+++ b/apps/browser/src/_locales/kn/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "ಪಟ್ಟಿ ಮಾಡಲು ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳು ಇಲ್ಲ."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "ತೆಗೆ"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json
index 67284fce5e1..74c9103943b 100644
--- a/apps/browser/src/_locales/ko/messages.json
+++ b/apps/browser/src/_locales/ko/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "비밀번호가 없습니다."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "제거"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json
index 29e92c4097d..ebcf61ffd6d 100644
--- a/apps/browser/src/_locales/lt/messages.json
+++ b/apps/browser/src/_locales/lt/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Slaptažodžių sąraše nėra."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Pašalinti"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json
index cd121342612..0a847e86f65 100644
--- a/apps/browser/src/_locales/lv/messages.json
+++ b/apps/browser/src/_locales/lv/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Nav paroļu, ko parādīt."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Noņemt"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Šim iestatījumam tika piemērotas uzņēmējdarbības nosacījumu prasības"
},
- "additionalContentAvailable": {
- "message": "Ir pieejams papildu saturs"
+ "showCharacterCount": {
+ "message": "Rādīt rakstzīmju skaitu"
+ },
+ "hideCharacterCount": {
+ "message": "Paslēpt rakstzīmju skaitu"
},
"itemsInTrash": {
"message": "Vienumi atkritnē"
diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json
index bf53c4b52d5..8a27d914ea9 100644
--- a/apps/browser/src/_locales/ml/messages.json
+++ b/apps/browser/src/_locales/ml/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "പ്രദർശിപ്പിക്കാൻ പാസ്സ്വേഡുകൾ ഒന്നും ഇല്ല."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "നീക്കുക"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json
index 15116fe3d48..890fc14fdd0 100644
--- a/apps/browser/src/_locales/mr/messages.json
+++ b/apps/browser/src/_locales/mr/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/my/messages.json
+++ b/apps/browser/src/_locales/my/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json
index ffd1a4e7a19..a5d503d3987 100644
--- a/apps/browser/src/_locales/nb/messages.json
+++ b/apps/browser/src/_locales/nb/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Det er ingen passord å liste opp."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Fjern"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/ne/messages.json
+++ b/apps/browser/src/_locales/ne/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json
index 78a817da8c7..791fd7b2374 100644
--- a/apps/browser/src/_locales/nl/messages.json
+++ b/apps/browser/src/_locales/nl/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Er zijn geen wachtwoorden om weer te geven."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Verwijderen"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Bedrijfsbeleidseisen zijn op deze instelling toegepast"
},
- "additionalContentAvailable": {
- "message": "Extra inhoud beschikbaar"
+ "showCharacterCount": {
+ "message": "Aantal tekens weergeven"
+ },
+ "hideCharacterCount": {
+ "message": "Aantal tekens verbergen"
},
"itemsInTrash": {
"message": "Items in prullenbak"
diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/nn/messages.json
+++ b/apps/browser/src/_locales/nn/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/or/messages.json
+++ b/apps/browser/src/_locales/or/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json
index b5ac0206c9b..7576f8a0cab 100644
--- a/apps/browser/src/_locales/pl/messages.json
+++ b/apps/browser/src/_locales/pl/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Brak haseł."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Usuń"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json
index a14c0ce1709..6abab6b104d 100644
--- a/apps/browser/src/_locales/pt_BR/messages.json
+++ b/apps/browser/src/_locales/pt_BR/messages.json
@@ -400,11 +400,11 @@
"description": "deprecated. Use specialCharactersLabel instead."
},
"include": {
- "message": "Include",
+ "message": "Incluir",
"description": "Card header for password generator include block"
},
"uppercaseDescription": {
- "message": "Include uppercase characters",
+ "message": "Incluir caracteres maiúsculos",
"description": "Tooltip for the password generator uppercase character checkbox"
},
"uppercaseLabel": {
@@ -412,7 +412,7 @@
"description": "Label for the password generator uppercase character checkbox"
},
"lowercaseDescription": {
- "message": "Include lowercase characters",
+ "message": "Incluir caracteres minúsculos",
"description": "Full description for the password generator lowercase character checkbox"
},
"lowercaseLabel": {
@@ -420,15 +420,15 @@
"description": "Label for the password generator lowercase character checkbox"
},
"numbersDescription": {
- "message": "Include numbers",
+ "message": "Incluir números",
"description": "Full description for the password generator numbers checkbox"
},
"numbersLabel": {
- "message": "0-9",
+ "message": "0 – 9",
"description": "Label for the password generator numbers checkbox"
},
"specialCharactersDescription": {
- "message": "Include special characters",
+ "message": "Incluir caracteres especiais",
"description": "Full description for the password generator special characters checkbox"
},
"specialCharactersLabel": {
@@ -459,7 +459,7 @@
"description": "deprecated. Use avoidAmbiguous instead."
},
"avoidAmbiguous": {
- "message": "Avoid ambiguous characters",
+ "message": "Evitar Caracteres Ambíguos",
"description": "Label for the avoid ambiguous characters checkbox."
},
"searchVault": {
@@ -684,10 +684,10 @@
"message": "A sua nova conta foi criada! Agora você pode iniciar a sessão."
},
"newAccountCreated2": {
- "message": "Your new account has been created!"
+ "message": "Sua nova conta foi criada!"
},
"youHaveBeenLoggedIn": {
- "message": "You have been logged in!"
+ "message": "Você está conectado!"
},
"youSuccessfullyLoggedIn": {
"message": "Você logou na sua conta com sucesso"
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Não existem senhas para listar."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remover"
},
@@ -3478,7 +3487,7 @@
"message": "Verificação requerida pelo site que a iniciou. Esse recurso ainda não está implementado para contas sem senha mestra."
},
"logInWithPasskeyQuestion": {
- "message": "Log in with passkey?"
+ "message": "Fazer ‘login’ com chave de acesso?"
},
"passkeyAlreadyExists": {
"message": "Uma chave de acesso já existe para este aplicativo."
@@ -3490,7 +3499,7 @@
"message": "Você não tem um login correspondente para este site."
},
"noMatchingLoginsForSite": {
- "message": "No matching logins for this site"
+ "message": "Sem credenciais correspondentes para este site"
},
"confirm": {
"message": "Confirmar"
@@ -3502,10 +3511,10 @@
"message": "Salvar chave de acesso como um novo login"
},
"chooseCipherForPasskeySave": {
- "message": "Choose a login to save this passkey to"
+ "message": "Escolha um ‘login’ para salvar com essa chave de acesso"
},
"chooseCipherForPasskeyAuth": {
- "message": "Choose a passkey to log in with"
+ "message": "Escolha uma senha para iniciar sessão"
},
"passkeyItem": {
"message": "Item de chave de acesso"
@@ -3703,7 +3712,7 @@
"description": "Notification message for when saving credentials has succeeded."
},
"passwordSaved": {
- "message": "Password saved!",
+ "message": "Senha salva!",
"description": "Notification message for when saving credentials has succeeded."
},
"updateCipherAttemptSuccess": {
@@ -3711,7 +3720,7 @@
"description": "Notification message for when updating credentials has succeeded."
},
"passwordUpdated": {
- "message": "Password updated!",
+ "message": "Senha atualizada!",
"description": "Notification message for when updating credentials has succeeded."
},
"saveCipherAttemptFailed": {
@@ -4300,28 +4309,31 @@
"enterprisePolicyRequirementsApplied": {
"message": "Os requisitos de política empresarial foram aplicados nesta configuração"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Mostrar contagem de caracteres"
+ },
+ "hideCharacterCount": {
+ "message": "Esconder contagem de caracteres"
},
"itemsInTrash": {
- "message": "Items in trash"
+ "message": "Itens na lixeira"
},
"noItemsInTrash": {
- "message": "No items in trash"
+ "message": "Nenhum item na lixeira"
},
"noItemsInTrashDesc": {
- "message": "Items you delete will appear here and be permanently deleted after 30 days"
+ "message": "Os itens que você excluir aparecerão aqui e serão excluídos permanentemente após 30 dias"
},
"trashWarning": {
- "message": "Items that have been in trash more than 30 days will automatically be deleted"
+ "message": "Os itens que ficarem na lixeira por mais de 30 dias serão excluídos automaticamente"
},
"restore": {
- "message": "Restore"
+ "message": "Restaurar"
},
"deleteForever": {
- "message": "Delete forever"
+ "message": "Apagar permanentemente"
},
"noEditPermissions": {
- "message": "You don't have permission to edit this item"
+ "message": "Você não tem permissão para editar este arquivo"
}
}
diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json
index 459200c735f..c516d2d1ed1 100644
--- a/apps/browser/src/_locales/pt_PT/messages.json
+++ b/apps/browser/src/_locales/pt_PT/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Não existem palavras-passe para listar."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remover"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Os requisitos da política empresarial foram aplicados a esta definição"
},
- "additionalContentAvailable": {
- "message": "Estão disponíveis conteúdos adicionais"
+ "showCharacterCount": {
+ "message": "Mostrar contagem de caracteres"
+ },
+ "hideCharacterCount": {
+ "message": "Ocultar contagem de caracteres"
},
"itemsInTrash": {
"message": "Itens no lixo"
diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json
index 24e77c0564e..62dda4fe0f4 100644
--- a/apps/browser/src/_locales/ro/messages.json
+++ b/apps/browser/src/_locales/ro/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Nicio parolă de afișat."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Ștergere"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json
index 1099825fba9..fec64ad9ce1 100644
--- a/apps/browser/src/_locales/ru/messages.json
+++ b/apps/browser/src/_locales/ru/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Нет паролей для отображения."
},
+ "clearHistory": {
+ "message": "Очистить историю"
+ },
+ "noPasswordsToShow": {
+ "message": "Нет паролей для отображения"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "Нет недавно сгенерированных паролей"
+ },
"remove": {
"message": "Удалить"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "К этой настройке были применены требования корпоративной политики"
},
- "additionalContentAvailable": {
- "message": "Дополнительный контент доступен"
+ "showCharacterCount": {
+ "message": "Показать количество символов"
+ },
+ "hideCharacterCount": {
+ "message": "Скрыть количество символов"
},
"itemsInTrash": {
"message": "Элементы в корзине"
diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json
index acea5593e43..9b906a57ea3 100644
--- a/apps/browser/src/_locales/si/messages.json
+++ b/apps/browser/src/_locales/si/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "ලැයිස්තු ගත කිරීමට මුරපද නොමැත."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "ඉවත් කරන්න"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json
index 2eb0172d1f1..0f9088dc5e8 100644
--- a/apps/browser/src/_locales/sk/messages.json
+++ b/apps/browser/src/_locales/sk/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Neboli nájdené žiadne heslá."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Odstrániť"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Na toto nastavenie boli uplatnené požiadavky pravidiel spoločnosti"
},
- "additionalContentAvailable": {
- "message": "K dispozícii je ďalší obsah"
+ "showCharacterCount": {
+ "message": "Zobraziť počítadlo znakov"
+ },
+ "hideCharacterCount": {
+ "message": "Skryť počítadlo znakov"
},
"itemsInTrash": {
"message": "Položky v koši"
diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json
index 030ae2eac77..b9f72e0dae7 100644
--- a/apps/browser/src/_locales/sl/messages.json
+++ b/apps/browser/src/_locales/sl/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Ni takšnih gesel."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Odstrani"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json
index b3d179ef2bc..257478519b1 100644
--- a/apps/browser/src/_locales/sr/messages.json
+++ b/apps/browser/src/_locales/sr/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Нема лозинки у листи."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Уклони"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Захтеви политике предузећа су примењени на ово подешавање"
},
- "additionalContentAvailable": {
- "message": "Додатни садржај је доступан"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Ставке у смећу"
diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json
index 270c1fb374b..6c8715a9582 100644
--- a/apps/browser/src/_locales/sv/messages.json
+++ b/apps/browser/src/_locales/sv/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Det finns inga lösenord att lista."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Ta bort"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Visa antal tecken"
+ },
+ "hideCharacterCount": {
+ "message": "Dölj antal tecken"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json
index 0aa83ad1d7c..81f6bacb96c 100644
--- a/apps/browser/src/_locales/te/messages.json
+++ b/apps/browser/src/_locales/te/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "There are no passwords to list."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Remove"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json
index 6332df29b79..645cfc5e379 100644
--- a/apps/browser/src/_locales/th/messages.json
+++ b/apps/browser/src/_locales/th/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "ไม่มีรหัสผ่านที่จะแสดง"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "ลบ"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json
index d510619a5cc..9539f49b9f9 100644
--- a/apps/browser/src/_locales/tr/messages.json
+++ b/apps/browser/src/_locales/tr/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Listelenecek parola yok."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Kaldır"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Bu ayara kurumsal ilke gereksinimleri uygulandı"
},
- "additionalContentAvailable": {
- "message": "Ek içerikler mevcut"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Çöp kutusundaki kayıtlar"
diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json
index ad39629b28e..47f5bb486b1 100644
--- a/apps/browser/src/_locales/uk/messages.json
+++ b/apps/browser/src/_locales/uk/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Немає паролів."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Вилучити"
},
@@ -3478,7 +3487,7 @@
"message": "Сайт ініціює обов'язкову верифікацію. Ця функція ще не реалізована для облікових записів без головного пароля."
},
"logInWithPasskeyQuestion": {
- "message": "Log in with passkey?"
+ "message": "Увійти з ключем доступу?"
},
"passkeyAlreadyExists": {
"message": "Ключ доступу для цієї програми вже існує."
@@ -3490,7 +3499,7 @@
"message": "У вас немає відповідних записів для цього сайту."
},
"noMatchingLoginsForSite": {
- "message": "No matching logins for this site"
+ "message": "Немає відповідних записів для цього сайту"
},
"confirm": {
"message": "Підтвердити"
@@ -3502,10 +3511,10 @@
"message": "Зберегти ключ доступу як новий запис"
},
"chooseCipherForPasskeySave": {
- "message": "Choose a login to save this passkey to"
+ "message": "Виберіть запис для збереження цього ключа доступу"
},
"chooseCipherForPasskeyAuth": {
- "message": "Choose a passkey to log in with"
+ "message": "Виберіть ключ доступу для входу"
},
"passkeyItem": {
"message": "Ключ доступу"
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "До цього налаштування застосовано вимоги політики компанії"
},
- "additionalContentAvailable": {
- "message": "Доступний додатковий вміст"
+ "showCharacterCount": {
+ "message": "Показати кількість символів"
+ },
+ "hideCharacterCount": {
+ "message": "Приховати кількість символів"
},
"itemsInTrash": {
"message": "Записи в смітнику"
diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json
index 698f87f78b6..559000d519a 100644
--- a/apps/browser/src/_locales/vi/messages.json
+++ b/apps/browser/src/_locales/vi/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "Không có mật khẩu để liệt kê."
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "Xoá"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json
index fac6baff19b..de2bfdf63fb 100644
--- a/apps/browser/src/_locales/zh_CN/messages.json
+++ b/apps/browser/src/_locales/zh_CN/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "没有可列出的密码。"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "移除"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "企业策略要求已应用于此设置"
},
- "additionalContentAvailable": {
- "message": "其他内容可用"
+ "showCharacterCount": {
+ "message": "显示字符计数"
+ },
+ "hideCharacterCount": {
+ "message": "隐藏字符计数"
},
"itemsInTrash": {
"message": "回收站中的项目"
diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json
index e2b2705fdaf..8f6673017c0 100644
--- a/apps/browser/src/_locales/zh_TW/messages.json
+++ b/apps/browser/src/_locales/zh_TW/messages.json
@@ -1796,6 +1796,15 @@
"noPasswordsInList": {
"message": "沒有可列出的密碼。"
},
+ "clearHistory": {
+ "message": "Clear history"
+ },
+ "noPasswordsToShow": {
+ "message": "No passwords to show"
+ },
+ "noRecentlyGeneratedPassword": {
+ "message": "You haven't generated a password recently"
+ },
"remove": {
"message": "移除"
},
@@ -4300,8 +4309,11 @@
"enterprisePolicyRequirementsApplied": {
"message": "Enterprise policy requirements have been applied to this setting"
},
- "additionalContentAvailable": {
- "message": "Additional content is available"
+ "showCharacterCount": {
+ "message": "Show character count"
+ },
+ "hideCharacterCount": {
+ "message": "Hide character count"
},
"itemsInTrash": {
"message": "Items in trash"
diff --git a/apps/browser/store/locales/et/copy.resx b/apps/browser/store/locales/et/copy.resx
index 0f0c8c13fb8..d2a6be860ce 100644
--- a/apps/browser/store/locales/et/copy.resx
+++ b/apps/browser/store/locales/et/copy.resx
@@ -124,48 +124,48 @@
Kodus, tööl ja teel - Bitwarden hoiustab imelihtsalt kõik su paroolid, pääsuvõtmed ja tundliku info.
- Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more!
+ Tunnustatud firmade PCMag, WIRED, The Verge, CNET, G2 ja teiste poolt kui parim paroolihaldur!
-SECURE YOUR DIGITAL LIFE
-Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access.
+KAITSE ENDA DIGITAALSET MAAILMA
+Lukusta oma digitaalne maailm ja kaitse seda andmelekete vastu luues ja salvestades unikaalsed ja tugevad paroolid iga konto jaoks. Halda kõike täielikult krüpteeritud hoidlas, kuhu pääsed ainult sina ligi.
-ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE
-Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions.
+PÄÄSE OMA ANDMETELE LIGI IGALT POOLT, IGAL AJAL, IGAST SEADMEST
+Halda, hoiusta, kaitse ja jaga lõpmatult palju paroole mööda lõpmatult paljusid seadmeid ilma piiranguteta.
-EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE
-Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features.
+KÕIGIL PEAKSID OLEMA TÖÖRIISTAD OHUTULT INTERNETIS SEIKLEMISEKS
+Kasuta Bitwardenit tasuta ilma reklaamide või andmete müümisega. Bitwarden usub, et kõigil peaks olema võimalus surfata ohutult internetis. Preemium plaanid pakuvad juurdepääsu veel rohkematele funktsioonidele.
-EMPOWER YOUR TEAMS WITH BITWARDEN
-Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more.
+VÕIMENDA OMA TIIME BITWARDENIGA
+Tiimide ja ettevõtete plaanid tulevad koos professionaalsete ärifunktsioonidega. Mõned näited on SSO liides, ise majutamine, arvutikataloogide ühendamine ja SCIM kasutamine, globaalsed seaded, API, sündmuste logid ja veel rohkemgi.
-Use Bitwarden to secure your workforce and share sensitive information with colleagues.
+Kasuta Bitwardenit oma töötajate turvamiseks ja tundliku informatsiooni jagamiseks kolleegidega.
-More reasons to choose Bitwarden:
+Veel Põhjusi Miks Valida Bitwarden:
-World-Class Encryption
-Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private.
+Maailmatasemel Krüpteering
+Paroolid on kaitstud tipptehnoloogilise täieliku krüpteerimisega (AES-256 bit, salted hashtag ja PBKDF2 SHA-256), nii et sinu andmed püsivad privaatsete ja turvalistena.
-3rd-party Audits
-Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications.
+Põhjalikud turvatestid kolmandate firmade poolt
+Bitwarden korraldab regulaarselt põhjalike turvateste tuntud kolmandate firmade poolt. Need igaaastased kontrolltestid sisaldavad kogu koodibaasi ülevaatust ja test-küberrünnakuid Bitwardeni IP-de, serverite ja veebirakenduste vastu.
-Advanced 2FA
-Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey.
+Kõrgetasemeline 2-astmeline autentiteerimine (2FA)
+Kaitse oma andmeid kolmanda poole autentitaatoriga, emailile saadetud koodide või FIDO2 WebAuthn süsteemidega, nagu näiteks füüsiline turvavõti või pääsuvõti.
Bitwarden Send
-Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure.
+Jaga andmeid otse teistega kasutades täieliku krüpteerimist ja vähenda lekke tõenäosust.
-Built-in Generator
-Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy.
+Sisse ehitatud Generaator
+Loo igale oma saidile pikkasid, keerulisi ning täiesti kordumatuid paroole ja ainulaadseid kasutajanimesid. Veel paremaks privaatsuseks saad end ühendada ka variemaili (email alias) pakkujatega.
-Global Translations
-Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin.
+Paljudes Keeltes
+Bitwardenit on tõlgitud juba 60 erinevasse keelde ja see arv kasvab, tänu meie globaalsele kogukonnale Crowdin platvormil.
-Cross-Platform Applications
-Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more.
+Kõigis Sinu Seadmetes
+Kaitse ja jaga oma tundliku informatsiooni Bitwardeni Hoidlas nii brauserist, telefonist, arvutist kui ka mujaltki.
-Bitwarden secures more than just passwords
-End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev!
+Bitwarden hoiustab peale paroolide veel muudki
+Täielikult krüpteeritud andmehalduse lahendused Bitwardenilt võimendavad organisatsioone ja hoiustavad kõike, kaasa arvatud arendajate saladusi ja pääsuvõtmeid. Külasta veebilehte bitwarden.com, et uurida lähemalt Bitwarden Secrets Manageri kohta ja vaata lähemalt passwordless.dev!
diff --git a/apps/browser/store/locales/pt_BR/copy.resx b/apps/browser/store/locales/pt_BR/copy.resx
index 067f9357b23..24331b3a1ba 100644
--- a/apps/browser/store/locales/pt_BR/copy.resx
+++ b/apps/browser/store/locales/pt_BR/copy.resx
@@ -124,49 +124,46 @@
Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais.
- Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more!
+ Reconhecido como o melhor gerenciador de senhas por "PCMag", 'WIRED', 'The Verge', 'CNET', 'G2', entre outros!
-SECURE YOUR DIGITAL LIFE
-Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access.
+PROTEJA A SUA VIDA DIGITAL
+Deixe a sua vida digital segura e se proteja contra violações de dados gerando e salvando senhas únicas e fortes para cada conta pessoal. Mantendo tudo isso em um cofre encriptografado de ponta a ponta que apenas você pode acessar.
-ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE
-Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions.
+ACESSE OS SEUS DADOS, EM QUALQUER LUGAR, HORA E DISPOSITIVO
+Gerencie, armazene, proteja e compartilhe senhas facilmente entre dispositivos ilimitados e sem restrições.
-EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE
-Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features.
+TODOS DEVERIAM TEM FERRAMENTAS PARA SE PROTEGER ONLINE
+Utilize Bitwarden de graça sem anuncios ou venda dos seus dados. A Bitwarden acredita que todos deveriam ter a opção de estar seguro online. Planos Premium oferecem recursos mais avançados.
-EMPOWER YOUR TEAMS WITH BITWARDEN
-Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more.
+EMPODERE O SEUS TIMES COM BITWARDEN
+Os Planos para times e empresas vem com recursos profissionais para negócios. Alguns exemplos inculuem integração SSO, Auto-hospedagem, integração de diretório e provisionamento SCIM, políticas globais, acesso API, registro de eventos e mais.
-Use Bitwarden to secure your workforce and share sensitive information with colleagues.
+Utilizer Bitwarn para proteger os seus empregados e compartilhar informações sensíveis para os colegas.
+Mais razões para escolher Bitwarden:
-More reasons to choose Bitwarden:
+Senhas encriptografadas por classe de palavras são protegidas com criptografia de ponta a ponta avançada (AES-256 bit, salted hashtag, and PBKDF2 SHA-256), então os seus dados ficam seguros e privados.
-World-Class Encryption
-Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private.
+Auditoria de Terceiros
+Bitwarden regularmente conduz auditorias de terceiros com notáveis empresas de segurança. Essas audições anuais incluem qualificação e penetração do código fonte através de IPs da Bitwarden, servidores e aplicações WEB.
-3rd-party Audits
-Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications.
+2FA Avançado
+Proteja o seu login com um autenticador de doisfatores, códigos de email ou credenciais FIDO2 WebAuthn como chave de segurança por hardware ou chave de acesso.
-Advanced 2FA
-Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey.
+Envio Bitwarden
+Transmita dados diretamente para outros enquanto mantem segurança de encriptografia ponta a ponta e limitando exposição.
-Bitwarden Send
-Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure.
+Gerador integrado
+Crie senhas grandes, complexas e diferentes e nomes de usuário unicos para cada site que visitar. Integre com provedores de email para privacidade adicional
-Built-in Generator
-Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy.
+Tradutores globais
+As traduções da Bitwarden estão disponíveis para mais de 60 líguas, traduzidas pela comunidade global através do Crowdin.
-Global Translations
-Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin.
+Aplicações Multi-Plataforma
+Proteja e compartilhe conteúdo sensível dentro do Vault da Bitwarden de qualquer navegador, dispositivo móvel, ou desktop OS, entre outros.
-Cross-Platform Applications
-Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more.
-
-Bitwarden secures more than just passwords
-End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev!
-
+Bitwarden protege mais do que apenas soluções em gerenciamento de credenciais de senhas encriptografadas ponta a ponta, Bitwarden empodera organizações para proteger qualquer coisa, incluindo segredos de desenvolvedor e chaves de acesso.
+Visite Bitwarden.com para aprender mais sobre Bitwarden Secrets Manager e Bitwarden Passwordless.dev!
Em casa, no trabalho, ou em qualquer lugar, o Bitwarden protege facilmente todas as suas senhas, senhas e informações confidenciais.
From 456b1567295a1c76d8ce620897cd837fbbc8e9a9 Mon Sep 17 00:00:00 2001
From: Bitwarden DevOps
<106330231+bitwarden-devops-bot@users.noreply.github.com>
Date: Mon, 9 Sep 2024 11:05:49 -0400
Subject: [PATCH 23/36] Bumped client version(s) (#10961)
---
apps/desktop/package.json | 2 +-
apps/desktop/src/package-lock.json | 4 ++--
apps/desktop/src/package.json | 2 +-
package-lock.json | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 40ce2fec5d9..4562653978b 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": "2024.9.1",
+ "version": "2024.9.0",
"keywords": [
"bitwarden",
"password",
diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json
index ce08dfde2cd..6823bddceb8 100644
--- a/apps/desktop/src/package-lock.json
+++ b/apps/desktop/src/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@bitwarden/desktop",
- "version": "2024.9.1",
+ "version": "2024.9.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@bitwarden/desktop",
- "version": "2024.9.1",
+ "version": "2024.9.0",
"license": "GPL-3.0",
"dependencies": {
"@bitwarden/desktop-napi": "file:../desktop_native/napi",
diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json
index e34641f1e09..18a046d5bce 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": "2024.9.1",
+ "version": "2024.9.0",
"author": "Bitwarden Inc. (https://bitwarden.com)",
"homepage": "https://bitwarden.com",
"license": "GPL-3.0",
diff --git a/package-lock.json b/package-lock.json
index 2fb382d5e68..94bc636b4ec 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -232,7 +232,7 @@
},
"apps/desktop": {
"name": "@bitwarden/desktop",
- "version": "2024.9.1",
+ "version": "2024.9.0",
"hasInstallScript": true,
"license": "GPL-3.0"
},
From 8a199a1f663ff9e44790684ac808d50f200f6e4f Mon Sep 17 00:00:00 2001
From: Tom <144813356+ttalty@users.noreply.github.com>
Date: Mon, 9 Sep 2024 11:48:08 -0400
Subject: [PATCH 24/36] [AC-2614] Member Access Localization (#10931)
* Initial setup and modifications for member access report api implementation
* Adding the permissions logic for getting the permissions text
* fixing the test cases
* Some refactoring on async calls
* Comments on the model
* Resolving the mock issue
* messages
* Localization of text
* One more file to fix merge
---
apps/web/src/locales/en/messages.json | 21 +++++++++++++++++++
.../services/member-access-report.service.ts | 21 ++++++++++++++-----
.../view/member-access-export.view.ts | 8 +++----
3 files changed, 41 insertions(+), 9 deletions(-)
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 7a7785469bc..53ab34478a3 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -8756,6 +8756,27 @@
"memberAccessReportPageDesc": {
"message": "Audit organization member access across groups, collections, and collection items. The CSV export provides a detailed breakdown per member, including information on collection permissions and account configurations."
},
+ "memberAccessReportNoCollection": {
+ "message": "(No Collection)"
+ },
+ "memberAccessReportNoCollectionPermission": {
+ "message": "(No Collection Permission)"
+ },
+ "memberAccessReportNoGroup": {
+ "message": "(No Group)"
+ },
+ "memberAccessReportTwoFactorEnabledTrue": {
+ "message": "On"
+ },
+ "memberAccessReportTwoFactorEnabledFalse": {
+ "message": "Off"
+ },
+ "memberAccessReportAuthenticationEnabledTrue": {
+ "message": "On"
+ },
+ "memberAccessReportAuthenticationEnabledFalse": {
+ "message": "Off"
+ },
"higherKDFIterations": {
"message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker."
},
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
index 4ab7ffd6e42..0548841e8c3 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
@@ -64,14 +64,25 @@ export class MemberAccessReportService {
const exportItems = memberAccessReports.flatMap((report) => {
const userDetails = report.accessDetails.map((detail) => {
+ const collectionName = collectionNameMap.get(detail.collectionName.encryptedString);
return {
email: report.email,
name: report.userName,
- twoStepLogin: report.twoFactorEnabled ? "On" : "Off",
- accountRecovery: report.accountRecoveryEnabled ? "On" : "Off",
- group: detail.groupName,
- collection: collectionNameMap.get(detail.collectionName.encryptedString),
- collectionPermission: this.getPermissionText(detail),
+ twoStepLogin: report.twoFactorEnabled
+ ? this.i18nService.t("memberAccessReportTwoFactorEnabledTrue")
+ : this.i18nService.t("memberAccessReportTwoFactorEnabledFalse"),
+ accountRecovery: report.accountRecoveryEnabled
+ ? this.i18nService.t("memberAccessReportAuthenticationEnabledTrue")
+ : this.i18nService.t("memberAccessReportAuthenticationEnabledFalse"),
+ group: detail.groupName
+ ? detail.groupName
+ : this.i18nService.t("memberAccessReportNoGroup"),
+ collection: collectionName
+ ? collectionName
+ : this.i18nService.t("memberAccessReportNoCollection"),
+ collectionPermission: detail.collectionId
+ ? this.getPermissionText(detail)
+ : this.i18nService.t("memberAccessReportNoCollection"),
totalItems: detail.itemCount.toString(),
};
});
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/view/member-access-export.view.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/view/member-access-export.view.ts
index be9035e1f2c..2b009011af1 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/view/member-access-export.view.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/view/member-access-export.view.ts
@@ -10,12 +10,12 @@ export type MemberAccessExportItem = {
};
export const userReportItemHeaders: { [key in keyof MemberAccessExportItem]: string } = {
- email: "Email Address",
- name: "Full Name",
+ email: "Email",
+ name: "Name",
twoStepLogin: "Two-Step Login",
accountRecovery: "Account Recovery",
- group: "Group Name",
- collection: "Collection Name",
+ group: "Group",
+ collection: "Collection",
collectionPermission: "Collection Permission",
totalItems: "Total Items",
};
From e786eac87dbec269ed5a99fdcafa7602cd74bea1 Mon Sep 17 00:00:00 2001
From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com>
Date: Mon, 9 Sep 2024 18:21:09 +0100
Subject: [PATCH 25/36] Resolve the ui changes issues (#10955)
---
.../change-plan-dialog.component.html | 29 +++++++++++++------
apps/web/src/locales/en/messages.json | 19 +++++++-----
2 files changed, 31 insertions(+), 17 deletions(-)
diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
index d643c41e0ff..02071f5aa8c 100644
--- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
+++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
@@ -4,7 +4,7 @@
{{ "upgradeFreeOrganization" | i18n: currentPlanName }}
-
{{ "upgradePlan" | i18n }}
+
{{ "upgradePlans" | i18n }}
{{ "selectAPlan" | i18n }}
@@ -52,9 +52,21 @@
tabindex="0"
>
-
+
+ {{ "recommended" | i18n }}
+
+
- {{
+ {{
selectableProduct.nameLocalizationKey | i18n
}}
@@ -73,9 +85,8 @@
) | currency: "$"
}}
+ /{{ "monthPerMember" | i18n }}
- /{{ "month" | i18n }}
- {{ "includesXMembers" | i18n: selectableProduct.PasswordManager.baseSeats }}
@@ -108,7 +119,7 @@
| currency: "$")
}}
- /{{ "monthPerMember" | i18n }}
+ /{{ "monthPerMember" | i18n }}
{{ "freeForever" | i18n }}
@@ -125,7 +136,7 @@
{{ "bitwardenPasswordManager" | i18n }}
- {{ "upgradeEnterpriseMessage" | i18n }}
+ {{ "enterprisePlanUpgradeMessage" | i18n }}
-
@@ -193,13 +204,13 @@
*ngIf="selectableProduct.productTier === productTypes.Teams"
class="tw-text-xs tw-px-2"
>
- {{ "upgradeTeamsMessage" | i18n }}
+ {{ "teamsPlanUpgradeMessage" | i18n }}
- {{ "upgradeFamilyMessage" | i18n }}
+ {{ "familyPlanUpgradeMessage" | i18n }}
Date: Mon, 9 Sep 2024 19:32:13 +0200
Subject: [PATCH 26/36] Typescript 5.3:
Fix-super-missuse-on-instance-properties (#10952)
Co-authored-by: Daniel James Smith
---
apps/browser/src/tools/popup/send/send-groupings.component.ts | 2 +-
apps/browser/src/tools/popup/send/send-type.component.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/browser/src/tools/popup/send/send-groupings.component.ts b/apps/browser/src/tools/popup/send/send-groupings.component.ts
index 99cac6f73c8..87de6af31cf 100644
--- a/apps/browser/src/tools/popup/send/send-groupings.component.ts
+++ b/apps/browser/src/tools/popup/send/send-groupings.component.ts
@@ -64,7 +64,7 @@ export class SendGroupingsComponent extends BaseSendComponent implements OnInit,
dialogService,
toastService,
);
- super.onSuccessfulLoad = async () => {
+ this.onSuccessfulLoad = async () => {
this.selectAll();
};
}
diff --git a/apps/browser/src/tools/popup/send/send-type.component.ts b/apps/browser/src/tools/popup/send/send-type.component.ts
index 2a555dfa928..8329831e0bc 100644
--- a/apps/browser/src/tools/popup/send/send-type.component.ts
+++ b/apps/browser/src/tools/popup/send/send-type.component.ts
@@ -66,7 +66,7 @@ export class SendTypeComponent extends BaseSendComponent implements OnInit, OnDe
dialogService,
toastService,
);
- super.onSuccessfulLoad = async () => {
+ this.onSuccessfulLoad = async () => {
this.selectType(this.type);
};
this.applySavedState =
From 124b4ce822d63923bc018d6ffce7dd9b1b183dd8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2024 16:33:19 -0400
Subject: [PATCH 27/36] [deps] AC: Update sass-loader to v16 (#10588)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 94bc636b4ec..055962ac492 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -168,7 +168,7 @@
"remark-gfm": "4.0.0",
"rimraf": "6.0.1",
"sass": "1.74.1",
- "sass-loader": "14.2.1",
+ "sass-loader": "16.0.1",
"storybook": "8.2.9",
"style-loader": "3.3.4",
"tailwindcss": "3.4.10",
@@ -33494,9 +33494,9 @@
}
},
"node_modules/sass-loader": {
- "version": "14.2.1",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz",
- "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.1.tgz",
+ "integrity": "sha512-xACl1ToTsKnL9Ce5yYpRxrLj9QUDCnwZNhzpC7tKiFyA8zXsd3Ap+HGVnbCgkdQcm43E+i6oKAWBsvGA6ZoiMw==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index 391474243b4..1ed2e6cab99 100644
--- a/package.json
+++ b/package.json
@@ -130,7 +130,7 @@
"remark-gfm": "4.0.0",
"rimraf": "6.0.1",
"sass": "1.74.1",
- "sass-loader": "14.2.1",
+ "sass-loader": "16.0.1",
"storybook": "8.2.9",
"style-loader": "3.3.4",
"tailwindcss": "3.4.10",
From cdb40818a8e8f395b48c9dc2b1195365acedb6f8 Mon Sep 17 00:00:00 2001
From: Tom <144813356+ttalty@users.noreply.github.com>
Date: Mon, 9 Sep 2024 16:58:56 -0400
Subject: [PATCH 28/36] [AC-2614] Member access test fix (#10969)
* Initial setup and modifications for member access report api implementation
* Adding the permissions logic for getting the permissions text
* fixing the test cases
* Some refactoring on async calls
* Comments on the model
* Resolving the mock issue
* messages
* Localization of text
* One more file to fix merge
* Fixing test case localization lookup
* Fixed permissions lookup
---
.../member-access-report.service.spec.ts | 16 ++++++++++------
.../services/member-access-report.service.ts | 2 +-
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.spec.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.spec.ts
index 20d33e314af..6aab54f77d5 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.spec.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.spec.ts
@@ -10,13 +10,17 @@ describe("ImportService", () => {
const mockOrganizationId = "mockOrgId" as OrganizationId;
const reportApiService = mock();
let memberAccessReportService: MemberAccessReportService;
- const i18nService = mock();
+ const i18nMock = mock({
+ t(key) {
+ return key;
+ },
+ });
beforeEach(() => {
reportApiService.getMemberAccessData.mockImplementation(() =>
Promise.resolve(memberAccessReportsMock),
);
- memberAccessReportService = new MemberAccessReportService(reportApiService, i18nService);
+ memberAccessReportService = new MemberAccessReportService(reportApiService, i18nMock);
});
describe("generateMemberAccessReportView", () => {
@@ -92,16 +96,16 @@ describe("ImportService", () => {
expect.objectContaining({
email: "sjohnson@email.com",
name: "Sarah Johnson",
- twoStepLogin: "On",
- accountRecovery: "On",
+ twoStepLogin: "memberAccessReportTwoFactorEnabledTrue",
+ accountRecovery: "memberAccessReportAuthenticationEnabledTrue",
group: "Group 1",
totalItems: "20",
}),
expect.objectContaining({
email: "jlull@email.com",
name: "James Lull",
- twoStepLogin: "Off",
- accountRecovery: "Off",
+ twoStepLogin: "memberAccessReportTwoFactorEnabledFalse",
+ accountRecovery: "memberAccessReportAuthenticationEnabledFalse",
group: "Group 4",
totalItems: "5",
}),
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
index 0548841e8c3..3616893e231 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
@@ -82,7 +82,7 @@ export class MemberAccessReportService {
: this.i18nService.t("memberAccessReportNoCollection"),
collectionPermission: detail.collectionId
? this.getPermissionText(detail)
- : this.i18nService.t("memberAccessReportNoCollection"),
+ : this.i18nService.t("memberAccessReportNoCollectionPermission"),
totalItems: detail.itemCount.toString(),
};
});
From 4e7399ed98985dd7041a54f3487bb1dc96f616be Mon Sep 17 00:00:00 2001
From: Nick Krantz <125900171+nick-livefront@users.noreply.github.com>
Date: Mon, 9 Sep 2024 16:36:23 -0500
Subject: [PATCH 29/36] [PM-9733] Custom Vault Timeout (#10515)
* handle timeout changes that are predefined string values
- Passing a string to `Math.max` will cause a NaN to be set.
* type form instance so TypeScript is more aware of the form values
---
.../vault-timeout-input.component.spec.ts | 81 +++++++++++++++++++
.../vault-timeout-input.component.ts | 22 ++---
2 files changed, 94 insertions(+), 9 deletions(-)
create mode 100644 libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts
diff --git a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts
new file mode 100644
index 00000000000..6b39c90fc9b
--- /dev/null
+++ b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.spec.ts
@@ -0,0 +1,81 @@
+import { ComponentFixture, TestBed } from "@angular/core/testing";
+import { BehaviorSubject } from "rxjs";
+
+import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
+import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type";
+
+import { VaultTimeoutInputComponent } from "./vault-timeout-input.component";
+
+describe("VaultTimeoutInputComponent", () => {
+ let component: VaultTimeoutInputComponent;
+ let fixture: ComponentFixture;
+ const get$ = jest.fn().mockReturnValue(new BehaviorSubject({}));
+ const availableVaultTimeoutActions$ = jest.fn().mockReturnValue(new BehaviorSubject([]));
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [VaultTimeoutInputComponent],
+ providers: [
+ { provide: PolicyService, useValue: { get$ } },
+ { provide: VaultTimeoutSettingsService, useValue: { availableVaultTimeoutActions$ } },
+ { provide: I18nService, useValue: { t: (key: string) => key } },
+ ],
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(VaultTimeoutInputComponent);
+ component = fixture.componentInstance;
+ component.vaultTimeoutOptions = [
+ { name: "oneMinute", value: 1 },
+ { name: "fiveMinutes", value: 5 },
+ { name: "fifteenMinutes", value: 15 },
+ { name: "thirtyMinutes", value: 30 },
+ { name: "oneHour", value: 60 },
+ { name: "fourHours", value: 240 },
+ { name: "onRefresh", value: VaultTimeoutStringType.OnRestart },
+ ];
+ fixture.detectChanges();
+ });
+
+ describe("form", () => {
+ beforeEach(async () => {
+ await component.ngOnInit();
+ });
+
+ it("invokes the onChange associated with `ControlValueAccessor`", () => {
+ const onChange = jest.fn();
+ component.registerOnChange(onChange);
+
+ component.form.controls.vaultTimeout.setValue(VaultTimeoutStringType.OnRestart);
+
+ expect(onChange).toHaveBeenCalledWith(VaultTimeoutStringType.OnRestart);
+ });
+
+ it("updates custom value to match preset option", () => {
+ // 1 hour
+ component.form.controls.vaultTimeout.setValue(60);
+
+ expect(component.form.value.custom).toEqual({ hours: 1, minutes: 0 });
+
+ // 17 minutes
+ component.form.controls.vaultTimeout.setValue(17);
+
+ expect(component.form.value.custom).toEqual({ hours: 0, minutes: 17 });
+
+ // 2.25 hours
+ component.form.controls.vaultTimeout.setValue(135);
+
+ expect(component.form.value.custom).toEqual({ hours: 2, minutes: 15 });
+ });
+
+ it("sets custom timeout to 0 when a preset string option is selected", () => {
+ // Set custom value to random values
+ component.form.controls.custom.setValue({ hours: 1, minutes: 1 });
+
+ component.form.controls.vaultTimeout.setValue(VaultTimeoutStringType.OnLocked);
+
+ expect(component.form.value.custom).toEqual({ hours: 0, minutes: 0 });
+ });
+ });
+});
diff --git a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts
index f1cfcec8c3e..7c760835603 100644
--- a/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts
+++ b/libs/auth/src/angular/vault-timeout-input/vault-timeout-input.component.ts
@@ -4,6 +4,8 @@ import {
AbstractControl,
ControlValueAccessor,
FormBuilder,
+ FormControl,
+ FormGroup,
NG_VALIDATORS,
NG_VALUE_ACCESSOR,
ReactiveFormsModule,
@@ -22,13 +24,15 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
import { VaultTimeout, VaultTimeoutOption } from "@bitwarden/common/types/vault-timeout.type";
import { FormFieldModule, SelectModule } from "@bitwarden/components";
-interface VaultTimeoutFormValue {
- vaultTimeout: VaultTimeout | null;
- custom: {
- hours: number | null;
- minutes: number | null;
- };
-}
+type VaultTimeoutForm = FormGroup<{
+ vaultTimeout: FormControl;
+ custom: FormGroup<{
+ hours: FormControl;
+ minutes: FormControl;
+ }>;
+}>;
+
+type VaultTimeoutFormValue = VaultTimeoutForm["value"];
@Component({
selector: "auth-vault-timeout-input",
@@ -64,7 +68,7 @@ export class VaultTimeoutInputComponent
static CUSTOM_VALUE = -100;
static MIN_CUSTOM_MINUTES = 0;
- form = this.formBuilder.group({
+ form: VaultTimeoutForm = this.formBuilder.group({
vaultTimeout: [null],
custom: this.formBuilder.group({
hours: [null],
@@ -120,7 +124,7 @@ export class VaultTimeoutInputComponent
takeUntil(this.destroy$),
)
.subscribe((value) => {
- const current = Math.max(value, 0);
+ const current = typeof value === "string" ? 0 : Math.max(value, 0);
// This cannot emit an event b/c it would cause form.valueChanges to fire again
// and we are already handling that above so just silently update
From 12967b0c17643898a89d3f5f36b0914f4c8d55b9 Mon Sep 17 00:00:00 2001
From: rr-bw <102181210+rr-bw@users.noreply.github.com>
Date: Mon, 9 Sep 2024 15:12:31 -0700
Subject: [PATCH 30/36] h3 typography on small screens, h2 on medium-large
screens (#10939)
---
.../angular/anon-layout/anon-layout.component.html | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/libs/auth/src/angular/anon-layout/anon-layout.component.html b/libs/auth/src/angular/anon-layout/anon-layout.component.html
index 39570dabc8b..6603fa970d4 100644
--- a/libs/auth/src/angular/anon-layout/anon-layout.component.html
+++ b/libs/auth/src/angular/anon-layout/anon-layout.component.html
@@ -13,9 +13,16 @@
-
- {{ title }}
-
+
+
+
+ {{ title }}
+
+
+
+ {{ title }}
+
+
{{ subtitle }}
From 71e5bcb9477c9d626f162dc55e0218e27edaebce Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 10 Sep 2024 12:02:05 +0200
Subject: [PATCH 31/36] [PM-11885] [deps] Tools: Update electron to v32.0.2
(#10964)
* [deps] Tools: Update electron to v32.0.2
* Bump version electron-builder.json
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel James Smith
Co-authored-by: Daniel James Smith <2670567+djsmith85@users.noreply.github.com>
---
apps/desktop/electron-builder.json | 2 +-
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json
index b6572587faa..49e414dfe99 100644
--- a/apps/desktop/electron-builder.json
+++ b/apps/desktop/electron-builder.json
@@ -25,7 +25,7 @@
"**/node_modules/argon2/package.json",
"**/node_modules/argon2/build/Release/argon2.node"
],
- "electronVersion": "32.0.1",
+ "electronVersion": "32.0.2",
"generateUpdatesFilesForAllChannels": true,
"publish": {
"provider": "generic",
diff --git a/package-lock.json b/package-lock.json
index 055962ac492..0a9936bbf2b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -129,7 +129,7 @@
"copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
- "electron": "32.0.1",
+ "electron": "32.0.2",
"electron-builder": "24.13.3",
"electron-log": "5.0.1",
"electron-reload": "2.0.0-alpha.1",
@@ -16433,9 +16433,9 @@
}
},
"node_modules/electron": {
- "version": "32.0.1",
- "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.1.tgz",
- "integrity": "sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==",
+ "version": "32.0.2",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.2.tgz",
+ "integrity": "sha512-nmZblq8wW3HZ17MAyaUuiMI9Mb0Cgc7UR3To85h/rVopbfyF5s34NxtK4gvyRfYPxpDGP4k+HoQIPniPPrdE3w==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
diff --git a/package.json b/package.json
index 1ed2e6cab99..9e1921cbdf8 100644
--- a/package.json
+++ b/package.json
@@ -91,7 +91,7 @@
"copy-webpack-plugin": "12.0.2",
"cross-env": "7.0.3",
"css-loader": "7.1.2",
- "electron": "32.0.1",
+ "electron": "32.0.2",
"electron-builder": "24.13.3",
"electron-log": "5.0.1",
"electron-reload": "2.0.0-alpha.1",
From c1b1db071d9def6a293fb6860a1c664d737fed74 Mon Sep 17 00:00:00 2001
From: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com>
Date: Tue, 10 Sep 2024 12:57:47 +0100
Subject: [PATCH 32/36] [AC-3029][Defect] Organization storage count is not
carried over to the Upgrade dialog Total section (#10965)
* Resolve the ui changes issues
* Resolve the storage ui issue
---
.../change-plan-dialog.component.html | 24 ++++++++++++-------
.../change-plan-dialog.component.ts | 21 ++++++++++++++--
2 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
index 02071f5aa8c..1c92cbf6632 100644
--- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
+++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.html
@@ -389,17 +389,21 @@
bitTypography="body2"
*ngIf="
selectedPlan.PasswordManager.hasAdditionalStorageOption &&
- !organization.useSecretsManager
+ !organization.useSecretsManager &&
+ organization.maxStorageGb > 0
"
>
- {{ 0 }}
+ {{ organization.maxStorageGb }}
{{ "additionalStorageGbMessage" | i18n }}
×
- {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }}
+ {{ additionalStoragePriceMonthly(selectedPlan) | currency: "$" }}
/{{ "year" | i18n }}
- {{ 0 | currency: "$" }}
+ {{
+ organization.maxStorageGb * selectedPlan.PasswordManager.additionalStoragePricePerGb
+ | currency: "$"
+ }}
@@ -505,17 +509,21 @@
bitTypography="body2"
*ngIf="
selectedPlan.PasswordManager.hasAdditionalStorageOption &&
- !organization.useSecretsManager
+ !organization.useSecretsManager &&
+ organization.maxStorageGb > 0
"
>
- {{ 0 }}
+ {{ organization.maxStorageGb }}
{{ "additionalStorageGbMessage" | i18n }}
×
- {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }}
+ {{ additionalStoragePriceMonthly(selectedPlan) | currency: "$" }}
/{{ "month" | i18n }}
- {{ 0 | currency: "$" }}
+ {{
+ organization.maxStorageGb * selectedPlan.PasswordManager.additionalStoragePricePerGb
+ | currency: "$"
+ }}
diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts
index a359c281ebe..9492b51fcb2 100644
--- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts
+++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts
@@ -477,6 +477,13 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
);
}
+ additionalStoragePriceMonthly(selectedPlan: PlanResponse) {
+ if (!selectedPlan.isAnnual) {
+ return selectedPlan.PasswordManager.additionalStoragePricePerGb;
+ }
+ return selectedPlan.PasswordManager.additionalStoragePricePerGb / 12;
+ }
+
additionalServiceAccountTotal(plan: PlanResponse): number {
if (!plan.SecretsManager.hasAdditionalServiceAccountOption || this.additionalServiceAccount) {
return 0;
@@ -525,9 +532,18 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
get total() {
if (this.organization.useSecretsManager) {
- return this.passwordManagerSubtotal + this.secretsManagerSubtotal + this.taxCharges || 0;
+ return (
+ this.passwordManagerSubtotal +
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.secretsManagerSubtotal +
+ this.taxCharges || 0
+ );
}
- return this.passwordManagerSubtotal + this.taxCharges || 0;
+ return (
+ this.passwordManagerSubtotal +
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.taxCharges || 0
+ );
}
get teamsStarterPlanIsAvailable() {
@@ -639,6 +655,7 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
if (this.selectedPlan.productTier !== ProductTierType.Families) {
request.additionalSeats = this.organization.seats;
}
+ request.additionalStorageGb = this.organization.maxStorageGb;
request.premiumAccessAddon =
this.selectedPlan.PasswordManager.hasPremiumAccessOption &&
this.formGroup.controls.premiumAccessAddon.value;
From 2d02b6ca5ce1e7d41d2e2acc89e44cc6aa75207d Mon Sep 17 00:00:00 2001
From: Jared Snider <116684653+JaredSnider-Bitwarden@users.noreply.github.com>
Date: Tue, 10 Sep 2024 11:29:48 -0400
Subject: [PATCH 33/36] Auth/PM-11252 - Registration with Email Verification -
Add new redirect connector (#10682)
* PM-11252 - Registration with email verification - Add new signup redirect connector
* PM-11252 - Make the redirect connector generic and extensible while updating it to reference the new fragment based approach which prevents open redirects and prevents the query string from being sent to servers or proxies.
* PM-11252 - PR feedback - refactor redirect to simply forward any fragment onward with no query param parsing required leading to an even more generic solution.
* PM-11252 - Docs
* PM-11252 - PR Feedback - Include styles in chunks to remove need to manually import scss
* PM-11252 - Update redirect html to tailwind.
---
apps/web/src/connectors/redirect.html | 29 +++++++++++++++++++++++++++
apps/web/src/connectors/redirect.ts | 17 ++++++++++++++++
apps/web/webpack.config.js | 6 ++++++
3 files changed, 52 insertions(+)
create mode 100644 apps/web/src/connectors/redirect.html
create mode 100644 apps/web/src/connectors/redirect.ts
diff --git a/apps/web/src/connectors/redirect.html b/apps/web/src/connectors/redirect.html
new file mode 100644
index 00000000000..13b05fb17e2
--- /dev/null
+++ b/apps/web/src/connectors/redirect.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+ Bitwarden Web vault
+
+
+
+
+
+
+
+
+
+
+
![Bitwarden]()
+
+
+
+
+
+
diff --git a/apps/web/src/connectors/redirect.ts b/apps/web/src/connectors/redirect.ts
new file mode 100644
index 00000000000..82bd273fad3
--- /dev/null
+++ b/apps/web/src/connectors/redirect.ts
@@ -0,0 +1,17 @@
+// This redirect connector is used to redirect users to the correct URL after they have been sent here from an email link.
+// The fragment contains the information needed to redirect the user to the correct page.
+// This is required because android app links couldn't properly handle the angular hash based route we originally had in the email link.
+window.addEventListener("load", () => {
+ // ex: https://vault.bitwarden.com/redirect-connector.html#finish-signup?token=fakeToken&email=example%40example.com&fromEmail=true
+ const currentUrl = new URL(window.location.href);
+
+ // Get the fragment (everything after the #)
+ const fragment = currentUrl.hash.substring(1); // Remove the leading #
+
+ if (!fragment) {
+ throw new Error("No fragment found in URL. Cannot determine redirect.");
+ }
+
+ const newUrl = `${window.location.origin}/#/${fragment}`;
+ window.location.href = newUrl;
+});
diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js
index ce3979f7918..cec4bf044be 100644
--- a/apps/web/webpack.config.js
+++ b/apps/web/webpack.config.js
@@ -111,6 +111,11 @@ const plugins = [
filename: "sso-connector.html",
chunks: ["connectors/sso"],
}),
+ new HtmlWebpackPlugin({
+ template: "./src/connectors/redirect.html",
+ filename: "redirect-connector.html",
+ chunks: ["connectors/redirect", "styles"],
+ }),
new HtmlWebpackPlugin({
template: "./src/connectors/captcha.html",
filename: "captcha-connector.html",
@@ -325,6 +330,7 @@ const webpackConfig = {
"connectors/sso": "./src/connectors/sso.ts",
"connectors/captcha": "./src/connectors/captcha.ts",
"connectors/duo-redirect": "./src/connectors/duo-redirect.ts",
+ "connectors/redirect": "./src/connectors/redirect.ts",
styles: ["./src/scss/styles.scss", "./src/scss/tailwind.css"],
theme_head: "./src/theme.ts",
},
From 4128b18b27ed8f183f7787514630cc63185f3a61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?=
Date: Tue, 10 Sep 2024 12:43:33 -0400
Subject: [PATCH 34/36] [PM-8279] password generation component (#10805)
---
.../credential-generator.component.html | 2 +-
.../credential-generator.component.ts | 7 +-
libs/common/src/tools/dependencies.ts | 2 +-
.../integration/rpc/integration-request.ts | 11 +-
libs/common/src/tools/types.ts | 17 +
.../generator/components/src/dependencies.ts | 37 +-
libs/tools/generator/components/src/index.ts | 1 +
.../src/password-generator.component.html | 44 ++
.../src/password-generator.component.ts | 117 +++++
.../generator/core/src/data/generators.ts | 15 +
.../src/engine/password-randomizer.spec.ts | 36 ++
.../core/src/engine/password-randomizer.ts | 52 ++-
.../credential-generator.service.spec.ts | 297 ++++++++++++-
.../services/credential-generator.service.ts | 60 ++-
.../passphrase-generator-strategy.spec.ts | 2 +-
.../passphrase-generator-strategy.ts | 12 +-
.../strategies/password-generator-strategy.ts | 59 +--
.../core/src/types/credential-category.ts | 5 +
.../credential-generator-configuration.ts | 20 +
.../core/src/types/credential-generator.ts | 12 +
.../src/types/generated-credential.spec.ts | 58 +++
.../core/src/types/generated-credential.ts | 47 ++
libs/tools/generator/core/src/types/index.ts | 3 +
libs/tools/generator/core/src/util.spec.ts | 411 +++++++++++++++++-
libs/tools/generator/core/src/util.ts | 83 ++++
25 files changed, 1292 insertions(+), 118 deletions(-)
create mode 100644 libs/tools/generator/components/src/password-generator.component.html
create mode 100644 libs/tools/generator/components/src/password-generator.component.ts
create mode 100644 libs/tools/generator/core/src/types/credential-category.ts
create mode 100644 libs/tools/generator/core/src/types/credential-generator.ts
create mode 100644 libs/tools/generator/core/src/types/generated-credential.spec.ts
create mode 100644 libs/tools/generator/core/src/types/generated-credential.ts
diff --git a/apps/browser/src/tools/popup/generator/credential-generator.component.html b/apps/browser/src/tools/popup/generator/credential-generator.component.html
index 0b43b0e257c..d8c49da5b1a 100644
--- a/apps/browser/src/tools/popup/generator/credential-generator.component.html
+++ b/apps/browser/src/tools/popup/generator/credential-generator.component.html
@@ -1 +1 @@
-
+
diff --git a/apps/browser/src/tools/popup/generator/credential-generator.component.ts b/apps/browser/src/tools/popup/generator/credential-generator.component.ts
index f07affd2374..16938fbe79f 100644
--- a/apps/browser/src/tools/popup/generator/credential-generator.component.ts
+++ b/apps/browser/src/tools/popup/generator/credential-generator.component.ts
@@ -1,14 +1,11 @@
import { Component } from "@angular/core";
-import {
- PassphraseSettingsComponent,
- PasswordSettingsComponent,
-} from "@bitwarden/generator-components";
+import { PasswordGeneratorComponent } from "@bitwarden/generator-components";
@Component({
standalone: true,
selector: "credential-generator",
templateUrl: "credential-generator.component.html",
- imports: [PassphraseSettingsComponent, PasswordSettingsComponent],
+ imports: [PasswordGeneratorComponent],
})
export class CredentialGeneratorComponent {}
diff --git a/libs/common/src/tools/dependencies.ts b/libs/common/src/tools/dependencies.ts
index 0488291b446..8b860591d54 100644
--- a/libs/common/src/tools/dependencies.ts
+++ b/libs/common/src/tools/dependencies.ts
@@ -77,7 +77,7 @@ export type SingleUserDependency = {
export type OnDependency = {
/** The stream that controls emissions
*/
- on$: Observable;
+ on$: Observable;
};
/** A pattern for types that emit when a dependency is `true`.
diff --git a/libs/common/src/tools/integration/rpc/integration-request.ts b/libs/common/src/tools/integration/rpc/integration-request.ts
index 84a7b517abe..9f1808a632b 100644
--- a/libs/common/src/tools/integration/rpc/integration-request.ts
+++ b/libs/common/src/tools/integration/rpc/integration-request.ts
@@ -1,11 +1,6 @@
+import { GenerationRequest } from "../../types";
+
/** Options that provide contextual information about the application state
* when an integration is invoked.
*/
-export type IntegrationRequest = {
- /** @param website The domain of the website the requested integration is used
- * within. This should be set to `null` when the request is not specific
- * to any website.
- * @remarks this field contains sensitive data
- */
- website: string | null;
-};
+export type IntegrationRequest = Partial;
diff --git a/libs/common/src/tools/types.ts b/libs/common/src/tools/types.ts
index 0c2f2832eaa..83d69edb06c 100644
--- a/libs/common/src/tools/types.ts
+++ b/libs/common/src/tools/types.ts
@@ -46,3 +46,20 @@ export type Constraints = {
/** utility type for methods that evaluate constraints generically. */
export type AnyConstraint = PrimitiveConstraint & StringConstraints & NumberConstraints;
+
+/** Options that provide contextual information about the application state
+ * when a generator is invoked.
+ */
+export type VaultItemRequest = {
+ /** The domain of the website the requested credential is used
+ * within. This should be set to `null` when the request is not specific
+ * to any website.
+ * @remarks this field contains sensitive data
+ */
+ website: string | null;
+};
+
+/** Options that provide contextual information about the application state
+ * when a generator is invoked.
+ */
+export type GenerationRequest = Partial;
diff --git a/libs/tools/generator/components/src/dependencies.ts b/libs/tools/generator/components/src/dependencies.ts
index 927c3811c86..d96ff0db8d6 100644
--- a/libs/tools/generator/components/src/dependencies.ts
+++ b/libs/tools/generator/components/src/dependencies.ts
@@ -4,41 +4,60 @@ import { ReactiveFormsModule } from "@angular/forms";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { safeProvider } from "@bitwarden/angular/platform/utils/safe-provider";
+import { SafeInjectionToken } from "@bitwarden/angular/services/injection-tokens";
import { JslibServicesModule } from "@bitwarden/angular/services/jslib-services.module";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
+import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
import { StateProvider } from "@bitwarden/common/platform/state";
import {
CardComponent,
CheckboxModule,
ColorPasswordModule,
FormFieldModule,
+ IconButtonModule,
InputModule,
+ ItemModule,
SectionComponent,
SectionHeaderComponent,
+ ToggleGroupModule,
} from "@bitwarden/components";
-import { CredentialGeneratorService } from "@bitwarden/generator-core";
+import {
+ createRandomizer,
+ CredentialGeneratorService,
+ Randomizer,
+} from "@bitwarden/generator-core";
+
+const RANDOMIZER = new SafeInjectionToken("Randomizer");
/** Shared module containing generator component dependencies */
@NgModule({
- imports: [SectionComponent, SectionHeaderComponent, CardComponent],
+ imports: [CardComponent, SectionComponent, SectionHeaderComponent],
exports: [
+ CardComponent,
+ CheckboxModule,
+ CommonModule,
+ ColorPasswordModule,
+ FormFieldModule,
+ IconButtonModule,
+ InputModule,
+ ItemModule,
JslibModule,
JslibServicesModule,
- FormFieldModule,
- CommonModule,
ReactiveFormsModule,
- ColorPasswordModule,
- InputModule,
- CheckboxModule,
SectionComponent,
SectionHeaderComponent,
- CardComponent,
+ ToggleGroupModule,
],
providers: [
+ safeProvider({
+ provide: RANDOMIZER,
+ useFactory: createRandomizer,
+ deps: [CryptoService],
+ }),
safeProvider({
provide: CredentialGeneratorService,
useClass: CredentialGeneratorService,
- deps: [StateProvider, PolicyService],
+ deps: [RANDOMIZER, StateProvider, PolicyService],
}),
],
declarations: [],
diff --git a/libs/tools/generator/components/src/index.ts b/libs/tools/generator/components/src/index.ts
index 5915c5d59f6..4423f8a1ec9 100644
--- a/libs/tools/generator/components/src/index.ts
+++ b/libs/tools/generator/components/src/index.ts
@@ -2,3 +2,4 @@ export { PassphraseSettingsComponent } from "./passphrase-settings.component";
export { CredentialGeneratorHistoryComponent } from "./credential-generator-history.component";
export { EmptyCredentialHistoryComponent } from "./empty-credential-history.component";
export { PasswordSettingsComponent } from "./password-settings.component";
+export { PasswordGeneratorComponent } from "./password-generator.component";
diff --git a/libs/tools/generator/components/src/password-generator.component.html b/libs/tools/generator/components/src/password-generator.component.html
new file mode 100644
index 00000000000..db5a1ed379b
--- /dev/null
+++ b/libs/tools/generator/components/src/password-generator.component.html
@@ -0,0 +1,44 @@
+
+
+ {{ "password" | i18n }}
+
+
+ {{ "passphrase" | i18n }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/tools/generator/components/src/password-generator.component.ts b/libs/tools/generator/components/src/password-generator.component.ts
new file mode 100644
index 00000000000..6c84d83c4cf
--- /dev/null
+++ b/libs/tools/generator/components/src/password-generator.component.ts
@@ -0,0 +1,117 @@
+import { Component, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from "@angular/core";
+import { BehaviorSubject, distinctUntilChanged, map, Subject, switchMap, takeUntil } from "rxjs";
+
+import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
+import { UserId } from "@bitwarden/common/types/guid";
+import { CredentialGeneratorService, Generators, GeneratorType } from "@bitwarden/generator-core";
+import { GeneratedCredential } from "@bitwarden/generator-history";
+
+import { DependenciesModule } from "./dependencies";
+import { PassphraseSettingsComponent } from "./passphrase-settings.component";
+import { PasswordSettingsComponent } from "./password-settings.component";
+
+/** Options group for passwords */
+@Component({
+ standalone: true,
+ selector: "bit-password-generator",
+ templateUrl: "password-generator.component.html",
+ imports: [DependenciesModule, PasswordSettingsComponent, PassphraseSettingsComponent],
+})
+export class PasswordGeneratorComponent implements OnInit, OnDestroy {
+ constructor(
+ private generatorService: CredentialGeneratorService,
+ private accountService: AccountService,
+ private zone: NgZone,
+ ) {}
+
+ /** Binds the passphrase component to a specific user's settings.
+ * When this input is not provided, the form binds to the active
+ * user
+ */
+ @Input()
+ userId: UserId | null;
+
+ /** tracks the currently selected credential type */
+ protected credentialType$ = new BehaviorSubject("password");
+
+ /** Emits the last generated value. */
+ protected readonly value$ = new BehaviorSubject("");
+
+ /** Emits when the userId changes */
+ protected readonly userId$ = new BehaviorSubject(null);
+
+ /** Emits when a new credential is requested */
+ protected readonly generate$ = new Subject();
+
+ /** Tracks changes to the selected credential type
+ * @param type the new credential type
+ */
+ protected onCredentialTypeChanged(type: GeneratorType) {
+ if (this.credentialType$.value !== type) {
+ this.credentialType$.next(type);
+ this.generate$.next();
+ }
+ }
+
+ /** Emits credentials created from a generation request. */
+ @Output()
+ readonly onGenerated = new EventEmitter();
+
+ async ngOnInit() {
+ if (this.userId) {
+ this.userId$.next(this.userId);
+ } else {
+ this.accountService.activeAccount$
+ .pipe(
+ map((acct) => acct.id),
+ distinctUntilChanged(),
+ takeUntil(this.destroyed),
+ )
+ .subscribe(this.userId$);
+ }
+
+ this.credentialType$
+ .pipe(
+ switchMap((type) => this.typeToGenerator$(type)),
+ takeUntil(this.destroyed),
+ )
+ .subscribe((generated) => {
+ // update subjects within the angular zone so that the
+ // template bindings refresh immediately
+ this.zone.run(() => {
+ this.onGenerated.next(generated);
+ this.value$.next(generated.credential);
+ });
+ });
+ }
+
+ private typeToGenerator$(type: GeneratorType) {
+ const dependencies = {
+ on$: this.generate$,
+ userId$: this.userId$,
+ };
+
+ switch (type) {
+ case "password":
+ return this.generatorService.generate$(Generators.Password, dependencies);
+
+ case "passphrase":
+ return this.generatorService.generate$(Generators.Passphrase, dependencies);
+ default:
+ throw new Error(`Invalid generator type: "${type}"`);
+ }
+ }
+
+ private readonly destroyed = new Subject();
+ ngOnDestroy(): void {
+ // tear down subscriptions
+ this.destroyed.complete();
+
+ // finalize subjects
+ this.generate$.complete();
+ this.value$.complete();
+
+ // finalize component bindings
+ this.onGenerated.complete();
+ }
+}
diff --git a/libs/tools/generator/core/src/data/generators.ts b/libs/tools/generator/core/src/data/generators.ts
index 94e289be03e..f71d484f9c2 100644
--- a/libs/tools/generator/core/src/data/generators.ts
+++ b/libs/tools/generator/core/src/data/generators.ts
@@ -1,5 +1,8 @@
+import { Randomizer } from "../abstractions";
+import { PasswordRandomizer } from "../engine";
import { PASSPHRASE_SETTINGS, PASSWORD_SETTINGS } from "../strategies/storage";
import {
+ CredentialGenerator,
PassphraseGenerationOptions,
PassphraseGeneratorPolicy,
PasswordGenerationOptions,
@@ -14,6 +17,12 @@ import { DefaultPasswordGenerationOptions } from "./default-password-generation-
import { Policies } from "./policies";
const PASSPHRASE = Object.freeze({
+ category: "passphrase",
+ engine: {
+ create(randomizer: Randomizer): CredentialGenerator {
+ return new PasswordRandomizer(randomizer);
+ },
+ },
settings: {
initial: DefaultPassphraseGenerationOptions,
constraints: {
@@ -32,6 +41,12 @@ const PASSPHRASE = Object.freeze({
>);
const PASSWORD = Object.freeze({
+ category: "password",
+ engine: {
+ create(randomizer: Randomizer): CredentialGenerator {
+ return new PasswordRandomizer(randomizer);
+ },
+ },
settings: {
initial: DefaultPasswordGenerationOptions,
constraints: {
diff --git a/libs/tools/generator/core/src/engine/password-randomizer.spec.ts b/libs/tools/generator/core/src/engine/password-randomizer.spec.ts
index bbc31a4a293..fca98855fd5 100644
--- a/libs/tools/generator/core/src/engine/password-randomizer.spec.ts
+++ b/libs/tools/generator/core/src/engine/password-randomizer.spec.ts
@@ -335,4 +335,40 @@ describe("PasswordRandomizer", () => {
expect(result).toEqual("foo-foo");
});
});
+
+ describe("generate", () => {
+ it("processes password generation options", async () => {
+ const password = new PasswordRandomizer(randomizer);
+
+ const result = await password.generate(
+ {},
+ {
+ length: 10,
+ },
+ );
+
+ expect(result.category).toEqual("password");
+ });
+
+ it("processes passphrase generation options", async () => {
+ const password = new PasswordRandomizer(randomizer);
+
+ const result = await password.generate(
+ {},
+ {
+ numWords: 10,
+ },
+ );
+
+ expect(result.category).toEqual("passphrase");
+ });
+
+ it("throws when it cannot recognize the options type", async () => {
+ const password = new PasswordRandomizer(randomizer);
+
+ const result = password.generate({}, {});
+
+ await expect(result).rejects.toBeInstanceOf(Error);
+ });
+ });
});
diff --git a/libs/tools/generator/core/src/engine/password-randomizer.ts b/libs/tools/generator/core/src/engine/password-randomizer.ts
index 438ea8b8b47..c3a2e2b5d93 100644
--- a/libs/tools/generator/core/src/engine/password-randomizer.ts
+++ b/libs/tools/generator/core/src/engine/password-randomizer.ts
@@ -1,13 +1,26 @@
import { EFFLongWordList } from "@bitwarden/common/platform/misc/wordlist";
+import { GenerationRequest } from "@bitwarden/common/tools/types";
+
+import {
+ CredentialGenerator,
+ GeneratedCredential,
+ PassphraseGenerationOptions,
+ PasswordGenerationOptions,
+} from "../types";
+import { optionsToEffWordListRequest, optionsToRandomAsciiRequest } from "../util";
import { Randomizer } from "./abstractions";
import { Ascii } from "./data";
import { CharacterSet, EffWordListRequest, RandomAsciiRequest } from "./types";
/** Generation algorithms that produce randomized secrets */
-export class PasswordRandomizer {
+export class PasswordRandomizer
+ implements
+ CredentialGenerator,
+ CredentialGenerator
+{
/** Instantiates the password randomizer
- * @param random data source for random data
+ * @param randomizer data source for random data
*/
constructor(private randomizer: Randomizer) {}
@@ -52,6 +65,41 @@ export class PasswordRandomizer {
return wordList.join(request.separator);
}
+
+ generate(
+ request: GenerationRequest,
+ settings: PasswordGenerationOptions,
+ ): Promise;
+ generate(
+ request: GenerationRequest,
+ settings: PassphraseGenerationOptions,
+ ): Promise;
+ async generate(
+ _request: GenerationRequest,
+ settings: PasswordGenerationOptions | PassphraseGenerationOptions,
+ ) {
+ if (isPasswordGenerationOptions(settings)) {
+ const request = optionsToRandomAsciiRequest(settings);
+ const password = await this.randomAscii(request);
+
+ return new GeneratedCredential(password, "password", Date.now());
+ } else if (isPassphraseGenerationOptions(settings)) {
+ const request = optionsToEffWordListRequest(settings);
+ const passphrase = await this.randomEffLongWords(request);
+
+ return new GeneratedCredential(passphrase, "passphrase", Date.now());
+ }
+
+ throw new Error("Invalid settings received by generator.");
+ }
+}
+
+function isPasswordGenerationOptions(settings: any): settings is PasswordGenerationOptions {
+ return "length" in (settings ?? {});
+}
+
+function isPassphraseGenerationOptions(settings: any): settings is PassphraseGenerationOptions {
+ return "numWords" in (settings ?? {});
}
// given a generator request, convert each of its `number | undefined` properties
diff --git a/libs/tools/generator/core/src/services/credential-generator.service.spec.ts b/libs/tools/generator/core/src/services/credential-generator.service.spec.ts
index 31f5134918b..5b784b3d07b 100644
--- a/libs/tools/generator/core/src/services/credential-generator.service.spec.ts
+++ b/libs/tools/generator/core/src/services/credential-generator.service.spec.ts
@@ -1,5 +1,5 @@
import { mock } from "jest-mock-extended";
-import { BehaviorSubject, firstValueFrom } from "rxjs";
+import { BehaviorSubject, filter, firstValueFrom, Subject } from "rxjs";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
@@ -8,9 +8,14 @@ import { GENERATOR_DISK, UserKeyDefinition } from "@bitwarden/common/platform/st
import { Constraints } from "@bitwarden/common/tools/types";
import { OrganizationId, PolicyId, UserId } from "@bitwarden/common/types/guid";
-import { FakeStateProvider, FakeAccountService, awaitAsync } from "../../../../../common/spec";
-import { PolicyEvaluator } from "../abstractions";
-import { CredentialGeneratorConfiguration } from "../types";
+import {
+ FakeStateProvider,
+ FakeAccountService,
+ awaitAsync,
+ ObservableTracker,
+} from "../../../../../common/spec";
+import { PolicyEvaluator, Randomizer } from "../abstractions";
+import { CredentialGeneratorConfiguration, GeneratedCredential } from "../types";
import { CredentialGeneratorService } from "./credential-generator.service";
@@ -34,8 +39,23 @@ const somePolicy = new Policy({
enabled: true,
});
+const SomeTime = new Date(1);
+const SomeCategory = "passphrase";
+
// fake the configuration
const SomeConfiguration: CredentialGeneratorConfiguration = {
+ category: SomeCategory,
+ engine: {
+ create: (randomizer) => {
+ return {
+ generate: (request, settings) => {
+ const credential = request.website ? `${request.website}|${settings.foo}` : settings.foo;
+ const result = new GeneratedCredential(credential, SomeCategory, SomeTime);
+ return Promise.resolve(result);
+ },
+ };
+ },
+ },
settings: {
initial: { foo: "initial" },
constraints: { foo: {} },
@@ -87,6 +107,9 @@ const accountService = new FakeAccountService({
// fake state
const stateProvider = new FakeStateProvider(accountService);
+// fake randomizer
+const randomizer = mock();
+
describe("CredentialGeneratorService", () => {
beforeEach(async () => {
await accountService.switchAccount(SomeUser);
@@ -94,10 +117,242 @@ describe("CredentialGeneratorService", () => {
jest.clearAllMocks();
});
+ describe("generate$", () => {
+ it("emits a generation for the active user when subscribed", async () => {
+ const settings = { foo: "value" };
+ await stateProvider.setUserState(SettingsKey, settings, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration));
+
+ const result = await generated.expectEmission();
+
+ expect(result).toEqual(new GeneratedCredential("value", SomeCategory, SomeTime));
+ });
+
+ it("follows the active user", async () => {
+ const someSettings = { foo: "some value" };
+ const anotherSettings = { foo: "another value" };
+ await stateProvider.setUserState(SettingsKey, someSettings, SomeUser);
+ await stateProvider.setUserState(SettingsKey, anotherSettings, AnotherUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration));
+
+ await accountService.switchAccount(AnotherUser);
+ await generated.pauseUntilReceived(2);
+ generated.unsubscribe();
+
+ expect(generated.emissions).toEqual([
+ new GeneratedCredential("some value", SomeCategory, SomeTime),
+ new GeneratedCredential("another value", SomeCategory, SomeTime),
+ ]);
+ });
+
+ it("emits a generation when the settings change", async () => {
+ const someSettings = { foo: "some value" };
+ const anotherSettings = { foo: "another value" };
+ await stateProvider.setUserState(SettingsKey, someSettings, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration));
+
+ await stateProvider.setUserState(SettingsKey, anotherSettings, SomeUser);
+ await generated.pauseUntilReceived(2);
+ generated.unsubscribe();
+
+ expect(generated.emissions).toEqual([
+ new GeneratedCredential("some value", SomeCategory, SomeTime),
+ new GeneratedCredential("another value", SomeCategory, SomeTime),
+ ]);
+ });
+
+ // FIXME: test these when the fake state provider can create the required emissions
+ it.todo("errors when the settings error");
+ it.todo("completes when the settings complete");
+
+ it("includes `website$`'s last emitted value", async () => {
+ const settings = { foo: "value" };
+ await stateProvider.setUserState(SettingsKey, settings, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const website$ = new BehaviorSubject("some website");
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration, { website$ }));
+
+ const result = await generated.expectEmission();
+
+ expect(result).toEqual(new GeneratedCredential("some website|value", SomeCategory, SomeTime));
+ });
+
+ it("errors when `website$` errors", async () => {
+ await stateProvider.setUserState(SettingsKey, null, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const website$ = new BehaviorSubject("some website");
+ let error = null;
+
+ generator.generate$(SomeConfiguration, { website$ }).subscribe({
+ error: (e: unknown) => {
+ error = e;
+ },
+ });
+ website$.error({ some: "error" });
+ await awaitAsync();
+
+ expect(error).toEqual({ some: "error" });
+ });
+
+ it("completes when `website$` completes", async () => {
+ await stateProvider.setUserState(SettingsKey, null, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const website$ = new BehaviorSubject("some website");
+ let completed = false;
+
+ generator.generate$(SomeConfiguration, { website$ }).subscribe({
+ complete: () => {
+ completed = true;
+ },
+ });
+ website$.complete();
+ await awaitAsync();
+
+ expect(completed).toBeTruthy();
+ });
+
+ it("emits a generation for a specific user when `user$` supplied", async () => {
+ await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
+ await stateProvider.setUserState(SettingsKey, { foo: "another" }, AnotherUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const userId$ = new BehaviorSubject(AnotherUser).asObservable();
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration, { userId$ }));
+
+ const result = await generated.expectEmission();
+
+ expect(result).toEqual(new GeneratedCredential("another", SomeCategory, SomeTime));
+ });
+
+ it("emits a generation for a specific user when `user$` emits", async () => {
+ await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
+ await stateProvider.setUserState(SettingsKey, { foo: "another" }, AnotherUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const userId = new BehaviorSubject(SomeUser);
+ const userId$ = userId.pipe(filter((u) => !!u));
+ const generated = new ObservableTracker(generator.generate$(SomeConfiguration, { userId$ }));
+
+ userId.next(AnotherUser);
+ const result = await generated.pauseUntilReceived(2);
+
+ expect(result).toEqual([
+ new GeneratedCredential("value", SomeCategory, SomeTime),
+ new GeneratedCredential("another", SomeCategory, SomeTime),
+ ]);
+ });
+
+ it("errors when `user$` errors", async () => {
+ await stateProvider.setUserState(SettingsKey, null, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const userId$ = new BehaviorSubject(SomeUser);
+ let error = null;
+
+ generator.generate$(SomeConfiguration, { userId$ }).subscribe({
+ error: (e: unknown) => {
+ error = e;
+ },
+ });
+ userId$.error({ some: "error" });
+ await awaitAsync();
+
+ expect(error).toEqual({ some: "error" });
+ });
+
+ it("completes when `user$` completes", async () => {
+ await stateProvider.setUserState(SettingsKey, null, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const userId$ = new BehaviorSubject(SomeUser);
+ let completed = false;
+
+ generator.generate$(SomeConfiguration, { userId$ }).subscribe({
+ complete: () => {
+ completed = true;
+ },
+ });
+ userId$.complete();
+ await awaitAsync();
+
+ expect(completed).toBeTruthy();
+ });
+
+ it("emits a generation only when `on$` emits", async () => {
+ // This test breaks from arrange/act/assert because it is testing causality
+ await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const on$ = new Subject();
+ const results: any[] = [];
+
+ // confirm no emission during subscription
+ const sub = generator
+ .generate$(SomeConfiguration, { on$ })
+ .subscribe((result) => results.push(result));
+ await awaitAsync();
+ expect(results.length).toEqual(0);
+
+ // confirm forwarded emission
+ on$.next();
+ await awaitAsync();
+ expect(results).toEqual([new GeneratedCredential("value", SomeCategory, SomeTime)]);
+
+ // confirm updating settings does not cause an emission
+ await stateProvider.setUserState(SettingsKey, { foo: "next" }, SomeUser);
+ await awaitAsync();
+ expect(results.length).toBe(1);
+
+ // confirm forwarded emission takes latest value
+ on$.next();
+ await awaitAsync();
+ sub.unsubscribe();
+
+ expect(results).toEqual([
+ new GeneratedCredential("value", SomeCategory, SomeTime),
+ new GeneratedCredential("next", SomeCategory, SomeTime),
+ ]);
+ });
+
+ it("errors when `on$` errors", async () => {
+ await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const on$ = new Subject();
+ let error: any = null;
+
+ // confirm no emission during subscription
+ generator.generate$(SomeConfiguration, { on$ }).subscribe({
+ error: (e: unknown) => {
+ error = e;
+ },
+ });
+ on$.error({ some: "error" });
+ await awaitAsync();
+
+ expect(error).toEqual({ some: "error" });
+ });
+
+ it("completes when `on$` completes", async () => {
+ await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
+ const on$ = new Subject();
+ let complete = false;
+
+ // confirm no emission during subscription
+ generator.generate$(SomeConfiguration, { on$ }).subscribe({
+ complete: () => {
+ complete = true;
+ },
+ });
+ on$.complete();
+ await awaitAsync();
+
+ expect(complete).toBeTruthy();
+ });
+ });
+
describe("settings$", () => {
it("defaults to the configuration's initial settings if settings aren't found", async () => {
await stateProvider.setUserState(SettingsKey, null, SomeUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const result = await firstValueFrom(generator.settings$(SomeConfiguration));
@@ -107,7 +362,7 @@ describe("CredentialGeneratorService", () => {
it("reads from the active user's configuration-defined storage", async () => {
const settings = { foo: "value" };
await stateProvider.setUserState(SettingsKey, settings, SomeUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const result = await firstValueFrom(generator.settings$(SomeConfiguration));
@@ -119,7 +374,7 @@ describe("CredentialGeneratorService", () => {
await stateProvider.setUserState(SettingsKey, settings, SomeUser);
const policy$ = new BehaviorSubject([somePolicy]);
policyService.getAll$.mockReturnValue(policy$);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const result = await firstValueFrom(generator.settings$(SomeConfiguration));
@@ -131,7 +386,7 @@ describe("CredentialGeneratorService", () => {
const anotherSettings = { foo: "another" };
await stateProvider.setUserState(SettingsKey, someSettings, SomeUser);
await stateProvider.setUserState(SettingsKey, anotherSettings, AnotherUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const results: any = [];
const sub = generator.settings$(SomeConfiguration).subscribe((r) => results.push(r));
@@ -148,7 +403,7 @@ describe("CredentialGeneratorService", () => {
await stateProvider.setUserState(SettingsKey, { foo: "value" }, SomeUser);
const anotherSettings = { foo: "another" };
await stateProvider.setUserState(SettingsKey, anotherSettings, AnotherUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId$ = new BehaviorSubject(AnotherUser).asObservable();
const result = await firstValueFrom(generator.settings$(SomeConfiguration, { userId$ }));
@@ -161,7 +416,7 @@ describe("CredentialGeneratorService", () => {
await stateProvider.setUserState(SettingsKey, someSettings, SomeUser);
const anotherSettings = { foo: "another" };
await stateProvider.setUserState(SettingsKey, anotherSettings, AnotherUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
const results: any = [];
@@ -180,7 +435,7 @@ describe("CredentialGeneratorService", () => {
it("errors when the arbitrary user's stream errors", async () => {
await stateProvider.setUserState(SettingsKey, null, SomeUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
let error = null;
@@ -198,7 +453,7 @@ describe("CredentialGeneratorService", () => {
it("completes when the arbitrary user's stream completes", async () => {
await stateProvider.setUserState(SettingsKey, null, SomeUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
let completed = false;
@@ -216,7 +471,7 @@ describe("CredentialGeneratorService", () => {
it("ignores repeated arbitrary user emissions", async () => {
await stateProvider.setUserState(SettingsKey, null, SomeUser);
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
let count = 0;
@@ -240,7 +495,7 @@ describe("CredentialGeneratorService", () => {
describe("settings", () => {
it("writes to the user's state", async () => {
const singleUserId$ = new BehaviorSubject(SomeUser).asObservable();
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const subject = await generator.settings(SomeConfiguration, { singleUserId$ });
subject.next({ foo: "next value" });
@@ -253,7 +508,7 @@ describe("CredentialGeneratorService", () => {
it("waits for the user to become available", async () => {
const singleUserId = new BehaviorSubject(null);
const singleUserId$ = singleUserId.asObservable();
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
let completed = false;
const promise = generator.settings(SomeConfiguration, { singleUserId$ }).then((settings) => {
@@ -271,7 +526,7 @@ describe("CredentialGeneratorService", () => {
describe("policy$", () => {
it("creates a disabled policy evaluator when there is no policy", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId$ = new BehaviorSubject(SomeUser).asObservable();
const result = await firstValueFrom(generator.policy$(SomeConfiguration, { userId$ }));
@@ -281,7 +536,7 @@ describe("CredentialGeneratorService", () => {
});
it("creates an active policy evaluator when there is a policy", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId$ = new BehaviorSubject(SomeUser).asObservable();
const policy$ = new BehaviorSubject([somePolicy]);
policyService.getAll$.mockReturnValue(policy$);
@@ -293,7 +548,7 @@ describe("CredentialGeneratorService", () => {
});
it("follows policy emissions", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
const somePolicySubject = new BehaviorSubject([somePolicy]);
@@ -316,7 +571,7 @@ describe("CredentialGeneratorService", () => {
});
it("follows user emissions", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
const somePolicy$ = new BehaviorSubject([somePolicy]).asObservable();
@@ -340,7 +595,7 @@ describe("CredentialGeneratorService", () => {
});
it("errors when the user errors", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
const expectedError = { some: "error" };
@@ -358,7 +613,7 @@ describe("CredentialGeneratorService", () => {
});
it("completes when the user completes", async () => {
- const generator = new CredentialGeneratorService(stateProvider, policyService);
+ const generator = new CredentialGeneratorService(randomizer, stateProvider, policyService);
const userId = new BehaviorSubject(SomeUser);
const userId$ = userId.asObservable();
diff --git a/libs/tools/generator/core/src/services/credential-generator.service.ts b/libs/tools/generator/core/src/services/credential-generator.service.ts
index 891d0016fef..d2012ecf20f 100644
--- a/libs/tools/generator/core/src/services/credential-generator.service.ts
+++ b/libs/tools/generator/core/src/services/credential-generator.service.ts
@@ -1,5 +1,7 @@
import {
+ BehaviorSubject,
combineLatest,
+ concatMap,
distinctUntilChanged,
endWith,
filter,
@@ -8,32 +10,84 @@ import {
map,
mergeMap,
Observable,
+ race,
switchMap,
takeUntil,
+ withLatestFrom,
} from "rxjs";
+import { Simplify } from "type-fest";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { StateProvider } from "@bitwarden/common/platform/state";
-import { SingleUserDependency, UserDependency } from "@bitwarden/common/tools/dependencies";
+import {
+ OnDependency,
+ SingleUserDependency,
+ UserDependency,
+} from "@bitwarden/common/tools/dependencies";
import { UserStateSubject } from "@bitwarden/common/tools/state/user-state-subject";
import { Constraints } from "@bitwarden/common/tools/types";
-import { PolicyEvaluator } from "../abstractions";
+import { PolicyEvaluator, Randomizer } from "../abstractions";
import { mapPolicyToEvaluatorV2 } from "../rx";
import { CredentialGeneratorConfiguration as Configuration } from "../types/credential-generator-configuration";
type Policy$Dependencies = UserDependency;
type Settings$Dependencies = Partial;
+type Generate$Dependencies = Simplify & Partial> & {
+ /** Emits the active website when subscribed.
+ *
+ * The generator does not respond to emissions of this interface;
+ * If it is provided, the generator blocks until a value becomes available.
+ * When `website$` is omitted, the generator uses the empty string instead.
+ * When `website$` completes, the generator completes.
+ * When `website$` errors, the generator forwards the error.
+ */
+ website$?: Observable;
+};
// FIXME: once the modernization is complete, switch the type parameters
// in `PolicyEvaluator` and bake-in the constraints type.
type Evaluator = PolicyEvaluator & Constraints;
export class CredentialGeneratorService {
constructor(
+ private randomizer: Randomizer,
private stateProvider: StateProvider,
private policyService: PolicyService,
) {}
+ /** Generates a stream of credentials
+ * @param configuration determines which generator's settings are loaded
+ * @param dependencies.on$ when specified, a new credential is emitted when
+ * this emits. Otherwise, a new credential is emitted when the settings
+ * update.
+ */
+ generate$(
+ configuration: Readonly>,
+ dependencies?: Generate$Dependencies,
+ ) {
+ // instantiate the engine
+ const engine = configuration.engine.create(this.randomizer);
+
+ // stream blocks until all of these values are received
+ const website$ = dependencies?.website$ ?? new BehaviorSubject(null);
+ const request$ = website$.pipe(map((website) => ({ website })));
+ const settings$ = this.settings$(configuration, dependencies);
+
+ // monitor completion
+ const requestComplete$ = request$.pipe(ignoreElements(), endWith(true));
+ const settingsComplete$ = request$.pipe(ignoreElements(), endWith(true));
+ const complete$ = race(requestComplete$, settingsComplete$);
+
+ // generation proper
+ const generate$ = (dependencies?.on$ ?? settings$).pipe(
+ withLatestFrom(request$, settings$),
+ concatMap(([, request, settings]) => engine.generate(request, settings)),
+ takeUntil(complete$),
+ );
+
+ return generate$;
+ }
+
/** Get the settings for the provided configuration
* @param configuration determines which generator's settings are loaded
* @param dependencies.userId$ identifies the user to which the settings are bound.
@@ -82,7 +136,7 @@ export class CredentialGeneratorService {
* @remarks the subject enforces policy for the settings
*/
async settings(
- configuration: Configuration,
+ configuration: Readonly>,
dependencies: SingleUserDependency,
) {
const userId = await firstValueFrom(
diff --git a/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.spec.ts b/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.spec.ts
index f9b346e02b0..6591b179fc2 100644
--- a/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.spec.ts
+++ b/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.spec.ts
@@ -17,7 +17,7 @@ import { PASSPHRASE_SETTINGS } from "./storage";
const SomeUser = "some user" as UserId;
-describe("Password generation strategy", () => {
+describe("Passphrase generation strategy", () => {
describe("toEvaluator()", () => {
it("should map to the policy evaluator", async () => {
const strategy = new PassphraseGeneratorStrategy(null, null);
diff --git a/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.ts b/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.ts
index fe2731f9dd5..37d8b9e3fba 100644
--- a/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.ts
+++ b/libs/tools/generator/core/src/strategies/passphrase-generator-strategy.ts
@@ -2,11 +2,11 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { StateProvider } from "@bitwarden/common/platform/state";
import { GeneratorStrategy } from "../abstractions";
-import { DefaultPassphraseBoundaries, DefaultPassphraseGenerationOptions, Policies } from "../data";
+import { DefaultPassphraseGenerationOptions, Policies } from "../data";
import { PasswordRandomizer } from "../engine";
import { mapPolicyToEvaluator } from "../rx";
import { PassphraseGenerationOptions, PassphraseGeneratorPolicy } from "../types";
-import { observe$PerUserId, sharedStateByUserId } from "../util";
+import { observe$PerUserId, optionsToEffWordListRequest, sharedStateByUserId } from "../util";
import { PASSPHRASE_SETTINGS } from "./storage";
@@ -33,13 +33,7 @@ export class PassphraseGeneratorStrategy
// algorithm
async generate(options: PassphraseGenerationOptions): Promise {
- const requestWords = options.numWords ?? DefaultPassphraseGenerationOptions.numWords;
- const request = {
- numberOfWords: Math.max(requestWords, DefaultPassphraseBoundaries.numWords.min),
- capitalize: options.capitalize ?? DefaultPassphraseGenerationOptions.capitalize,
- number: options.includeNumber ?? DefaultPassphraseGenerationOptions.includeNumber,
- separator: options.wordSeparator ?? DefaultPassphraseGenerationOptions.wordSeparator,
- };
+ const request = optionsToEffWordListRequest(options);
return this.randomizer.randomEffLongWords(request);
}
diff --git a/libs/tools/generator/core/src/strategies/password-generator-strategy.ts b/libs/tools/generator/core/src/strategies/password-generator-strategy.ts
index 9ed62490c06..9ff8a3d88b0 100644
--- a/libs/tools/generator/core/src/strategies/password-generator-strategy.ts
+++ b/libs/tools/generator/core/src/strategies/password-generator-strategy.ts
@@ -6,7 +6,7 @@ import { Policies, DefaultPasswordGenerationOptions } from "../data";
import { PasswordRandomizer } from "../engine";
import { mapPolicyToEvaluator } from "../rx";
import { PasswordGenerationOptions, PasswordGeneratorPolicy } from "../types";
-import { observe$PerUserId, sharedStateByUserId, sum } from "../util";
+import { observe$PerUserId, optionsToRandomAsciiRequest, sharedStateByUserId } from "../util";
import { PASSWORD_SETTINGS } from "./storage";
@@ -32,62 +32,7 @@ export class PasswordGeneratorStrategy
// algorithm
async generate(options: PasswordGenerationOptions): Promise {
- // converts password generation option sets, which are defined by
- // an "enabled" and "quantity" parameter, to the password engine's
- // parameters, which represent disabled options as `undefined`
- // properties.
- function process(
- // values read from the options
- enabled: boolean,
- quantity: number,
- // value used if an option is missing
- defaultEnabled: boolean,
- defaultQuantity: number,
- ) {
- const isEnabled = enabled ?? defaultEnabled;
- const actualQuantity = quantity ?? defaultQuantity;
- const result = isEnabled ? actualQuantity : undefined;
-
- return result;
- }
-
- const request = {
- uppercase: process(
- options.uppercase,
- options.minUppercase,
- DefaultPasswordGenerationOptions.uppercase,
- DefaultPasswordGenerationOptions.minUppercase,
- ),
- lowercase: process(
- options.lowercase,
- options.minLowercase,
- DefaultPasswordGenerationOptions.lowercase,
- DefaultPasswordGenerationOptions.minLowercase,
- ),
- digits: process(
- options.number,
- options.minNumber,
- DefaultPasswordGenerationOptions.number,
- DefaultPasswordGenerationOptions.minNumber,
- ),
- special: process(
- options.special,
- options.minSpecial,
- DefaultPasswordGenerationOptions.special,
- DefaultPasswordGenerationOptions.minSpecial,
- ),
- ambiguous: options.ambiguous ?? DefaultPasswordGenerationOptions.ambiguous,
- all: 0,
- };
-
- // engine represents character sets as "include only"; you assert how many all
- // characters there can be rather than a total length. This conversion has
- // the character classes win, so that the result is always consistent with policy
- // minimums.
- const required = sum(request.uppercase, request.lowercase, request.digits, request.special);
- const remaining = (options.length ?? 0) - required;
- request.all = Math.max(remaining, 0);
-
+ const request = optionsToRandomAsciiRequest(options);
const result = await this.randomizer.randomAscii(request);
return result;
diff --git a/libs/tools/generator/core/src/types/credential-category.ts b/libs/tools/generator/core/src/types/credential-category.ts
new file mode 100644
index 00000000000..54c8c5ed8e9
--- /dev/null
+++ b/libs/tools/generator/core/src/types/credential-category.ts
@@ -0,0 +1,5 @@
+/** Kinds of credentials that can be stored by the history service
+ * password - a secret consisting of arbitrary characters used to authenticate a user
+ * passphrase - a secret consisting of words used to authenticate a user
+ */
+export type CredentialCategory = "password" | "passphrase";
diff --git a/libs/tools/generator/core/src/types/credential-generator-configuration.ts b/libs/tools/generator/core/src/types/credential-generator-configuration.ts
index 2a8b07b0e82..80d977a73c8 100644
--- a/libs/tools/generator/core/src/types/credential-generator-configuration.ts
+++ b/libs/tools/generator/core/src/types/credential-generator-configuration.ts
@@ -1,9 +1,29 @@
import { UserKeyDefinition } from "@bitwarden/common/platform/state";
import { Constraints } from "@bitwarden/common/tools/types";
+import { Randomizer } from "../abstractions";
import { PolicyConfiguration } from "../types";
+import { CredentialCategory } from "./credential-category";
+import { CredentialGenerator } from "./credential-generator";
+
export type CredentialGeneratorConfiguration = {
+ /** Category describing usage of the credential generated by this configuration
+ */
+ category: CredentialCategory;
+
+ /** An algorithm that generates credentials when ran. */
+ engine: {
+ /** Factory for the generator
+ */
+ // FIXME: note that this erases the engine's type so that credentials are
+ // generated uniformly. This property needs to be maintained for
+ // the credential generator, but engine configurations should return
+ // the underlying type. `create` may be able to do double-duty w/ an
+ // engine definition if `CredentialGenerator` can be made covariant.
+ create: (randomizer: Randomizer) => CredentialGenerator;
+ };
+ /** Defines the stored parameters for credential generation */
settings: {
/** value used when an account's settings haven't been initialized */
initial: Readonly>;
diff --git a/libs/tools/generator/core/src/types/credential-generator.ts b/libs/tools/generator/core/src/types/credential-generator.ts
new file mode 100644
index 00000000000..c95ff25afff
--- /dev/null
+++ b/libs/tools/generator/core/src/types/credential-generator.ts
@@ -0,0 +1,12 @@
+import { GenerationRequest } from "@bitwarden/common/tools/types";
+
+import { GeneratedCredential } from "./generated-credential";
+
+/** An algorithm that generates credentials. */
+export type CredentialGenerator = {
+ /** Generates a credential
+ * @param request runtime parameters
+ * @param settings stored parameters
+ */
+ generate: (request: GenerationRequest, settings: Settings) => Promise;
+};
diff --git a/libs/tools/generator/core/src/types/generated-credential.spec.ts b/libs/tools/generator/core/src/types/generated-credential.spec.ts
new file mode 100644
index 00000000000..a687676576b
--- /dev/null
+++ b/libs/tools/generator/core/src/types/generated-credential.spec.ts
@@ -0,0 +1,58 @@
+import { CredentialCategory, GeneratedCredential } from ".";
+
+describe("GeneratedCredential", () => {
+ describe("constructor", () => {
+ it("assigns credential", () => {
+ const result = new GeneratedCredential("example", "passphrase", new Date(100));
+
+ expect(result.credential).toEqual("example");
+ });
+
+ it("assigns category", () => {
+ const result = new GeneratedCredential("example", "passphrase", new Date(100));
+
+ expect(result.category).toEqual("passphrase");
+ });
+
+ it("passes through date parameters", () => {
+ const result = new GeneratedCredential("example", "password", new Date(100));
+
+ expect(result.generationDate).toEqual(new Date(100));
+ });
+
+ it("converts numeric dates to Dates", () => {
+ const result = new GeneratedCredential("example", "password", 100);
+
+ expect(result.generationDate).toEqual(new Date(100));
+ });
+ });
+
+ it("toJSON converts from a credential into a JSON object", () => {
+ const credential = new GeneratedCredential("example", "password", new Date(100));
+
+ const result = credential.toJSON();
+
+ expect(result).toEqual({
+ credential: "example",
+ category: "password" as CredentialCategory,
+ generationDate: 100,
+ });
+ });
+
+ it("fromJSON converts Json objects into credentials", () => {
+ const jsonValue = {
+ credential: "example",
+ category: "password" as CredentialCategory,
+ generationDate: 100,
+ };
+
+ const result = GeneratedCredential.fromJSON(jsonValue);
+
+ expect(result).toBeInstanceOf(GeneratedCredential);
+ expect(result).toEqual({
+ credential: "example",
+ category: "password",
+ generationDate: new Date(100),
+ });
+ });
+});
diff --git a/libs/tools/generator/core/src/types/generated-credential.ts b/libs/tools/generator/core/src/types/generated-credential.ts
new file mode 100644
index 00000000000..ff174b04a58
--- /dev/null
+++ b/libs/tools/generator/core/src/types/generated-credential.ts
@@ -0,0 +1,47 @@
+import { Jsonify } from "type-fest";
+
+import { CredentialCategory } from "./credential-category";
+
+/** A credential generation result */
+export class GeneratedCredential {
+ /**
+ * Instantiates a generated credential
+ * @param credential The value of the generated credential (e.g. a password)
+ * @param category The kind of credential
+ * @param generationDate The date that the credential was generated.
+ * Numeric values should are interpreted using {@link Date.valueOf}
+ * semantics.
+ */
+ constructor(
+ readonly credential: string,
+ readonly category: CredentialCategory,
+ generationDate: Date | number,
+ ) {
+ if (typeof generationDate === "number") {
+ this.generationDate = new Date(generationDate);
+ } else {
+ this.generationDate = generationDate;
+ }
+ }
+
+ /** The date that the credential was generated */
+ generationDate: Date;
+
+ /** Constructs a credential from its `toJSON` representation */
+ static fromJSON(jsonValue: Jsonify) {
+ return new GeneratedCredential(
+ jsonValue.credential,
+ jsonValue.category,
+ jsonValue.generationDate,
+ );
+ }
+
+ /** Serializes a credential to a JSON-compatible object */
+ toJSON() {
+ return {
+ credential: this.credential,
+ category: this.category,
+ generationDate: this.generationDate.valueOf(),
+ };
+ }
+}
diff --git a/libs/tools/generator/core/src/types/index.ts b/libs/tools/generator/core/src/types/index.ts
index 786b15b9d11..229ac1c0c38 100644
--- a/libs/tools/generator/core/src/types/index.ts
+++ b/libs/tools/generator/core/src/types/index.ts
@@ -1,8 +1,11 @@
export * from "./boundary";
export * from "./catchall-generator-options";
+export * from "./credential-category";
+export * from "./credential-generator";
export * from "./credential-generator-configuration";
export * from "./eff-username-generator-options";
export * from "./forwarder-options";
+export * from "./generated-credential";
export * from "./generator-options";
export * from "./generator-type";
export * from "./no-policy";
diff --git a/libs/tools/generator/core/src/util.spec.ts b/libs/tools/generator/core/src/util.spec.ts
index 32bdc3ad3af..7ffd869535b 100644
--- a/libs/tools/generator/core/src/util.spec.ts
+++ b/libs/tools/generator/core/src/util.spec.ts
@@ -1,4 +1,5 @@
-import { sum } from "./util";
+import { DefaultPassphraseGenerationOptions } from "./data";
+import { optionsToEffWordListRequest, optionsToRandomAsciiRequest, sum } from "./util";
describe("sum", () => {
it("returns 0 when the list is empty", () => {
@@ -15,3 +16,411 @@ describe("sum", () => {
expect(sum(1, 2, 3)).toBe(6);
});
});
+
+describe("optionsToRandomAsciiRequest", () => {
+ it("should map options", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 20,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 1,
+ minLowercase: 2,
+ minNumber: 3,
+ minSpecial: 4,
+ });
+
+ expect(result).toEqual({
+ all: 10,
+ uppercase: 1,
+ lowercase: 2,
+ digits: 3,
+ special: 4,
+ ambiguous: true,
+ });
+ });
+
+ it("should disable uppercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 3,
+ ambiguous: true,
+ uppercase: false,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 1,
+ minLowercase: 1,
+ minNumber: 1,
+ minSpecial: 1,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: undefined,
+ lowercase: 1,
+ digits: 1,
+ special: 1,
+ ambiguous: true,
+ });
+ });
+
+ it("should disable lowercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 3,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: false,
+ number: true,
+ special: true,
+ minUppercase: 1,
+ minLowercase: 1,
+ minNumber: 1,
+ minSpecial: 1,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 1,
+ lowercase: undefined,
+ digits: 1,
+ special: 1,
+ ambiguous: true,
+ });
+ });
+
+ it("should disable digits", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 3,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: false,
+ special: true,
+ minUppercase: 1,
+ minLowercase: 1,
+ minNumber: 1,
+ minSpecial: 1,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 1,
+ lowercase: 1,
+ digits: undefined,
+ special: 1,
+ ambiguous: true,
+ });
+ });
+
+ it("should disable special", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 3,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: false,
+ minUppercase: 1,
+ minLowercase: 1,
+ minNumber: 1,
+ minSpecial: 1,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 1,
+ lowercase: 1,
+ digits: 1,
+ special: undefined,
+ ambiguous: true,
+ });
+ });
+
+ it("should override length with minimums", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 20,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 1,
+ minLowercase: 2,
+ minNumber: 3,
+ minSpecial: 4,
+ });
+
+ expect(result).toEqual({
+ all: 10,
+ uppercase: 1,
+ lowercase: 2,
+ digits: 3,
+ special: 4,
+ ambiguous: true,
+ });
+ });
+
+ it("should default uppercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 2,
+ ambiguous: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 2,
+ minLowercase: 0,
+ minNumber: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 2,
+ lowercase: 0,
+ digits: 0,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default lowercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ number: true,
+ special: true,
+ minUppercase: 0,
+ minLowercase: 2,
+ minNumber: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 2,
+ digits: 0,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default number", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ special: true,
+ minUppercase: 0,
+ minLowercase: 0,
+ minNumber: 2,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 0,
+ digits: 2,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default special", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ minUppercase: 0,
+ minLowercase: 0,
+ minNumber: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 0,
+ digits: 0,
+ special: undefined,
+ ambiguous: true,
+ });
+ });
+
+ it("should default minUppercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minLowercase: 0,
+ minNumber: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 1,
+ lowercase: 0,
+ digits: 0,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default minLowercase", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 0,
+ minNumber: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 1,
+ digits: 0,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default minNumber", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 0,
+ minLowercase: 0,
+ minSpecial: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 0,
+ digits: 1,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+
+ it("should default minSpecial", async () => {
+ const result = optionsToRandomAsciiRequest({
+ length: 0,
+ ambiguous: true,
+ uppercase: true,
+ lowercase: true,
+ number: true,
+ special: true,
+ minUppercase: 0,
+ minLowercase: 0,
+ minNumber: 0,
+ });
+
+ expect(result).toEqual({
+ all: 0,
+ uppercase: 0,
+ lowercase: 0,
+ digits: 0,
+ special: 0,
+ ambiguous: true,
+ });
+ });
+});
+
+describe("optionsToEffWordListRequest", () => {
+ it("should map options", async () => {
+ const result = optionsToEffWordListRequest({
+ numWords: 4,
+ capitalize: true,
+ includeNumber: true,
+ wordSeparator: "!",
+ });
+
+ expect(result).toEqual({
+ numberOfWords: 4,
+ capitalize: true,
+ number: true,
+ separator: "!",
+ });
+ });
+
+ it("should default numWords", async () => {
+ const result = optionsToEffWordListRequest({
+ capitalize: true,
+ includeNumber: true,
+ wordSeparator: "!",
+ });
+
+ expect(result).toEqual({
+ numberOfWords: DefaultPassphraseGenerationOptions.numWords,
+ capitalize: true,
+ number: true,
+ separator: "!",
+ });
+ });
+
+ it("should default capitalize", async () => {
+ const result = optionsToEffWordListRequest({
+ numWords: 4,
+ includeNumber: true,
+ wordSeparator: "!",
+ });
+
+ expect(result).toEqual({
+ numberOfWords: 4,
+ capitalize: DefaultPassphraseGenerationOptions.capitalize,
+ number: true,
+ separator: "!",
+ });
+ });
+
+ it("should default includeNumber", async () => {
+ const result = optionsToEffWordListRequest({
+ numWords: 4,
+ capitalize: true,
+ wordSeparator: "!",
+ });
+
+ expect(result).toEqual({
+ numberOfWords: 4,
+ capitalize: true,
+ number: DefaultPassphraseGenerationOptions.includeNumber,
+ separator: "!",
+ });
+ });
+
+ it("should default wordSeparator", async () => {
+ const result = optionsToEffWordListRequest({
+ numWords: 4,
+ capitalize: true,
+ includeNumber: true,
+ });
+
+ expect(result).toEqual({
+ numberOfWords: 4,
+ capitalize: true,
+ number: true,
+ separator: DefaultPassphraseGenerationOptions.wordSeparator,
+ });
+ });
+});
diff --git a/libs/tools/generator/core/src/util.ts b/libs/tools/generator/core/src/util.ts
index cca2c75834c..21e901765e2 100644
--- a/libs/tools/generator/core/src/util.ts
+++ b/libs/tools/generator/core/src/util.ts
@@ -7,6 +7,13 @@ import {
} from "@bitwarden/common/platform/state";
import { UserId } from "@bitwarden/common/types/guid";
+import {
+ DefaultPassphraseBoundaries,
+ DefaultPassphraseGenerationOptions,
+ DefaultPasswordGenerationOptions,
+} from "./data";
+import { PassphraseGenerationOptions, PasswordGenerationOptions } from "./types";
+
/** construct a method that outputs a copy of `defaultValue` as an observable. */
export function observe$PerUserId(
create: () => Partial,
@@ -50,3 +57,79 @@ export function sharedStateByUserId(key: UserKeyDefinition, provid
/** returns the sum of items in the list. */
export const sum = (...items: number[]) =>
(items ?? []).reduce((sum: number, current: number) => sum + (current ?? 0), 0);
+
+/* converts password generation option sets, which are defined by
+ * an "enabled" and "quantity" parameter, to the password engine's
+ * parameters, which represent disabled options as `undefined`
+ * properties.
+ */
+export function optionsToRandomAsciiRequest(options: PasswordGenerationOptions) {
+ // helper for processing common option sets
+ function process(
+ // values read from the options
+ enabled: boolean,
+ quantity: number,
+ // value used if an option is missing
+ defaultEnabled: boolean,
+ defaultQuantity: number,
+ ) {
+ const isEnabled = enabled ?? defaultEnabled;
+ const actualQuantity = quantity ?? defaultQuantity;
+ const result = isEnabled ? actualQuantity : undefined;
+
+ return result;
+ }
+
+ const request = {
+ uppercase: process(
+ options.uppercase,
+ options.minUppercase,
+ DefaultPasswordGenerationOptions.uppercase,
+ DefaultPasswordGenerationOptions.minUppercase,
+ ),
+ lowercase: process(
+ options.lowercase,
+ options.minLowercase,
+ DefaultPasswordGenerationOptions.lowercase,
+ DefaultPasswordGenerationOptions.minLowercase,
+ ),
+ digits: process(
+ options.number,
+ options.minNumber,
+ DefaultPasswordGenerationOptions.number,
+ DefaultPasswordGenerationOptions.minNumber,
+ ),
+ special: process(
+ options.special,
+ options.minSpecial,
+ DefaultPasswordGenerationOptions.special,
+ DefaultPasswordGenerationOptions.minSpecial,
+ ),
+ ambiguous: options.ambiguous ?? DefaultPasswordGenerationOptions.ambiguous,
+ all: 0,
+ };
+
+ // engine represents character sets as "include only"; you assert how many all
+ // characters there can be rather than a total length. This conversion has
+ // the character classes win, so that the result is always consistent with policy
+ // minimums.
+ const required = sum(request.uppercase, request.lowercase, request.digits, request.special);
+ const remaining = (options.length ?? 0) - required;
+ request.all = Math.max(remaining, 0);
+
+ return request;
+}
+
+/* converts passphrase generation option sets to the eff word list request
+ */
+export function optionsToEffWordListRequest(options: PassphraseGenerationOptions) {
+ const requestWords = options.numWords ?? DefaultPassphraseGenerationOptions.numWords;
+ const request = {
+ numberOfWords: Math.max(requestWords, DefaultPassphraseBoundaries.numWords.min),
+ capitalize: options.capitalize ?? DefaultPassphraseGenerationOptions.capitalize,
+ number: options.includeNumber ?? DefaultPassphraseGenerationOptions.includeNumber,
+ separator: options.wordSeparator ?? DefaultPassphraseGenerationOptions.wordSeparator,
+ };
+
+ return request;
+}
From 744a48183b15094d3d384573e10d639c2de4e15c Mon Sep 17 00:00:00 2001
From: Bitwarden DevOps
<106330231+bitwarden-devops-bot@users.noreply.github.com>
Date: Tue, 10 Sep 2024 12:47:18 -0400
Subject: [PATCH 35/36] Bumped client version(s) (#10975)
---
apps/browser/package.json | 2 +-
apps/browser/src/manifest.json | 2 +-
apps/browser/src/manifest.v3.json | 2 +-
package-lock.json | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/apps/browser/package.json b/apps/browser/package.json
index b76a1e84126..4d008b684cb 100644
--- a/apps/browser/package.json
+++ b/apps/browser/package.json
@@ -1,6 +1,6 @@
{
"name": "@bitwarden/browser",
- "version": "2024.9.0",
+ "version": "2024.9.1",
"scripts": {
"build": "cross-env MANIFEST_VERSION=3 webpack",
"build:mv2": "webpack",
diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json
index f916555fef2..2d7f46fa59a 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": "2024.9.0",
+ "version": "2024.9.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 12d501ba9ed..5e132774e6e 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": "2024.9.0",
+ "version": "2024.9.1",
"description": "__MSG_extDesc__",
"default_locale": "en",
"author": "Bitwarden Inc.",
diff --git a/package-lock.json b/package-lock.json
index 0a9936bbf2b..a1ef2eb87bb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -192,7 +192,7 @@
},
"apps/browser": {
"name": "@bitwarden/browser",
- "version": "2024.9.0"
+ "version": "2024.9.1"
},
"apps/cli": {
"name": "@bitwarden/cli",
From 8921230b4f5f33d0948572e47261604a6a3d731e Mon Sep 17 00:00:00 2001
From: SmithThe4th
Date: Tue, 10 Sep 2024 14:15:01 -0400
Subject: [PATCH 36/36] [PM-11200] Move delete item permission to Can Manage
(#10890)
* Refactored the showDelete function to check if a user can manage a collection
Removed the can edit or manage cipher check from the show delete function
* Add check for AC vault to return true when user has admin access
* Check user is an admin or custom user with editAnyCollection
* Check user is an admin or custom user with editAnyCollection
---
.../vault-cipher-row.component.html | 2 +-
.../vault-items/vault-cipher-row.component.ts | 1 +
.../vault-items/vault-items.component.html | 3 ++
.../vault-items/vault-items.component.ts | 40 +++++++++++++++----
.../individual-vault/vault.component.html | 1 +
5 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
index 524d9dff20b..6a04ff6071d 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
+++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html
@@ -157,7 +157,7 @@