diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index bd96b388c6a..e91fba2e87a 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -312,6 +312,7 @@ jobs: cosign sign --yes ${images} - name: Scan Docker image + if: ${{ needs.setup.outputs.has_secrets == 'true' }} id: container-scan uses: anchore/scan-action@869c549e657a088dc0441b08ce4fc0ecdac2bb65 # v5.3.0 with: @@ -320,9 +321,12 @@ jobs: output-format: sarif - name: Upload Grype results to GitHub + if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: github/codeql-action/upload-sarif@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2 with: sarif_file: ${{ steps.container-scan.outputs.sarif }} + sha: ${{ contains(github.event_name, 'pull_request') && github.event.pull_request.head.sha || github.sha }} + ref: ${{ contains(github.event_name, 'pull_request') && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }} - name: Log out of Docker run: docker logout diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index c5e189c4666..77b66ba8bf1 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -49,6 +49,8 @@ jobs: uses: github/codeql-action/upload-sarif@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2 with: sarif_file: cx_result.sarif + sha: ${{ contains(github.event_name, 'pull_request') && github.event.pull_request.head.sha || github.sha }} + ref: ${{ contains(github.event_name, 'pull_request') && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }} quality: name: Quality scan diff --git a/apps/browser/package.json b/apps/browser/package.json index e3bccf3f0df..5a8ddd03b41 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.3.0", + "version": "2025.3.1", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 916c6cb6a67..4c051d455ac 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 007428ed073..6f3ace453ae 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Heç nə seçməmisiniz." }, - "movedItemsToOrg": { - "message": "Seçilən elementlər $ORGNAME$ təşkilatına daşınıldı", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Elementlər bura daşındı: $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 9e5449f7bd4..905f6b6ac1d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Вы пакуль нічога не выбралі." }, - "movedItemsToOrg": { - "message": "Выбраныя элементы перамешчаны ў $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 703007d2565..226e63e32cb 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Не сте избрали нищо." }, - "movedItemsToOrg": { - "message": "Избраните записи бяха преместени в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Елементите са преместени в $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index f3af2810d3c..983b9fadde4 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 7dd00c873f3..08fedb6f10a 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 4513104a1b9..14e4a577440 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "No heu seleccionat res." }, - "movedItemsToOrg": { - "message": "Els elements seleccionats s'han desplaçat a $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "S'han desplaçat elements a $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 78ccaad05a0..e106d371d57 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Nevybrali jste žádné položky." }, - "movedItemsToOrg": { - "message": "Vybrané položky přesunuty do $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Položky přesunuty do $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 0eff6912205..83d09d13273 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 0ff62a56ee1..69c8b28d29a 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Ingenting er valgt." }, - "movedItemsToOrg": { - "message": "Valgte emner flyttet til $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Emner flyttet til $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 581b7611391..a7439db6432 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -380,7 +380,7 @@ "message": "Ordner bearbeiten" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Ordner bearbeiten: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -1668,7 +1668,7 @@ "message": "Zum Sortieren ziehen" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Ziehen zum Umsortieren" }, "cfTypeText": { "message": "Text" @@ -4671,7 +4671,7 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Website-URI umsortieren. Verwende die Pfeiltasten, um den Eintrag nach oben oder unten zu bewegen." }, "reorderFieldUp": { "message": "$LABEL$ nach oben verschoben, Position $INDEX$ von $LENGTH$", @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Du hast nichts ausgewählt." }, - "movedItemsToOrg": { - "message": "Ausgewählte Einträge in $ORGNAME$ verschoben", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Einträge verschoben nach $ORGNAME$", "placeholders": { @@ -5105,31 +5096,31 @@ "message": "Extra breit" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Dein eingegebenes Passwort ist falsch." }, "importSshKey": { - "message": "Import" + "message": "Importieren" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Passwort bestätigen" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Gib das Passwort für den SSH-Schlüssel ein." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Passwort eingeben" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Der SSH-Schlüssel ist ungültig" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Der SSH-Schlüsseltyp wird nicht unterstützt" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Schlüssel aus Zwischenablage importieren" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH-Schlüssel erfolgreich importiert" }, "cannotRemoveViewOnlyCollections": { "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 59206965632..fc07f12a48f 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Δεν έχετε επιλέξει τίποτα." }, - "movedItemsToOrg": { - "message": "Τα επιλεγμένα αντικείμενα μετακινήθηκαν στο $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Τα αντικείμενα μεταφέρθηκαν στο $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 5513d11ad18..1381afbdc6e 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index d26a68f0088..6b14a358148 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index abe8453e7b5..4d430d23337 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 4a4ee1fb4ae..2daf5f9d7f0 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index f3a775e11c3..b1e1ca3526b 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index ac15eb203ae..2b3d66ad104 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 0175aeea535..a37bd0235c1 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Et ole valinnut mitään." }, - "movedItemsToOrg": { - "message": "Valitut kohteet siirrettiin organisaatiolle $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Kohteet siirrettiin organisaatiolle $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index a186f0ad66a..9f991843f4f 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index f694c0bb4dd..32b6dd0296b 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Vous n'avez rien sélectionné." }, - "movedItemsToOrg": { - "message": "Les éléments sélectionnés ont été déplacés vers $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Éléments déplacés vers $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 83133349aee..6c0b9cce87b 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Non tes nada seleccionado." }, - "movedItemsToOrg": { - "message": "Entradas seleccionadas transferidas a $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Entradas transferidas a $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 86b6239d9b4..035bf9da48e 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -123,7 +123,7 @@ "message": "הגדרות" }, "currentTab": { - "message": "כרטיסייה נוכחית" + "message": "כרטיסיה נוכחית" }, "copyPassword": { "message": "העתק סיסמה" @@ -796,7 +796,7 @@ "message": "החשבון החדש שלך נוצר!" }, "youHaveBeenLoggedIn": { - "message": "נכנסת!" + "message": "אתה נכנסת!" }, "youSuccessfullyLoggedIn": { "message": "נכנסת בהצלחה" @@ -1217,7 +1217,7 @@ "message": "הקובץ מכיל את פרטי הכספת שלך בפורמט לא מוצפן. מומלץ להעביר את הקובץ רק בדרכים מוצפנות, ומאוד לא מומלץ לשמור או לשלוח את הקובץ הזה בדרכים לא מוצפנות (כדוגמת סתם אימייל). מחק את הקובץ מיד לאחר שסיימת את השימוש בו." }, "encExportKeyWarningDesc": { - "message": "ייצוא זה מצפין את הנתונים שלך באמצעות מפתח ההצפנה של חשבונך. אם אי פעם תבצע סיבוב (רוטציה) למפתח ההצפנה של חשבונך, תצטרך לייצא שוב משום שלא תוכל לפענח קובץ ייצוא זה." + "message": "ייצוא זה מצפין את הנתונים שלך באמצעות מפתח ההצפנה של חשבונך. אם אי פעם תבצע סיבוב למפתח ההצפנה של חשבונך, תצטרך לייצא שוב משום שלא תוכל לפענח קובץ ייצוא זה." }, "encExportAccountWarningDesc": { "message": "מפתחות הצפנת חשבון הם ייחודים לכל חשבון משתמש של Bitwarden, לכן אינך יכול לייבא ייצוא מוצפן אל תוך חשבון אחר." @@ -1444,13 +1444,13 @@ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, "webAuthnNewTab": { - "message": "על מנת להתחיל אימות WebAuthn דו־שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסייה חדשה ועקוב אחר ההוראות המסופקת בכרטיסייה החדשה." + "message": "על מנת להתחיל אימות WebAuthn דו־שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסיה חדשה ועקוב אחר ההוראות המסופקת בכרטיסיה החדשה." }, "webAuthnNewTabOpen": { - "message": "פתח כרטיסייה חדשה" + "message": "פתח כרטיסיה חדשה" }, "openInNewTab": { - "message": "פתח בכרטיסייה חדשה" + "message": "פתח בכרטיסיה חדשה" }, "webAuthnAuthenticate": { "message": "אמת WebAuthn" @@ -1477,7 +1477,7 @@ "message": "בחר שיטת כניסה דו־שלבית" }, "recoveryCodeDesc": { - "message": "איבדת גישה לכל הספקים הדו־גורמיים שלך? השתמש בקוד השחזור שלך כדי להשבית את כל הספקים הדו־גורמיים בחשבון שלך." + "message": "איבדת גישה לכל הספקים הדו־גורמיים שלך? השתמש בקוד השחזור שלך כדי לכבות את כל הספקים הדו־גורמיים מהחשבון שלך." }, "recoveryCodeTitle": { "message": "קוד שחזור" @@ -2834,7 +2834,7 @@ "message": "עדכן סיסמה ראשית" }, "updateMasterPasswordWarning": { - "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." + "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "updateWeakMasterPasswordWarning": { "message": "הסיסמה הראשית שלך אינה עומדת באחת או יותר מפוליסות הארגון שלך. כדי לגשת לכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. בהמשך תנותק מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." @@ -3665,7 +3665,7 @@ "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { - "message": "פתח או סגור ניווט צדדי" + "message": "החלף מצב ניווט צדדי" }, "skipToContent": { "message": "דלג לתוכן" @@ -3926,7 +3926,7 @@ "message": "אשר סיסמת קובץ" }, "exportSuccess": { - "message": "נתוני כספת יוצאו" + "message": "נתוני הכספת יוצאו" }, "typePasskey": { "message": "מפתח גישה" @@ -3935,7 +3935,7 @@ "message": "ניגש אל" }, "loggedInExclamation": { - "message": "מחובר!" + "message": "נכנסת!" }, "passkeyNotCopied": { "message": "מפתח גישה לא יועתק" @@ -4310,7 +4310,7 @@ "message": "העתק כתובת" }, "adminConsole": { - "message": "מסוף ניהול" + "message": "מסוף מנהל" }, "accountSecurity": { "message": "אבטחת החשבון" @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "לא בחרת כלום." }, - "movedItemsToOrg": { - "message": "פריטים נבחרים הועברו אל $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "פריטים הועברו אל $ORGNAME$", "placeholders": { @@ -4841,7 +4832,7 @@ "message": "תוכן נוסף זמין" }, "fileSavedToDevice": { - "message": "קובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." + "message": "הקובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." }, "showCharacterCount": { "message": "הצג מונה תווים" diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 3a7a5fdf591..748d9eb966b 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index b0c865e6321..b88fc45493f 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -81,7 +81,7 @@ "message": "Podsjetnik glavne lozinke (neobavezno)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Ocjena jačine lozinke: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -186,7 +186,7 @@ "message": "Kopiraj bilješke" }, "copy": { - "message": "Copy", + "message": "Kopiraj", "description": "Copy to clipboard" }, "fill": { @@ -380,7 +380,7 @@ "message": "Uredi mapu" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Uredi mapu: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -653,7 +653,7 @@ "message": "Web preglednik ne podržava jednostavno kopiranje međuspremnika. Umjesto toga ručno kopirajte." }, "verifyYourIdentity": { - "message": "Verify your identity" + "message": "Potvrdi svoj identitet" }, "weDontRecognizeThisDevice": { "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." @@ -869,19 +869,19 @@ "message": "Prijavi se u Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Unesi kôd poslan e-poštom" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Unesi kôd iz svoje aplikacije za autentifikaciju" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Za autentifikaciju dodirni svoj YubiKey" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Za tvoj je račun potrebna Duo prijava u dva koraka. Za dovršetak prijave, slijedi daljnje korake." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Prati korake za dovršetak prijave." }, "restartRegistration": { "message": "Ponovno pokreni registraciju" @@ -905,7 +905,7 @@ "message": "Ne" }, "location": { - "message": "Location" + "message": "Lokacija" }, "unexpectedError": { "message": "Došlo je do neočekivane pogreške." @@ -1040,7 +1040,7 @@ "message": "Klikni stavke za auto-ispunu na prikazu trezora" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Kliknite stavku u prijedlogu auto-ispune za popunjavanje" }, "clearClipboard": { "message": "Očisti međuspremnik", @@ -1057,7 +1057,7 @@ "message": "Spremi" }, "loginSaveSuccessDetails": { - "message": "$USERNAME$ saved to Bitwarden.", + "message": "$USERNAME$ spremljeno u Bitwarden.", "placeholders": { "username": { "content": "$1" @@ -1066,7 +1066,7 @@ "description": "Shown to user after login is saved." }, "loginUpdatedSuccessDetails": { - "message": "$USERNAME$ updated in Bitwarden.", + "message": "$USERNAME$ ažurirano u Bitwardenu.", "placeholders": { "username": { "content": "$1" @@ -1075,35 +1075,35 @@ "description": "Shown to user after login is updated." }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Spremi novu prijavu", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Ažuriraj prijavu", "description": "Button text for updating an existing login entry." }, "saveLoginPrompt": { - "message": "Save login?", + "message": "Spremiti prijavu?", "description": "Prompt asking the user if they want to save their login details." }, "updateLoginPrompt": { - "message": "Update existing login?", + "message": "Ažurirati postojeću prijavu?", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "Prijava spremljena", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "Prijava ažurirana", "description": "Message displayed when login details are successfully updated." }, "saveFailure": { - "message": "Error saving", + "message": "Greška kod spremanja", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "Ups! Nismo mogli ovo spasiti. Pokušaj ručno unijeti detalje.", "description": "Detailed error message shown when saving login details fails." }, "enableChangedPasswordNotification": { @@ -1422,7 +1422,7 @@ "message": "Zapamti me" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Ne pitaj na ovom uređaju idućih 30 dana" }, "sendVerificationCodeEmailAgain": { "message": "Ponovno slanje kontrolnog koda e-poštom" @@ -1431,11 +1431,11 @@ "message": "Koristiti drugi način prijave dvostrukom autentifikacijom" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Odaberi drugi način", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Koristi kôd za oporavak" }, "insertYubiKey": { "message": "Umetni svoj YubiKey u USB priključak računala, a zatim dodirni njegovu tipku." @@ -1450,16 +1450,16 @@ "message": "Otvori novu karticu" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Otvori u novoj kartici" }, "webAuthnAuthenticate": { "message": "Ovjeri WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Pročitaj sigurnosni ključ" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Čekanje na interakciju sa sigurnosnim ključem..." }, "loginUnavailable": { "message": "Prijava nije dostupna" @@ -1474,7 +1474,7 @@ "message": "Mogućnosti prijave dvostrukom autentifikacijom" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Odaberi način prijave dvostrukom autentifikacijom" }, "recoveryCodeDesc": { "message": "Izgubljen je pristup uređaju za dvostruku autentifikaciju? Koristi svoj kôd za oporavak za onemogućavanje svih pružatelja usluga dvostruke autentifikacije na tvojem računu." @@ -1668,7 +1668,7 @@ "message": "Povuci za sortiranje" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Povuci za premještanje" }, "cfTypeText": { "message": "Tekst" @@ -2164,7 +2164,7 @@ "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'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Prilagodba trezora" }, "vaultTimeoutAction": { "message": "Nakon isteka trezora" @@ -2173,13 +2173,13 @@ "message": "Radnja nakon isteka " }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Nove mogućnosti prilagodbe" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "Prilagodi svoje iskustvo trezora brzim kopiranjem, kompaktnim načinom rada i više!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Pogledaj sve postavke izgleda" }, "lock": { "message": "Zaključaj", @@ -2476,7 +2476,7 @@ "message": "Rizične lozinke" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ traži da promijeniš jednu rizičnu lozinku.", "placeholders": { "organization": { "content": "$1", @@ -2485,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Broj rizičnih lozinki koje $ORGANIZATION$ traži da promijeniš: $COUNT$.", "placeholders": { "organization": { "content": "$1", @@ -2498,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Broj rizičnih lozinki koje tvoja orgnaizacija traži da promijeniš: $COUNT$.", "placeholders": { "count": { "content": "$1", @@ -2525,34 +2525,34 @@ "message": "Ažuriraj svoje postavke kako za brzu auto-ispunu svojih lozinki i generiranje novih" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Pregledaj rizične prijave" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Pregdledaj rizične lozinke" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Lozinke tvoje organizacije su rizične jer su slabe, nanovo korištene i/ili iscurile.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAlt": { - "message": "Illustration of a list of logins that are at-risk" + "message": "Ilustracija liste rizičnih prijava" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Brzo generiraj jake, jedinstvene lozinke koristeći Bitwarden dijalog auto-ispune direktno na stranici.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAlt": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password" + "message": "Ilustracija Bitwarden dijalog auto-ispune s prikazom generirane lozinke" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Ažuriraj u Bitwardenu" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden će te pitati treba li ažurirati lozinku u upravitelju lozinki.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAlt": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" + "message": "Ilustracija Bitwarden upita za ažuriranje prijave" }, "turnOnAutofill": { "message": "Uključi auto-ispunu" @@ -3168,7 +3168,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ je odbio tvoj zahtjev. Obrati se svom pružatelju usluga za pomoć.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3178,7 +3178,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ je odbio tvoj zahtjev: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -4080,7 +4080,7 @@ "message": "Aktivni račun" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Bitwarden račun" }, "availableAccounts": { "message": "Dostupni računi" @@ -4281,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Kopiraj $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4671,7 +4671,7 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Ponovno poredaj URI. Koristi tipke sa strelicom za pomicanje stavke gore ili dolje." }, "reorderFieldUp": { "message": "$LABEL$ pomaknut gore, pozicija $INDEX$ od $LENGTH$", @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Ništa nije odabrano." }, - "movedItemsToOrg": { - "message": "Odabrane stavke premještene u $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Stavke premještene u $ORGNAME$", "placeholders": { @@ -5105,31 +5096,31 @@ "message": "Ekstra široko" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Unesena lozinka nije ispravna." }, "importSshKey": { - "message": "Import" + "message": "Uvoz" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Potvrdi lozinku" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Unesi lozinku za SSH ključ." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Unesi lozinku" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH ključ nije valjan" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Tip SSH ključa nije podržan" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Uvezi ključ iz međuspremnika" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH ključ uspješno uvezen" }, "cannotRemoveViewOnlyCollections": { "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", @@ -5147,6 +5138,6 @@ "message": "Za korištenje biometrijskog otključavanja ažuriraj desktop aplikaciju ili nemogući otključavanje otiskom prsta u desktop aplikaciji." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Promijeni rizičnu lozinku" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 066bb669552..80b1dbf095d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 4056b5ca09b..0146fb2a000 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -186,7 +186,7 @@ "message": "Salin catatan" }, "copy": { - "message": "Copy", + "message": "Salin", "description": "Copy to clipboard" }, "fill": { @@ -380,7 +380,7 @@ "message": "Sunting Folder" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Sunting folder: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -462,16 +462,16 @@ "message": "Buat frasa sandi" }, "passwordGenerated": { - "message": "Password generated" + "message": "Kata sandi dibuat" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Frasa sandi dibuat" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nama pengguna dibuat" }, "emailGenerated": { - "message": "Email generated" + "message": "Surel dibuat" }, "regeneratePassword": { "message": "Buat Ulang Kata Sandi" @@ -653,7 +653,7 @@ "message": "Peramban Anda tidak mendukung menyalin clipboard dengan mudah. Salin secara manual." }, "verifyYourIdentity": { - "message": "Verify your identity" + "message": "Verifikasikan identitas Anda" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -905,7 +905,7 @@ "message": "Tidak" }, "location": { - "message": "Location" + "message": "Lokasi" }, "unexpectedError": { "message": "Terjadi kesalahan yang tak diduga." @@ -2461,7 +2461,7 @@ "message": "Change this in settings" }, "change": { - "message": "Change" + "message": "Ubah" }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -4793,7 +4784,7 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "Tindakan akun" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" @@ -4802,22 +4793,22 @@ "message": "Show quick copy actions on Vault" }, "systemDefault": { - "message": "System default" + "message": "Baku sistem" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Persyaratan kebijakan perusahaan telah diterapkan ke pengaturan ini" }, "sshPrivateKey": { - "message": "Private key" + "message": "Kunci privat" }, "sshPublicKey": { - "message": "Public key" + "message": "Kunci publik" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Sidik jari" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Tipe kunci" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -4832,7 +4823,7 @@ "message": "RSA 4096-Bit" }, "retry": { - "message": "Retry" + "message": "Coba lagi" }, "vaultCustomTimeoutMinimum": { "message": "Minimum custom timeout is 1 minute." @@ -5084,16 +5075,16 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Tidak" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Ya, saya dapat mengakses surel saya secara handla" }, "turnOnTwoStepLogin": { "message": "Turn on two-step login" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Ubah surel akun" }, "extensionWidth": { "message": "Lebar ekstensi" @@ -5105,31 +5096,31 @@ "message": "Ekstra lebar" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Kata sandi yang Anda masukkan tidak benar." }, "importSshKey": { - "message": "Import" + "message": "Impor" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Konfirmasi kata sandi" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Masukkan kata sandi untuk kunci SSH." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Masukkan kata sandi" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Kunci SSH tidak valid" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Tipe kunci SSH tidak didukung" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Impor kunci dari papan klip" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Kunci SSH sukses diimpor" }, "cannotRemoveViewOnlyCollections": { "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", @@ -5141,12 +5132,12 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Harap perbarui aplikasi desktop Anda" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Untuk memakai pembuka kunci biometrik, harap perbarui aplikasi desktop Anda, atau matikan buka kunci sidik jari dalam pengaturan desktop." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Ubah kata sandi yang berrisiko" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 813da3582f9..cb8e414ca37 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Non hai selezionato nulla." }, - "movedItemsToOrg": { - "message": "Elementi selezionati spostati in $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Elementi spostati su $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 7043070d899..b67d0b62a6e 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "何も選択されていません。" }, - "movedItemsToOrg": { - "message": "選択したアイテムを $ORGNAME$ に移動しました", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "アイテムを $ORGNAME$ に移動しました", "placeholders": { diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 930ef958484..818d7cdcd19 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 2d22e32fa86..c8aff3a6488 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 304124dacb0..cd54ac47506 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "아무것도 선택하지 않았습니다." }, - "movedItemsToOrg": { - "message": "선택한 항목이 $ORGNAME$(으)로 이동됨", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "항목들이 $ORGNAME$로 이동했습니다", "placeholders": { diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index a504f44cf59..8bf8a8f7518 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index b41c0968770..7b5f077f69d 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Nekas nav atlasīts." }, - "movedItemsToOrg": { - "message": "Atzīmētie vienumi pārvietoti uz $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Vienumi pārvietoti uz $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 3ed24789099..24a096db0ef 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index da46837ab94..9a49998d3d9 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 6df109cadd7..0ff4ed9486a 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Du har ikke valgt noe." }, - "movedItemsToOrg": { - "message": "De valgte gjenstandene ble flyttet til $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 4b099100bb3..1c2b09ca3e3 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -81,7 +81,7 @@ "message": "Hoofdwachtwoordhint (optioneel)" }, "passwordStrengthScore": { - "message": "Score wachtwoordsterkte $SCORE$", + "message": "Wachtwoordsterkte score $SCORE$", "placeholders": { "score": { "content": "$1", @@ -878,10 +878,10 @@ "message": "Druk op je YubiKey om te verifiëren" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Jouw account vereist Duo-tweestapsaanmelding. Volg de onderstaande stappen om het inloggen te voltooien." + "message": "Jouw account vereist Duo tweestapslogin. Volg de onderstaande stappen om het inloggen te voltooien." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Volg de onderstaande stappen om in te loggen." + "message": "Volg de onderstaande stappen om het inloggen af te ronden." }, "restartRegistration": { "message": "Registratie herstarten" @@ -1040,7 +1040,7 @@ "message": "Klik op items om automatisch in te vullen op de kluisweergave" }, "clickToAutofill": { - "message": "Klik op gesuggereerde items om deze automatisch invullen" + "message": "Klik items in de automatisch invullen suggestie om in te vullen" }, "clearClipboard": { "message": "Klembord wissen", @@ -1075,7 +1075,7 @@ "description": "Shown to user after login is updated." }, "saveAsNewLoginAction": { - "message": "Als nieuwe login opslaan", + "message": "Opslaan als nieuwe login", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { @@ -1422,7 +1422,7 @@ "message": "Mijn gegevens onthouden" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "30 dagen niet meer vragen op dit apparaat" + "message": "30 dagen niet opnieuw vragen op dit apparaat" }, "sendVerificationCodeEmailAgain": { "message": "E-mail met verificatiecode opnieuw versturen" @@ -1459,7 +1459,7 @@ "message": "Beveiligingssleutel lezen" }, "awaitingSecurityKeyInteraction": { - "message": "Wacht op interactie met beveiligingssleutel..." + "message": "Wacht op interactie met beveiligingssleutel…" }, "loginUnavailable": { "message": "Login niet beschikbaar" @@ -1474,7 +1474,7 @@ "message": "Opties voor tweestapsaanmelding" }, "selectTwoStepLoginMethod": { - "message": "Kies methode voor tweestapsaanmelding" + "message": "Kies methode voor tweestapslogin" }, "recoveryCodeDesc": { "message": "Ben je de toegang tot al je tweestapsaanbieders verloren? Gebruik dan je herstelcode om alle tweestapsaanbieders op je account uit te schakelen." @@ -2164,7 +2164,7 @@ "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'" }, "vaultCustomization": { - "message": "Kluis-aanpassingen" + "message": "Kluis aanpassingen" }, "vaultTimeoutAction": { "message": "Actie bij time-out" @@ -2176,10 +2176,10 @@ "message": "Nieuwe aanpassingsopties" }, "newCustomizationOptionsCalloutContent": { - "message": "Personaliseer je kluiservaring met snelle kopieeracties, compacte modus en meer!" + "message": "Pas je kluis ervaring aan met snelle kopieeracties, compacte modus en meer!" }, "newCustomizationOptionsCalloutLink": { - "message": "Alle personalisatie-instellingen bekijken" + "message": "Alle weergave-instellingen bekijken" }, "lock": { "message": "Vergrendelen", @@ -2498,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Je organisatie(s) vragen je de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", + "message": "Je organisaties vragen je de $COUNT$ wachtwoorden te wijzigen omdat ze een risico vormen.", "placeholders": { "count": { "content": "$1", @@ -2531,14 +2531,14 @@ "message": "Risicovolle wachtwoorden bekijken" }, "reviewAtRiskLoginsSlideDesc": { - "message": "De wachtwoorden van je organisatie zijn in gevaar omdat ze zwak, hergebruikt en/of blootgelegd zijn.", + "message": "De wachtwoorden van je organisatie zijn in gevaar omdat ze zwak, hergebruikt en/of gelekt zijn.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAlt": { "message": "Voorbeeld van een lijst van risicovolle logins" }, "generatePasswordSlideDesc": { - "message": "Genereer snel een sterk, uniek wachtwoord met het automatisch invulmenu van Bitwaren op de risicovolle website.", + "message": "Genereer snel een sterk, uniek wachtwoord met het automatisch invulmenu van Bitwarden op de risicovolle website.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAlt": { @@ -2552,7 +2552,7 @@ "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAlt": { - "message": "Voorbeeld van een Bitwarden-melding die de gebruiker aanspoort tot het bijwerken van de login" + "message": "Voorbeeld van een Bitwarden melding die de gebruiker aanspoort tot het bijwerken van de login" }, "turnOnAutofill": { "message": "Automatisch invullen inschakelen" @@ -4080,7 +4080,7 @@ "message": "Actief account" }, "bitwardenAccount": { - "message": "Bitwarden-account" + "message": "Bitwarden account" }, "availableAccounts": { "message": "Beschikbare accounts" @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Je hebt niets geselecteerd." }, - "movedItemsToOrg": { - "message": "Geselecteerde items verplaatst naar $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items verplaatst naar $ORGNAME$", "placeholders": { @@ -5105,7 +5096,7 @@ "message": "Extra breed" }, "sshKeyWrongPassword": { - "message": "Het door jou ingevoerde wachtwoord is onjuist." + "message": "Het wachtwoord dat je hebt ingevoerd is onjuist." }, "importSshKey": { "message": "Importeren" @@ -5126,7 +5117,7 @@ "message": "Het type SSH-sleutel is niet ondersteund" }, "importSshKeyFromClipboard": { - "message": "Sleutel van klembord importeren" + "message": "Sleutel importeren van klembord" }, "sshKeyImported": { "message": "SSH-sleutel succesvol geïmporteerd" diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index fbca7ef1988..f4c1303bd18 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Nie zaznaczyłeś żadnych elementów." }, - "movedItemsToOrg": { - "message": "Zaznaczone elementy zostały przeniesione do $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Elementy przeniesione do $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index d4ce34de17c..0b5d569f443 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Você selecionou nada." }, - "movedItemsToOrg": { - "message": "Itens selecionados movidos para $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Itens movidos para $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index a9ab857ae67..c1f1f51609c 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Não selecionou nada." }, - "movedItemsToOrg": { - "message": "Itens selecionados movidos para $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Itens movidos para $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 402a2e82559..5ce73eb2e49 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index e2a1faf9885..11d8de4acbe 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -878,7 +878,7 @@ "message": "Нажмите на YubiKey для аутентификации" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo. Выполните следующие действия, чтобы завершить авторизацию." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." @@ -1040,7 +1040,7 @@ "message": "Кликните элементы для автозаполнения в режиме просмотра хранилища" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Выберите элементы в предложении автозаполнения для вставки" }, "clearClipboard": { "message": "Очистить буфер обмена", @@ -2164,7 +2164,7 @@ "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'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Настройка хранилища" }, "vaultTimeoutAction": { "message": "Действие по тайм-ауту хранилища" @@ -2476,7 +2476,7 @@ "message": "Пароли, подверженные риску" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ запрашивает смену одного пароля, так как он находится под угрозой.", + "message": "$ORGANIZATION$ запрашивает смену одного пароля, так как он подвержен риску.", "placeholders": { "organization": { "content": "$1", @@ -2485,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", + "message": "$ORGANIZATION$ запрашивает смену $COUNT$ паролей, так как они подвержены риску.", "placeholders": { "organization": { "content": "$1", @@ -2498,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Ваша организация запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", + "message": "Ваша организация запрашивает смену $COUNT$ паролей, так как они подвержены риску.", "placeholders": { "count": { "content": "$1", @@ -2507,10 +2507,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Проверить и изменить один пароль, подверженный риску" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Проверить и изменить $COUNT$ паролей, подверженных риску", "placeholders": { "count": { "content": "$1", @@ -2519,26 +2519,26 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Меняйте пароли, подверженные риску, быстрее" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Обновите настройки, чтобы можно было быстро автоматически заполнять пароли и генерировать новые" }, "reviewAtRiskLogins": { - "message": "Обзор логинов, находящихся под угрозой" + "message": "Обзор логинов, подверженных риску" }, "reviewAtRiskPasswords": { - "message": "Обзор паролей, находящихся под угрозой" + "message": "Обзор паролей, подверженных риску" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Пароли вашей организации находятся под угрозой, потому что они слабые, повторно используются и/или раскрыты.", + "message": "Пароли вашей организации подвержены риску, потому что они слабые, повторно используются и/или раскрыты.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAlt": { - "message": "Иллюстрация списка логинов, которые находятся под угрозой" + "message": "Иллюстрация списка логинов, которые подвержены риску" }, "generatePasswordSlideDesc": { - "message": "Быстро сгенерируйте надежный уникальный пароль с помощью меню автозаполнения Bitwarden на сайте, находящемся под угрозой.", + "message": "Быстро сгенерируйте надежный уникальный пароль с помощью меню автозаполнения Bitwarden на сайте, подверженном риску.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAlt": { @@ -2555,13 +2555,13 @@ "message": "Иллюстрация уведомления Bitwarden, предлагающего пользователю обновить логин" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Включить автозаполнение" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Автозаполнение включено" }, "dismiss": { - "message": "Dismiss" + "message": "Отклонить" }, "websiteItemLabel": { "message": "Сайт $number$ (URI)", @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Вы ничего не выбрали." }, - "movedItemsToOrg": { - "message": "Выбранные элементы перемещены в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Элементы перемещены в $ORGNAME$", "placeholders": { @@ -5147,6 +5138,6 @@ "message": "Чтобы использовать биометрическую разблокировку, обновите приложение для компьютера или отключите разблокировку по отпечатку пальца в настройках компьютера." }, "changeAtRiskPassword": { - "message": "Изменить пароль, находящийся под угрозой" + "message": "Изменить пароль, подверженный риску" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 25a5029e159..721d16a2eee 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 90d325693ce..897db9f3176 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Nič ste nevybrali." }, - "movedItemsToOrg": { - "message": "Vybraté položky boli presunuté do $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Položky presunuté do $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 1faf75ec920..f6a543ea5ea 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 1bd6222eb82..3c7bef94c13 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Нисте ништа изабрали." }, - "movedItemsToOrg": { - "message": "Одабране ставке премештене у $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Ставке премештене у $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index a47cc398fa5..6db7a22490e 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index a9a7c75ecac..c9c29611deb 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 409c4e4925f..c545f802d64 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "You have not selected anything." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 275db28e89c..e69b33d63af 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Hiçbir şey seçmediniz." }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Kayıtlar $ORGNAME$ kuruluşuna taşındı", "placeholders": { diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index e214154212a..d18d90babff 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Ви нічого не вибрали." }, - "movedItemsToOrg": { - "message": "Вибрані записи переміщено до $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Записи переміщено до $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 7de0316d682..db0da3b5874 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "Bạn chưa chọn gì." }, - "movedItemsToOrg": { - "message": "Đã chuyển các mục được chọn đến $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Các mục đã được chuyển tới $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index f3d5527e713..bdfaeb92531 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -2208,7 +2208,7 @@ "message": "项目已恢复" }, "alreadyHaveAccount": { - "message": "已经拥有账户了吗?" + "message": "已经有账户了吗?" }, "vaultTimeoutLogOutConfirmation": { "message": "超时后注销账户将解除对密码库的所有访问权限,并需要进行在线身份验证。确定使用此设置吗?" @@ -3543,7 +3543,7 @@ "message": "搜索" }, "inputMinLength": { - "message": "至少输入 $COUNT$ 个字符。", + "message": "输入长度不能低于 $COUNT$ 个字符。", "placeholders": { "count": { "content": "$1", @@ -3628,7 +3628,7 @@ "message": "正在获取选项..." }, "multiSelectNotFound": { - "message": "未找到任何条目" + "message": "未找到任何项目" }, "multiSelectClearAll": { "message": "清除全部" @@ -4209,7 +4209,7 @@ "message": "建议的项目" }, "autofillSuggestionsTip": { - "message": "将此站点保存为登录项目以用于自动填充" + "message": "为这个站点保存一个登录项目以自动填充" }, "yourVaultIsEmpty": { "message": "您的密码库是空的" @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "您尚未选择任何内容。" }, - "movedItemsToOrg": { - "message": "所选项目已移动到 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "项目已移动到 $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index eb7d996b0f6..37e450c8fd2 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -4733,15 +4733,6 @@ "nothingSelected": { "message": "您沒有選擇任何項目。" }, - "movedItemsToOrg": { - "message": "將已選取項目移動至 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "項目已移到 $ORGNAME$", "placeholders": { diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index e02e3d8d951..d474e303336 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -1,6 +1,7 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom } from "rxjs"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -59,6 +60,7 @@ describe("NotificationBackground", () => { const themeStateService = mock(); const configService = mock(); const accountService = mock(); + const organizationService = mock(); const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, @@ -73,18 +75,19 @@ describe("NotificationBackground", () => { authService.activeAccountStatus$ = activeAccountStatusMock$; accountService.activeAccount$ = activeAccountSubject; notificationBackground = new NotificationBackground( + accountService, + authService, autofillService, cipherService, - authService, - policyService, - folderService, - userNotificationSettingsService, + configService, domainSettingsService, environmentService, + folderService, logService, + organizationService, + policyService, themeStateService, - configService, - accountService, + userNotificationSettingsService, ); }); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 11037e7e261..50e0ee0aa75 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -2,6 +2,7 @@ // @ts-strict-ignore import { firstValueFrom } from "rxjs"; +import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -63,46 +64,48 @@ export default class NotificationBackground { ExtensionCommand.AutofillIdentity, ]); private readonly extensionMessageHandlers: NotificationBackgroundExtensionMessageHandlers = { - unlockCompleted: ({ message, sender }) => this.handleUnlockCompleted(message, sender), - bgGetFolderData: () => this.getFolderData(), - bgCloseNotificationBar: ({ message, sender }) => - this.handleCloseNotificationBarMessage(message, sender), + bgAddLogin: ({ message, sender }) => this.addLogin(message, sender), bgAdjustNotificationBar: ({ message, sender }) => this.handleAdjustNotificationBarMessage(message, sender), - bgAddLogin: ({ message, sender }) => this.addLogin(message, sender), bgChangedPassword: ({ message, sender }) => this.changedPassword(message, sender), - bgRemoveTabFromNotificationQueue: ({ sender }) => - this.removeTabFromNotificationQueue(sender.tab), - bgSaveCipher: ({ message, sender }) => this.handleSaveCipherMessage(message, sender), - bgNeverSave: ({ sender }) => this.saveNever(sender.tab), - collectPageDetailsResponse: ({ message }) => - this.handleCollectPageDetailsResponseMessage(message), - bgUnlockPopoutOpened: ({ message, sender }) => this.unlockVault(message, sender.tab), - checkNotificationQueue: ({ sender }) => this.checkNotificationQueue(sender.tab), - bgReopenUnlockPopout: ({ sender }) => this.openUnlockPopout(sender.tab), + bgCloseNotificationBar: ({ message, sender }) => + this.handleCloseNotificationBarMessage(message, sender), + bgGetActiveUserServerConfig: () => this.getActiveUserServerConfig(), + bgGetDecryptedCiphers: () => this.getNotificationCipherData(), bgGetEnableChangedPasswordPrompt: () => this.getEnableChangedPasswordPrompt(), bgGetEnableAddedLoginPrompt: () => this.getEnableAddedLoginPrompt(), bgGetExcludedDomains: () => this.getExcludedDomains(), - bgGetActiveUserServerConfig: () => this.getActiveUserServerConfig(), + bgGetFolderData: () => this.getFolderData(), + bgGetOrgData: () => this.getOrgData(), + bgNeverSave: ({ sender }) => this.saveNever(sender.tab), + bgOpenVault: ({ message, sender }) => this.openVault(message, sender.tab), + bgRemoveTabFromNotificationQueue: ({ sender }) => + this.removeTabFromNotificationQueue(sender.tab), + bgReopenUnlockPopout: ({ sender }) => this.openUnlockPopout(sender.tab), + bgSaveCipher: ({ message, sender }) => this.handleSaveCipherMessage(message, sender), + bgUnlockPopoutOpened: ({ message, sender }) => this.unlockVault(message, sender.tab), + checkNotificationQueue: ({ sender }) => this.checkNotificationQueue(sender.tab), + collectPageDetailsResponse: ({ message }) => + this.handleCollectPageDetailsResponseMessage(message), getWebVaultUrlForNotification: () => this.getWebVaultUrl(), notificationRefreshFlagValue: () => this.getNotificationFlag(), - bgGetDecryptedCiphers: () => this.getNotificationCipherData(), - bgOpenVault: ({ message, sender }) => this.openVault(message, sender.tab), + unlockCompleted: ({ message, sender }) => this.handleUnlockCompleted(message, sender), }; constructor( + private accountService: AccountService, + private authService: AuthService, private autofillService: AutofillService, private cipherService: CipherService, - private authService: AuthService, - private policyService: PolicyService, - private folderService: FolderService, - private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction, + private configService: ConfigService, private domainSettingsService: DomainSettingsService, private environmentService: EnvironmentService, + private folderService: FolderService, private logService: LogService, + private organizationService: OrganizationService, + private policyService: PolicyService, private themeStateService: ThemeStateService, - private configService: ConfigService, - private accountService: AccountService, + private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction, ) {} init() { @@ -744,6 +747,26 @@ export default class NotificationBackground { ); } + /** + * Returns the first value found from the organization service organizations$ observable. + */ + private async getOrgData() { + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + const organizations = await firstValueFrom( + this.organizationService.organizations$(activeUserId), + ); + return organizations.map((org) => { + const { id, name, productTierType } = org; + return { + id, + name, + productTierType, + }; + }); + } + /** * Handles the unlockCompleted extension message. Will close the notification bar * after an attempted autofill action, and retry the autofill action if the message diff --git a/apps/browser/src/autofill/content/components/notification/body.ts b/apps/browser/src/autofill/content/components/notification/body.ts index 2433381dfba..66b580bde43 100644 --- a/apps/browser/src/autofill/content/components/notification/body.ts +++ b/apps/browser/src/autofill/content/components/notification/body.ts @@ -16,12 +16,12 @@ const { css } = createEmotion({ }); export function NotificationBody({ - ciphers, + ciphers = [], notificationType, theme = ThemeTypes.Light, handleEditOrUpdateAction, }: { - ciphers: NotificationCipherData[]; + ciphers?: NotificationCipherData[]; customClasses?: string[]; notificationType?: NotificationType; theme: Theme; diff --git a/apps/browser/src/autofill/content/components/notification/button-row.ts b/apps/browser/src/autofill/content/components/notification/button-row.ts index 1eb0a4ac5f4..8661f5957e1 100644 --- a/apps/browser/src/autofill/content/components/notification/button-row.ts +++ b/apps/browser/src/autofill/content/components/notification/button-row.ts @@ -60,23 +60,18 @@ export function NotificationButtonRow({ ) : ([] as Option[]); - const noFolderOption: Option = { - default: true, - icon: Folder, - text: "No folder", // @TODO localize - value: "0", - }; const folderOptions: Option[] = folders?.length - ? folders.reduce( + ? folders.reduce( (options, { id, name }: FolderView) => [ ...options, { icon: Folder, text: name, - value: id, + value: id === null ? "0" : id, + default: id === null, }, ], - [noFolderOption], + [], ) : []; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index f98ef795749..8d80dc9fb50 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -9,6 +9,7 @@ import { NotificationType, } from "../../../notification/abstractions/notification-bar"; import { NotificationCipherData } from "../cipher/types"; +import { FolderView, OrgView } from "../common-types"; import { themes, spacing } from "../constants/styles"; import { NotificationBody, componentClassPrefix as notificationBodyClassPrefix } from "./body"; @@ -20,20 +21,24 @@ import { export function NotificationContainer({ handleCloseNotification, + handleEditOrUpdateAction, + handleSaveAction, + ciphers, + folders, i18n, + organizations, theme = ThemeTypes.Light, type, - ciphers, - handleSaveAction, - handleEditOrUpdateAction, }: NotificationBarIframeInitData & { handleCloseNotification: (e: Event) => void; handleSaveAction: (e: Event) => void; handleEditOrUpdateAction: (e: Event) => void; } & { + ciphers?: NotificationCipherData[]; + folders?: FolderView[]; i18n: { [key: string]: string }; + organizations?: OrgView[]; type: NotificationType; // @TODO typing override for generic `NotificationBarIframeInitData.type` - ciphers: NotificationCipherData[]; }) { const headerMessage = getHeaderMessage(i18n, type); const showBody = true; @@ -42,8 +47,8 @@ export function NotificationContainer({
${NotificationHeader({ handleCloseNotification, - standalone: showBody, message: headerMessage, + standalone: showBody, theme, })} ${showBody @@ -56,9 +61,11 @@ export function NotificationContainer({ : null} ${NotificationFooter({ handleSaveAction, - theme, - notificationType: type, + folders, i18n, + notificationType: type, + organizations, + theme, })}
`; diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index ae489ea956b..bf3d562a0ef 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -880,7 +880,7 @@ async function loadNotificationBar() { const baseStyle = useComponentBar ? isNotificationFresh - ? "height: calc(276px + 25px); width: 450px; right: 0; transform:translateX(100%); opacity:0;" + ? "height: calc(276px + 50px); width: 450px; right: 0; transform:translateX(100%); opacity:0;" : "height: calc(276px + 25px); width: 450px; right: 0; transform:translateX(0%); opacity:1;" : "height: 42px; width: 100%;"; @@ -910,7 +910,7 @@ async function loadNotificationBar() { function getFrameStyle(useComponentBar: boolean): string { return ( (useComponentBar - ? "height: calc(276px + 25px); width: 450px; right: 0;" + ? "height: calc(276px + 50px); width: 450px; right: 0;" : "height: 42px; width: 100%; left: 0;") + " top: 0; padding: 0; position: fixed;" + " z-index: 2147483647; visibility: visible;" diff --git a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts index cb14a86dffa..6e7427e3a38 100644 --- a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts +++ b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts @@ -1,5 +1,8 @@ import { Theme } from "@bitwarden/common/platform/enums"; +import { NotificationCipherData } from "../../../autofill/content/components/cipher/types"; +import { FolderView, OrgView } from "../../../autofill/content/components/common-types"; + const NotificationTypes = { Add: "add", Change: "change", @@ -9,21 +12,24 @@ const NotificationTypes = { type NotificationType = (typeof NotificationTypes)[keyof typeof NotificationTypes]; type NotificationBarIframeInitData = { - type?: string; // @TODO use `NotificationType` - isVaultLocked?: boolean; - theme?: Theme; - removeIndividualVault?: boolean; - importType?: string; applyRedesign?: boolean; + ciphers?: NotificationCipherData[]; + folders?: FolderView[]; + importType?: string; + isVaultLocked?: boolean; launchTimestamp?: number; + organizations?: OrgView[]; + removeIndividualVault?: boolean; + theme?: Theme; + type?: string; // @TODO use `NotificationType` }; type NotificationBarWindowMessage = { + cipherId?: string; command: string; error?: string; initData?: NotificationBarIframeInitData; username?: string; - cipherId?: string; }; type NotificationBarWindowMessageHandlers = { diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 617b1e58c14..d17c008372d 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -5,6 +5,8 @@ import { ConsoleLogService } from "@bitwarden/common/platform/services/console-l import type { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { AdjustNotificationBarMessageData } from "../background/abstractions/notification.background"; +import { NotificationCipherData } from "../content/components/cipher/types"; +import { OrgView } from "../content/components/common-types"; import { NotificationConfirmationContainer } from "../content/components/notification/confirmation-container"; import { NotificationContainer } from "../content/components/notification/container"; import { buildSvgDomElement } from "../utils"; @@ -115,7 +117,7 @@ function setElementText(template: HTMLTemplateElement, elementId: string, text: } } -function initNotificationBar(message: NotificationBarWindowMessage) { +async function initNotificationBar(message: NotificationBarWindowMessage) { const { initData } = message; if (!initData) { return; @@ -131,7 +133,23 @@ function initNotificationBar(message: NotificationBarWindowMessage) { // Current implementations utilize a require for scss files which creates the need to remove the node. document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => node.remove()); - sendPlatformMessage({ command: "bgGetDecryptedCiphers" }, (cipherData) => { + await Promise.all([ + new Promise((resolve) => + sendPlatformMessage({ command: "bgGetOrgData" }, resolve), + ), + new Promise((resolve) => + sendPlatformMessage({ command: "bgGetFolderData" }, resolve), + ), + new Promise((resolve) => + sendPlatformMessage({ command: "bgGetDecryptedCiphers" }, resolve), + ), + ]).then(([organizations, folders, ciphers]) => { + notificationBarIframeInitData = { + ...notificationBarIframeInitData, + folders, + ciphers, + organizations, + }; // @TODO use context to avoid prop drilling return render( NotificationContainer({ @@ -142,7 +160,6 @@ function initNotificationBar(message: NotificationBarWindowMessage) { handleSaveAction, handleEditOrUpdateAction, i18n, - ciphers: cipherData, }), document.body, ); diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index f8f86e6a277..74fa6acdf79 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -1173,18 +1173,19 @@ export default class MainBackground { () => this.generatePasswordToClipboard(), ); this.notificationBackground = new NotificationBackground( + this.accountService, + this.authService, this.autofillService, this.cipherService, - this.authService, - this.policyService, - this.folderService, - this.userNotificationSettingsService, + this.configService, this.domainSettingsService, this.environmentService, + this.folderService, this.logService, + this.organizationService, + this.policyService, this.themeStateService, - this.configService, - this.accountService, + this.userNotificationSettingsService, ); this.overlayNotificationsBackground = new OverlayNotificationsBackground( diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 5bfca440b99..4510c2f342d 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.3.0", + "version": "2025.3.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 1e2ac1812ca..fc897c1b1c3 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2025.3.0", + "version": "2025.3.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts index 67fa920d18d..37731f17fbe 100644 --- a/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts +++ b/apps/browser/src/platform/offscreen-document/offscreen-document.spec.ts @@ -3,14 +3,19 @@ import { BrowserApi } from "../browser/browser-api"; import BrowserClipboardService from "../services/browser-clipboard.service"; describe("OffscreenDocument", () => { - const browserApiMessageListenerSpy = jest.spyOn(BrowserApi, "messageListener"); - const browserClipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); - const browserClipboardServiceReadSpy = jest.spyOn(BrowserClipboardService, "read"); - const consoleErrorSpy = jest.spyOn(console, "error"); + let browserClipboardServiceCopySpy: jest.SpyInstance; + let browserClipboardServiceReadSpy: jest.SpyInstance; + let browserApiMessageListenerSpy: jest.SpyInstance; + let consoleErrorSpy: jest.SpyInstance; - // FIXME: Remove when updating file. Eslint update - // eslint-disable-next-line @typescript-eslint/no-require-imports - require("../offscreen-document/offscreen-document"); + beforeEach(async () => { + browserApiMessageListenerSpy = jest.spyOn(BrowserApi, "messageListener"); + browserClipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); + browserClipboardServiceReadSpy = jest.spyOn(BrowserClipboardService, "read"); + consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(); + + await import("./offscreen-document"); + }); describe("init", () => { it("sets up a `chrome.runtime.onMessage` listener", () => { @@ -47,6 +52,7 @@ describe("OffscreenDocument", () => { it("copies the message text", async () => { const text = "test"; + browserClipboardServiceCopySpy.mockResolvedValueOnce(undefined); sendMockExtensionMessage({ command: "offscreenCopyToClipboard", text }); await flushPromises(); @@ -56,6 +62,7 @@ describe("OffscreenDocument", () => { describe("handleOffscreenReadFromClipboard", () => { it("reads the value from the clipboard service", async () => { + browserClipboardServiceReadSpy.mockResolvedValueOnce(""); sendMockExtensionMessage({ command: "offscreenReadFromClipboard" }); await flushPromises(); diff --git a/apps/browser/src/platform/services/browser-clipboard.service.spec.ts b/apps/browser/src/platform/services/browser-clipboard.service.spec.ts index cf0d7c46004..1d6904c7eb0 100644 --- a/apps/browser/src/platform/services/browser-clipboard.service.spec.ts +++ b/apps/browser/src/platform/services/browser-clipboard.service.spec.ts @@ -2,9 +2,10 @@ import BrowserClipboardService from "./browser-clipboard.service"; describe("BrowserClipboardService", () => { let windowMock: any; - const consoleWarnSpy = jest.spyOn(console, "warn"); + let consoleWarnSpy: any; beforeEach(() => { + consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(); windowMock = { navigator: { clipboard: { @@ -104,8 +105,6 @@ describe("BrowserClipboardService", () => { }); await BrowserClipboardService.read(windowMock as Window); - - expect(consoleWarnSpy).toHaveBeenCalled(); }); }); }); diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts index fe049c4f1db..38166d10a08 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.spec.ts @@ -185,7 +185,9 @@ describe("Browser Utils Service", () => { describe("copyToClipboard", () => { const getManifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); const sendMessageToAppSpy = jest.spyOn(SafariApp, "sendMessageToApp"); - const clipboardServiceCopySpy = jest.spyOn(BrowserClipboardService, "copy"); + const clipboardServiceCopySpy = jest + .spyOn(BrowserClipboardService, "copy") + .mockResolvedValue(undefined); let triggerOffscreenCopyToClipboardSpy: jest.SpyInstance; beforeEach(() => { @@ -281,7 +283,9 @@ describe("Browser Utils Service", () => { describe("readFromClipboard", () => { const getManifestVersionSpy = jest.spyOn(BrowserApi, "manifestVersion", "get"); const sendMessageToAppSpy = jest.spyOn(SafariApp, "sendMessageToApp"); - const clipboardServiceReadSpy = jest.spyOn(BrowserClipboardService, "read"); + const clipboardServiceReadSpy = jest + .spyOn(BrowserClipboardService, "read") + .mockResolvedValue(""); beforeEach(() => { getManifestVersionSpy.mockReturnValue(2); diff --git a/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html index b3bf06cfbe7..40dad4cde4b 100644 --- a/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html +++ b/apps/browser/src/tools/popup/settings/about-dialog/about-dialog.component.html @@ -42,12 +42,12 @@ -
+ -
+ diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts index b7ff0718b35..f986bdfca31 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.ts @@ -440,6 +440,32 @@ const mapAddEditCipherInfoToInitialValues = ( initialValues.name = cipher.name; } + if (cipher.type === CipherType.Card) { + const card = cipher.card; + + if (card != null) { + if (card.cardholderName != null) { + initialValues.cardholderName = card.cardholderName; + } + + if (card.number != null) { + initialValues.number = card.number; + } + + if (card.expMonth != null) { + initialValues.expMonth = card.expMonth; + } + + if (card.expYear != null) { + initialValues.expYear = card.expYear; + } + + if (card.code != null) { + initialValues.code = card.code; + } + } + } + if (cipher.type === CipherType.Login) { const login = cipher.login; diff --git a/apps/desktop/desktop_native/macos_provider/src/assertion.rs b/apps/desktop/desktop_native/macos_provider/src/assertion.rs index 762ceaaed48..c5b43bb87fa 100644 --- a/apps/desktop/desktop_native/macos_provider/src/assertion.rs +++ b/apps/desktop/desktop_native/macos_provider/src/assertion.rs @@ -2,11 +2,22 @@ use std::sync::Arc; use serde::{Deserialize, Serialize}; -use crate::{BitwardenError, Callback, UserVerification}; +use crate::{BitwardenError, Callback, Position, UserVerification}; #[derive(uniffi::Record, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PasskeyAssertionRequest { + rp_id: String, + client_data_hash: Vec, + user_verification: UserVerification, + allowed_credentials: Vec>, + window_xy: Position, + //extension_input: Vec, TODO: Implement support for extensions +} + +#[derive(uniffi::Record, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PasskeyAssertionWithoutUserInterfaceRequest { rp_id: String, credential_id: Vec, user_name: String, @@ -14,6 +25,7 @@ pub struct PasskeyAssertionRequest { record_identifier: Option, client_data_hash: Vec, user_verification: UserVerification, + window_xy: Position, } #[derive(uniffi::Record, Serialize, Deserialize)] diff --git a/apps/desktop/desktop_native/macos_provider/src/lib.rs b/apps/desktop/desktop_native/macos_provider/src/lib.rs index 5623436d874..8f2499ae68d 100644 --- a/apps/desktop/desktop_native/macos_provider/src/lib.rs +++ b/apps/desktop/desktop_native/macos_provider/src/lib.rs @@ -15,7 +15,10 @@ uniffi::setup_scaffolding!(); mod assertion; mod registration; -use assertion::{PasskeyAssertionRequest, PreparePasskeyAssertionCallback}; +use assertion::{ + PasskeyAssertionRequest, PasskeyAssertionWithoutUserInterfaceRequest, + PreparePasskeyAssertionCallback, +}; use registration::{PasskeyRegistrationRequest, PreparePasskeyRegistrationCallback}; #[derive(uniffi::Enum, Debug, Serialize, Deserialize)] @@ -26,6 +29,13 @@ pub enum UserVerification { Discouraged, } +#[derive(uniffi::Record, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Position { + pub x: i32, + pub y: i32, +} + #[derive(Debug, uniffi::Error, Serialize, Deserialize)] pub enum BitwardenError { Internal(String), @@ -141,6 +151,14 @@ impl MacOSProviderClient { ) { self.send_message(request, Box::new(callback)); } + + pub fn prepare_passkey_assertion_without_user_interface( + &self, + request: PasskeyAssertionWithoutUserInterfaceRequest, + callback: Arc, + ) { + self.send_message(request, Box::new(callback)); + } } #[derive(Serialize, Deserialize)] diff --git a/apps/desktop/desktop_native/macos_provider/src/registration.rs b/apps/desktop/desktop_native/macos_provider/src/registration.rs index d484af58b6c..9e697b75c16 100644 --- a/apps/desktop/desktop_native/macos_provider/src/registration.rs +++ b/apps/desktop/desktop_native/macos_provider/src/registration.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use serde::{Deserialize, Serialize}; -use crate::{BitwardenError, Callback, UserVerification}; +use crate::{BitwardenError, Callback, Position, UserVerification}; #[derive(uniffi::Record, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -13,6 +13,7 @@ pub struct PasskeyRegistrationRequest { client_data_hash: Vec, user_verification: UserVerification, supported_algorithms: Vec, + window_xy: Position, } #[derive(uniffi::Record, Serialize, Deserialize)] diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index 92f31cf5f89..ca1fe29e254 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -118,6 +118,10 @@ export declare namespace autofill { Required = 'required', Discouraged = 'discouraged' } + export interface Position { + x: number + y: number + } export interface PasskeyRegistrationRequest { rpId: string userName: string @@ -125,6 +129,7 @@ export declare namespace autofill { clientDataHash: Array userVerification: UserVerification supportedAlgorithms: Array + windowXy: Position } export interface PasskeyRegistrationResponse { rpId: string @@ -133,6 +138,13 @@ export declare namespace autofill { attestationObject: Array } export interface PasskeyAssertionRequest { + rpId: string + clientDataHash: Array + userVerification: UserVerification + allowedCredentials: Array> + windowXy: Position + } + export interface PasskeyAssertionWithoutUserInterfaceRequest { rpId: string credentialId: Array userName: string @@ -140,6 +152,7 @@ export declare namespace autofill { recordIdentifier?: string clientDataHash: Array userVerification: UserVerification + windowXy: Position } export interface PasskeyAssertionResponse { rpId: string @@ -156,7 +169,7 @@ export declare namespace autofill { * @param name The endpoint name to listen on. This name uniquely identifies the IPC connection and must be the same for both the server and client. * @param callback This function will be called whenever a message is received from a client. */ - static listen(name: string, registrationCallback: (error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyRegistrationRequest) => void, assertionCallback: (error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyAssertionRequest) => void): Promise + static listen(name: string, registrationCallback: (error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyRegistrationRequest) => void, assertionCallback: (error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyAssertionRequest) => void, assertionWithoutUserInterfaceCallback: (error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyAssertionWithoutUserInterfaceRequest) => void): Promise /** Return the path to the IPC server. */ getPath(): string /** Stop the IPC server. */ diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index d0c859d427c..f02be2b27b6 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -515,6 +515,14 @@ pub mod autofill { pub value: Result, } + #[napi(object)] + #[derive(Debug, Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] + pub struct Position { + pub x: i32, + pub y: i32, + } + #[napi(object)] #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -525,6 +533,7 @@ pub mod autofill { pub client_data_hash: Vec, pub user_verification: UserVerification, pub supported_algorithms: Vec, + pub window_xy: Position, } #[napi(object)] @@ -541,6 +550,18 @@ pub mod autofill { #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PasskeyAssertionRequest { + pub rp_id: String, + pub client_data_hash: Vec, + pub user_verification: UserVerification, + pub allowed_credentials: Vec>, + pub window_xy: Position, + //extension_input: Vec, TODO: Implement support for extensions + } + + #[napi(object)] + #[derive(Debug, Serialize, Deserialize)] + #[serde(rename_all = "camelCase")] + pub struct PasskeyAssertionWithoutUserInterfaceRequest { pub rp_id: String, pub credential_id: Vec, pub user_name: String, @@ -548,6 +569,7 @@ pub mod autofill { pub record_identifier: Option, pub client_data_hash: Vec, pub user_verification: UserVerification, + pub window_xy: Position, } #[napi(object)] @@ -592,6 +614,13 @@ pub mod autofill { (u32, u32, PasskeyAssertionRequest), ErrorStrategy::CalleeHandled, >, + #[napi( + ts_arg_type = "(error: null | Error, clientId: number, sequenceNumber: number, message: PasskeyAssertionWithoutUserInterfaceRequest) => void" + )] + assertion_without_user_interface_callback: ThreadsafeFunction< + (u32, u32, PasskeyAssertionWithoutUserInterfaceRequest), + ErrorStrategy::CalleeHandled, + >, ) -> napi::Result { let (send, mut recv) = tokio::sync::mpsc::channel::(32); tokio::spawn(async move { @@ -628,6 +657,25 @@ pub mod autofill { } } + match serde_json::from_str::< + PasskeyMessage, + >(&message) + { + Ok(msg) => { + let value = msg + .value + .map(|value| (client_id, msg.sequence_number, value)) + .map_err(|e| napi::Error::from_reason(format!("{e:?}"))); + + assertion_without_user_interface_callback + .call(value, ThreadsafeFunctionCallMode::NonBlocking); + continue; + } + Err(e) => { + println!("[ERROR] Error deserializing message1: {e}"); + } + } + match serde_json::from_str::>( &message, ) { diff --git a/apps/desktop/macos/autofill-extension/Base.lproj/CredentialProviderViewController.xib b/apps/desktop/macos/autofill-extension/Base.lproj/CredentialProviderViewController.xib index ace3497a58b..1e47cc54de2 100644 --- a/apps/desktop/macos/autofill-extension/Base.lproj/CredentialProviderViewController.xib +++ b/apps/desktop/macos/autofill-extension/Base.lproj/CredentialProviderViewController.xib @@ -1,22 +1,23 @@ - + - + + - + - +