diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 9ae2db7244b..6a02c2d1245 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -57,7 +57,7 @@ jobs: run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@c9067691aca4a28d6fbb40d9eea6e144369fbcae # v10.9.5 + uses: chromaui/action@b984808b772126a9f44b2b7737b131b68a2ede32 # v11.7.1 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index 27475709b63..7551538b3a1 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -256,7 +256,7 @@ jobs: - setup - artifact-check runs-on: ubuntu-22.04 - if: ${{ always() && contains( inputs.environment , 'QA' ) }} + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} outputs: channel_id: ${{ steps.slack-message.outputs.channel_id }} ts: ${{ steps.slack-message.outputs.ts }} @@ -407,7 +407,7 @@ jobs: notify: name: Notify Slack with result runs-on: ubuntu-22.04 - if: ${{ always() && contains( inputs.environment , 'QA' ) }} + if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} needs: - setup - notify-start diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 88d53937f32..2b523a788b4 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 32df9140afe..90327c85425 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -1113,7 +1113,7 @@ "message": "Bitwarden-i dəstəklədiyiniz üçün təşəkkürlər!" }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Premium-a yüksəlt və bunları əldə et:" }, "premiumPrice": { "message": "Hamısı sadəcə ildə $PRICE$!", @@ -1125,7 +1125,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Hamısı sadəcə ildə $PRICE$!", "placeholders": { "price": { "content": "$1", @@ -3970,10 +3970,10 @@ "message": "Səhifə yüklənəndə avto-doldurulsun?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Vaxtı bitmiş kart" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Yeniləmisinizsə, kart məlumatlarınızı güncəlləyin" }, "cardDetails": { "message": "Kart detalları" @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animasiyaları fəallaşdır" + }, "addAccount": { "message": "Hesab əlavə et" }, diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index a49add09586..e06960c6b74 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 1d6f1cda360..de9686623d2 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Включване на анимациите" + }, "addAccount": { "message": "Добавяне на регистрация" }, diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index b570bf14b20..8bb46b60aba 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 550b49f056a..9d53f1e0fdc 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 0374ce8384f..88f04d0b517 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -302,16 +302,16 @@ "message": "Edita la carpeta" }, "newFolder": { - "message": "New folder" + "message": "Carpeta nova" }, "folderName": { - "message": "Folder name" + "message": "Nom de la carpeta" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Imbriqueu una carpeta afegint el nom de la carpeta principal seguit d'una \"/\". Exemple: Social/Fòrums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "No s'ha afegit cap carpeta" }, "createFoldersToOrganize": { "message": "Create folders to organize your vault items" @@ -448,7 +448,7 @@ "message": "Preferit" }, "unfavorite": { - "message": "Suprimeix de Preferits" + "message": "Trau dels preferits" }, "itemAddedToFavorites": { "message": "Element afegit als preferits" @@ -847,7 +847,7 @@ "message": "Mostra les identitats a la pàgina de pestanya" }, "showIdentitiesCurrentTabDesc": { - "message": "Llista els elements d'identitat de la pàgina de pestanya per facilitar l'autoemplenat." + "message": "Llista els elements d'identitat de la pestanya de la pàgina per facilitar l'autoemplenat." }, "clearClipboard": { "message": "Buida el porta-retalls", @@ -3141,11 +3141,11 @@ "message": "Alies de domini" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Els elements amb una nova sol·licitud de contrasenya mestra no es poden omplir automàticament en carregar la pàgina. L'emplenament automàtic en carregar de la pàgina està desactivat.", + "message": "Els elements amb una nova sol·licitud de contrasenya mestra no es poden omplir automàticament en carregar la pàgina. L'emplenament automàtic en carregar la pàgina està desactivat.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina per que utilitze la configuració predeterminada.", + "message": "S'ha configurat l'emplenament automàtic en carregar la pàgina perquè utilitze la configuració predeterminada.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Afig compte" }, diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index aff80372c65..b16040f3276 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Povolit animace" + }, "addAccount": { "message": "Přidat účet" }, diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 43eb9c41724..295f970b182 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Ychwanegu cyfrif" }, diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 52f463a3a4b..ea5d1eae3cb 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Aktivér animationer" + }, "addAccount": { "message": "Tilføj konto" }, diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index c5905ed913c..658b95e5e0f 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Konto hinzufügen" }, diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index a29eaab7555..83a77c6b382 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Προσθήκη λογαριασμού" }, diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 5ed28c6ec0e..1e8fd03ade3 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 533e271e6d5..49a2f0d3f33 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index feefa391c1a..97288cb6964 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index a9a8e115955..a3eb6c468cc 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Añadir cuenta" }, diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index c8bc75fa43e..ee717416ac4 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index f102af8442b..e04be282700 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 109a5228a9e..159a7f49e92 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 1ca7d1ce15e..b9f3df94e48 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, suojausavaimesi ja arkaluonteiset tietosi helposti.", + "message": "Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti.", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -715,7 +715,7 @@ "message": "Aloita rekisteröityminen alusta tai yritä kirjautua sisään uudelleen." }, "youMayAlreadyHaveAnAccount": { - "message": "Sinulla saattaa olla jo tili" + "message": "Sinulla saattaa jo olla tili" }, "logOutConfirmation": { "message": "Haluatko varmasti kirjautua ulos?" @@ -736,7 +736,7 @@ "message": "Kansio lisätty" }, "twoStepLoginConfirmation": { - "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" + "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi suojausavaimen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" }, "editedFolder": { "message": "Kansio tallennettiin" @@ -873,10 +873,10 @@ "message": "Tarjoa kirjautumistiedon salasanan päivitystä, kun verkkosivustolla havaitaan uusi salasana. Koskee kaikkia kirjautuneita tilejä." }, "enableUsePasskeys": { - "message": "Tarjoa suojausvainten tallennusta ja käyttöä" + "message": "Tarjoa pääsyavainten tallennusta ja käyttöä" }, "usePasskeysDesc": { - "message": "Tarjoa tallennusta uusille suojausavaimille tai kirjautumista holvissasi olevilla salausavaimilla. Koskee kaikkia kirjautuneita tilejä." + "message": "Tarjoa uusien pääsyavainten tallennusta sekä kirjautumista holvissasi olevilla pääsyavaimilla. Koskee kaikkia kirjautuneita tilejä." }, "notificationChangeDesc": { "message": "Haluatko päivittää salasanan Bitwardeniin?" @@ -1152,10 +1152,10 @@ "message": "Tämä ominaisuus edellyttää Premium-jäsenyyttä." }, "enterVerificationCodeApp": { - "message": "Syötä 6-numeroinen todennuskoodi todennussovelluksestasi." + "message": "Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi." }, "enterVerificationCodeEmail": { - "message": "Syötä 6-numeroinen todennuskoodi, joka lähetettiin sähköpostitse osoitteeseen $EMAIL$.", + "message": "Syötä osoitteeseen $EMAIL$ lähetetty kuusinumeroinen todennuskoodi.", "placeholders": { "email": { "content": "$1", @@ -1185,7 +1185,7 @@ "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, "insertU2f": { - "message": "Kytke todennuslaitteesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." + "message": "Kytke suojausavaimesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." }, "webAuthnNewTab": { "message": "Aloittaaksesi kaksivaiheisen WebAuthn-tunnistautumisen, seuraa alla olevasta painikkeesta uuteen välilehteen avautuvia ohjeita." @@ -1222,7 +1222,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP -todennuslaite" + "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." @@ -1232,14 +1232,14 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.", + "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-suojausavainta.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa todennuslaitetta päästäksesi käsiksi tiliisi." + "message": "Käytä mitä tahansa WebAuthn‑yhteensopivaa suojausavainta päästäksesi tilillesi." }, "emailTitle": { "message": "Sähköposti" @@ -1852,7 +1852,7 @@ "message": "Käytä tätä käyttäjätunnusta" }, "securePasswordGenerated": { - "message": "Turvallinen salasana luotu! Muista myös päivittää salasana verkkosivustolla." + "message": "Turvallinen salasana luotiin! Muista päivittää salasana myös verkkosivustolla." }, "useGeneratorHelpTextPartOne": { "message": "Käytä generaattoria", @@ -3063,7 +3063,7 @@ } }, "singleFieldNeedsAttention": { - "message": "1 kenttä vaatii huomiotasi." + "message": "Yksi kenttä vaatii huomiotasi." }, "multipleFieldsNeedAttention": { "message": "$COUNT$ kenttää vaatii huomiotasi.", @@ -3409,25 +3409,25 @@ "message": "Holvin tiedot on viety" }, "typePasskey": { - "message": "Suojausavain" + "message": "Pääsyavain" }, "passkeyNotCopied": { - "message": "Suojausavainta ei kopioida" + "message": "Pääsyavainta ei kopioida" }, "passkeyNotCopiedAlert": { - "message": "Suojausavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" + "message": "Pääsyavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "Käynnistävä sivusto edellyttää todennusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." + "message": "Käynnistänyt sivusto edellyttää vahvistusta. Ominaisuutta ei ole vielä toteutettu tileille, joilla ei ole pääsalasanaa." }, "logInWithPasskey": { - "message": "Kirjaudutaanko suojausavaimella?" + "message": "Kirjaudutaanko pääsyavaimella?" }, "passkeyAlreadyExists": { - "message": "Tälle sovellukselle on jo tallennettu suojausavain." + "message": "Tälle sovellukselle on jo tallennettu pääsyavain." }, "noPasskeysFoundForThisApplication": { - "message": "Tälle sovellukselle ei löytynyt suojausavaimia." + "message": "Tälle sovellukselle ei löytynyt pääsyavaimia." }, "noMatchingPasskeyLogin": { "message": "Holvissasi ei ole tälle sivustolle sopivaa kirjautumistietoa." @@ -3436,28 +3436,28 @@ "message": "Vahvista" }, "savePasskey": { - "message": "Tallenna suojausavain" + "message": "Tallenna pääsyavain" }, "savePasskeyNewLogin": { - "message": "Tallenna suojausavain uuteen kirjautumistietoon" + "message": "Tallenna pääsyavain uuteen kirjautumistietoon" }, "choosePasskey": { - "message": "Valitse kirjautumistieto, johon suojausavain tallennetaan" + "message": "Valitse kirjautumistieto, johon pääsyavain tallennetaan" }, "passkeyItem": { - "message": "Suojausavainkohde" + "message": "Pääsyavainkohde" }, "overwritePasskey": { - "message": "Korvataanko suojausavain?" + "message": "Korvataanko pääsyavain?" }, "overwritePasskeyAlert": { - "message": "Kohde sisältää jo suojausavaimen. Haluatko varmasti korvata nykyisen suojausavaimen?" + "message": "Kohde sisältää jo pääsyavaimen. Haluatko varmasti korvata nykyisen avaimen?" }, "featureNotSupported": { "message": "Ominaisuutta ei vielä tueta" }, "yourPasskeyIsLocked": { - "message": "Salausavaimen käyttö edellyttää todennusta. Jatka vahvistamalla henkilöllisyytesi." + "message": "Pääsyavaimen käyttö edellyttää tunnistautumista. Jatka vahvistamalla henkilöllisyytesi." }, "multifactorAuthenticationCancelled": { "message": "Monivaiheinen todennus peruttiin" @@ -3651,10 +3651,10 @@ "message": "Onnistui" }, "removePasskey": { - "message": "Poista suojausavain" + "message": "Poista pääsyavain" }, "passkeyRemoved": { - "message": "Suojausavain poistettiin" + "message": "Pääsyavain poistettiin" }, "autofillSuggestions": { "message": "Automaattitäytä ehdotukset" @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Käytä animaatioita" + }, "addAccount": { "message": "Lisää tili" }, @@ -3997,7 +4000,7 @@ "message": "Tiedot" }, "passkeys": { - "message": "Avainkoodit", + "message": "Pääsyavaimet", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4005,7 +4008,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Kirjaudu avainkoodilla", + "message": "Kirjaudu pääsyavaimella", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4165,7 +4168,7 @@ } }, "itemsMovedToOrg": { - "message": "Kohteet siirrettiin organisaatioon $ORGNAME$", + "message": "Kohteet siirrettiin organisaatiolle $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4174,7 +4177,7 @@ } }, "itemMovedToOrg": { - "message": "Kohde siirrettiin organisaatioon $ORGNAME$", + "message": "Kohde siirrettiin organisaatiolle $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4218,7 +4221,7 @@ "message": "Tilitoiminnot" }, "showNumberOfAutofillSuggestions": { - "message": "Näytä kirjautumisen automaattitäytön ehtotusten määrä laajennuksen kuvakkeessa" + "message": "Näytä automaattitäytön kirjautumistietoehdotusten määrä laajennuksen kuvakkeessa" }, "systemDefault": { "message": "Järjestelmän oletus" diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 9f09fb6964d..bfe541fc36f 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 153c5710b0b..dd25eddfcce 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -14,7 +14,7 @@ "message": "Identifiez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "Invitation acceptée" }, "createAccount": { "message": "Créer un compte" @@ -69,10 +69,10 @@ "message": "Indice du mot de passe principal (facultatif)" }, "joinOrganization": { - "message": "Join organization" + "message": "Rejoindre l'organisation" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "Terminer de rejoindre cette organisation en configurant un mot de passe principal." }, "tab": { "message": "Onglet" @@ -114,19 +114,19 @@ "message": "Copier le code de sécurité" }, "copyName": { - "message": "Copy name" + "message": "Copier le nom" }, "copyCompany": { - "message": "Copy company" + "message": "Copier l'entreprise" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Copier le numéro de sécurité sociale" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Copier le numéro de passeport" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Copier la plaque d'immatriculation" }, "autoFill": { "message": "Saisie automatique" @@ -302,22 +302,22 @@ "message": "Modifier le dossier" }, "newFolder": { - "message": "New folder" + "message": "Nouveau dossier" }, "folderName": { - "message": "Folder name" + "message": "Nom de dossier" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Imbriquer un dossier en ajoutant le nom du dossier parent suivi d'un \"/\". Par exemple : Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Pas de dossier ajouté" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Créer des dossiers pour organiser les éléments de votre coffre" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce dossier ?" }, "deleteFolder": { "message": "Supprimer le dossier" @@ -688,7 +688,7 @@ "message": "Bitwarden peut stocker et remplir des codes de vérification en 2 étapes. Sélectionnez l'icône caméra pour prendre une capture d'écran du code QR de l'authentificateur de ce site Web, ou copiez et collez la clé dans ce champ." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "En savoir plus sur les authentificateurs" }, "copyTOTP": { "message": "Copier la clé Authenticator (TOTP)" @@ -823,7 +823,7 @@ "message": "Demander d'ajouter un identifiant" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "Enregistrer dans les options de coffre" }, "addLoginNotificationDesc": { "message": "Demander d'ajouter un élément si aucun n'est trouvé dans votre coffre." @@ -832,7 +832,7 @@ "message": "Demande l'ajout d'un élément si celui-ci n'est pas trouvé dans votre coffre. S'applique à tous les comptes connectés." }, "showCardsInVaultView": { - "message": "Show cards as Autofill suggestions on Vault view" + "message": "Afficher les cartes de paiement en tant que suggestions de saisie automatique dans la vue du coffre" }, "showCardsCurrentTab": { "message": "Afficher les cartes de paiement sur la Page d'onglet" @@ -841,7 +841,7 @@ "message": "Liste les éléments des cartes de paiement sur la Page d'onglet pour faciliter la saisie automatique." }, "showIdentitiesInVaultView": { - "message": "Show identifies as Autofill suggestions on Vault view" + "message": "Afficher les identités en tant que suggestions de saisie automatique dans la vue du coffre" }, "showIdentitiesCurrentTab": { "message": "Afficher les identités sur la Page d'onglet" @@ -1080,7 +1080,7 @@ "message": "1 Go de stockage chiffré pour les fichiers joints." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "Accès d'urgence." }, "premiumSignUpTwoStepOptions": { "message": "Options de connexion propriétaires à deux facteurs telles que YubiKey et Duo." @@ -1104,7 +1104,7 @@ "message": "Vous pouvez acheter une adhésion Premium sur le coffre web de bitwarden.com. Voulez-vous visiter le site web maintenant ?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Vous pouvez acheter la version Premium depuis les paramètres de votre compte dans l'application web Bitwarden." }, "premiumCurrentMember": { "message": "Vous êtes un membre Premium !" @@ -1113,7 +1113,7 @@ "message": "Merci de soutenir Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Mettre à niveau à la version Premium et recevez :" }, "premiumPrice": { "message": "Tout pour seulement $PRICE$/an !", @@ -1125,7 +1125,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Tout pour seulement $PRICE$ /an !", "placeholders": { "price": { "content": "$1", @@ -1218,17 +1218,17 @@ "message": "Application d'authentification" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "Entrez un code généré par une application d'authentification comme Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP Security Key" + "message": "Clé de sécurité OTP de Yubico" }, "yubiKeyDesc": { "message": "Utiliser une YubiKey pour accéder à votre compte. Fonctionne avec les appareils YubiKey 4, 4 Nano, 4C et NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "Entrez un code généré par Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1245,7 +1245,7 @@ "message": "Courriel" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "Entrez le code envoyé à votre adresse courriel." }, "selfHostedEnvironment": { "message": "Environnement auto-hébergé" @@ -1297,13 +1297,13 @@ "message": "Suggestions de saisie automatique" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Afficher les suggestions de saisie automatique dans les champs d'un formulaire" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Afficher les suggestions lorsque l'icône est sélectionnée" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "S'applique à tous les comptes connectés." }, "turnOffBrowserBuiltInPasswordManagerSettings": { "message": "Désactivez les paramètres du gestionnaire de mots de passe intégré à votre navigateur pour éviter les conflits." @@ -1324,7 +1324,7 @@ "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "Saisie automatique lors du chargement de la page" }, "enableAutoFillOnPageLoad": { "message": "Saisir automatiquement au chargement de la page" @@ -1333,7 +1333,7 @@ "message": "Si un formulaire de connexion est détecté, il sera saisi automatiquement lors du chargement de la page web." }, "autofillOnPageLoadWarning": { - "message": "$OPENTAG$Warning:$CLOSETAG$ Compromised or untrusted websites can exploit autofill on page load.", + "message": "$OPENTAG$Attention :$CLOSETAG$ Les sites web compromis ou non fiables peuvent exploiter la saisie automatique lors du chargement de la page.", "placeholders": { "openTag": { "content": "$1", @@ -1349,7 +1349,7 @@ "message": "les sites web compromis ou non fiables peuvent exploiter la saisie automatique au chargement de la page." }, "learnMoreAboutAutofillOnPageLoadLinkText": { - "message": "Learn more about risks" + "message": "En savoir plus sur les risques" }, "learnMoreAboutAutofill": { "message": "En savoir plus sur la saisie automatique" @@ -1379,13 +1379,13 @@ "message": "Ouvrir le coffre dans la barre latérale" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Saisir automatiquement le dernier identifiant utilisé pour le site web actuel" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Saisir automatiquement la dernière carte utilisée pour le site web actuel" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Saisir automatiquement la dernière identité utilisée pour le site web actuel" }, "commandGeneratePasswordDesc": { "message": "Générer et copier un nouveau mot de passe aléatoire dans le presse-papiers." @@ -1418,7 +1418,7 @@ "message": "Booléen" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Case à cocher" }, "cfTypeLinked": { "message": "Lié", @@ -1621,7 +1621,7 @@ } }, "viewItemHeader": { - "message": "View $TYPE$", + "message": "Voir les $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1692,7 +1692,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Domaine de base (recommandé)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -1840,26 +1840,26 @@ "message": "Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur." }, "passwordGenerator": { - "message": "Password generator" + "message": "Générateur de mot de passe" }, "usernameGenerator": { - "message": "Username generator" + "message": "Générateur de nom d'utilisateur" }, "useThisPassword": { - "message": "Use this password" + "message": "Utiliser ce mot de passe" }, "useThisUsername": { - "message": "Use this username" + "message": "Utiliser ce nom d'utilisateur" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Mot de passe sécurisé généré ! N'oubliez pas aussi de mettre à jour votre mot de passe sur le site Web." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Utiliser le générateur", "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": "pour créer un mot de passe fort unique", "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": { @@ -1985,7 +1985,7 @@ "message": "Votre nouveau mot de passe principal ne répond pas aux exigences de politique de sécurité." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "Obtenez des conseils, des annonces et des opportunités de recherche de la part de Bitwarden dans votre boîte de réception." }, "unsubscribe": { "message": "Se désabonner" @@ -2060,7 +2060,7 @@ "message": "Erreur de correspondance entre les comptes" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Le déverrouillage biométrique a échoué. La clé secrète biométrique n'a pas réussi à déverrouiller le coffre. Veuillez essayer de configurer à nouveau la biométrie." }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" @@ -2111,7 +2111,7 @@ "message": "Une politique d'organisation a bloqué l'import d'éléments dans votre coffre personel." }, "domainsTitle": { - "message": "Domains", + "message": "Domaines", "description": "A category title describing the concept of web domains" }, "excludedDomains": { @@ -2124,7 +2124,7 @@ "message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines pour tous les comptes connectés. Vous devez actualiser la page pour que les modifications prennent effet." }, "websiteItemLabel": { - "message": "Website $number$ (URI)", + "message": "Site web $number$ (URI)", "placeholders": { "number": { "content": "$1", @@ -2142,7 +2142,7 @@ } }, "excludedDomainsSavedSuccess": { - "message": "Excluded domain changes saved" + "message": "Changements de domaines exclus enregistrés" }, "send": { "message": "Send", @@ -2180,7 +2180,7 @@ "message": "Protégé par un mot de passe" }, "copyLink": { - "message": "Copy link" + "message": "Copier le lien" }, "copySendLink": { "message": "Copier le lien du Send", @@ -2314,11 +2314,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send créé avec succès !", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Le Send est disponible à toute personne ayant le lien durant les $DAYS$ prochains jours.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2328,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Lien Send copié", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2393,7 +2393,7 @@ "message": "Vérification de courriel requise" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "Courriel vérifié" }, "emailVerificationRequiredDesc": { "message": "Vous devez vérifier votre courriel pour utiliser cette fonctionnalité. Vous pouvez vérifier votre courriel dans le coffre web." @@ -2411,7 +2411,7 @@ "message": "Votre mot de passe principal ne répond pas aux exigences de politique de sécurité de cette organisation. Pour accéder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Votre organisation a désactivé le déchiffrement de votre appareil de confiance. Veuillez configurer un mot de passe principal pour accéder à votre coffre." }, "resetPasswordPolicyAutoEnroll": { "message": "Inscription automatique" @@ -2864,22 +2864,22 @@ "message": "Paramètres de saisie automatique" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Raccourci de saisie automatique" }, "autofillKeyboardShortcutUpdateLabel": { - "message": "Change shortcut" + "message": "Modifier le raccourci" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Gérer les raccourcis" }, "autofillShortcut": { "message": "Raccourci clavier de saisie automatique" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Le raccourci de saisie automatique de l'identifiant n'est pas configuré. Changez-le dans les paramètres du navigateur." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Le raccourci de saisie automatique de l'identifiant est $COMMAND$. Gérez tous les raccourcis dans les paramètres du navigateur.", "placeholders": { "command": { "content": "$1", @@ -2982,11 +2982,11 @@ "message": "Appareil de confiance" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "Pas de Send actif", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "Utilisez Send pour partager en toute sécurité des informations chiffrées avec tout le monde.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3063,10 +3063,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 champ nécessite votre attention." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ champs nécessitent votre attention.", "placeholders": { "count": { "content": "$1", @@ -3153,7 +3153,7 @@ "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Basculer la navigation latérale" }, "skipToContent": { "message": "Accéder directement au contenu" @@ -3175,7 +3175,7 @@ "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Déverrouillez votre compte pour afficher les suggestions de saisie automatique", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3183,7 +3183,7 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Déverrouiller votre compte, s'ouvre dans une nouvelle fenêtre", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "fillCredentialsFor": { @@ -3207,7 +3207,7 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Nouvel identifiant", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { @@ -3215,7 +3215,7 @@ "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "Nouvelle carte de paiement", "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { @@ -3223,7 +3223,7 @@ "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "Nouvelle identité", "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { @@ -3406,7 +3406,7 @@ "message": "Confirmez le mot de passe du fichier" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Données du coffre exportées" }, "typePasskey": { "message": "Clé d'identification (passkey)" @@ -3588,27 +3588,27 @@ "description": "Label indicating the most common import formats" }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "Continuer vers les paramètres du navigateur ?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continue to Help Center?", + "message": "Continuer vers le centre d'aide ?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Vous pouvez afficher et définir les raccourcis d'extension dans les paramètres de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Modifiez les paramètres de saisie automatique et de gestion des mots de passe de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Vous pouvez afficher et définir les raccourcis d'extension dans les paramètres de votre navigateur.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -3722,7 +3722,7 @@ } }, "autofillTitle": { - "message": "Autofill - $ITEMNAME$", + "message": "Saisie automatique - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -3735,7 +3735,7 @@ "message": "Aucune valeur à copier" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Assigner aux collections" }, "copyEmail": { "message": "Copier l'email" @@ -3801,13 +3801,13 @@ "message": "Eléments sans dossier" }, "itemDetails": { - "message": "Item details" + "message": "Détails de l'élément" }, "itemName": { - "message": "Item name" + "message": "Nom de l’élément" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -3819,44 +3819,44 @@ "message": "L'organisation est désactivée" }, "owner": { - "message": "Owner" + "message": "Propriétaire" }, "selfOwnershipLabel": { - "message": "You", + "message": "Vous", "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { "message": "Les éléments des Organisations désactivées ne sont pas accessibles. Contactez le propriétaire de votre Organisation pour obtenir de l'aide." }, "additionalInformation": { - "message": "Additional information" + "message": "Informations supplémentaires" }, "itemHistory": { - "message": "Item history" + "message": "Historique de l'élément" }, "lastEdited": { - "message": "Last edited" + "message": "Dernière modification" }, "ownerYou": { - "message": "Owner: You" + "message": "Propriétaire : Vous" }, "linked": { - "message": "Linked" + "message": "Lié" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Copié avec succès" }, "upload": { - "message": "Upload" + "message": "Téléverser" }, "addAttachment": { - "message": "Add attachment" + "message": "Ajouter une pièce jointe" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "La taille maximale du fichier est de 500 Mo" }, "deleteAttachmentName": { - "message": "Delete attachment $NAME$", + "message": "Supprimer la pièce jointe $NAME$", "placeholders": { "name": { "content": "$1", @@ -3865,7 +3865,7 @@ } }, "downloadAttachmentName": { - "message": "Download $NAME$", + "message": "Télécharger $NAME$", "placeholders": { "name": { "content": "$1", @@ -3880,22 +3880,22 @@ "message": "Premium" }, "freeOrgsCannotUseAttachments": { - "message": "Free organizations cannot use attachments" + "message": "Les organisations gratuites ne peuvent pas utiliser de pièces jointes" }, "filters": { "message": "Filtres" }, "personalDetails": { - "message": "Personal details" + "message": "Données personnelles" }, "identification": { "message": "Identification" }, "contactInfo": { - "message": "Contact info" + "message": "Informations de contact" }, "downloadAttachment": { - "message": "Download - $ITEMNAME$", + "message": "Télécharger - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -3904,23 +3904,23 @@ } }, "cardNumberEndsWith": { - "message": "card number ends with", + "message": "numéro de la carte se termine par", "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { - "message": "Login credentials" + "message": "Identifiants de connexion" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Clé d'authentification" }, "autofillOptions": { - "message": "Autofill options" + "message": "Options de saisie automatique" }, "websiteUri": { - "message": "Website (URI)" + "message": "Site web (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Site web (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -3930,16 +3930,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Site web ajouté" }, "addWebsite": { - "message": "Add website" + "message": "Ajouter le site web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Supprimer le site web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Par défaut ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -3967,16 +3967,16 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Saisir automatiquement lors du chargement de la page ?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Carte de paiement expirée" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Si vous l'avez renouvelée, mettez à jour les informations de la carte de paiement" }, "cardDetails": { - "message": "Card details" + "message": "Détails de la carte de paiement" }, "cardBrandDetails": { "message": "$BRAND$ details", @@ -3987,38 +3987,41 @@ } } }, + "enableAnimations": { + "message": "Activer les animations" + }, "addAccount": { "message": "Ajouter un compte" }, "loading": { - "message": "Loading" + "message": "Chargement" }, "data": { - "message": "Data" + "message": "Données" }, "passkeys": { - "message": "Passkeys", + "message": "Clés d'accès", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Mots de passe", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Se connecter avec une clé d'accès", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { - "message": "Assign" + "message": "Assigner" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir l'élément." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "Seuls les membres de l'organisation ayant accès à ces collections pourront voir les éléments." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "Vous avez sélectionné $TOTAL_COUNT$ éléments. Vous ne pouvez pas mettre à jour $READONLY_COUNT$ de ces éléments parce que vous n'avez pas les autorisations pour les éditer.", "placeholders": { "total_count": { "content": "$1", @@ -4030,37 +4033,37 @@ } }, "addField": { - "message": "Add field" + "message": "Ajouter un champ" }, "add": { - "message": "Add" + "message": "Ajouter" }, "fieldType": { - "message": "Field type" + "message": "Type du champ" }, "fieldLabel": { - "message": "Field label" + "message": "Intitulé du champ" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Utiliser des champs de texte pour les données telles que les questions de sécurité" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Utiliser des champs cachés pour des données sensibles telles qu'un mot de passe" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Utilisez les cases à cocher si vous souhaitez saisir automatiquement la case à cocher d'un formulaire, tel qu'un courriel de rappel" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "Utilisez un champ lié lorsque vous rencontrez des problèmes de saisie automatique pour un site Web spécifique." }, "linkedLabelHelpText": { "message": "Enter the the field's html id, name, aria-label, or placeholder." }, "editField": { - "message": "Edit field" + "message": "Éditer le champ" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Éditer $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4069,7 +4072,7 @@ } }, "deleteCustomField": { - "message": "Delete $LABEL$", + "message": "Supprimer $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4078,7 +4081,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "$LABEL$ ajouté", "placeholders": { "label": { "content": "$1", @@ -4087,7 +4090,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Réorganiser $LABEL$. Utilisez les flèches de votre clavier pour déplacer l'élément vers le haut ou vers le bas.", "placeholders": { "label": { "content": "$1", @@ -4113,13 +4116,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Sélectionnez les collections à assigner" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 élément sera transféré définitivement à l'organisation sélectionnée. Vous ne serez plus le propriétaire de cet élément." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "message": "Les éléments $PERSONAL_ITEMS_COUNT$ seront transférés de façon permanente à l'organisation sélectionnée. Vous ne serez plus le propriétaire de ces éléments.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4128,7 +4131,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 élément sera transféré définitivement à $ORG$. Vous ne serez plus le propriétaire de cet élément.", "placeholders": { "org": { "content": "$1", @@ -4137,7 +4140,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "Les éléments $PERSONAL_ITEMS_COUNT$ seront transférés à $ORG$ de façon permanente. Vous ne serez plus propriétaire de ces éléments.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4150,13 +4153,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Collections assignées avec succès" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Vous n'avez rien sélectionné." }, "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", + "message": "Les éléments sélectionnés ont été déplacés vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4165,7 +4168,7 @@ } }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Éléments déplacés vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4174,7 +4177,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Élément déplacé vers $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4200,7 +4203,7 @@ } }, "itemLocation": { - "message": "Item Location" + "message": "Emplacement de l'élément" }, "fileSends": { "message": "File Sends" @@ -4209,7 +4212,7 @@ "message": "Text Sends" }, "bitwardenNewLook": { - "message": "Bitwarden has a new look!" + "message": "Bitwarden a un nouveau look !" }, "bitwardenNewLookDesc": { "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" @@ -4218,7 +4221,7 @@ "message": "Account actions" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Afficher le nombre de suggestions de saisie automatique d'identifiant sur l'icône d'extension" }, "systemDefault": { "message": "System default" diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index b57ca6c7017..91cd72fbc91 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index df0a0b46d55..3df3937a1df 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 9d65d502e21..109b3c8b06e 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index e60676782a3..0d931cb5108 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Dodaj račun" }, diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 72d0b8a1887..dfcfe51ab29 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animációk engedélyezése" + }, "addAccount": { "message": "Fiók hozzáadása" }, diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index b70e8d6788d..75dcf04a58a 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 60ce1373d07..59c4091c1a0 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 0072b24fa5e..8c729136d90 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "アニメーションを有効化" + }, "addAccount": { "message": "アカウントを追加" }, diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index d8e02622fd6..109ceb35eab 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index afcb7a17d0d..99de6153875 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 4325971967a..6d01dc6ea94 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index d41ce8ec216..a894feb5eb0 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Pridėti paskyrą" }, diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 75725ebb3a8..dc7100f3fda 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -1379,13 +1379,13 @@ "message": "Atvērt glabātavu sānu joslā" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto pieteikšanās vienumu pašreizējā tīmekļvietnē" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto karti pašreizējā tīmekļvietnē" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Automātiski aizpildīt ar iepriekš izmantoto identitāti pašreizējā tīmekļvietnē" }, "commandGeneratePasswordDesc": { "message": "Izveidot jaunu nejaušu paroli un ievietot to starpliktuvē" @@ -1692,7 +1692,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Pamata domēns (ieteicams)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2870,16 +2870,16 @@ "message": "Mainīt īsinājumtaustiņus" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Manage shortcuts" + "message": "Pārvaldīt saīsnes" }, "autofillShortcut": { "message": "Automātiskās aizpildes īsinājumtaustiņi" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Automātiskās aizpildes īsceļš pieteikšanās vienumiem nav uzstādīts. To var izdarīt pārlūka iestatījumos." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Automātiskās aizpildes īsceļš pieteikšanās vienumiem ir: $COMMAND$. Visus īsinājumtaustiņus var pārvaldīt pārlūka iestatījumos.", "placeholders": { "command": { "content": "$1", @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Iespējot animācijas" + }, "addAccount": { "message": "Pievienot kontu" }, diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 2dcf65d111e..80f13845ad8 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 39941ed1a11..7d1a3b668c1 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index b9fd5fd32a7..b76b824d2b0 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 1b29416c1f1..39683ed7697 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animaties inschakelen" + }, "addAccount": { "message": "Account toevoegen" }, diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index bded75e089c..d1d77df71ad 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Dodaj konto" }, diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 7829d7a59a4..f15f3eb922f 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Adicionar conta" }, diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index a40029dc1ac..75c0d12f9ec 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Ativar animações" + }, "addAccount": { "message": "Adicionar conta" }, diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 2c0a570161f..90dbfd33d2d 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index f115aa80329..5002161e96b 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Включить анимацию" + }, "addAccount": { "message": "Добавить аккаунт" }, diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 02ff1f43a30..edffa756719 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index ef4f60b0c51..03d1eaf38a6 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Povoliť animácie" + }, "addAccount": { "message": "Pridať účet" }, diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index f32fbca0a18..4a4bb31d9b3 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 5cd284196f4..eaf7a732e8e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -1080,7 +1080,7 @@ "message": "1ГБ шифровано складиште за прилоге." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "Хитан приступ." }, "premiumSignUpTwoStepOptions": { "message": "Приоритарне опције пријаве у два корака као што су YubiKey и Duo." @@ -1104,7 +1104,7 @@ "message": "Можете купити премијум претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Можете да купите Премиум у подешавањима налога у веб апликацији Bitwarden." }, "premiumCurrentMember": { "message": "Ви сте премијум члан!" @@ -1113,7 +1113,7 @@ "message": "Хвала Вам за подршку Bitwarden-а." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Надоградите на премиум и добијте:" }, "premiumPrice": { "message": "Све за само $PRICE$ годишње!", @@ -1125,7 +1125,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Све то за само $PRICE$ годишње!", "placeholders": { "price": { "content": "$1", @@ -2314,7 +2314,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send је успешно направљен!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { @@ -2328,7 +2328,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Send линк је копиран", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3970,10 +3970,10 @@ "message": "Ауто-попуњавање при учитавању странице?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Картица је истекла" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Ако сте је обновили, ажурирајте податке о картици" }, "cardDetails": { "message": "Детаљи картице" @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Омогући анимације" + }, "addAccount": { "message": "Додај налог" }, diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index b4b4a0adf29..f885a489b04 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Aktivera animationer" + }, "addAccount": { "message": "Lägg till konto" }, diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 0700341d237..a580b3372a3 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index f630cc928e4..490aa27d739 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 776d098664a..9ecaf18c282 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -1125,7 +1125,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Bunların hepsi yılda sadece $PRICE$!", "placeholders": { "price": { "content": "$1", @@ -1852,14 +1852,14 @@ "message": "Bu kullanıcı adını kullan" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Güvenli parola üretildi. Web sitesindeki parolanızı da güncellemeyi unutmayın." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Güçlü ve benzersiz bir parola üretmek için", "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": "üreteci kullanabilirsiniz", "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": { @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Animasyonları etkinleştir" + }, "addAccount": { "message": "Hesap ekle" }, diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 97158d37e4b..de2f5d1853f 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Увімкнути анімацію" + }, "addAccount": { "message": "Додати обліковий запис" }, diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 77d8a9de144..eb1ac1037d8 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -231,11 +231,11 @@ "message": "Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web." }, "fingerprintPhrase": { - "message": "Fingerprint Phrase", + "message": "Cụm vân tay", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Cụm từ mật khẩu của tài khoản của bạn", + "message": "Cụm vân tay của tài khoản của bạn", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -542,7 +542,7 @@ "message": "Mật khẩu chính không hợp lệ" }, "vaultTimeout": { - "message": "Thời gian chờ của kho lưu trữ" + "message": "Thời gian chờ của kho" }, "lockNow": { "message": "Khóa ngay" @@ -934,7 +934,7 @@ "message": "Xuất từ" }, "exportVault": { - "message": "Xuất kho lưu trữ" + "message": "Xuất kho" }, "fileFormat": { "message": "Định dạng tập tin" @@ -968,7 +968,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Xác nhận xuất kho lưu trữ" + "message": "Xác nhận xuất kho" }, "exportWarningDesc": { "message": "Bản xuất này chứa dữ liệu kho bạn và không được mã hóa. Bạn không nên lưu trữ hay gửi tập tin đã xuất thông qua phương thức rủi ro (như email). Vui lòng xóa nó ngay lập tức khi bạn đã sử dụng xong." @@ -980,7 +980,7 @@ "message": "Khóa mã hóa tài khoản là duy nhất cho mỗi tài khoản Bitwarden, vì vậy bạn không thể nhập tệp xuất được mã hóa vào một tài khoản khác." }, "exportMasterPassword": { - "message": "Nhập mật khẩu chính để xuất kho lưu trữ của bạn." + "message": "Nhập mật khẩu chính để xuất kho của bạn." }, "shared": { "message": "Đã chia sẻ" @@ -1391,7 +1391,7 @@ "message": "Tạo và sao chép một mật khẩu ngẫu nhiên mới vào khay nhớ tạm" }, "commandLockVaultDesc": { - "message": "Khoá kho lưu trữ" + "message": "Khoá kho" }, "customFields": { "message": "Trường tùy chỉnh" @@ -1447,7 +1447,7 @@ "message": "Hiển thị biểu tượng bộ đếm" }, "badgeCounterDesc": { - "message": "Cho biết bạn có bao nhiêu lần đăng nhập cho trang web hiện tại." + "message": "Cho biết bạn có bao nhiêu thông tin đăng nhập cho trang web hiện tại." }, "cardholderName": { "message": "Tên chủ thẻ" @@ -1895,7 +1895,7 @@ "message": "Bạn đã có tài khoản?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Việc đăng xuất sẽ loại bỏ tất cả truy cập vào kho lưu trữ của bạn và yêu cầu xác minh trực tuyến sau khi hết giai đoạn thời gian chờ. Bạn có chắc chắn muốn dùng cài đặt này không?" + "message": "Đăng xuất sẽ xóa tất cả quyền truy cập vào kho của bạn và yêu cầu xác minh trực tuyến sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Xác nhận hành động khi hết thời gian chờ" @@ -2027,7 +2027,7 @@ "message": "Xác minh đồng bộ máy tính" }, "desktopIntegrationVerificationText": { - "message": "Vui lòng xác minh rằng ứng dụng trên máy tính thấy vân tay này:" + "message": "Vui lòng xác minh ứng dụng trên máy tính hiển thị cụm vân tay này: " }, "desktopIntegrationDisabledTitle": { "message": "Tích hợp trình duyệt chưa được kích hoạt" @@ -2487,7 +2487,7 @@ "message": "Thời gian mở kho vượt quá giới hạn do tổ chức của bạn đặt ra." }, "vaultExportDisabled": { - "message": "Xuất kho lưu trữ không có sẵn" + "message": "Xuất kho không có sẵn" }, "personalVaultExportPolicyInEffect": { "message": "Các chính sách của tổ chức ngăn cản bạn xuất kho lưu trữ cá nhân của mình." @@ -2777,7 +2777,7 @@ "message": "Đang đăng nhập với tên" }, "notYou": { - "message": "Không phải bạn sao?" + "message": "Không phải bạn?" }, "newAroundHere": { "message": "Bạn mới tới đây sao?" @@ -2792,10 +2792,10 @@ "message": "Đăng nhập bằng thiết bị phải được thiết lập trong cài đặt của ứng dụng Bitwarden. Dùng cách khác?" }, "fingerprintPhraseHeader": { - "message": "Cụm từ dấu vân tay" + "message": "Cụm vân tay" }, "fingerprintMatchInfo": { - "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm từ mật khẩu khớp trên thiết bị khác." + "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm vân tay khớp trên thiết bị khác." }, "resendNotification": { "message": "Gửi lại thông báo" @@ -3620,7 +3620,7 @@ "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { - "message": "Đặt Bitwarden làm trình quản lý mật khẩu mặc định của bạn", + "message": "Bitwarden làm trình quản lý mật khẩu mặc định", "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Thêm tài khoản" }, diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index d99bb8e9594..c2ed27b25a4 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -1125,7 +1125,7 @@ } }, "premiumPriceV2": { - "message": "全部仅需 $PRICE$ /年!", + "message": "全部仅需 $PRICE$ 每年!", "placeholders": { "price": { "content": "$1", @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "启用动画" + }, "addAccount": { "message": "添加账户" }, diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index a7a264ad47a..470fd45d2d4 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -3987,6 +3987,9 @@ } } }, + "enableAnimations": { + "message": "Enable animations" + }, "addAccount": { "message": "Add account" }, diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 7ac3e02160d..27fc868a9bb 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -6,6 +6,7 @@ import { LogoutReason } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; @@ -39,6 +40,7 @@ export class AppComponent implements OnInit, OnDestroy { private lastActivity: Date; private activeUserId: UserId; private recordActivitySubject = new Subject(); + private routerAnimations = false; private destroy$ = new Subject(); @@ -57,6 +59,7 @@ export class AppComponent implements OnInit, OnDestroy { private messageListener: MessageListener, private toastService: ToastService, private accountService: AccountService, + private animationControlService: AnimationControlService, ) {} async ngOnInit() { @@ -173,6 +176,12 @@ export class AppComponent implements OnInit, OnDestroy { } } }); + + this.animationControlService.enableRoutingAnimation$ + .pipe(takeUntil(this.destroy$)) + .subscribe((state) => { + this.routerAnimations = state; + }); } ngOnDestroy(): void { @@ -181,7 +190,9 @@ export class AppComponent implements OnInit, OnDestroy { } getState(outlet: RouterOutlet) { - if (outlet.activatedRouteData.state === "ciphers") { + if (!this.routerAnimations) { + return; + } else if (outlet.activatedRouteData.state === "ciphers") { const routeDirection = (window as any).routeDirection != null ? (window as any).routeDirection : ""; return ( diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index f6f3bf732b0..7c5e49e741b 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -41,6 +41,10 @@ import { } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; +import { + AnimationControlService, + DefaultAnimationControlService, +} from "@bitwarden/common/platform/abstractions/animation-control.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; @@ -527,6 +531,11 @@ const safeProviders: SafeProvider[] = [ useClass: Fido2UserVerificationService, deps: [PasswordRepromptService, UserVerificationService, DialogService], }), + safeProvider({ + provide: AnimationControlService, + useClass: DefaultAnimationControlService, + deps: [GlobalStateProvider], + }), safeProvider({ provide: TaskSchedulerService, useExisting: ForegroundTaskSchedulerService, diff --git a/apps/browser/src/vault/popup/settings/appearance.component.html b/apps/browser/src/vault/popup/settings/appearance.component.html index 36b21905127..a431fc72a1f 100644 --- a/apps/browser/src/vault/popup/settings/appearance.component.html +++ b/apps/browser/src/vault/popup/settings/appearance.component.html @@ -64,4 +64,17 @@ {{ accountSwitcherEnabled ? ("faviconDescAlt" | i18n) : ("faviconDesc" | i18n) }} +
+
+
+ + +
+
+
diff --git a/apps/browser/src/vault/popup/settings/appearance.component.ts b/apps/browser/src/vault/popup/settings/appearance.component.ts index 154d4e426d8..1095b56a75c 100644 --- a/apps/browser/src/vault/popup/settings/appearance.component.ts +++ b/apps/browser/src/vault/popup/settings/appearance.component.ts @@ -3,6 +3,7 @@ import { firstValueFrom } from "rxjs"; import { BadgeSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/badge-settings.service"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; +import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { ThemeType } from "@bitwarden/common/platform/enums"; @@ -20,6 +21,7 @@ export class AppearanceComponent implements OnInit { theme: ThemeType; themeOptions: any[]; accountSwitcherEnabled = false; + enableRoutingAnimation: boolean; constructor( private messagingService: MessagingService, @@ -27,6 +29,7 @@ export class AppearanceComponent implements OnInit { private badgeSettingsService: BadgeSettingsServiceAbstraction, i18nService: I18nService, private themeStateService: ThemeStateService, + private animationControlService: AnimationControlService, ) { this.themeOptions = [ { name: i18nService.t("default"), value: ThemeType.System }, @@ -40,6 +43,10 @@ export class AppearanceComponent implements OnInit { } async ngOnInit() { + this.enableRoutingAnimation = await firstValueFrom( + this.animationControlService.enableRoutingAnimation$, + ); + this.enableFavicon = await firstValueFrom(this.domainSettingsService.showFavicons$); this.enableBadgeCounter = await firstValueFrom(this.badgeSettingsService.enableBadgeCounter$); @@ -47,6 +54,10 @@ export class AppearanceComponent implements OnInit { this.theme = await firstValueFrom(this.themeStateService.selectedTheme$); } + async updateRoutingAnimation() { + await this.animationControlService.setEnableRoutingAnimation(this.enableRoutingAnimation); + } + async updateFavicon() { await this.domainSettingsService.setShowFavicons(this.enableFavicon); } diff --git a/apps/browser/store/locales/fi/copy.resx b/apps/browser/store/locales/fi/copy.resx index 076a724bdf8..3056b71f87a 100644 --- a/apps/browser/store/locales/fi/copy.resx +++ b/apps/browser/store/locales/fi/copy.resx @@ -121,7 +121,7 @@ Bitwarden Salasanahallinta - Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi. + Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti. Muun muassa PCMag, WIRED, The Verge, CNET sekä G2 ovat nimenneet Bitwardenin parhaaksi salasanahallinnaksi! @@ -147,10 +147,10 @@ Maailmanluoka salaus: Salasanat on suojattu edistyneellä päästä päähän salauksella (AES-256 bit, suolattu hajautus sekä PBKDF2 SHA-256), joten tietosi pysyvät turvassa ja yksityisinä. Riippumattomat auditoinnit -Bitwarden teetättää säännöllisesti tunnettujen tietoturvayritysten suorittamia kattavia riippumattomia tietoturva-arviointeja. Näissä vuotuisissa auditoinneissa arvioidaan lähdekoodia ja suoritetaan murtotestausta Bitwardenin IP-osoittelle, palvelimille ja verkkosovelluksille. +Bitwarden teetättää säännöllisesti kattavia riippumattomia tietoturva-arviointeja tunnettuilla tietoturvayrityksillä. Näissä vuotuisissa auditoinneissa arvioidaan lähdekoodia ja suoritetaan murtotestausta Bitwardenin IP-osoitteille, palvelimille ja verkkosovelluksille. Edistynyt kaksivaiheinen tunnistautuminen -Suojaa kirjautumistietosi riippumattomalla todennussovelluksella, sähköpostikoodeilla tai FIDO2 WEBAuthn -standardin mukaisilla fyysisillä tai ohjelmallisilla suojausavaimilla. +Suojaa kirjautumistietosi riippumattomalla todennussovelluksella, sähköpostikoodeilla, tai FIDO2 WEBAuthn -standardin mukaisilla tunnistustavoilla kuten fyysisillä suojausavaimilla tai pääsyavaimilla. Bitwarden Send Välitä tietoja muille suoraan, päästä päähän salausta menettämättä ja rajoitaen niiden näkyvyyttä. @@ -169,7 +169,7 @@ Bitwardenin päästä päähän salatut käyttäjätietojen hallintaratkaisut ta - Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi. + Kotona, töissä tai reissussa, Bitwarden suojaa salasanasi, pääsyavaimesi ja arkaluonteiset tietosi helposti. Synkronoi ja hallitse holviasi useilla laitteilla diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index dc3cc7ec0bb..deaf6b8e57f 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -47,7 +47,6 @@ export namespace processisolations { export function isCoreDumpingDisabled(): Promise export function disableMemoryAccess(): Promise } - export namespace powermonitors { export function onLock(callback: (err: Error | null, ) => any): Promise export function isLockMonitorAvailable(): Promise diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 15139a99296..aded8cc3914 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -234,7 +234,7 @@ "autoStart": true, "base": "core22", "confinement": "strict", - "plugs": ["default", "password-manager-service"], + "plugs": ["default", "network", "network-bind", "password-manager-service"], "stagePackages": ["default"] }, "protocols": [ diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index a311ed2b865..089eb1c027c 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -300,13 +300,19 @@ export class AppComponent implements OnInit, OnDestroy { this.systemService.clearClipboard(message.clipboardValue, message.clearMs); } break; - case "ssoCallback": + case "ssoCallback": { + const queryParams = { + code: message.code, + state: message.state, + redirectUri: message.redirectUri ?? "bitwarden://sso-callback", + }; // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises this.router.navigate(["sso"], { - queryParams: { code: message.code, state: message.state }, + queryParams: queryParams, }); break; + } case "premiumRequired": { const premiumConfirmed = await this.dialogService.openSimpleDialog({ title: { key: "premiumRequired" }, @@ -455,6 +461,9 @@ export class AppComponent implements OnInit, OnDestroy { case "deepLink": this.processDeepLink(message.urlString); break; + case "launchUri": + this.platformUtilsService.launchUri(message.url); + break; } }); }); diff --git a/apps/desktop/src/auth/login/login.component.ts b/apps/desktop/src/auth/login/login.component.ts index c5ee9a07603..68b25b8b7e9 100644 --- a/apps/desktop/src/auth/login/login.component.ts +++ b/apps/desktop/src/auth/login/login.component.ts @@ -23,6 +23,7 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; @@ -187,4 +188,40 @@ export class LoginComponent extends BaseLoginComponent implements OnInit, OnDest const email = this.loggedEmail; document.getElementById(email == null || email === "" ? "email" : "masterPassword")?.focus(); } + + async launchSsoBrowser(clientId: string, ssoRedirectUri: string) { + if (!ipc.platform.isAppImage && !ipc.platform.isSnapStore && !ipc.platform.isDev) { + return super.launchSsoBrowser(clientId, ssoRedirectUri); + } + + // Save off email for SSO + await this.ssoLoginService.setSsoEmail(this.formGroup.value.email); + + // Generate necessary sso params + const passwordOptions: any = { + type: "password", + length: 64, + uppercase: true, + lowercase: true, + numbers: true, + special: false, + }; + const state = await this.passwordGenerationService.generatePassword(passwordOptions); + const ssoCodeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); + const codeVerifierHash = await this.cryptoFunctionService.hash(ssoCodeVerifier, "sha256"); + const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); + + // Save sso params + await this.ssoLoginService.setSsoState(state); + await this.ssoLoginService.setCodeVerifier(ssoCodeVerifier); + try { + await ipc.platform.localhostCallbackService.openSsoPrompt(codeChallenge, state); + } catch (err) { + this.platformUtilsService.showToast( + "error", + this.i18nService.t("errorOccured"), + this.i18nService.t("ssoError"), + ); + } + } } diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index 44afdf3b646..9d65abafdef 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -1817,7 +1817,7 @@ "message": "Vir blaaierbiometrie moet werkskermbiometrie eers in instellings geaktiveer wees." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index 8ce9508675c..390a694756e 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -500,10 +500,10 @@ "message": "إنشاء حساب" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "تعيين كلمة مرور قوية" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "إنهاء إنشاء حسابك عن طريق تعيين كلمة مرور" }, "logIn": { "message": "تسجيل الدخول" @@ -527,7 +527,7 @@ "message": "تلميح كلمة المرور الرئيسية (اختياري)" }, "masterPassHintText": { - "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "message": "إذا نسيت كلمة المرور الخاصة بك، يمكن إرسال تلميح كلمة المرور إلى بريدك الإلكتروني. $CURRENT$/$MAXIMUM$ الحد الأقصى للحرف.", "placeholders": { "current": { "content": "$1", @@ -540,22 +540,22 @@ } }, "masterPassword": { - "message": "Master password" + "message": "كلمة المرور الرئيسية" }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "لا يمكن استعادة كلمة المرور الرئيسية إذا نسيتها!" }, "confirmMasterPassword": { - "message": "Confirm master password" + "message": "تأكيد كلمة المرور الرئيسية" }, "masterPassHintLabel": { - "message": "Master password hint" + "message": "تلميح كلمة المرور الرئيسية" }, "joinOrganization": { - "message": "Join organization" + "message": "الانضمام إلى المؤسسة" }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "إنهاء الانضمام إلى هذه المؤسسة عن طريق تعيين كلمة مرور رئيسية." }, "settings": { "message": "الإعدادات" @@ -634,7 +634,7 @@ "message": "رمز التحقق مطلوب." }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "تم إلغاء المصادقة أو استغرقت وقتا طويلا. الرجاء المحاولة مرة أخرى." }, "invalidVerificationCode": { "message": "رمز التحقق غير صالح" @@ -688,17 +688,17 @@ "message": "تطبيق المصادقة" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "أدخل رمز تم إنشاؤه بواسطة تطبيق مصادقة مثل Bitwarden Authenticer.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP security key" + "message": "مفتاح أمان YubiKey OTP" }, "yubiKeyDesc": { "message": "استخدم YubiKey للوصول إلى حسابك. يعمل مع YubiKey 4 ،4 Nano ،4C، وأجهزة NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "أدخل الرمز الذي تم إنشاؤه بواسطة نظام حماية Duo.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -715,7 +715,7 @@ "message": "البريد الإلكتروني" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "أدخل رمزا أرسل إلى بريدك الإلكتروني." }, "loginUnavailable": { "message": "تسجيل الدخول غير متاح" @@ -799,16 +799,16 @@ "message": "انتهت صلاحية جلسة الدخول." }, "restartRegistration": { - "message": "Restart registration" + "message": "إعادة تشغيل التسجيل" }, "expiredLink": { - "message": "Expired link" + "message": "رابط منتهي الصلاحية" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "الرجاء إعادة تشغيل التسجيل أو محاولة تسجيل الدخول." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "قد يكون لديك حساب بالفعل" }, "logOutConfirmation": { "message": "هل أنت متأكد من أنك تريد تسجيل الخروج؟" @@ -1175,7 +1175,7 @@ "message": "يمكنك شراء العضوية المتميزة على bitwarden.com على خزانة الويب. هل تريد زيارة الموقع الآن؟" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "يمكنك شراء Premium من إعدادات حسابك على تطبيق Bitwarden على شبكة الإنترنت." }, "premiumCurrentMember": { "message": "أنت عضو مميز!" @@ -1514,13 +1514,13 @@ "message": "إعدادات Windows Hello إضافية" }, "unlockWithPolkit": { - "message": "Unlock with system authentication" + "message": "فتح مع مصادقة النظام" }, "windowsHelloConsentMessage": { "message": "تحقق من Bitwarden." }, "polkitConsentMessage": { - "message": "Authenticate to unlock Bitwarden." + "message": "مصادقة لفتح Bitwarden." }, "unlockWithTouchId": { "message": "فتح بواسطة معرف اللمس" @@ -1535,7 +1535,7 @@ "message": "اسأل عن Windows Hello عند التشغيل" }, "autoPromptPolkit": { - "message": "Ask for system authentication on launch" + "message": "طلب مصادقة النظام عند التشغيل" }, "autoPromptTouchId": { "message": "اطلب معرف اللمس عند التشغيل" @@ -1724,19 +1724,19 @@ "message": "كلمة المرور الرئيسية الجديدة لا تفي بمتطلبات السياسة العامة." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "احصل على المشورة والإعلانات وفرص البحث من Bitwarden في صندوق الوارد الخاص بك." }, "unsubscribe": { - "message": "Unsubscribe" + "message": "إلغاء الاشتراك" }, "atAnyTime": { - "message": "at any time." + "message": "في أي وقت." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "من خلال المتابعة، أنت توافق على" }, "and": { - "message": "and" + "message": "و" }, "acceptPolicies": { "message": "من خلال تحديد هذا المربع فإنك توافق على ما يلي:" @@ -1817,10 +1817,10 @@ "message": "القياسات الحيوية للمتصفح تتطلب القياسات الحيوية لسطح المكتب ليتم تمكينها في الإعدادات أولاً." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "الإعداد التلقائي غير متوفر" }, "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": "بسبب طريقة التثبيت، لا يمكن تمكين دعم القياسات الحيوية تلقائياً. هل ترغب في فتح الوثائق حول كيفية القيام بذلك يدوياً؟" }, "personalOwnershipSubmitError": { "message": "بسبب سياسة المؤسسة، يمنع عليك حفظ العناصر في خزانتك الشخصية. غيّر خيار الملكية إلى مؤسسة واختر من المجموعات المتاحة." @@ -2007,7 +2007,7 @@ "message": "التحقق من البريد الإلكتروني مطلوب" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "تم التحقق من البريد الإلكتروني" }, "emailVerificationRequiredDesc": { "message": "يجب عليك التحقق من بريدك الإلكتروني لاستخدام هذه الميزة." @@ -2034,7 +2034,7 @@ "message": "كلمة المرور الرئيسية الخاصة بك لا تفي بواحدة أو أكثر من سياسات مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديث كلمة المرور الرئيسية الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. وقد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "لقد قامت مؤسستك بتعطيل تشفير الجهاز الموثوق به. الرجاء تعيين كلمة مرور رئيسية للوصول إلى خزانك." }, "tryAgain": { "message": "حاول مرة أخرى" @@ -2121,7 +2121,7 @@ "message": "مهلة خزنتك تتجاوز القيود التي تضعها مؤسستك." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "تم قبول الدعوة" }, "resetPasswordPolicyAutoEnroll": { "message": "التسجيل التلقائي" @@ -2766,7 +2766,7 @@ "message": "قائمة فرعية" }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "تبديل التنقل الجانبي" }, "skipToContent": { "message": "تخطي إلى المحتوى" @@ -2824,7 +2824,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "خطأ في الاتصال بخدمة Duo. استخدم طريقة تسجيل الدخول بخطوتين مختلفة أو اتصل بـ Duo للمساعدة." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "قم بتشغيل دوو واتبع الخطوات لإنهاء تسجيل الدخول." @@ -2848,7 +2848,7 @@ "message": "كلمة مرور الملف غير صالحة، الرجاء استخدام كلمة المرور التي أدخلتها عند إنشاء ملف التصدير." }, "destination": { - "message": "Destination" + "message": "الوجهة" }, "learnAboutImportOptions": { "message": "تعرف على خيارات الاستيراد الخاصة بك" @@ -2907,7 +2907,7 @@ "message": "تأكيد كلمة مرور الملف" }, "exportSuccess": { - "message": "Vault data exported" + "message": "تم تصدير بيانات المخزن" }, "multifactorAuthenticationCancelled": { "message": "تم إلغاء المصادقة المتعددة" @@ -3045,12 +3045,12 @@ } }, "data": { - "message": "Data" + "message": "البيانات" }, "fileSends": { - "message": "File Sends" + "message": "إرسال الملف" }, "textSends": { - "message": "Text Sends" + "message": "إرسال النص" } } diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 822edf8caf5..f599eb90c6d 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -1817,7 +1817,7 @@ "message": "Для актывацыі біяметрыі ў браўзеры неабходна спачатку ўключыць яе ў наладах праграмы для камп'ютара." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 0ca46770ba6..ad8de7d1a3b 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -2848,7 +2848,7 @@ "message": "Неправилна парола за файла. Използвайте паролата, която сте въвели при създаването на изнесения файл." }, "destination": { - "message": "Destination" + "message": "Дестинация" }, "learnAboutImportOptions": { "message": "Научете повече относно възможностите за внасяне" diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index c53838dd0fa..fadeb3516cc 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -1817,7 +1817,7 @@ "message": "ব্রাউজার বায়োমেট্রিক্সের জন্য প্রথমে সেটিংসে ডেস্কটপ বায়োমেট্রিক সক্ষম করা প্রয়োজন।" }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 6ce58c87fe1..afb3f103d67 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -1817,7 +1817,7 @@ "message": "Biometrija preglednika zahtijeva prethodno omogućenu biometriju u Bitwarden desktop aplikaciji." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index 24967667119..418fe59830e 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -1817,7 +1817,7 @@ "message": "La biometria del navegador primer necessita habilitar la biomètrica d’escriptori a la configuració." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index 5ba77a14bdb..5ae6512cebb 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index c0f98f17535..1bd37185503 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -738,10 +738,10 @@ "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, - "selfHostedCustomEnvHeader" :{ + "selfHostedCustomEnvHeader": { "message": "For advanced configuration, you can specify the base URL of each service independently." }, - "selfHostedEnvFormInvalid" :{ + "selfHostedEnvFormInvalid": { "message": "You must add either the base Server URL or at least one custom environment." }, "customEnvironment": { @@ -1279,10 +1279,10 @@ } } }, - "errorRefreshingAccessToken":{ + "errorRefreshingAccessToken": { "message": "Access Token Refresh Error" }, - "errorRefreshingAccessTokenDesc":{ + "errorRefreshingAccessTokenDesc": { "message": "No refresh token or API keys found. Please try logging out and logging back in." }, "help": { @@ -1668,7 +1668,7 @@ "message": "Your organization requires you to set a master password.", "description": "Used as a card title description on the set password page to explain why the user is there" }, - "verificationRequired" : { + "verificationRequired": { "message": "Verification required", "description": "Default title for the user verification dialog." }, @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" @@ -3052,5 +3052,8 @@ }, "textSends": { "message": "Text Sends" + }, + "ssoError": { + "message": "No free ports could be found for the sso login." } } diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index ad78a34e25e..f06d7dcad71 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 72279325456..219cf5372ff 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -1817,7 +1817,7 @@ "message": "La biometría del navegador requiere habilitar primero la biometría de escritorio en los ajustes." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 88993edc567..e0afea254e6 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -1817,7 +1817,7 @@ "message": "Selleks, et kasutada biomeetriat brauseris, peab selle esmalt Bitwardeni töölaua rakenduse seadetes sisse lülitama." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 1b90a77192d..c7513b236b4 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -1817,7 +1817,7 @@ "message": "Nabigatzailearen biometriak lehenik mahaigainaren biometria gaitzeko eskatzen du." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index 2b5c810e4da..f51f59afca0 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -1817,7 +1817,7 @@ "message": "بیومتریک مرورگر ابتدا نیاز به فعالسازی بیومتریک دسکتاپ در تنظیمات دارد." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index f9caf83129b..d8b11b98960 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -643,10 +643,10 @@ "message": "Jatka" }, "enterVerificationCodeApp": { - "message": "Syötä 6-numeroinen todennuskoodi todennussovelluksestasi." + "message": "Syötä todennussovelluksesi näyttämä kuusinumeroinen todennuskoodi." }, "enterVerificationCodeEmail": { - "message": "Syötä 6-numeroinen todennuskoodi, joka lähetettiin sähköpostitse osoitteeseen $EMAIL$.", + "message": "Syötä osoitteeseen $EMAIL$ lähetetty kuusinumeroinen todennuskoodi.", "placeholders": { "email": { "content": "$1", @@ -676,7 +676,7 @@ "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." }, "insertU2f": { - "message": "Kytke todennuslaitteesi tietokoneen USB-porttiin ja jos laitteessa on painike, paina sitä." + "message": "Kytke suojausavaimesi tietokoneen USB-porttiin ja jos laitteessa on painike, paina sitä." }, "recoveryCodeDesc": { "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." @@ -692,7 +692,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP -todennuslaite" + "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." @@ -702,14 +702,14 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-todennuslaitetta.", + "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-suojausavainta.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Avaa tilisi millä tahansa WebAuthn‑yhteensopivalla todennuslaitteella." + "message": "Avaa tilisi millä tahansa WebAuthn‑yhteensopivalla suojausavaimella." }, "emailTitle": { "message": "Sähköposti" @@ -808,7 +808,7 @@ "message": "Aloita rekisteröityminen alusta tai yritä kirjautua sisään uudelleen." }, "youMayAlreadyHaveAnAccount": { - "message": "Sinulla saattaa olla jo tili" + "message": "Sinulla saattaa jo olla tili" }, "logOutConfirmation": { "message": "Haluatko varmasti kirjautua ulos?" @@ -916,7 +916,7 @@ "message": "Virheellinen pääsalasana" }, "twoStepLoginConfirmation": { - "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi todennuslaitteen, ‑sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" + "message": "Kaksivaiheinen kirjautuminen parantaa tilisi suojausta vaatimalla kirjautumisen vahvistuksen salasanan lisäksi suojausavaimen, todennussovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.com‑verkkoholvissa. Haluatko avata sen nyt?" }, "twoStepLogin": { "message": "Kaksivaiheinen kirjautuminen" @@ -1520,7 +1520,7 @@ "message": "Vahvista Bitwarden." }, "polkitConsentMessage": { - "message": "Todenna avataksesi Bitwardenin lukitus." + "message": "Avaa Bitwardenin lukitus tunnistautumalla." }, "unlockWithTouchId": { "message": "Avaa Touch ID:llä" @@ -1820,7 +1820,7 @@ "message": "Automaattinen määritys ei ole käytettävissä" }, "biometricsManualSetupDesc": { - "message": "Biometriatukea ei voitu ottaa automaattisesti käyttöön asennustavan vuoksi. Haluatko avata ohjeet tämän tekemiseksi manuaalisesti?" + "message": "Asennustavasta johtuen Biometriatukea ei voitu ottaa käyttöön automaattisesti. Haluatko avata ohjeen tämän manuaaliseen määritykseen?" }, "personalOwnershipSubmitError": { "message": "Yrityskäytännön johdosta kohteiden tallennus henkilökohtaiseen holviin ei ole mahdollista. Muuta omistusasetus organisaatiolle ja valitse käytettävissä olevista kokoelmista." @@ -2772,13 +2772,13 @@ "message": "Siirry sisältöön" }, "typePasskey": { - "message": "Suojausavain" + "message": "Pääsyavain" }, "passkeyNotCopied": { - "message": "Suojausavainta ei kopioida" + "message": "Pääsyavainta ei kopioida" }, "passkeyNotCopiedAlert": { - "message": "Suojausavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" + "message": "Pääsyavain ei kopioidu kloonattuun kohteeseen. Haluatko jatkaa kloonausta?" }, "aliasDomain": { "message": "Aliaksen verkkotunnus" @@ -2999,10 +2999,10 @@ "message": "Ota laitteistokiihdytys käyttöön ja käynnistä sovellus uudelleen" }, "removePasskey": { - "message": "Poista suojausavain" + "message": "Poista pääsyavain" }, "passkeyRemoved": { - "message": "Suojausavain poistettiin" + "message": "Pääsyavain poistettiin" }, "errorAssigningTargetCollection": { "message": "Virhe määritettäessä kohdekokoelmaa." diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 796c1581bbd..fcba4281757 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -1817,7 +1817,7 @@ "message": "Ang biometrics ng browser ay nangangailangan ng desktop biometrics na mai set up muna sa mga setting." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 7693bc08a94..ede5c563a16 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -1817,7 +1817,7 @@ "message": "Les options de biométrie dans le navigateur nécessitent au préalable l'activation des options de biométrie dans l'application de bureau." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index eb228ace8c3..c835e565557 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 1687a9587e5..33586af3511 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -1817,7 +1817,7 @@ "message": "בכדי להשתמש באמצעי אימות ביומטריים בדפדפן, אפשר תכונה זו באפליקציה בשולחן העבודה." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index 7094badd42c..16e85427b10 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 92252af3f82..b6f1863931d 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -1817,7 +1817,7 @@ "message": "Biometrik browser mengharuskan biometrik desktop diaktifkan di pengaturan terlebih dahulu." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index ea84505eb0d..af33ae0f6e7 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -1817,7 +1817,7 @@ "message": "L'autenticazione biometrica del browser richiede che l'autenticazione biometrica del desktop sia stata già impostata nelle impostazioni." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index eb228ace8c3..c835e565557 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index eb228ace8c3..c835e565557 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 1dbcf7c2288..19de2066d74 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -1817,7 +1817,7 @@ "message": "ಬ್ರೌಸರ್ ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಮೊದಲು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಡೆಸ್ಕ್ಟಾಪ್ ಬಯೋಮೆಟ್ರಿಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index e0705162693..bae57062455 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -1817,7 +1817,7 @@ "message": "브라우저에서 생체 인식을 사용하기 위해서는 설정에서 데스크톱 생체 인식을 먼저 활성화해야 합니다." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 8c91fa3f2dd..48c81e8f0ab 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -1817,7 +1817,7 @@ "message": "Pirma reikia nustatymuose nustatyti darbalaukio biometrinius duomenys, prieš juos naudojant naršyklėje." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index c94504d0249..4ab90c7243a 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index e4d154d6f50..215f5def545 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index eb228ace8c3..c835e565557 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 4d1b52f81b1..0882abff4b8 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index 8441dd2b2d5..eb5336dc557 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -1817,7 +1817,7 @@ "message": "Biometri i nettleserutvidelsen krever først aktivering i innstillinger i skrivebordsprogrammet." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 1764f7eb54e..2365cccd918 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index b79c2604f51..81ec6df8544 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index b0fb23dce11..455e63ecff0 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index aba64a81aad..9e742573d16 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -1817,7 +1817,7 @@ "message": "Biometria browserului necesită ca mai întâi să fie configurată biometria desktopului în setări." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index ae8e9bd25b7..9ac7c0dc352 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 102093af2a6..b54f4bc6d70 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 4f57d63f0a4..9b3fd229ced 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -1175,7 +1175,7 @@ "message": "Можете купити премијум претплату на bitwarden.com. Да ли желите да посетите веб сајт сада?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Можете да купите Премиум у подешавањима налога у веб апликацији Bitwarden." }, "premiumCurrentMember": { "message": "Ви сте премијум члан!" diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 23995076684..c839ff9d34a 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -1817,7 +1817,7 @@ "message": "Biometri i webbläsaren kräver att biometri på skrivbordet aktiveras i inställningarna först." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index eb228ace8c3..c835e565557 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index 91ba398f826..ac02e10a801 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -1817,7 +1817,7 @@ "message": "Browser biometrics requires desktop biometrics to be set up in the settings first." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index 0c6f1ed8da4..067b08f1d4b 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -1817,7 +1817,7 @@ "message": "Tarayıcıda biyometriyi kullanmak için önce ayarlardan masaüstü biyometrisini ayarlamanız gerekir." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 24d10043ca5..d0e985a301b 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -871,11 +871,11 @@ "message": "Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web." }, "fingerprintPhrase": { - "message": "Cụm từ mật khẩu", + "message": "Cụm vân tay", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Cụm từ mật khẩu tài khoản của bạn", + "message": "Cụm vân tay tài khoản của bạn", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "goToWebVault": { @@ -1649,7 +1649,7 @@ "message": "Xoá vĩnh viễn" }, "vaultTimeoutLogOutConfirmation": { - "message": "Tuỳ chọn đăng xuất sẽ đăng xuất khỏi kho sau khi hết thời gian mở kho và bạn sẽ cần đăng nhập lại để tiếp tục sử dụng. Bạn có chắc muốn sử dụng tuỳ chọn này không?" + "message": "Đăng xuất sẽ xóa tất cả quyền truy cập vào kho của bạn và yêu cầu xác minh trực tuyến sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Xác nhận hành động khi hết thời gian chờ" @@ -1778,7 +1778,7 @@ "message": "Yêu cầu xác minh để tích hợp trình duyệt" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Tăng cường bảo mật bằng cách yêu cầu xác nhận cụm từ mật khẩu khi kết nối máy tính với trình duyệt. Việc này yêu cầu bạn phải thực hiện thao tác xác minh mỗi khi tạo kết nối mới." + "message": "Tăng cường bảo mật bằng cách yêu cầu xác nhận cụm vân tay khi kết nối máy tính với trình duyệt. Việc này yêu cầu bạn phải thực hiện thao tác xác minh mỗi khi tạo kết nối." }, "enableHardwareAcceleration": { "message": "Dùng tính năng tăng tốc phần cứng" @@ -1793,7 +1793,7 @@ "message": "Xác minh kết nối trình duyệt" }, "verifyBrowserDesc": { - "message": "Vui lòng đảm bảo dấu vân tay hiển thị giống hệt với dấu vân tay được hiển thị trong tiện ích mở rộng trình duyệt." + "message": "Vui lòng đảm bảo cụm vân tay hiển thị giống hệt với cụm vân tay được hiển thị trong tiện ích mở rộng trình duyệt." }, "verifyNativeMessagingConnectionTitle": { "message": "$APPID$ muốn kết nối với Bitwarden", @@ -1817,7 +1817,7 @@ "message": "Sinh trắc học trên trình duyệt yêu cầu sinh trắc học trên máy tính phải được cài đặt trước." }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" @@ -2450,10 +2450,10 @@ "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, "fingerprintMatchInfo": { - "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm từ mật khẩu khớp trên thiết bị khác." + "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm vân tay khớp trên thiết bị khác." }, "fingerprintPhraseHeader": { - "message": "Cụm từ mật khẩu" + "message": "Cụm vân tay" }, "needAnotherOption": { "message": "Đăng nhập bằng thiết bị phải được thiết lập trong cài đặt của ứng dụng Bitwarden. Dùng cách khác?" diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index dc11ce73b0f..971bbf9466f 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -1817,7 +1817,7 @@ "message": "需先在桌面應用程式的設定中啟用生物特徵辨識,才能使用瀏覽器的生物特徵辨識。" }, "biometricsManualSetupTitle": { - "message": "Autometic setup not available" + "message": "Automatic setup not available" }, "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?" diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 816d317f411..b77cc722691 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -41,6 +41,7 @@ import { ElectronLogMainService } from "./platform/services/electron-log.main.se import { ElectronStorageService } from "./platform/services/electron-storage.service"; import { EphemeralValueStorageService } from "./platform/services/ephemeral-value-storage.main.service"; import { I18nMainService } from "./platform/services/i18n.main.service"; +import { SSOLocalhostCallbackService } from "./platform/services/sso-localhost-callback.service"; import { ElectronMainMessagingService } from "./services/electron-main-messaging.service"; import { isMacAppStore } from "./utils"; @@ -227,6 +228,7 @@ export class Main { this.clipboardMain.init(); new EphemeralValueStorageService(); + new SSOLocalhostCallbackService(this.environmentService, this.messagingService); } bootstrap() { diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index deb370201ff..029a0527c6e 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -51,6 +51,7 @@ export class WindowMain { // Perform a hard reload of the render process by crashing it. This is suboptimal but ensures that all memory gets // cleared, as the process itself will be completely garbage collected. ipcMain.on("reload-process", async () => { + this.logService.info("Reloading render process"); // User might have changed theme, ensure the window is updated. this.win.setBackgroundColor(await this.getBackgroundColor()); @@ -65,6 +66,7 @@ export class WindowMain { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises this.session.clearCache(); + this.logService.info("Render process reloaded"); }); return new Promise((resolve, reject) => { diff --git a/apps/desktop/src/platform/preload.ts b/apps/desktop/src/platform/preload.ts index 163ef9ae22c..c1c56c5522f 100644 --- a/apps/desktop/src/platform/preload.ts +++ b/apps/desktop/src/platform/preload.ts @@ -11,7 +11,7 @@ import { UnencryptedMessageResponse, } from "../models/native-messaging"; import { BiometricMessage, BiometricAction } from "../types/biometric-message"; -import { isDev, isFlatpak, isMacAppStore, isSnapStore, isWindowsStore } from "../utils"; +import { isAppImage, isDev, isFlatpak, isMacAppStore, isSnapStore, isWindowsStore } from "../utils"; import { ClipboardWriteMessage } from "./types/clipboard"; @@ -119,6 +119,12 @@ const ephemeralStore = { ipcRenderer.invoke("deleteEphemeralValue", key), }; +const localhostCallbackService = { + openSsoPrompt: (codeChallenge: string, state: string): Promise => { + return ipcRenderer.invoke("openSsoPrompt", { codeChallenge, state }); + }, +}; + export default { versions: { app: (): Promise => ipcRenderer.invoke("appVersion"), @@ -129,6 +135,7 @@ export default { isWindowsStore: isWindowsStore(), isFlatpak: isFlatpak(), isSnapStore: isSnapStore(), + isAppImage: isAppImage(), reloadProcess: () => ipcRenderer.send("reload-process"), log: (level: LogLevelType, message?: any, ...optionalParams: any[]) => ipcRenderer.invoke("ipc.log", { level, message, optionalParams }), @@ -179,6 +186,7 @@ export default { nativeMessaging, crypto, ephemeralStore, + localhostCallbackService, }; function deviceType(): DeviceType { diff --git a/apps/desktop/src/platform/services/sso-localhost-callback.service.ts b/apps/desktop/src/platform/services/sso-localhost-callback.service.ts new file mode 100644 index 00000000000..5efe73e2ad8 --- /dev/null +++ b/apps/desktop/src/platform/services/sso-localhost-callback.service.ts @@ -0,0 +1,129 @@ +import * as http from "http"; + +import { ipcMain } from "electron"; +import { firstValueFrom } from "rxjs"; + +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; +import { MessageSender } from "@bitwarden/common/platform/messaging"; + +/** + * The SSO Localhost login service uses a local host listener as fallback in case scheme handling deeplinks does not work. + * This way it is possible to log in with SSO on appimage, snap, and electron dev using the same methods that the cli uses. + */ +export class SSOLocalhostCallbackService { + private ssoRedirectUri = ""; + + constructor( + private environmentService: EnvironmentService, + private messagingService: MessageSender, + ) { + ipcMain.handle("openSsoPrompt", async (event, { codeChallenge, state }) => { + const { ssoCode } = await this.openSsoPrompt(codeChallenge, state); + this.messagingService.send("ssoCallback", { + code: ssoCode, + state: state, + redirectUri: this.ssoRedirectUri, + }); + }); + } + + private async openSsoPrompt( + codeChallenge: string, + state: string, + ): Promise<{ ssoCode: string; orgIdentifier: string }> { + const env = await firstValueFrom(this.environmentService.environment$); + + return new Promise((resolve, reject) => { + const callbackServer = http.createServer((req, res) => { + // after 5 minutes, close the server + setTimeout( + () => { + callbackServer.close(() => reject()); + }, + 5 * 60 * 1000, + ); + + const urlString = "http://localhost" + req.url; + const url = new URL(urlString); + const code = url.searchParams.get("code"); + const receivedState = url.searchParams.get("state"); + const orgIdentifier = this.getOrgIdentifierFromState(receivedState); + res.setHeader("Content-Type", "text/html"); + if (code != null && receivedState != null && this.checkState(receivedState, state)) { + res.writeHead(200); + res.end( + "Success | Bitwarden Desktop" + + "

Successfully authenticated with the Bitwarden desktop app

" + + "

You may now close this tab and return to the app.

" + + "", + ); + callbackServer.close(() => + resolve({ + ssoCode: code, + orgIdentifier: orgIdentifier, + }), + ); + } else { + res.writeHead(400); + res.end( + "Failed | Bitwarden Desktop" + + "

Something went wrong logging into the Bitwarden desktop app

" + + "

You may now close this tab and return to the app.

" + + "", + ); + callbackServer.close(() => reject()); + } + }); + let foundPort = false; + const webUrl = env.getWebVaultUrl(); + for (let port = 8065; port <= 8070; port++) { + try { + this.ssoRedirectUri = "http://localhost:" + port; + callbackServer.listen(port, () => { + this.messagingService.send("launchUri", { + url: + webUrl + + "/#/sso?clientId=" + + "desktop" + + "&redirectUri=" + + encodeURIComponent(this.ssoRedirectUri) + + "&state=" + + state + + "&codeChallenge=" + + codeChallenge, + }); + }); + foundPort = true; + break; + } catch { + // Ignore error since we run the same command up to 5 times. + } + } + if (!foundPort) { + reject(); + } + }); + } + + private getOrgIdentifierFromState(state: string): string { + if (state === null || state === undefined) { + return null; + } + + const stateSplit = state.split("_identifier="); + return stateSplit.length > 1 ? stateSplit[1] : null; + } + + private checkState(state: string, checkState: string): boolean { + if (state === null || state === undefined) { + return false; + } + if (checkState === null || checkState === undefined) { + return false; + } + + const stateSplit = state.split("_identifier="); + const checkStateSplit = checkState.split("_identifier="); + return stateSplit[0] === checkStateSplit[0]; + } +} diff --git a/apps/web/src/app/auth/settings/account/profile.component.ts b/apps/web/src/app/auth/settings/account/profile.component.ts index fa111c9fa6e..a960adfe5de 100644 --- a/apps/web/src/app/auth/settings/account/profile.component.ts +++ b/apps/web/src/app/auth/settings/account/profile.component.ts @@ -62,10 +62,7 @@ export class ProfileComponent implements OnInit, OnDestroy { } submit = async () => { - const request = new UpdateProfileRequest( - this.formGroup.get("name").value, - this.profile.masterPasswordHint, - ); + const request = new UpdateProfileRequest(this.formGroup.get("name").value); await this.apiService.putProfile(request); this.platformUtilsService.showToast("success", null, this.i18nService.t("accountUpdated")); }; diff --git a/apps/web/src/app/auth/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html index 7c3c22b3d7e..b5c8677405f 100644 --- a/apps/web/src/app/auth/settings/change-password.component.html +++ b/apps/web/src/app/auth/settings/change-password.component.html @@ -111,7 +111,7 @@
- +

{{ "upgradePlan" | i18n }}

-
+
{{ "selectAPlan" | i18n }} - - + {{ + "upgradeDiscount" + | i18n + : (this.discountPercentageFromSub > 0 + ? discountPercentageFromSub + : this.discountPercentage) + }} - - - {{ planInterval.name }} {{ - "upgradeDiscount" - | i18n - : (this.discountPercentageFromSub > 0 - ? discountPercentageFromSub - : this.discountPercentage) - }} + - - + + {{ planInterval.name }} + + +
+
-
- {{ "selected" | i18n }} -
-

- {{ selectableProduct.nameLocalizationKey | i18n }} +

+ {{ + selectableProduct.nameLocalizationKey | i18n + }} + + {{ "current" | i18n }}

+

+ {{ "bitwardenPasswordManager" | i18n }} +

{{ "upgradeEnterpriseMessage" | i18n }}

-

{{ "includeAllTeamsFeatures" | i18n }}

-
    -
  • + +
      +
    • + {{ "includeEnterprisePolicies" | i18n }}
    • -
    • - {{ "includeSsoAuthenticationMessage" | i18n }} +
    • + + {{ "passwordLessSso" | i18n }} +
    • +
    • + + {{ "accountRecovery" | i18n }} +
    • +
    • + + {{ "customRoles" | i18n }} +
    • +
    + +

    + {{ "bitwardenSecretsManager" | i18n }} +

    +
      +
    • + + {{ "unlimitedSecretsStorage" | i18n }} +
    • +
    • + + {{ "unlimitedUsers" | i18n }} +
    • +
    • + + {{ "unlimitedProjects" | i18n }} +
    • +
    • + + {{ "UpTo50MachineAccounts" | i18n }}
    • -
    • {{ "optionalOnPremHosting" | i18n }}
    @@ -153,6 +186,12 @@
+

+ {{ "bitwardenPasswordManager" | i18n }} +

{{ "upgradeFamilyMessage" | i18n }}

-
    -
  • - {{ "limitedUsers" | i18n: selectableProduct.PasswordManager.maxSeats }} +
      +
    • + + {{ "premiumAccounts" | i18n }}
    • -
    • - {{ "teamsInviteMessage" | i18n }} +
    • + + {{ "unlimitedSharing" | i18n }}
    • -
    • - {{ - "chooseMonthlyOrAnnualBilling" - | i18n: selectableProduct.PasswordManager.maxCollections - }} +
    • + + {{ "unlimitedCollections" | i18n }}
    • -
    • - {{ "createUnlimitedCollections" | i18n }} +
    +
      +
    • + + {{ "secureDataSharing" | i18n }}
    • -
    • - {{ "accessToCreateGroups" | i18n }} +
    • + + {{ "eventLogMonitoring" | i18n }}
    • -
    • - {{ "syncGroupsAndUsersFromDirectory" | i18n }} +
    • + + {{ "directoryIntegration" | i18n }}
    • -
    • - {{ "accessToPremiumFeatures" | i18n }} +
    +

    + {{ "bitwardenSecretsManager" | i18n }} +

    +
      +
    • + + {{ "unlimitedSecretsStorage" | i18n }}
    • -
    • - {{ "priorityCustomerSupport" | i18n }} +
    • + + {{ "unlimitedProjects" | i18n }}
    • -
    • - {{ "optionalOnPremHosting" | i18n }} +
    • + + {{ "UpTo20MachineAccounts" | i18n }}
+
+ + {{ "secretsManagerSubInfo" | i18n }} + + + {{ "secretsManagerWithFreePasswordManagerInfo" | i18n }} + +
-

{{ "paymentMethod" | i18n }}

@@ -237,16 +322,327 @@ >

- -
+ +
+

+ {{ "passwordManager" | i18n }} +

+

+ + {{ passwordManagerSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.PasswordManager.basePrice / 12 + : selectedPlan.PasswordManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + + + + {{ + selectedPlan.PasswordManager.basePrice | currency: "$" + }} + {{ "freeWithSponsorship" | i18n }} + + + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ passwordManagerSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }} + +

+

+ + {{ 0 }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} + /{{ "year" | i18n }} + + {{ 0 | currency: "$" }} +

+ +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ sub?.smSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.SecretsManager.basePrice / 12 + : selectedPlan.SecretsManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ secretsManagerSeatTotal(selectedPlan, sub.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan?.SecretsManager?.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+
+ +

+ {{ "passwordManager" | i18n }} +

- {{ selectedPlan.PasswordManager.baseSeats }} + {{ "basePrice" | i18n }}: + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.PasswordManager.basePrice | currency: "$" }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ passwordManagerSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }} + +

+

+ + {{ 0 }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} + /{{ "month" | i18n }} + + {{ 0 | currency: "$" }} +

+ +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ "basePrice" | i18n }}: + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ secretsManagerSeatTotal(selectedPlan, sub?.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+
+
+ +
+ + +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ sub?.smSeats }} + {{ "members" | i18n }} × + {{ + (selectedPlan.isAnnual + ? selectedPlan.SecretsManager.basePrice / 12 + : selectedPlan.SecretsManager.basePrice + ) | currency: "$" + }} + /{{ "year" | i18n }} + +

+

+ + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats || 0 }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "year" | i18n }} + + + + {{ secretsManagerSeatTotal(selectedPlan, sub.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} + {{ "additionalStorageGbMessage" | i18n }} + × + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} + + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+ +

+ {{ "passwordManager" | i18n }} +

+

+ + {{ organization.seats }} {{ "members" | i18n }} × {{ (selectedPlan.isAnnual @@ -284,26 +680,77 @@ /{{ "year" | i18n }} - + + {{ "freeForOneYear" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }}

+
+ + +

+ {{ "secretsManager" | i18n }} +

+

+ + {{ "basePrice" | i18n }}: + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + {{ "monthAbbr" | i18n }} + + + {{ selectedPlan.SecretsManager.basePrice | currency: "$" }} + +

- {{ 0 }} + {{ "additionalUsers" | i18n }}: + {{ sub?.smSeats }}  + {{ "members" | i18n }} + × + {{ selectedPlan.SecretsManager.seatPrice | currency: "$" }} + /{{ "month" | i18n }} + + + {{ secretsManagerSeatTotal(selectedPlan, sub?.smSeats) | currency: "$" }} + +

+

+ + {{ additionalServiceAccount }} {{ "additionalStorageGbMessage" | i18n }} × - {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} - /{{ "year" | i18n }} + {{ selectedPlan.SecretsManager.additionalPricePerServiceAccount | currency: "$" }} + /{{ "month" | i18n }} - {{ 0 | currency: "$" }} + {{ additionalServiceAccountTotal(selectedPlan) | currency: "$" }} +

+ +

+ {{ "passwordManager" | i18n }}

-
-

{{ "additionalUsers" | i18n }}: - {{ formGroup.controls["additionalSeats"].value || 0 }}  + {{ organization.seats }}  {{ "members" | i18n }} × {{ selectedPlan.PasswordManager.seatPrice | currency: "$" }} /{{ "month" | i18n }} - + + {{ "freeForOneYear" | i18n }} + + + {{ passwordManagerSeatTotal(selectedPlan) | currency: "$" }}

-

- - {{ 0 }} - {{ "additionalStorageGbMessage" | i18n }} - × - {{ selectedPlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }} - /{{ "month" | i18n }} - - {{ 0 | currency: "$" }} -

-