diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 763b48ab1d9..2550f0fddbe 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,6 +8,8 @@ apps/desktop/desktop_native @bitwarden/team-platform-dev apps/desktop/desktop_native/objc/src/native/autofill @bitwarden/team-autofill-dev apps/desktop/desktop_native/core/src/autofill @bitwarden/team-autofill-dev +## No ownership for Cargo.toml to allow dependency updates +apps/desktop/desktop_native/Cargo.toml ## Auth team files ## apps/browser/src/auth @bitwarden/team-auth-dev @@ -90,7 +92,9 @@ apps/web/src/app/core @bitwarden/team-platform-dev apps/web/src/app/shared @bitwarden/team-platform-dev apps/web/src/translation-constants.ts @bitwarden/team-platform-dev # Workflows -.github/workflows/brew-bump-desktop.yml @bitwarden/team-platform-dev +# Any changes here should also be reflected in Renovate configuration +.github/workflows/automatic-issue-responses.yml @bitwarden/team-platform-dev +.github/workflows/automatic-pull-request-responses.yml @bitwarden/team-platform-dev .github/workflows/build-browser-target.yml @bitwarden/team-platform-dev .github/workflows/build-browser.yml @bitwarden/team-platform-dev .github/workflows/build-cli-target.yml @bitwarden/team-platform-dev @@ -100,10 +104,13 @@ apps/web/src/translation-constants.ts @bitwarden/team-platform-dev .github/workflows/build-web-target.yml @bitwarden/team-platform-dev .github/workflows/build-web.yml @bitwarden/team-platform-dev .github/workflows/chromatic.yml @bitwarden/team-platform-dev +.github/workflows/crowdin-pull.yml @bitwarden/team-platform-dev +.github/workflows/enforce-labels.yml @bitwarden/team-platform-dev .github/workflows/lint.yml @bitwarden/team-platform-dev .github/workflows/locales-lint.yml @bitwarden/team-platform-dev .github/workflows/repository-management.yml @bitwarden/team-platform-dev .github/workflows/scan.yml @bitwarden/team-platform-dev +.github/workflows/stale-bot.yml @bitwarden/team-platform-dev .github/workflows/test.yml @bitwarden/team-platform-dev .github/workflows/version-auto-bump.yml @bitwarden/team-platform-dev # ESLint custom rules @@ -114,6 +121,7 @@ apps/browser/src/autofill @bitwarden/team-autofill-dev apps/desktop/src/autofill @bitwarden/team-autofill-dev libs/common/src/autofill @bitwarden/team-autofill-dev apps/desktop/macos/autofill-extension @bitwarden/team-autofill-dev +apps/desktop/src/app/components/fido2placeholder.component.ts @bitwarden/team-autofill-dev apps/desktop/desktop_native/windows-plugin-authenticator @bitwarden/team-autofill-dev # DuckDuckGo integration apps/desktop/native-messaging-test-runner @bitwarden/team-autofill-dev @@ -152,6 +160,7 @@ apps/desktop/src/locales/en/messages.json apps/web/src/locales/en/messages.json ## BRE team owns these workflows ## +# Any changes here should also be reflected in Renovate configuration ## .github/workflows/brew-bump-desktop.yml @bitwarden/dept-bre .github/workflows/deploy-web.yml @bitwarden/dept-bre .github/workflows/publish-cli.yml @bitwarden/dept-bre @@ -159,13 +168,11 @@ apps/web/src/locales/en/messages.json .github/workflows/publish-web.yml @bitwarden/dept-bre .github/workflows/retrieve-current-desktop-rollout.yml @bitwarden/dept-bre .github/workflows/staged-rollout-desktop.yml @bitwarden/dept-bre - -## Shared ownership workflows ## -.github/workflows/release-browser.yml -.github/workflows/release-cli.yml -.github/workflows/release-desktop-beta.yml -.github/workflows/release-desktop.yml -.github/workflows/release-web.yml +.github/workflows/release-browser.yml @bitwarden/dept-bre +.github/workflows/release-cli.yml @bitwarden/dept-bre +.github/workflows/release-desktop-beta.yml @bitwarden/dept-bre +.github/workflows/release-desktop.yml @bitwarden/dept-bre +.github/workflows/release-web.yml @bitwarden/dept-bre ## Docker files have shared ownership ## **/Dockerfile diff --git a/.github/ISSUE_TEMPLATE/browser.yml b/.github/ISSUE_TEMPLATE/browser.yml index ec78f3ee555..23a0e4276bf 100644 --- a/.github/ISSUE_TEMPLATE/browser.yml +++ b/.github/ISSUE_TEMPLATE/browser.yml @@ -84,11 +84,11 @@ body: attributes: label: Browser Version description: What version of the browser(s) are you seeing the problem on? - - type: input + - type: textarea id: version attributes: - label: Build Version - description: What version of our software are you running? (go to "Settings" → "About" in the extension) + label: Environment Versions + description: Copy from "Settings" → "About" → "About Bitwarden" in the extension. Should include the extension version and server environment. validations: required: true - type: checkboxes diff --git a/.github/codecov.yml b/.github/codecov.yml index 0a6b3ceacff..d9d59f9de28 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -12,7 +12,7 @@ component_management: paths: - apps/browser/src/key-management/biometrics/** - apps/cli/src/key-management/cli-biometrics-service.ts - - apps/desktop/destkop_native/core/src/biometric/** + - apps/desktop/desktop_native/core/src/biometric/** - apps/desktop/src/key-management/biometrics/** - apps/desktop/src/services/biometric-message-handler.service.ts - apps/web/src/app/key-management/web-biometric.service.ts @@ -24,6 +24,7 @@ component_management: - apps/desktop/src/key-management/lock/** - apps/web/src/app/key-management/lock/** - libs/key-management-ui/src/lock/** + - libs/common/src/key-management/device-trust/** - component_id: key-management-ipc name: Key Management - IPC paths: @@ -46,6 +47,7 @@ component_management: - libs/key-management/src/kdf-config.service.ts - libs/key-management/src/key.service.ts - libs/common/src/key-management/master-password/** + - libs/common/src/key-management/key-connector/** - component_id: key-management-crypto name: Key Management - Crypto paths: diff --git a/.github/renovate.json5 b/.github/renovate.json5 index b9de0084c25..01361a97404 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,28 +1,65 @@ { $schema: "https://docs.renovatebot.com/renovate-schema.json", - extends: ["github>bitwarden/renovate-config"], // Extends our base config for pinned dependencies + extends: ["github>bitwarden/renovate-config"], // Extends our default configuration for pinned dependencies enabledManagers: ["cargo", "github-actions", "npm"], packageRules: [ { + // Group all build/test/lint workflows for GitHub Actions together for Platform + // Since they are code owners we don't need to assign a review team in Renovate + // Any changes here should also be reflected in CODEOWNERS groupName: "github-action minor", matchManagers: ["github-actions"], - matchUpdateTypes: ["minor"], - }, - { - matchManagers: ["cargo"], + matchFileNames: [ + "./github/workflows/automatic-issue-responses.yml", + "./github/workflows/automatic-pull-request-responses.yml", + "./github/workflows/build-browser.yml", + "./github/workflows/build-cli.yml", + "./github/workflows/build-desktop.yml", + "./github/workflows/build-web.yml", + "./github/workflows/chromatic.yml", + "./github/workflows/crowdin-pull.yml", + "./github/workflows/enforce-labels.yml", + "./github/workflows/lint.yml", + "./github/workflows/locales-lint.yml", + "./github/workflows/repository-management.yml", + "./github/workflows/scan.yml", + "./github/workflows/stale-bot.yml", + "./github/workflows/test.yml", + "./github/workflows/version-auto-bump.yml", + ], commitMessagePrefix: "[deps] Platform:", }, { - groupName: "napi", - matchPackageNames: ["napi", "napi-build", "napi-derive"], + // Group all release-related workflows for GitHub Actions together for BRE + // Since they are code owners we don't need to assign a review team in Renovate + // Any changes here should also be reflected in CODEOWNERS + groupName: "github-action minor", + matchManagers: ["github-actions"], + matchFileNames: [ + "./github/workflows/brew-bump-desktop.yml", + "./github/workflows/deploy-web.yml", + "./github/workflows/publish-cli.yml", + "./github/workflows/publish-desktop.yml", + "./github/workflows/publish-web.yml", + "./github/workflows/retrieve-current-desktop-rollout.yml", + "./github/workflows/staged-rollout-desktop.yml", + "./github/workflows/release-cli.yml", + "./github/workflows/release-desktop-beta.yml", + "./github/workflows/release-desktop.yml", + "./github/workflows/release-web.yml", + ], + commitMessagePrefix: "[deps] BRE:", }, { + // Disable major and minor updates for TypeScript and Zone.js because they are managed by Angular matchPackageNames: ["typescript", "zone.js"], matchUpdateTypes: ["major", "minor"], description: "Determined by Angular", enabled: false, }, { + // Disable major updates for core Angular dependencies because they are managed through ng update + // when we decide to upgrade. matchSourceUrls: [ "https://github.com/angular-eslint/angular-eslint", "https://github.com/angular/angular-cli", @@ -35,19 +72,27 @@ enabled: false, }, { + // Renovate should manage patch updates for TypeScript and Zone.js, despite ignoring major and minor matchPackageNames: ["typescript", "zone.js"], matchUpdateTypes: "patch", }, { + // We want to update all the Jest-related packages together, to reduce PR noise groupName: "jest", matchPackageNames: ["@types/jest", "jest", "ts-jest", "jest-preset-angular"], - matchUpdateTypes: "major", }, { + // We need to group all napi-related packages together to avoid build errors caused by version incompatibilities + groupName: "napi", + matchPackageNames: ["napi", "napi-build", "napi-derive"], + }, + { + // We need to group all macOS/iOS binding-related packages together to avoid build errors caused by version incompatibilities groupName: "macOS/iOS bindings", matchPackageNames: ["core-foundation", "security-framework", "security-framework-sys"], }, { + // We need to group all zbus-related packages together to avoid build errors caused by version incompatibilities groupName: "zbus", matchPackageNames: ["zbus", "zbus_polkit"], }, @@ -123,16 +168,20 @@ matchPackageNames: [ "@emotion/css", "@webcomponents/custom-elements", + "bitwarden-russh", "bytes", "concurrently", "cross-env", "del", + "ed25519", "lit", - "nord", "patch-package", + "pkcs8", "prettier", "prettier-plugin-tailwindcss", "rimraf", + "ssh-encoding", + "ssh-key", "@storybook/web-components-webpack5", "tabbable", "tldts", @@ -166,31 +215,68 @@ "@types/node-forge", "@types/node-ipc", "@yao-pkg/pkg", + "anyhow", + "arboard", "babel-loader", + "base64", + "bindgen", "browserslist", + "byteorder", + "bytes", + "core-foundation", "copy-webpack-plugin", + "dirs", "electron", "electron-builder", "electron-log", "electron-reload", "electron-store", "electron-updater", + "embed_plist", + "futures", + "hex", + "homedir", "html-webpack-injector", "html-webpack-plugin", + "interprocess", "json5", + "keytar", + "libc", + "log", "lowdb", + "napi", + "napi-build", + "napi-derive", "node-forge", "node-ipc", + "oo7", + "oslog", + "pin-project", "pkg", + "rand", "rxjs", + "scopeguard", + "security-framework", + "security-framework-sys", + "serde", + "serde_json", + "simplelog", + "sysinfo", "tsconfig-paths-webpack-plugin", "type-fest", + "typenum", "typescript", "typescript-strict-plugin", + "uniffi", "webpack", "webpack-cli", "webpack-dev-server", "webpack-node-externals", + "widestring", + "windows", + "windows-registry", + "zbus", + "zbus_polkit", ], description: "Platform owned dependencies", commitMessagePrefix: "[deps] Platform:", @@ -308,7 +394,17 @@ reviewers: ["team:team-vault-dev"], }, { - matchPackageNames: ["@types/argon2-browser", "argon2", "argon2-browser", "big-integer"], + matchPackageNames: [ + "@types/argon2-browser", + "aes", + "argon2", + "argon2-browser", + "big-integer", + "cbc", + "rsa", + "russh-cryptovec", + "sha2", + ], description: "Key Management owned dependencies", commitMessagePrefix: "[deps] KM:", reviewers: ["team:team-key-management-dev"], diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index c65366c7796..48ecca540e8 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -146,9 +146,9 @@ jobs: # Note, before updating the ubuntu version of the workflow, ensure the snap base image # is equal or greater than the new version. Otherwise there might be GLIBC version issues. # The snap base for desktop is defined in `apps/desktop/electron-builder.json` - # We are currently running on 20.04 until the Ubuntu 24.04 release is available, as moving - # to 22.04 now breaks users who are on 20.04 due to mismatched GLIBC versions. - runs-on: ubuntu-20.04 + # We intentionally keep this runner on the oldest supported OS in GitHub Actions + # for maximum compatibility across GLIBC versions + runs-on: ubuntu-22.04 needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} diff --git a/apps/browser/package.json b/apps/browser/package.json index 21784167b9e..e3bccf3f0df 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.2.2", + "version": "2025.3.0", "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/postcss.config.js b/apps/browser/postcss.config.js index a4dee9d4362..5657df3afcf 100644 --- a/apps/browser/postcss.config.js +++ b/apps/browser/postcss.config.js @@ -1,4 +1,4 @@ -/* eslint-disable no-undef, @typescript-eslint/no-require-imports */ +/* eslint-disable @typescript-eslint/no-require-imports */ module.exports = { plugins: [ require("postcss-import"), diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 36c0ef40579..4c051d455ac 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "أدخل عنوان البريد الإلكتروني لحسابك وسيُرسل تلميح كلمة المرور الخاصة بك إليك" }, - "passwordHint": { - "message": "تلميح كلمة المرور" - }, - "enterEmailToGetHint": { - "message": "أدخل عنوان البريد الإلكتروني لحسابك للحصول على تلميح كلمة المرور الرئيسية." - }, "getMasterPasswordHint": { "message": "احصل على تلميح كلمة المرور الرئيسية" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "تحرير المجلّد" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "مجلد جديد" }, @@ -479,22 +482,6 @@ "length": { "message": "الطول" }, - "uppercase": { - "message": "أحرف كبيرة (من A إلى Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "أحرف كبيرة (من a إلى z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "الأرقام (من 0 الى 9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "الأحرف الخاصة (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "تضمين", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "تضمين أحرف خاصة", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "عدد الكلمات" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "متصفح الويب الخاص بك لا يدعم خاصية النسخ السهل. يرجى استخدام النسخ اليدوي." }, - "verifyIdentity": { - "message": "قم بتأكيد هويتك" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "لا" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "حدث خطأ غير متوقع." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "حفظ" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "اسأل عن تحديث تسجيل الدخول الحالي" }, @@ -1133,10 +1169,6 @@ "message": "فاتح", "description": "Light color" }, - "solarizedDark": { - "message": "داكن مُشمس", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "التصدير من" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "البيئة المستضافة ذاتيا" }, - "selfHostedEnvironmentFooter": { - "message": "حدد عنوان URL الأساسي لتثبيت Bitwarden المستضاف محليًا." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "بيئة مخصصة" }, - "customEnvironmentFooter": { - "message": "للمستخدمين المتقدمين. يمكنك تحديد عنوان URL الأساسي لكل خدمة بشكل مستقل." - }, "baseUrl": { "message": "رابط الخادم" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "اسحب للفرز" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "نص" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "تم تعديل الإعدادات" - }, - "environmentEditedClick": { - "message": "انقر هنا" - }, - "environmentEditedReset": { - "message": "لإعادة تعيين الإعدادات المُعدة مسبقاً" - }, "serverVersion": { "message": "إصدار الخادم" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "تسجيل الدخول باستخدام كلمة المرور الرئيسية" }, - "loggingInAs": { - "message": "تسجيل الدخول كـ" - }, - "notYou": { - "message": "ليس حسابك؟" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "تسجيل الدخول بالجهاز" }, - "loginWithDeviceEnabledInfo": { - "message": "يجب إعداد تسجيل الدخول بالجهاز في إعدادات تطبيق Bitwarden. هل تحتاج إلى خِيار آخر؟" - }, "fingerprintPhraseHeader": { "message": "عبارة بصمة الإصبع" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "تم إرسال إشعار إلى جهازك." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "طلب موافقة المدير" }, - "approveWithMasterPassword": { - "message": "الموافقة بواسطة كلمة المرور الرئيسية" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 5b9975cb5b9..6f3ace453ae 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" }, - "passwordHint": { - "message": "Parol ipucu" - }, - "enterEmailToGetHint": { - "message": "Ana parol ipucunuzu alacağınız hesabınızın e-poçt ünvanını daxil edin." - }, "getMasterPasswordHint": { "message": "Ana parol üçün ipucu alın" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Qovluğa düzəliş et" }, + "editFolderWithName": { + "message": "Qovluğa düzəliş et: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Yeni qovluq" }, @@ -479,22 +482,6 @@ "length": { "message": "Uzunluq" }, - "uppercase": { - "message": "Böyük hərf (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Kiçik hərf (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Rəqəmlər (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Xüsusi simvollar (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Daxil et", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Xüsusi xarakterləri daxil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Söz sayı" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Veb brauzeriniz lövhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayın." }, - "verifyIdentity": { - "message": "Kimliyi doğrula" + "verifyYourIdentity": { + "message": "Kimliyinizi doğrulayın" }, "weDontRecognizeThisDevice": { "message": "Bu cihazı tanımırıq. Kimliyinizi doğrulamaq üçün e-poçtunuza göndərilən kodu daxil edin." @@ -921,6 +904,9 @@ "no": { "message": "Xeyr" }, + "location": { + "message": "Yerləşmə" + }, "unexpectedError": { "message": "Gözlənilməz bir xəta baş verdi." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Saxla" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ Bitwarden-də saxlanıldı.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ Bitwarden-də güncəlləndi.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Yeni giriş kimi saxla", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Giriş məlumatlarını güncəllə", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Giriş məlumatları saxlanılsın?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Mövcud giriş məlumatları güncəllənsin?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Giriş məlumatları saxlanıldı", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Giriş məlumatları güncəlləndi", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Saxlama xətası", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Bunu saxlaya bilmədik. Məlumatları manual daxil etməyə çalışın.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Mövcud girişin güncəllənməsini soruş" }, @@ -1133,10 +1169,6 @@ "message": "Açıq", "description": "Light color" }, - "solarizedDark": { - "message": "Günəşli tünd", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Buradan xaricə köçür" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted mühit" }, - "selfHostedEnvironmentFooter": { - "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının təməl URL-sini müəyyənləşdirin." - }, "selfHostedBaseUrlHint": { "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının təməl URL-sini müəyyənləşdirin. Nümunə: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Özəl mühit" }, - "customEnvironmentFooter": { - "message": "Qabaqcıl istifadəçilər üçündür. Hər xidmətin baza URL-sini müstəqil olaraq müəyyənləşdirə bilərsiniz." - }, "baseUrl": { "message": "Server URL-si" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Sıralamaq üçün sürüklə" }, + "dragToReorder": { + "message": "Yenidən sıralamaq üçün sürüklə" + }, "cfTypeText": { "message": "Mətn" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Ayarlara düzəliş edildi" - }, - "environmentEditedClick": { - "message": "Bura klikləyin" - }, - "environmentEditedReset": { - "message": "ön konfiqurasiyalı ayarları sıfırlamaq üçün" - }, "serverVersion": { "message": "Server versiyası" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Ana parolla giriş et" }, - "loggingInAs": { - "message": "Giriş et" - }, - "notYou": { - "message": "Siz deyilsiniz?" - }, "newAroundHere": { "message": "Burada yenisiniz?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Cihazla giriş et" }, - "loginWithDeviceEnabledInfo": { - "message": "Cihazla giriş, Bitwarden tətbiqinin ayarlarında qurulmalıdır. Başqa bir seçimə ehtiyacınız var?" - }, "fingerprintPhraseHeader": { "message": "Barmaq izi ifadəsi" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Bütün giriş seçimlərinə bax" }, - "viewAllLoginOptionsV1": { - "message": "Bütün giriş seçimlərinə bax" - }, "notificationSentDevice": { "message": "Cihazınıza bir bildiriş göndərildi." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Admin təsdiqini tələb et" }, - "approveWithMasterPassword": { - "message": "Ana parolla təsdiqlə" - }, "ssoIdentifierRequired": { "message": "Təşkilat SSO identifikatoru tələb olunur." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tələbiniz admininizə göndərildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Təsdiqləndikdən sonra məlumatlandırılacaqsınız." - }, "troubleLoggingIn": { "message": "Girişdə problem var?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktiv hesab" }, + "bitwardenAccount": { + "message": "Bitwarden hesabı" + }, "availableAccounts": { "message": "Mövcud hesablar" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Veb sayt URI-yını yenidən sırala. Ox düyməsi ilə elementi yuxarı və ya aşağı daşıyın." + }, "reorderFieldUp": { "message": "$LABEL$ yuxarı daşındı, mövqeyi $INDEX$/$LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra enli" }, + "sshKeyWrongPassword": { + "message": "Daxil etdiyiniz parol yanlışdır." + }, + "importSshKey": { + "message": "Daxilə köçür" + }, + "confirmSshKeyPassword": { + "message": "Parolu təsdiqlə" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH açarı üçün parolu daxil edin." + }, + "enterSshKeyPassword": { + "message": "Parolu daxil edin" + }, + "invalidSshKey": { + "message": "SSH açarı yararsızdır" + }, + "sshKeyTypeUnsupported": { + "message": "SSH açar növü dəstəklənmir" + }, + "importSshKeyFromClipboard": { + "message": "Açarı lövhədən daxilə köçür" + }, + "sshKeyImported": { + "message": "SSH açarı uğurla daxilə köçürüldü" + }, "cannotRemoveViewOnlyCollections": { "message": "\"Yalnız baxma\" icazələrinə sahib kolleksiyaları silə bilməzsiniz: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Biometrik kilid açmanı istifadə etmək üçün lütfən masaüstü tətbiqinizi güncəlləyin, ya da masaüstü ayarlarında barmaq izi ilə kilid açmanı sıradan çıxardın." + }, + "changeAtRiskPassword": { + "message": "Riskli parolları dəyişdir" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index e5885c34ccc..905f6b6ac1d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Падказка да пароля" - }, - "enterEmailToGetHint": { - "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі да асноўнага пароля." - }, "getMasterPasswordHint": { "message": "Атрымаць падказку да асноўнага пароля" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Рэдагаваць папку" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Новая папка" }, @@ -479,22 +482,6 @@ "length": { "message": "Даўжыня" }, - "uppercase": { - "message": "Вялікія літары (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Маленькія літары (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Лічбы (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Спецыяльныя сімвалы (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Уключыць", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Уключыце спецыяльныя сімвалы", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Колькасць слоў" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Ваш вэб-браўзер не падтрымлівае капіяванне даных у буфер абмену. Скапіюйце іх уручную." }, - "verifyIdentity": { - "message": "Праверыць асобу" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Адбылася нечаканая памылка." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Захаваць" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Пытацца пра абнаўленні існуючага лагіна" }, @@ -1133,10 +1169,6 @@ "message": "Светлая", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Экспартаванне з" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Асяроддзе ўласнага хостынгу" }, - "selfHostedEnvironmentFooter": { - "message": "Увядзіце асноўны URL-адрас вашага лакальнага размяшчэння ўсталяванага Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Карыстальніцкае асяроддзе" }, - "customEnvironmentFooter": { - "message": "Для дасведчаных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кожнай службы." - }, "baseUrl": { "message": "URL-адрас сервера" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Перацягніце для сартавання" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Тэкст" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Налады былі адрэдагаваныя" - }, - "environmentEditedClick": { - "message": "Націсніце тут" - }, - "environmentEditedReset": { - "message": "для скіду да прадвызначаных наладаў" - }, "serverVersion": { "message": "Версія сервера" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Увайсці з асноўным паролем" }, - "loggingInAs": { - "message": "Увайсці як" - }, - "notYou": { - "message": "Не вы?" - }, "newAroundHere": { "message": "Упершыню тут?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Уваход з прыладай" }, - "loginWithDeviceEnabledInfo": { - "message": "Неабходна наладзіць уваход з прыладай у наладах мабільнай праграмы Bitwarden. Патрабуецца іншы варыянт?" - }, "fingerprintPhraseHeader": { "message": "Фраза адбітка пальца" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "Апавяшчэнне было адпраўлена на вашу прыладу." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Запытаць ухваленне адміністратара" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запыт адпраўлены адміністратару." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вы атрымаеце апавяшчэння пасля яго ўхвалення." - }, "troubleLoggingIn": { "message": "Праблемы з уваходам?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Вы пакуль нічога не выбралі." }, - "movedItemsToOrg": { - "message": "Выбраныя элементы перамешчаны ў $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 8238a03d69a..226e63e32cb 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" }, - "passwordHint": { - "message": "Подсказка за паролата" - }, - "enterEmailToGetHint": { - "message": "Въведете адреса на имейла си, за да получите подсказка за главната си парола." - }, "getMasterPasswordHint": { "message": "Подсказка за главната парола" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Редактиране на папка" }, + "editFolderWithName": { + "message": "Редактиране на папка: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Нова папка" }, @@ -479,22 +482,6 @@ "length": { "message": "Дължина" }, - "uppercase": { - "message": "Главни букви (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Малки букви (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Числа (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Специални знаци (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Включване", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Включване на специални знаци", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Брой думи" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Браузърът не поддържа копиране в буфера, затова копирайте на ръка." }, - "verifyIdentity": { - "message": "Потвърждаване на самоличността" + "verifyYourIdentity": { + "message": "Потвърдете самоличността си" }, "weDontRecognizeThisDevice": { "message": "Това устройство е непознато. Въведете кода изпратен на е-пощата Ви, за да потвърдите самоличността си." @@ -921,6 +904,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Местоположение" + }, "unexpectedError": { "message": "Възникна неочаквана грешка." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Да, нека се запише сега" }, + "loginSaveSuccessDetails": { + "message": "Запазено в Битуорден: $USERNAME$.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "Обновено в Битуорден: $USERNAME$.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Запазване като нов елемент за вписване", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Обновяване на данните за вписване", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Запазване на данните за вписване?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Да се обновят ли текущите данни за вписване?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Данните за вписване са запазени", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Данните за вписване са обновени", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Грешка при запазването", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "О, не! Запазването не беше успешно. Опитайте да въведете данните ръчно.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Питане за обновяване на съществуващ запис" }, @@ -1133,10 +1169,6 @@ "message": "Светъл", "description": "Light color" }, - "solarizedDark": { - "message": "Преекспонирано тъмен", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Изнасяне от" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Собствена среда" }, - "selfHostedEnvironmentFooter": { - "message": "Укажете базовия адрес за собствената ви инсталирана среда на Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Посочете базовия адрес на Вашата собствена инсталация на Битуорден. Пример: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Специална среда" }, - "customEnvironmentFooter": { - "message": "За специални случаи. Може да укажете основните адреси на всяка ползвана услуга поотделно." - }, "baseUrl": { "message": "Адрес на сървъра" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Подредба чрез влачене" }, + "dragToReorder": { + "message": "Плъзнете за пренареждане" + }, "cfTypeText": { "message": "Текст" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Настройките баха променени" - }, - "environmentEditedClick": { - "message": "Щракнете тук" - }, - "environmentEditedReset": { - "message": "за да върнете предварително зададените настройки" - }, "serverVersion": { "message": "Версия на сървъра" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Вписване с главната парола" }, - "loggingInAs": { - "message": "Вписване като" - }, - "notYou": { - "message": "Това не сте Вие?" - }, "newAroundHere": { "message": "За пръв път ли сте тук?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Вписване с устройство" }, - "loginWithDeviceEnabledInfo": { - "message": "Вписването с устройство трябва да е включено в настройките на приложението на Битуорден. Друга настройка ли търсите?" - }, "fingerprintPhraseHeader": { "message": "Уникална фраза" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Вижте всички възможности за вписване" }, - "viewAllLoginOptionsV1": { - "message": "Вижте всички възможности за вписване" - }, "notificationSentDevice": { "message": "Към устройството Ви е изпратено известие." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Подаване на заявка за одобрение от администратор" }, - "approveWithMasterPassword": { - "message": "Одобряване с главната парола" - }, "ssoIdentifierRequired": { "message": "Идентификаторът за еднократна идентификация на организация е задължителен." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Вашата заявка беше изпратена до администратора Ви." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ще получите известие, когато тя бъде одобрена." - }, "troubleLoggingIn": { "message": "Имате проблем с вписването?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Активиране на регистрацията" }, + "bitwardenAccount": { + "message": "Акаунт в Битуорден" + }, "availableAccounts": { "message": "Налични регистрации" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Преместване на адреса на уеб сайта. Използвайте стрелките, за да преместите елемента нагоре или надолу." + }, "reorderFieldUp": { "message": "Преместено нагоре: $LABEL$. Позиция $INDEX$ от $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Не сте избрали нищо." }, - "movedItemsToOrg": { - "message": "Избраните записи бяха преместени в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Елементите са преместени в $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Много широко" }, + "sshKeyWrongPassword": { + "message": "Въведената парола е неправилна." + }, + "importSshKey": { + "message": "Внасяне" + }, + "confirmSshKeyPassword": { + "message": "Потвърждаване на паролата" + }, + "enterSshKeyPasswordDesc": { + "message": "Въведете паролата за SSH-ключа." + }, + "enterSshKeyPassword": { + "message": "Въведете паролата" + }, + "invalidSshKey": { + "message": "SSH ключът е неправилен" + }, + "sshKeyTypeUnsupported": { + "message": "Типът на SSH ключа не се поддържа" + }, + "importSshKeyFromClipboard": { + "message": "Внасяне на ключ от буфера за обмен" + }, + "sshKeyImported": { + "message": "SSH ключът е внесен успешно" + }, "cannotRemoveViewOnlyCollections": { "message": "Не можете да премахвате колекции с права „Само за преглед“: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "За да използвате отключването чрез биометрични данни, обновете самостоятелното приложение или изключете отключването чрез пръстов отпечатък в настройките му." + }, + "changeAtRiskPassword": { + "message": "Промяна на парола в риск" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index eaa80a68b0a..983b9fadde4 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "পাসওয়ার্ড ইঙ্গিত" - }, - "enterEmailToGetHint": { - "message": "আপনার মূল পাসওয়ার্ডের ইঙ্গিতটি পেতে আপনার অ্যাকাউন্টের ইমেল ঠিকানা প্রবেশ করুন।" - }, "getMasterPasswordHint": { "message": "মূল পাসওয়ার্ডের ইঙ্গিত পান" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "ফোল্ডার সম্পাদনা" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "দৈর্ঘ্য" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "শব্দের সংখ্যা" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "আপনার ওয়েব ব্রাউজার সহজে ক্লিপবোর্ড অনুলিপি সমর্থন করে না। পরিবর্তে এটি নিজেই অনুলিপি করুন।" }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "না" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "একটি অপ্রত্যাশিত ত্রুটি ঘটেছে।" }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "হ্যাঁ, এখনই সংরক্ষণ করুন" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "উজ্জ্বল", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "স্ব-হোস্টকৃত পরিবেশ" }, - "selfHostedEnvironmentFooter": { - "message": "আপনার অন-প্রাঙ্গনে হোস্টকৃত Bitwarden ইনস্টলেশনটির বেস URL উল্লেখ করুন।" - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "পছন্দসই পরিবেশ" }, - "customEnvironmentFooter": { - "message": "উন্নত ব্যবহারকারীদের জন্য। আপনি স্বতন্ত্রভাবে প্রতিটি পরিষেবার মূল URL নির্দিষ্ট করতে পারেন।" - }, "baseUrl": { "message": "সার্ভার URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "বাছাই করতে টানুন" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "পাঠ্য" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index e2a4c09ce3d..08fedb6f10a 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Nagovještaj lozinke" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 9c5874ee522..14e4a577440 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduïu l'adreça de correu electrònic del compte i se us enviarà la pista de contrasenya" }, - "passwordHint": { - "message": "Pista de la contrasenya" - }, - "enterEmailToGetHint": { - "message": "Introduïu l'adreça electrònica del vostre compte per rebre la contrasenya mestra." - }, "getMasterPasswordHint": { "message": "Obteniu la pista de la contrasenya mestra" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edita la carpeta" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Carpeta nova" }, @@ -479,22 +482,6 @@ "length": { "message": "Longitud" }, - "uppercase": { - "message": "Majúscula (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minúscula (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Números (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caràcters especials (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Inclou", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Inclou caràcters especials", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Nombre de paraules" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "El vostre navegador web no admet la còpia fàcil del porta-retalls. Copieu-ho manualment." }, - "verifyIdentity": { - "message": "Verifica identitat" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "S'ha produït un error inesperat." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Guarda" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Demana d'actualitzar els inicis de sessió existents" }, @@ -1133,10 +1169,6 @@ "message": "Clar", "description": "Light color" }, - "solarizedDark": { - "message": "Solaritzat fosc", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exporta des de" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Entorn d'allotjament propi" }, - "selfHostedEnvironmentFooter": { - "message": "Especifiqueu l'URL base de la vostra instal·lació de Bitwarden allotjada en un entorn propi." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Entorn personalitzat" }, - "customEnvironmentFooter": { - "message": "Per a usuaris avançats. Podeu especificar l'URL base de cada servei independentment." - }, "baseUrl": { "message": "URL del servidor" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arrossega per ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "La configuració s'ha editat" - }, - "environmentEditedClick": { - "message": "Feu clic ací" - }, - "environmentEditedReset": { - "message": "per restablir els paràmetres preconfigurats" - }, "serverVersion": { "message": "Versió del servidor" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Inici de sessió amb contrasenya mestra" }, - "loggingInAs": { - "message": "Has iniciat sessió com" - }, - "notYou": { - "message": "No sou vosaltres?" - }, "newAroundHere": { "message": "Nou per ací?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Inici de sessió amb dispositiu" }, - "loginWithDeviceEnabledInfo": { - "message": "L'inici de sessió amb el dispositiu ha d'estar activat a la configuració de l'aplicació Bitwarden. Necessiteu una altra opció?" - }, "fingerprintPhraseHeader": { "message": "Frase d'empremta digital" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Veure totes les opcions d'inici de sessió" }, - "viewAllLoginOptionsV1": { - "message": "Veure totes les opcions d'inici de sessió" - }, "notificationSentDevice": { "message": "S'ha enviat una notificació al vostre dispositiu." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Sol·liciteu l'aprovació de l'administrador" }, - "approveWithMasterPassword": { - "message": "Aprova amb contrasenya mestra" - }, "ssoIdentifierRequired": { "message": "Es requereix un identificador SSO de l'organització." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La vostra sol·licitud s'ha enviat a l'administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se us notificarà una vegada aprovat." - }, "troubleLoggingIn": { "message": "Teniu problemes per iniciar la sessió?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Activa el compte" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Comptes disponibles" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra ample" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 8b91245b8f0..e106d371d57 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" }, - "passwordHint": { - "message": "Nápověda pro heslo" - }, - "enterEmailToGetHint": { - "message": "Zadejte e-mailovou adresu pro zaslání nápovědy k hlavnímu heslu." - }, "getMasterPasswordHint": { "message": "Zaslat nápovědu k hlavnímu heslu" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Upravit složku" }, + "editFolderWithName": { + "message": "Upravit složku: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nová složka" }, @@ -479,22 +482,6 @@ "length": { "message": "Délka" }, - "uppercase": { - "message": "Velká písmena (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Malá písmena (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Číslice (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Speciální znaky (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Zahrnout", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Zahrnout speciální znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Počet slov" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Váš webový prohlížeč nepodporuje automatické kopírování do schránky. Musíte ho zkopírovat ručně." }, - "verifyIdentity": { - "message": "Ověřit identitu" + "verifyYourIdentity": { + "message": "Ověřte svou totožnost" }, "weDontRecognizeThisDevice": { "message": "Toto zařízení nepoznáváme. Zadejte kód zaslaný na Váš e-mail pro ověření Vaší totožnosti." @@ -921,6 +904,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Umístění" + }, "unexpectedError": { "message": "Vyskytla se neočekávaná chyba." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Uložit" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ uloženo do Bitwardenu.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ aktualizováno v Bitwardenu.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Uložit jako nové přihlašovací údaje", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Aktualizovat přihlašovací údaje", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Uložit přihlašovací údaje?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Aktualizovat existující přihlašovací údaje?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Přihlašovací údaje byly uloženy", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Přihlašovací údaje byly aktualizovány", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Chyba při ukládání", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Ale ne! Nemohli jsme to uložit. Zkuste zadat podrobnosti ručně.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Zeptat se na aktualizaci existujícího přihlášení" }, @@ -1133,10 +1169,6 @@ "message": "Světlý", "description": "Light color" }, - "solarizedDark": { - "message": "Tmavý (solarizovaný)", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportovat z" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Vlastní hostované prostředí" }, - "selfHostedEnvironmentFooter": { - "message": "Zadejte základní URL adresu vlastní hostované aplikace Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Zadejte základní URL adresu Vaší vlastní hostované aplikace Bitwarden. Příklad: https://bitwarden.spolecnost.cz" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Vlastní prostředí" }, - "customEnvironmentFooter": { - "message": "Pro pokročilé uživatele. Můžete zadat základní URL adresu každé služby zvlášť." - }, "baseUrl": { "message": "URL serveru" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Přetáhnutím seřadíte" }, + "dragToReorder": { + "message": "Přesuňte tažením" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Nastavení byla upravena" - }, - "environmentEditedClick": { - "message": "Klepněte zde" - }, - "environmentEditedReset": { - "message": "pro obnovení do přednastavených nastavení" - }, "serverVersion": { "message": "Verze serveru" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Přihlásit se pomocí hlavního hesla" }, - "loggingInAs": { - "message": "Přihlašování jako" - }, - "notYou": { - "message": "Nejste to Vy?" - }, "newAroundHere": { "message": "Jste tu noví?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Přihlásit se zařízením" }, - "loginWithDeviceEnabledInfo": { - "message": "Přihlášení zařízením musí být nastaveno v aplikaci Bitwarden pro počítač. Potřebujete další volby?" - }, "fingerprintPhraseHeader": { "message": "Fráze otisku prstu" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Zobrazit všechny volby přihlášení" }, - "viewAllLoginOptionsV1": { - "message": "Zobrazit všechny volby přihlášení" - }, "notificationSentDevice": { "message": "Na Vaše zařízení bylo odesláno oznámení." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Žádost o schválení správcem" }, - "approveWithMasterPassword": { - "message": "Schválit hlavním heslem" - }, "ssoIdentifierRequired": { "message": "Je vyžadován SSO identifikátor organizace." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Váš požadavek byl odeslán Vašemu správci." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete upozorněni." - }, "troubleLoggingIn": { "message": "Potíže s přihlášením?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktivní účet" }, + "bitwardenAccount": { + "message": "Účet Bitwarden" + }, "availableAccounts": { "message": "Dostupné účty" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Změnit pořadí URI webové stránky. Použijte šipky pro posunutí položky nahoru nebo dolů." + }, "reorderFieldUp": { "message": "$LABEL$ - přesunuto nahoru, pozice $INDEX$ z $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra široký" }, + "sshKeyWrongPassword": { + "message": "Zadané heslo není správné." + }, + "importSshKey": { + "message": "Importovat" + }, + "confirmSshKeyPassword": { + "message": "Potvrdit heslo" + }, + "enterSshKeyPasswordDesc": { + "message": "Zadejte heslo pro SSH klíč." + }, + "enterSshKeyPassword": { + "message": "Zadejte heslo" + }, + "invalidSshKey": { + "message": "SSH klíč je neplatný" + }, + "sshKeyTypeUnsupported": { + "message": "Typ SSH klíče není podporován" + }, + "importSshKeyFromClipboard": { + "message": "Importovat klíč ze schránky" + }, + "sshKeyImported": { + "message": "SSH klíč byl úspěšně importován" + }, "cannotRemoveViewOnlyCollections": { "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Chcete-li použít biometrické odemknutí, aktualizujte aplikaci pro stolní počítač nebo v nastavení vypněte odemknutí otiskem prstů." + }, + "changeAtRiskPassword": { + "message": "Změnit ohrožené heslo" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 17a8dead9ed..83d09d13273 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Rheolydd cyfrineiriau Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "Gartref, yn y gweithle, neu ar fynd, mae Bitwarden yn diogelu eich holl gyfrineiriau a gwybodaeth sensitif", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -20,7 +20,7 @@ "message": "Creu cyfrif" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Newydd i Bitwarden?" }, "logInWithPasskey": { "message": "Log in with passkey" @@ -93,7 +93,7 @@ "message": "Join organization" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "Ymuno â $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -171,7 +171,7 @@ "message": "Copy fingerprint" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Copïo $FIELD$", "placeholders": { "field": { "content": "$1", @@ -186,11 +186,11 @@ "message": "Copy notes" }, "copy": { - "message": "Copy", + "message": "Copïo", "description": "Copy to clipboard" }, "fill": { - "message": "Fill", + "message": "Llenwi", "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { @@ -216,7 +216,7 @@ "message": "Cynhyrchu cyfrinair (wedi'i gopïo)" }, "copyElementIdentifier": { - "message": "Copy custom field name" + "message": "Copïo enw maes addasedig" }, "noMatchingLogins": { "message": "No matching logins" @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Anfon awgrym o'ch prif gyfrinair" }, @@ -323,19 +317,19 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "Mewngofnodi dau agm" + "message": "Mewngofnodi dau gam" }, "logOut": { "message": "Allgofnodi" }, "aboutBitwarden": { - "message": "About Bitwarden" + "message": "Ynghylch Bitwarden" }, "about": { "message": "Ynghylch" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "Mwy gan Bitwarden" }, "continueToBitwardenDotCom": { "message": "Continue to bitwarden.com?" @@ -385,6 +379,15 @@ "editFolder": { "message": "Golygu ffolder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Ffolder newydd" }, @@ -479,22 +482,6 @@ "length": { "message": "Hyd" }, - "uppercase": { - "message": "Priflythrennau (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Llythrennau bach (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Rhifau (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Nodau arbennig (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -524,13 +511,9 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Cynnwys nodau arbennig", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Nifer o eiriau" }, @@ -551,7 +534,7 @@ "message": "Isafswm nodau arbennig" }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Osgoi nodau amwys", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -601,7 +584,7 @@ "message": "Nodiadau" }, "privateNote": { - "message": "Private note" + "message": "Nodyn preifat" }, "note": { "message": "Nodyn" @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Dyw eich porwr gwe ddim yn cefnogi copïo drwy'r clipfwrdd yn hawdd. Copïwch â llaw yn lle." }, - "verifyIdentity": { - "message": "Gwirio'ch hunaniaeth" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -810,7 +793,7 @@ "message": "Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "Mae eich cyfrif wedi cael ei greu!" }, "youHaveBeenLoggedIn": { "message": "You have been logged in!" @@ -880,10 +863,10 @@ "message": "Mae eich sesiwn wedi dod i ben." }, "logIn": { - "message": "Log in" + "message": "Mewngofnodi" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Mewngofnodi i Bitwarden" }, "enterTheCodeSentToYourEmail": { "message": "Enter the code sent to your email" @@ -921,6 +904,9 @@ "no": { "message": "Na" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Cadw" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Cadw fel manylion mewngofnodi newydd", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Golau", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1418,7 +1450,7 @@ "message": "Agor tab newydd" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Agor mewn tab newydd" }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Amgylchedd addasedig" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1621,7 +1647,7 @@ "message": "Autofill the last used identity for the current website" }, "commandGeneratePasswordDesc": { - "message": "Generate and copy a new random password to the clipboard" + "message": "Cynhyrchu a chopïo cyfrinair hap newydd i'r clipfwrdd" }, "commandLockVaultDesc": { "message": "Cloi'r gell" @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Testun" }, @@ -1836,10 +1865,10 @@ "message": "Hunaniaeth" }, "typeSshKey": { - "message": "SSH key" + "message": "Allwedd SSH" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "$TYPE$ newydd", "placeholders": { "type": { "content": "$1", @@ -1914,7 +1943,7 @@ "message": "Nodiadau diogel" }, "sshKeys": { - "message": "SSH Keys" + "message": "Allweddi SSH" }, "clear": { "message": "Clirio", @@ -2109,19 +2138,19 @@ "message": "Clone" }, "passwordGenerator": { - "message": "Password generator" + "message": "Cynhyrchydd cyfrineiriau" }, "usernameGenerator": { - "message": "Username generator" + "message": "Cynhyrychydd enwau defnyddiwr" }, "useThisEmail": { - "message": "Use this email" + "message": "Defnyddio'r ebost hwn" }, "useThisPassword": { - "message": "Use this password" + "message": "Defnyddio'r cyfrinair hwn" }, "useThisUsername": { - "message": "Use this username" + "message": "Defnyddio'r enw defnyddiwr hwn" }, "securePasswordGenerated": { "message": "Secure password generated! Don't forget to also update your password on the website." @@ -2179,7 +2208,7 @@ "message": "Item restored" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "Oes gennych chi gyfrif eisoes?" }, "vaultTimeoutLogOutConfirmation": { "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" @@ -2191,7 +2220,7 @@ "message": "Llenwi'n awtomatig a chadw" }, "fillAndSave": { - "message": "Fill and save" + "message": "Llenwi a chadw" }, "autoFillSuccessAndSavedUri": { "message": "Item autofilled and URI saved" @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Cliciwch yma" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Fersiwn y gweinydd" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Mewngofnodi â'ch prif gyfrinair" }, - "loggingInAs": { - "message": "Yn mewngofnodi fel" - }, - "notYou": { - "message": "Nid chi?" - }, "newAroundHere": { "message": "Ydych chi'n newydd?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Mewngofnodi â dyfais" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Ymadrodd unigryw" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trafferth mewngofnodi?" }, @@ -3725,7 +3727,7 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Manylion mewngofnodi newydd", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { @@ -3733,7 +3735,7 @@ "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "Cerdyn newydd", "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { @@ -3741,7 +3743,7 @@ "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "Hunaniaeth newydd", "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Cyfrif gweithredol" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Cyfrifon ar gael" }, @@ -4198,7 +4203,7 @@ "message": "Passkey removed" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Awgrymiadau" }, "itemSuggestions": { "message": "Suggested items" @@ -4308,7 +4313,7 @@ "message": "Admin Console" }, "accountSecurity": { - "message": "Account security" + "message": "Diogelwch eich cyfrif" }, "notifications": { "message": "Hysbysiadau" @@ -4343,7 +4348,7 @@ } }, "new": { - "message": "New" + "message": "Newydd" }, "removeItem": { "message": "Remove $NAME$", @@ -4630,7 +4635,7 @@ "message": "Edit field" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Golygu $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4639,7 +4644,7 @@ } }, "deleteCustomField": { - "message": "Delete $LABEL$", + "message": "Dileu $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4648,7 +4653,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "Ychwanegwyd $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -4800,16 +4799,16 @@ "message": "Enterprise policy requirements have been applied to this setting" }, "sshPrivateKey": { - "message": "Private key" + "message": "Allwedd breifat" }, "sshPublicKey": { - "message": "Public key" + "message": "Allwedd gyhoeddus" }, "sshFingerprint": { "message": "Fingerprint" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Math o allwedd" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -5067,7 +5066,7 @@ "message": "Remind me later" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "A oes gennych chi fynediad dibynadwy i'ch ebost, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -5076,10 +5075,10 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "Nac oes" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Oes, mae gen i fynediad dibynadwy i fy ebost" }, "turnOnTwoStepLogin": { "message": "Turn on two-step login" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index b33960470cf..69c8b28d29a 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" }, - "passwordHint": { - "message": "Adgangskodetip" - }, - "enterEmailToGetHint": { - "message": "Indtast din kontos e-mailadresse for at modtage dit hovedadgangskodetip." - }, "getMasterPasswordHint": { "message": "Få hovedadgangskodetip" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Redigér mappe" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Ny mappe" }, @@ -479,22 +482,6 @@ "length": { "message": "Længde" }, - "uppercase": { - "message": "Store bogstaver (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Små bogstaver (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Tal (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Specialtegn (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Inkludér", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Inkludér specialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antal ord" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Din webbrowser understøtter ikke udklipsholder kopiering. Kopiér det manuelt i stedet." }, - "verifyIdentity": { - "message": "Bekræft identitet" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "Denne enhed er ikke genkendt. Angiv koden i den tilsendte e-mail for at bekræfte identiteten." @@ -921,6 +904,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Der opstod en uventet fejl." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Gem" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Bed om at opdatere eksisterende login" }, @@ -1133,10 +1169,6 @@ "message": "Lys", "description": "Light color" }, - "solarizedDark": { - "message": "Solariseret mørk", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Eksportér fra" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Selv-hosted miljø" }, - "selfHostedEnvironmentFooter": { - "message": "Angiv grund-URL'en i din lokal-hostede Bitwarden-installation." - }, "selfHostedBaseUrlHint": { "message": "Angiv basis-URL'en for den lokalt-hosted Bitwarden-installation. Eks.: https://bitwarden.firma.dk" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Brugerdefineret miljø" }, - "customEnvironmentFooter": { - "message": "Til avancerede brugere. Du kan angive grund-URL'en for hver service uafhængigt." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Træk for at sortere" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Indstillinger er blevet redigeret" - }, - "environmentEditedClick": { - "message": "Klik her" - }, - "environmentEditedReset": { - "message": "for at nulstille til forudkonfigurerede indstillinger" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log ind med hovedadgangskode" }, - "loggingInAs": { - "message": "Logger ind som" - }, - "notYou": { - "message": "Ikke dig?" - }, "newAroundHere": { "message": "Ny her?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log ind med enhed" }, - "loginWithDeviceEnabledInfo": { - "message": "Log ind med enhed skal være opsat i indstillingerne i Bitwarden mobil-appen. Behov for en anden mulighed?" - }, "fingerprintPhraseHeader": { "message": "Fingeraftrykssætning" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Vis alle indlogningsmuligheder" }, - "viewAllLoginOptionsV1": { - "message": "Vis alle indlogningsmuligheder" - }, "notificationSentDevice": { "message": "En notifikation er sendt til din enhed." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Anmod om admin-godkendelse" }, - "approveWithMasterPassword": { - "message": "Godkend med hovedadgangskode" - }, "ssoIdentifierRequired": { "message": "Organisations SSO-identifikator kræves." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Anmodningen er sendt til din admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du underrettes, når godkendelse foreligger." - }, "troubleLoggingIn": { "message": "Problemer med at logge ind?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktiv konto" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Tilgængelige konti" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ flyttet op, position $INDEX$ af $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra bred" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Samlinger med kun tilladelsen Vis kan ikke fjernes: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "For brug af biometrisk oplåsning skal computerapplikationen opdateres eller fingeraftryksoplåsning deaktiveres i computerindstillingerne." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 7a81a501c04..4df2fd25b3c 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" }, - "passwordHint": { - "message": "Passwort-Hinweis" - }, - "enterEmailToGetHint": { - "message": "Gib die E-Mail-Adresse deines Kontos ein, um den Hinweis für dein Master-Passwort zu erhalten." - }, "getMasterPasswordHint": { "message": "Hinweis zum Masterpasswort erhalten" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Ordner bearbeiten" }, + "editFolderWithName": { + "message": "Ordner bearbeiten: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Neuer Ordner" }, @@ -479,22 +482,6 @@ "length": { "message": "Länge" }, - "uppercase": { - "message": "Großbuchstaben (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Kleinbuchstaben (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Zahlen (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Sonderzeichen (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Einschließen", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Sonderzeichen einschließen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Anzahl der Wörter" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Den Browser unterstützt das einfache Kopieren nicht. Bitte kopiere es manuell." }, - "verifyIdentity": { - "message": "Identität verifizieren" + "verifyYourIdentity": { + "message": "Verifiziere deine Identität" }, "weDontRecognizeThisDevice": { "message": "Wir erkennen dieses Gerät nicht. Gib den an deine E-Mail-Adresse gesendeten Code ein, um deine Identität zu verifizieren." @@ -921,6 +904,9 @@ "no": { "message": "Nein" }, + "location": { + "message": "Standort" + }, "unexpectedError": { "message": "Ein unerwarteter Fehler ist aufgetreten." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Ja, jetzt speichern" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ in Bitwarden gespeichert.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ in Bitwarden aktualisiert.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Als neue Zugangsdaten speichern", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Zugangsdaten aktualisieren", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Zugangsdaten speichern?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Bestehende Zugangsdaten aktualisieren?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Zugangsdaten gespeichert", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Zugangsdaten aktualisiert", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Fehler beim Speichern", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh nein! Das konnten wir nicht speichern. Versuch, die Details manuell einzugeben.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Nach dem Aktualisieren bestehender Zugangsdaten fragen" }, @@ -1133,10 +1169,6 @@ "message": "Hell", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export aus" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Selbst gehostete Umgebung" }, - "selfHostedEnvironmentFooter": { - "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an." - }, "selfHostedBaseUrlHint": { "message": "Gib die Basis-URL deiner vor Ort gehosteten Bitwarden-Installation an. Beispiel: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Benutzerdefinierte Umgebung" }, - "customEnvironmentFooter": { - "message": "Für fortgeschrittene Benutzer. Du kannst die Basis-URL der jeweiligen Dienste unabhängig voneinander festlegen." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Zum Sortieren ziehen" }, + "dragToReorder": { + "message": "Ziehen zum umsortieren" + }, "cfTypeText": { "message": "Text" }, @@ -2447,7 +2476,7 @@ "message": "Gefährdete Passwörter" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ fordert dich auf, ein Passwort zu ändern, da es gefährdet ist.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ fordert dich auf, diese $COUNT$ Passwörter zu ändern, da diese gefährdet sind.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Deine Organisationen fordern dich auf, diese $COUNT$ Passwörter zu ändern, da diese gefährdet sind.", "placeholders": { "count": { "content": "$1", @@ -2496,34 +2525,34 @@ "message": "Aktualisiere deine Einstellungen, damit du deine Passwörter schnell automatisch ausfüllen kannst und neue generieren kannst" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Überprüfung gefährdeter Zugangsdaten" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Überprüfung gefährdeter Passwörter" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Die Passwörter deiner Organisationen sind gefährdet, weil sie schwach, wiederverwendet und/oder kompromittiert sind.", "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": "Illustration einer Liste gefährdeter Zugangsdaten" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Generiere schnell ein starkes, einzigartiges Passwort mit dem Bitwarden Auto-Ausfüllen-Menü auf der gefährdeten Website.", "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": "Illustration des Bitwarden Auto-Ausfüllen-Menüs, das ein generiertes Passwort anzeigt" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "In Bitwarden aktualisieren" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden wird dich dann auffordern, das Passwort im Passwort-Manager zu aktualisieren.", "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": "Illustration einer Bitwarden-Benachrichtigung, die den Benutzer dazu auffordert, die Zugangsdaten zu aktualisieren" }, "turnOnAutofill": { "message": "Auto-Ausfüllen aktivieren" @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Einstellungen wurden bearbeitet" - }, - "environmentEditedClick": { - "message": "Hier klicken" - }, - "environmentEditedReset": { - "message": "um auf vorkonfigurierte Einstellungen zurückzusetzen" - }, "serverVersion": { "message": "Server-Version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Mit Master-Passwort anmelden" }, - "loggingInAs": { - "message": "Anmelden als" - }, - "notYou": { - "message": "Nicht du?" - }, "newAroundHere": { "message": "Neu hier?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Mit Gerät anmelden" }, - "loginWithDeviceEnabledInfo": { - "message": "Die Anmeldung über ein Gerät muss in den Einstellungen der Bitwarden App eingerichtet werden. Benötigst du eine andere Option?" - }, "fingerprintPhraseHeader": { "message": "Fingerabdruck-Phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Alle Anmeldeoptionen anzeigen" }, - "viewAllLoginOptionsV1": { - "message": "Alle Anmeldeoptionen anzeigen" - }, "notificationSentDevice": { "message": "Eine Benachrichtigung wurde an dein Gerät gesendet." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Admin-Genehmigung anfragen" }, - "approveWithMasterPassword": { - "message": "Mit Master-Passwort genehmigen" - }, "ssoIdentifierRequired": { "message": "SSO-Kennung der Organisation erforderlich." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Deine Anfrage wurde an deinen Administrator gesendet." }, - "youWillBeNotifiedOnceApproved": { - "message": "Nach einer Genehmigung wirst du benachrichtigt." - }, "troubleLoggingIn": { "message": "Probleme beim Anmelden?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktives Konto" }, + "bitwardenAccount": { + "message": "Bitwarden-Konto" + }, "availableAccounts": { "message": "Verfügbare Konten" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "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$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra breit" }, + "sshKeyWrongPassword": { + "message": "Dein eingegebenes Passwort ist falsch." + }, + "importSshKey": { + "message": "Importieren" + }, + "confirmSshKeyPassword": { + "message": "Passwort bestätigen" + }, + "enterSshKeyPasswordDesc": { + "message": "Gib das Passwort für den SSH-Schlüssel ein." + }, + "enterSshKeyPassword": { + "message": "Passwort eingeben" + }, + "invalidSshKey": { + "message": "Der SSH-Schlüssel ist ungültig" + }, + "sshKeyTypeUnsupported": { + "message": "Der SSH-Schlüsseltyp wird nicht unterstützt" + }, + "importSshKeyFromClipboard": { + "message": "Schlüssel aus Zwischenablage importieren" + }, + "sshKeyImported": { + "message": "SSH-Schlüssel erfolgreich importiert" + }, "cannotRemoveViewOnlyCollections": { "message": "Du kannst Sammlungen mit Leseberechtigung nicht entfernen: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Um biometrisches Entsperren zu verwenden, aktualisiere bitte deine Desktop-Anwendung oder deaktiviere die Entsperrung per Fingerabdruck in den Desktop-Einstellungen." + }, + "changeAtRiskPassword": { + "message": "Gefährdetes Passwort ändern" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index dd4be61b1d2..fc07f12a48f 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Εισαγάγετε τη διεύθυνση email του λογαριασμού σας και θα σας αποσταλεί η υπόδειξη για τον κωδικό πρόσβασης" }, - "passwordHint": { - "message": "Υπόδειξη κωδικού πρόσβασης" - }, - "enterEmailToGetHint": { - "message": "Εισαγάγετε τη διεύθυνση email του λογαριασμού σας, για να λάβετε την υπόδειξη του κύριου κωδικού." - }, "getMasterPasswordHint": { "message": "Λήψη υπόδειξης κύριου κωδικού" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Επεξεργασία φακέλου" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Νέος φάκελος" }, @@ -479,22 +482,6 @@ "length": { "message": "Μήκος" }, - "uppercase": { - "message": "Κεφαλαία (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Πεζά (α-ω)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Αριθμοί (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Ειδικοί χαρακτήρες (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Συμπερίληψη", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Συμπερίληψη ειδικών χαρακτήρων", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Αριθμός λέξεων" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Το πρόγραμμα περιήγησης ιστού δεν υποστηρίζει εύκολη αντιγραφή πρόχειρου. Αντιγράψτε το με το χέρι αντ'αυτού." }, - "verifyIdentity": { - "message": "Επιβεβαίωση ταυτότητας" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Όχι" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Παρουσιάστηκε ένα μη αναμενόμενο σφάλμα." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Ναι, Αποθήκευση Τώρα" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ζητήστε να ενημερώσετε την υπάρχουσα σύνδεση" }, @@ -1133,10 +1169,6 @@ "message": "Φωτεινό", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Σκούρο", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Εξαγωγή από" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Αυτο-φιλοξενούμενο περιβάλλον" }, - "selfHostedEnvironmentFooter": { - "message": "Καθορίστε τη βασική διεύθυνση URL, της εγκατάστασης του Bitwarden που φιλοξενείται στο χώρο σας." - }, "selfHostedBaseUrlHint": { "message": "Καθορίστε το βασικό URL της εγκατάστασης Bitwarden στο χώρο σας. Παράδειγμα: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Προσαρμοσμένο περιβάλλον" }, - "customEnvironmentFooter": { - "message": "Για προχωρημένους χρήστες. Μπορείτε να ορίσετε ανεξάρτητα τη βασική διεύθυνση URL κάθε υπηρεσίας." - }, "baseUrl": { "message": "URL Διακομιστή" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Σύρετε για ταξινόμηση" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Κείμενο" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Οι ρυθμίσεις έχουν επεξεργαστεί" - }, - "environmentEditedClick": { - "message": "Κάντε κλικ εδώ" - }, - "environmentEditedReset": { - "message": "επαναφορά στις προ-ρυθμισμένες ρυθμίσεις" - }, "serverVersion": { "message": "Έκδοση διακομιστή" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Συνδεθείτε με τον κύριο κωδικό πρόσβασης" }, - "loggingInAs": { - "message": "Σύνδεση ως" - }, - "notYou": { - "message": "Δεν είστε εσείς;" - }, "newAroundHere": { "message": "Είστε νέος/α εδώ;" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Σύνδεση με τη χρήση συσκευής" }, - "loginWithDeviceEnabledInfo": { - "message": "Η σύνδεση με τη χρήση συσκευής πρέπει να οριστεί στις ρυθμίσεις της εφαρμογής Bitwarden. Χρειάζεστε κάποια άλλη επιλογή;" - }, "fingerprintPhraseHeader": { "message": "Φράση δακτυλικού αποτυπώματος" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Δείτε όλες τις επιλογές σύνδεσης" }, - "viewAllLoginOptionsV1": { - "message": "Δείτε όλες τις επιλογές σύνδεσης" - }, "notificationSentDevice": { "message": "Μια ειδοποίηση έχει σταλεί στη συσκευή σας." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Αίτηση έγκρισης διαχειριστή" }, - "approveWithMasterPassword": { - "message": "Έγκριση με κύριο κωδικό πρόσβασης" - }, "ssoIdentifierRequired": { "message": "Απαιτείται αναγνωριστικό οργανισμού SSO." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Το αίτημά σας εστάλη στον διαχειριστή σας." }, - "youWillBeNotifiedOnceApproved": { - "message": "Θα ειδοποιηθείτε μόλις εγκριθεί." - }, "troubleLoggingIn": { "message": "Δεν μπορείτε να συνδεθείτε;" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Ενεργός λογαριασμός" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Διαθέσιμοι λογαριασμοί" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ μετακινήθηκε πάνω, θέση $INDEX$ από $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Δεν έχετε επιλέξει τίποτα." }, - "movedItemsToOrg": { - "message": "Τα επιλεγμένα αντικείμενα μετακινήθηκαν στο $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Τα αντικείμενα μεταφέρθηκαν στο $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Εξαιρετικά φαρδύ" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index b600c6a89d9..16f462b7f17 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1183,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1536,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1551,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1691,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3293,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3332,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3347,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3362,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3506,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3555,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4718,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4778,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": { @@ -5149,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index e06dd05575d..1381afbdc6e 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognise this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organisation SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 23fe1e28140..6b14a358148 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special Characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify Identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognise this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Yes, save now" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarised Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server Version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organisation SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 9b6d1a48936..4d430d23337 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduce la dirección de correo electrónico de tu cuenta y se te enviará la pista de tu contraseña" }, - "passwordHint": { - "message": "Pista de contraseña" - }, - "enterEmailToGetHint": { - "message": "Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra." - }, "getMasterPasswordHint": { "message": "Obtener pista de la contraseña maestra" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editar carpeta" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Carpeta nueva" }, @@ -479,22 +482,6 @@ "length": { "message": "Longitud" }, - "uppercase": { - "message": "Mayúsculas (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minúsculas (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Números (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caracteres especiales (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Incluir", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Incluir caracteres especiales", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palabras" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Tu navegador web no soporta copiar al portapapeles facilmente. Cópialo manualmente." }, - "verifyIdentity": { - "message": "Verificar identidad" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "No reconocemos este dispositivo. Introduce el código enviado a tu correo electrónico para verificar tu identidad." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Ha ocurrido un error inesperado." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Guardar" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Solicitar la actualización de los datos de inicio de sesión existentes" }, @@ -1133,10 +1169,6 @@ "message": "Claro", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportar desde" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Entorno de alojamiento propio" }, - "selfHostedEnvironmentFooter": { - "message": "Especifica la URL base de tu instalación de Bitwarden de alojamiento propio." - }, "selfHostedBaseUrlHint": { "message": "Especifica la dirección URL base de la instalación de Bitwarden alojada localmente. Ejemplo: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Entorno personalizado" }, - "customEnvironmentFooter": { - "message": "Para usuarios avanzados. Puedes especificar la URL base de cada servicio de forma independiente." - }, "baseUrl": { "message": "URL del servidor" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arrastrar para ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Texto" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Se han editado los ajustes" - }, - "environmentEditedClick": { - "message": "Haga click aquí" - }, - "environmentEditedReset": { - "message": "para restablecer a los ajustes por defecto" - }, "serverVersion": { "message": "Versión del servidor" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Iniciar sesión con contraseña maestra" }, - "loggingInAs": { - "message": "Iniciando sesión como" - }, - "notYou": { - "message": "¿No eres tú?" - }, "newAroundHere": { "message": "¿Nuevo por aquí?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Acceder con un dispositivo" }, - "loginWithDeviceEnabledInfo": { - "message": "El acceso con dispositivo debe prepararse en la configuración de la aplicación Bitwarden. ¿Necesita otra opción?" - }, "fingerprintPhraseHeader": { "message": "Frase de huella" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Ver todas las opciones de inicio de sesión" }, - "viewAllLoginOptionsV1": { - "message": "Ver todas las opciones de inicio de sesión" - }, "notificationSentDevice": { "message": "Se ha enviado una notificación a tu dispositivo." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Solicitar aprobación del administrador" }, - "approveWithMasterPassword": { - "message": "Aprobar con contraseña maestra" - }, "ssoIdentifierRequired": { "message": "Se requiere un identificador único de inicio de sesión de la organización." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Su solicitud ha sido enviada a su administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se le notificará una vez aprobado." - }, "troubleLoggingIn": { "message": "¿Problemas para iniciar sesión?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Cuenta activa" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Cuentas disponibles" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extraancho" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Para utilizar el desbloqueo biométrico, por favor actualice su aplicación de escritorio o desactive el desbloqueo de huella dactilar en los ajustes del escritorio." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 81dd447ea9f..2daf5f9d7f0 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Parooli vihje" - }, - "enterEmailToGetHint": { - "message": "Ülemparooli vihje saamiseks sisesta oma konto e-posti aadress." - }, "getMasterPasswordHint": { "message": "Tuleta ülemparool vihjega meelde" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Muuda kausta" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Uus kaust" }, @@ -479,22 +482,6 @@ "length": { "message": "Pikkus" }, - "uppercase": { - "message": "Suurtäht (A-Z) ", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Väiketäht (a-z) ", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbrid (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Erimärgid (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Kasuta", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Kasuta sümboleid", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Sõnade arv" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Kasutatav brauser ei toeta lihtsat lõikelaua kopeerimist. Kopeeri see käsitsi." }, - "verifyIdentity": { - "message": "Identiteedi kinnitamine" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Ei" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Tekkis ootamatu viga." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Jah, salvesta see" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Paku olemasolevate andmete uuendamist" }, @@ -1133,10 +1169,6 @@ "message": "Hele", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized tume", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted Environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Kohandatud keskkond" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Serveri URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Lohista sorteerimiseks" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Seaded on uuendatud" - }, - "environmentEditedClick": { - "message": "Kliki siia," - }, - "environmentEditedReset": { - "message": "et taastada eelseadistatud seaded" - }, "serverVersion": { "message": "Serveri versioon" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Logi sisse ülemparooliga" }, - "loggingInAs": { - "message": "Sisselogimas kui" - }, - "notYou": { - "message": "Pole sina?" - }, "newAroundHere": { "message": "Oled siin uus?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Logi sisse seadme kaudu" }, - "loginWithDeviceEnabledInfo": { - "message": "Bitwardeni rakenduse seadistuses peab olema konfigureeritud sisselogimine läbi seadme. Vajad teist valikut?" - }, "fingerprintPhraseHeader": { "message": "Unikaalne sõnajada" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "Sinu seadmesse saadeti teavitus." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Küsi admini kinnitust" }, - "approveWithMasterPassword": { - "message": "Kinnita ülemparooliga" - }, "ssoIdentifierRequired": { "message": "Nõutav on organisatsiooni SSO identifikaator." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Kinnituspäring saadeti adminile." }, - "youWillBeNotifiedOnceApproved": { - "message": "Kinnitamise järel saad selle kohta teavituse." - }, "troubleLoggingIn": { "message": "Kas sisselogimisel on probleeme?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 106a4405aa1..b1e1ca3526b 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Pasahitza gogoratzeko pista" - }, - "enterEmailToGetHint": { - "message": "Sartu zure kontuko emaila pasahitz nagusiaren pista jasotzeko." - }, "getMasterPasswordHint": { "message": "Jaso pasahitz nagusiaren pista" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editatu Karpeta" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Luzera" }, - "uppercase": { - "message": "Letra larria (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Letra txikia (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Zenbakiak (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Karaktere bereziak (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Hitz kopurua" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Zure web nabigatzaileak ez du onartzen arbelean erraz kopiatzea. Eskuz kopiatu." }, - "verifyIdentity": { - "message": "Zure identitatea egiaztatu" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Ez" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Ustekabeko akatsa gertatu da." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Gorde" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Galdetu uneko saio-hasiera eguneratzeko" }, @@ -1133,10 +1169,6 @@ "message": "Argia", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized iluna", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Ostatze ingurune propioa" }, - "selfHostedEnvironmentFooter": { - "message": "Bitwarden instalatzeko, zehaztu ostatatze propioaren oinarrizko URL-a." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Ingurune pertsonalizatua" }, - "customEnvironmentFooter": { - "message": "Erabiltzaile aurreratuentzat. Zerbitzu bakoitzarentzako oinarrizko URL-a zehaztu dezakezu independienteki." - }, "baseUrl": { "message": "Zerbitzariaren URL-a" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arrastatu txukuntzeko" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Testua" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Ezarpenak editatu dira" - }, - "environmentEditedClick": { - "message": "Sakatu hemen" - }, - "environmentEditedReset": { - "message": "ezarpen lehenetsiak ezartzeko" - }, "serverVersion": { "message": "Zerbitzariaren bertsioa" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Hasi saioa pasahitz nagusiarekin" }, - "loggingInAs": { - "message": "Honela hasi saioa" - }, - "notYou": { - "message": "Ez zara zu?" - }, "newAroundHere": { "message": "Berria hemendik?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Eskatu administratzailearen onarpena" }, - "approveWithMasterPassword": { - "message": "Onartu pasahitz nagusiarekin" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Zure eskaera zure administratzaileari bidali zaio." }, - "youWillBeNotifiedOnceApproved": { - "message": "Jakinaraziko zaizu onartzen denean." - }, "troubleLoggingIn": { "message": "Arazoak saioa hasterakoan?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index cbd12fd6869..2b3d66ad104 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "یادآور کلمه عبور" - }, - "enterEmailToGetHint": { - "message": "برای دریافت یادآور کلمه عبور اصلی خود نشانی ایمیل‌تان را وارد کنید." - }, "getMasterPasswordHint": { "message": "دریافت یادآور کلمه عبور اصلی" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "ويرايش پوشه" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "طول" }, - "uppercase": { - "message": "حروف بزرگ (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "حروف کوچک (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "اعداد (‪0-9‬)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "نویسه‌های ویژه (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "تعداد کلمات" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "مرورگر شما از کپی کلیپ بورد آسان پشتیبانی نمی‌کند. به جای آن به صورت دستی کپی کنید." }, - "verifyIdentity": { - "message": "تأیید هویت" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "خیر" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "یک خطای غیر منتظره رخ داده است." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "ذخیره" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "درخواست برای به‌روزرسانی ورود به سیستم موجود" }, @@ -1133,10 +1169,6 @@ "message": "روشن", "description": "Light color" }, - "solarizedDark": { - "message": "تاریک خورشیدی", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "صادرات از" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "محیط خود میزبان" }, - "selfHostedEnvironmentFooter": { - "message": "نشانی اینترنتی پایه فرضی نصب Bitwarden میزبانی شده را مشخص کنید." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "محیط سفارشی" }, - "customEnvironmentFooter": { - "message": "برای کاربران پیشرفته. شما می‌توانید نشانی پایه هر سرویس را مستقلاً تعیین کنید." - }, "baseUrl": { "message": "نشانی اینترنتی سرور" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "برای مرتب‌سازی بکشید" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "متن" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "تنظیمات ویرایش شده اند" - }, - "environmentEditedClick": { - "message": "اینجا کلیک کنید" - }, - "environmentEditedReset": { - "message": "برای بازنشانی به تنظیمات از پیش پیکربندی شده" - }, "serverVersion": { "message": "نسخه سرور" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "با کلمه عبور اصلی وارد شوید" }, - "loggingInAs": { - "message": "در حال ورود به عنوان" - }, - "notYou": { - "message": "شما نیستید؟" - }, "newAroundHere": { "message": "اینجا تازه واردی؟" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "ورود با دستگاه" }, - "loginWithDeviceEnabledInfo": { - "message": "ورود به سیستم با دستگاه باید در تنظیمات برنامه‌ی Bitwarden تنظیم شود. به گزینه دیگری نیاز دارید؟" - }, "fingerprintPhraseHeader": { "message": "عبارت اثر انگشت" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "یک اعلان به دستگاه شما ارسال شده است." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "درخواست تأیید مدیر" }, - "approveWithMasterPassword": { - "message": "تأیید با کلمه عبور اصلی" - }, "ssoIdentifierRequired": { "message": "شناسه سازمان SSO مورد نیاز است." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "درخواست شما به مدیرتان فرستاده شد." }, - "youWillBeNotifiedOnceApproved": { - "message": "به محض تأیید مطلع خواهید شد." - }, "troubleLoggingIn": { "message": "در ورود مشکلی دارید؟" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index a19302bba13..a37bd0235c1 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -81,7 +81,7 @@ "message": "Pääsalasanan vihje (valinnainen)" }, "passwordStrengthScore": { - "message": "Salasanan vahvuusarvio $SCORE$", + "message": "Salasanan vahvuusluokitus on $SCORE$", "placeholders": { "score": { "content": "$1", @@ -129,7 +129,7 @@ "message": "Kopioi salasana" }, "copyPassphrase": { - "message": "Kopioi salauslauseke" + "message": "Kopioi salalause" }, "copyNote": { "message": "Kopioi merkinnät" @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" }, - "passwordHint": { - "message": "Salasanavihje" - }, - "enterEmailToGetHint": { - "message": "Syötä tilisi sähköpostiosoite saadaksesi pääsalasanan vihjeen." - }, "getMasterPasswordHint": { "message": "Pyydä pääsalasanan vihjettä" }, @@ -315,11 +309,11 @@ "message": "Voit vaihtaa pääsalasanasi Bitwardenin verkkosovelluksessa." }, "fingerprintPhrase": { - "message": "Tunnistelauseke", + "message": "Tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Tilisi tunnistelauseke", + "message": "Tilisi tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { @@ -385,6 +379,15 @@ "editFolder": { "message": "Muokkaa kansiota" }, + "editFolderWithName": { + "message": "Muokkaa kansiota: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Uusi kansio" }, @@ -456,19 +459,19 @@ "message": "Luo salasana" }, "generatePassphrase": { - "message": "Luo salauslauseke" + "message": "Luo salalause" }, "passwordGenerated": { "message": "Salasana luotiin" }, "passphraseGenerated": { - "message": "Salauslauseke luotiin" + "message": "Salalause luotiin" }, "usernameGenerated": { "message": "Käyttäjätunnus luotiin" }, "emailGenerated": { - "message": "Sähköpostiosoite luotu" + "message": "Sähköpostiosoite luotiin" }, "regeneratePassword": { "message": "Luo uusi salasana" @@ -479,22 +482,6 @@ "length": { "message": "Pituus" }, - "uppercase": { - "message": "Isot kirjaimet (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Pienet kirjaimet (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numerot (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Erikoismerkit (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Sisällytys", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Sisällytä erikoismerkkejä", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Sanojen määrä" }, @@ -555,7 +538,7 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Yrityskäytännön säännöt vaikuttavat generaattoriasetuksiisi.", + "message": "Yrityskäytännön säännöt vaikuttavat generaattorisi asetuksiin.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { @@ -583,7 +566,7 @@ "message": "Todennuksen salaisuus" }, "passphrase": { - "message": "Salauslauseke" + "message": "Salalause" }, "favorite": { "message": "Suosikki" @@ -669,11 +652,11 @@ "browserNotSupportClipboard": { "message": "Selaimesi ei tue helppoa leikepöydälle kopiointia. Kopioi kohde manuaalisesti." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Vahvista henkilöllisyytesi" }, "weDontRecognizeThisDevice": { - "message": "Emme tunnista tätä laitetta. Anna sähköpostiisi lähetetty koodi henkilöllisyytesi vahvistamiseksi." + "message": "Laitetta ei tunnistettu. Vahvista henkilöllisyytesi syöttämällä sähköpostitse saamasi koodi." }, "continueLoggingIn": { "message": "Jatka kirjautumista" @@ -886,16 +869,16 @@ "message": "Kirjaudu Bitwardeniin" }, "enterTheCodeSentToYourEmail": { - "message": "Syötä sähköpostitse vastaanottamasi koodi" + "message": "Syötä sähköpostitse saamasi koodi" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Syötä todennussovelluksesi näyttämä koodi" }, "pressYourYubiKeyToAuthenticate": { - "message": "Tunnistaudu painalla YubiKeytäsi" + "message": "Tunnistaudu koskettamalla YubiKeytäsi" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duon edellyttää tililtäsi kaksivaiheista tunnistautumista. Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." + "message": "Duo edellyttää tililtäsi kaksivaiheista tunnistautumista. Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." @@ -921,6 +904,9 @@ "no": { "message": "En" }, + "location": { + "message": "Sijainti" + }, "unexpectedError": { "message": "Tapahtui odottamaton virhe." }, @@ -1033,25 +1019,25 @@ "message": "Ehdota kohteen tallennusta, jos holvistasi ei vielä löydy vastaavaa kohdetta. Koskee kaikkia kirjautuneita tilejä." }, "showCardsInVaultViewV2": { - "message": "Näytä aina kortit automaattisen täytön ehdotuksina Holvi-näkymässä" + "message": "Näytä kortit aina automaattitäytön ehdotuksina Holvi-näkymässä" }, "showCardsCurrentTab": { "message": "Näytä kortit välilehtiosiossa" }, "showCardsCurrentTabDesc": { - "message": "Näytä kortit Välilehti-sivulla automaattitäytön helpottamiseksi." + "message": "Näytä kortit Välilehti-näkymässä automaattitäytön helpottamiseksi." }, "showIdentitiesInVaultViewV2": { - "message": "Näytä aina identiteetit automaattisen täytön ehdotuksina Holvi-näkymässä" + "message": "Näytä henkilöllisyydet aina automaattitäytön ehdotuksina Holvi-näkymässä" }, "showIdentitiesCurrentTab": { "message": "Näytä henkilöllisyydet välilehtiosiossa" }, "showIdentitiesCurrentTabDesc": { - "message": "Näytä henkilöllisyydet Välilehti-sivulla automaattitäytön helpottamiseksi." + "message": "Näytä henkilöllisyydet Välilehti-näkymässä automaattitäytön helpottamiseksi." }, "clickToAutofillOnVault": { - "message": "Valitse kohteita täyttääksesi tiedot automaattisesti Holvi-näkymässä" + "message": "Täytä kohteet Holvi-näkymästä klikkaamalla niitä" }, "clickToAutofill": { "message": "Täytä automaattitäytön ehdotus napsauttamalla sitä" @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Tallenna" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ tallennettiin Bitwardeniin.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ päivitettiin Bitwardeniin.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Tallenna uutena kirjautumistietona", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Päivitä kirjautumistieto", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Tallennetaanko kirjautumistieto?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Päivitetäänkö olemassaoleva kirjautumistieto?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Kirjautumistieto tallennettiin", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Kirjautumistieto päivitettiin", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Virhe tallennettaessa", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Voi ei! Emme voineet tallentaa tätä. Yritä syöttää tiedot manuaalisesti.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Kysy päivitetäänkö kirjautumistieto" }, @@ -1133,10 +1169,6 @@ "message": "Vaalea", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized, tumma", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Vie lähteestä" }, @@ -1294,7 +1326,7 @@ "message": "Varmuuskäyttö" }, "premiumSignUpTwoStepOptions": { - "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." + "message": "Kaksivaiheisen kirjautumisen erikoisvaihtoehdot, kuten YubiKey ja Duo." }, "ppremiumSignUpReports": { "message": "Salasanahygienian, tilin terveyden ja tietovuotojen raportointitoiminnot pitävät holvisi turvassa." @@ -1406,7 +1438,7 @@ "message": "Käytä palautuskoodiasi" }, "insertYubiKey": { - "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." + "message": "Kytke YubiKey-suojausavaimesi tietokoneen USB-porttiin ja kosketa sen painiketta." }, "insertU2f": { "message": "Kytke suojausavaimesi tietokoneen USB-porttiin. Jos laitteessa on painike, paina sitä." @@ -1424,7 +1456,7 @@ "message": "WebAuthn-todennus" }, "readSecurityKey": { - "message": "Lue todennuslaite" + "message": "Lue suojausavain" }, "awaitingSecurityKeyInteraction": { "message": "Odotetaan suojausavaimen aktivointia..." @@ -1442,10 +1474,10 @@ "message": "Kaksivaiheisen kirjautumisen asetukset" }, "selectTwoStepLoginMethod": { - "message": "Käytä vaihtoehtoista tunnistautumistapaa" + "message": "Valitse todennustapa" }, "recoveryCodeDesc": { - "message": "Etkö pysty käyttämään kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." + "message": "Etkö voi käyttää kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." }, "recoveryCodeTitle": { "message": "Palautuskoodi" @@ -1461,7 +1493,7 @@ "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { - "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." + "message": "Käytä YubiKey-suojausavainta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C ja NEO -laitteiden kanssa." }, "duoDescV2": { "message": "Syötä Duo Securityn luoma koodi.", @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Itse ylläpidetty palvelinympäristö" }, - "selfHostedEnvironmentFooter": { - "message": "Määritä omassa palvelinympäristössäsi suoritettavan Bitwarden-asennuksen perusosoite." - }, "selfHostedBaseUrlHint": { "message": "Määritä itse ylläpitämäsi Bitwarden-asennuksen perusosoite. Esimerkki: https://bitwarden.yritys.fi." }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Mukautettu palvelinympäristö" }, - "customEnvironmentFooter": { - "message": "Edistyneille käyttäjille. Voit määrittää jokaiselle palvelulle oman perusosoitteen." - }, "baseUrl": { "message": "Palvelimen URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Järjestä raahaamalla" }, + "dragToReorder": { + "message": "Järjestä vetämällä" + }, "cfTypeText": { "message": "Teksti" }, @@ -1665,7 +1694,7 @@ "message": "Painallus ponnahdusikkunan ulkopuolelle todennuskoodin sähköpostista noutoa varten sulkee ikkunan. Haluatko avata näkymän uuteen ikkunaan, jotta se pysyy avoinna?" }, "popupU2fCloseMessage": { - "message": "Tämä selain ei voi käsitellä U2F-pyyntöjä tässä ponnahdusikkunassa. Haluatko avata näkymän uuteen ikkunaan, jotta voit vahvistaa kirjautumisen U2F-todennuslaitteella?" + "message": "Tämä selain ei voi käsitellä U2F-pyyntöjä tässä ponnahdusikkunassa. Haluatko avata näkymän uuteen ikkunaan vahvistaaksesi kirjautumisen U2F-suojausavaimella?" }, "enableFavicon": { "message": "Näytä verkkosivustojen kuvakkeet" @@ -2051,7 +2080,7 @@ "message": "Heikko pääsalasana" }, "weakMasterPasswordDesc": { - "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslauseketta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?" + "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslausetta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?" }, "pin": { "message": "PIN", @@ -2144,13 +2173,13 @@ "message": "Aikakatkaisutoiminto" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Uusia mukautusvaihtoehtoja" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "Mukauta holvikokemustasi pikakopiointitoiminnoilla, kompaktilla tilalla ja muulla!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Näytä kaikki ulkoasuasetukset" }, "lock": { "message": "Lukitse", @@ -2233,7 +2262,7 @@ "message": "Yksi tai useampi organisaatiokäytäntö edellyttää, että pääsalasanasi täyttää seuraavat vaatimukset:" }, "policyInEffectMinComplexity": { - "message": "Monimutkaisuuden vähimmäispistemäärä on $SCORE$", + "message": "Monimutkaisuuden vähimmäisluokitus on $SCORE$", "placeholders": { "score": { "content": "$1", @@ -2447,7 +2476,7 @@ "message": "Vaarantuneet salasanat" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ pyytää sinua vaihtamaan yhden salasanan, koska se on vaarassa.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ pyytää sinua vaihtamaan nämä $COUNT$ salasanaa, koska ne ovat vaarassa.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Organisaatiosi pyytävät sinua vaihtamaan nämä $COUNT$ salasanaa, koska ne ovat vaarassa.", "placeholders": { "count": { "content": "$1", @@ -2496,34 +2525,34 @@ "message": "Päivitä asetuksesi, jotta voit täyttää salasanasi ja luoda uusia nopeasti." }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Tarkista vaarantuneet kirjautumistiedot" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Tarkista vaarantuneet salasanat" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Organisaatiosalasanasi ovat vaarantuneet, koska ne ovat heikkoja, toistuvasti käytettyjä ja/tai paljastuneita.", "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": "Kuvitus vaarantuneiden kirjautumistietojen luettelosta" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Luo vahva ja ainutlaatuinen salasana nopeasti Bitwardenin automaattitäytön valikosta vaarantuneella sivustolla.", "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": "Kuvitus Bitwardenin automaattitäytön valikosta, luodulla salasanalla" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Päivitä Bitwardenissa" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden pyytää sinua sitten päivittämään salasanan salasanahallinnassa.", "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": "Kuvitus ilmoituksesta, jossa Bitwarden tarjoaa kirjautumistiedon päivitystä" }, "turnOnAutofill": { "message": "Ota automaattitäyttö käyttöön" @@ -3038,7 +3067,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Käytä $RECOMMENDED$ tai useampaa sanaa vahvan salauslausekkeen luomiseen.", + "message": " Käytä vahvaan salalauseeseen ainakin $RECOMMENDED$ sanaa.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Asetuksia on muokattu" - }, - "environmentEditedClick": { - "message": "Paina tästä" - }, - "environmentEditedReset": { - "message": "palauttaaksesi oletusasetukset" - }, "serverVersion": { "message": "Palvelimen versio" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Kirjaudu pääsalasanalla" }, - "loggingInAs": { - "message": "Kirjaudutaan tunnuksella" - }, - "notYou": { - "message": "Etkö se ollut sinä?" - }, "newAroundHere": { "message": "Oletko uusi täällä?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Laitteella kirjautuminen" }, - "loginWithDeviceEnabledInfo": { - "message": "Laitteella kirjautuminen on määritettävä Bitwarden-sovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" - }, "fingerprintPhraseHeader": { "message": "Tunnistelauseke" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Näytä kaikki kirjautumisvaihtoehdot" }, - "viewAllLoginOptionsV1": { - "message": "Näytä kaikki kirjautumisvaihtoehdot" - }, "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Pyydä hyväksyntää ylläpidolta" }, - "approveWithMasterPassword": { - "message": "Hyväksy pääsalasanalla" - }, "ssoIdentifierRequired": { "message": "Organisaation kertakirjautumistunniste tarvitaan." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pyyntösi on välitetty ylläpidollesi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Saat ilmoituksen kun se on hyväksytty." - }, "troubleLoggingIn": { "message": "Ongelmia kirjautumisessa?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktiivinen tili" }, + "bitwardenAccount": { + "message": "Bitwarden-tili" + }, "availableAccounts": { "message": "Käytettävissä olevat tilit" }, @@ -4276,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Kopioi $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Siirrä verkkosivuston URIa. Liikuta kohdetta ylös- tai alaspäin nuolinäppäimillä." + }, "reorderFieldUp": { "message": "$LABEL$ siirrettiin ylemmäs, sijainti: $INDEX$/$LENGTH$", "placeholders": { @@ -4725,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": { @@ -5046,7 +5045,7 @@ "message": "Luotu salasana" }, "compactMode": { - "message": "Pienikokoinen tila" + "message": "Kompakti tila" }, "beta": { "message": "Beta" @@ -5061,7 +5060,7 @@ "message": "Bitwarden lähettää tilisi sähköpostiosoitteeseen koodin, jolla voit vahvistaa kirjautumiset uusista laitteista helmikuusta 2025 alkaen." }, "newDeviceVerificationNoticeContentPage2": { - "message": "Voit ottaa käyttöön kaksivaiheisen kirjautumisen vaihtoehtoisena tapana suojata tilisi, tai vaihtaa sähköpostisi sellaiseen, johon sinulla on pääsy." + "message": "Voit määrittää kaksivaiheisen kirjautumisen tilisi vaihtoehtoiseksi suojaustavaksi tai vaihtaa sähköpostiosoitteesi sellaiseen, johon sinulla on pääsy." }, "remindMeLater": { "message": "Muistuta myöhemmin" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Erittäin leveä" }, + "sshKeyWrongPassword": { + "message": "Syöttämäsi salasana on virheellinen." + }, + "importSshKey": { + "message": "Tuo" + }, + "confirmSshKeyPassword": { + "message": "Vahvista salasana" + }, + "enterSshKeyPasswordDesc": { + "message": "Syötä SSH-avaimen salasana." + }, + "enterSshKeyPassword": { + "message": "Syötä salasana" + }, + "invalidSshKey": { + "message": "SSH-avain on virheellinen" + }, + "sshKeyTypeUnsupported": { + "message": "SSH-avaintyyppiä ei ole tuettu" + }, + "importSshKeyFromClipboard": { + "message": "Tuo avain leikepöydältä" + }, + "sshKeyImported": { + "message": "SSH-avain on tuotu" + }, "cannotRemoveViewOnlyCollections": { "message": "Et voi poistaa kokoelmia, joihin sinulla on vain tarkasteluoikeus: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Käyttääksesi biometristä avausta, päivitä työpöytäsovelluksesi tai poista tunnistelauseke käytöstä työpöydän asetuksista." + }, + "changeAtRiskPassword": { + "message": "Vaihda vaarantunut salasana" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 5dc6e6a59b7..9f991843f4f 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Mungkahi sa Password" - }, - "enterEmailToGetHint": { - "message": "Ipasok ang iyong email address ng account para makatanggap ng hint ng iyong master password." - }, "getMasterPasswordHint": { "message": "Makuha ang Punong Password na Hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "I-edit ang folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Kahabaan" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-t) sa Filipino ay mababang-letra (a-t)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Mga espesyal na character (!@#$%^&*) sa Filipino ay tinatawag na mga simbolong pambihira", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Ang bilang ng mga salita\n\nNumero ng mga salita" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Hindi suportado ng iyong web browser ang madaling pag-copy ng clipboard. Kopya ito manually sa halip." }, - "verifyIdentity": { - "message": "I-verify ang pagkakakilanlan" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Hindi" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Namana ang isang hindi inaasahang error." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "I-save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Tanungin ang update ng umiiral na login" }, @@ -1133,10 +1169,6 @@ "message": "Mabait", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Kapaligirang self-hosted" }, - "selfHostedEnvironmentFooter": { - "message": "Tukuyin ang base URL ng iyong Bitwarden installation na naka-host sa on-premises." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Kapaligirang Custom" }, - "customEnvironmentFooter": { - "message": "Para sa mga advanced na gumagamit. Maaari mong tukuyin ang base URL ng bawat serbisyo nang independiyente." - }, "baseUrl": { "message": "URL ng Server" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "I-drag upang i-sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teksto" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Nabago ang mga setting" - }, - "environmentEditedClick": { - "message": "Mag-click dito" - }, - "environmentEditedReset": { - "message": "i-reset sa pre-configured na mga setting" - }, "serverVersion": { "message": "Bersyon ng server" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Mag-login gamit ang pangunahing password" }, - "loggingInAs": { - "message": "Naglolog-in bilang" - }, - "notYou": { - "message": "Hindi ikaw?" - }, "newAroundHere": { "message": "Mag-login gamit ang pangunahing password?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Mag log in gamit ang device" }, - "loginWithDeviceEnabledInfo": { - "message": "Ang pag log in gamit ang device ay dapat na naka set up sa mga setting ng Bitwarden app. Kailangan mo ng ibang opsyon?" - }, "fingerprintPhraseHeader": { "message": "Hulmabig ng Hilik ng Dako" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "Naipadala na ang notification sa iyong device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index c37c772acf9..32b6dd0296b 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -7,7 +7,7 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Chez vous, au travail, n'importe où, Bitwarden sécurise mots de passe, clés d'accès et informations sensibles", + "message": "Où que vous soyez, Bitwarden sécurise tous vos mots de passe, clés d'accès et informations sensibles", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { @@ -20,7 +20,7 @@ "message": "Créer un compte" }, "newToBitwarden": { - "message": "Nouveau sur Bitwarden ?" + "message": "Nouveau sur Bitwarden ?" }, "logInWithPasskey": { "message": "Se connecter avec une clé d'accès" @@ -243,7 +243,7 @@ "message": "Connectez-vous à votre coffre" }, "autoFillInfo": { - "message": "Il n'y a aucun identifiant disponible pour le remplissage automatique de l'onglet actuel du navigateur." + "message": "Il n'y a aucun identifiant disponible pour la saisie automatique concernant l'onglet actuel du navigateur." }, "addLogin": { "message": "Ajouter un identifiant" @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Saisissez l'adresse courriel de votre compte et votre indice de mot de passe vous sera envoyé" }, - "passwordHint": { - "message": "Indice de mot de passe" - }, - "enterEmailToGetHint": { - "message": "Saisissez l'adresse électronique de votre compte pour recevoir l'indice de votre mot de passe principal." - }, "getMasterPasswordHint": { "message": "Obtenir l'indice du mot de passe principal" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Modifier le dossier" }, + "editFolderWithName": { + "message": "Éditer le dossier : $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nouveau dossier" }, @@ -479,22 +482,6 @@ "length": { "message": "Longueur" }, - "uppercase": { - "message": "Majuscules (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minuscules (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Chiffres (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caractères spéciaux (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Inclure", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Inclure des caractères spéciaux", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Nombre de mots" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Votre navigateur web ne supporte pas la copie rapide depuis le presse-papier. Copiez-le manuellement à la place." }, - "verifyIdentity": { - "message": "Vérifier l'identité" + "verifyYourIdentity": { + "message": "Vérifiez votre identité" }, "weDontRecognizeThisDevice": { "message": "Nous ne reconnaissons pas cet appareil. Saisissez le code envoyé à votre courriel pour vérifier votre identité." @@ -921,6 +904,9 @@ "no": { "message": "Non" }, + "location": { + "message": "Emplacement" + }, "unexpectedError": { "message": "Une erreur inattendue est survenue." }, @@ -1033,7 +1019,7 @@ "message": "Demande l'ajout d'un élément si celui-ci n'est pas trouvé dans votre coffre. S'applique à tous les comptes connectés." }, "showCardsInVaultViewV2": { - "message": "Toujours montrer les cartes de paiement en tant que suggestions de remplissage automatique dans l'affichage du coffre" + "message": "Toujours afficher les cartes de paiement en tant que suggestions de saisie automatique dans l'affichage du coffre" }, "showCardsCurrentTab": { "message": "Afficher les cartes de paiement sur la Page d'onglet" @@ -1042,7 +1028,7 @@ "message": "Liste les éléments des cartes de paiement sur la Page d'onglet pour faciliter la saisie automatique." }, "showIdentitiesInVaultViewV2": { - "message": "Toujours montrer les identités en tant que suggestions de remplissage automatique dans l'affichage du coffre" + "message": "Toujours afficher les identités en tant que suggestions de saisie automatique dans l'affichage du coffre" }, "showIdentitiesCurrentTab": { "message": "Afficher les identités sur la Page d'onglet" @@ -1051,10 +1037,10 @@ "message": "Liste les éléments d'identité sur la Page d'onglet pour faciliter la saisie automatique." }, "clickToAutofillOnVault": { - "message": "Cliquez sur les éléments pour le remplissage automatique dans 'affichage du coffre" + "message": "Cliquez sur les éléments dans l'affichage du coffre pour la saisie automatique" }, "clickToAutofill": { - "message": "Cliquez sur les éléments de la suggestion de remplissage automatique pour les remplir" + "message": "Cliquez sur les éléments de la suggestion de saisie automatique pour les remplir" }, "clearClipboard": { "message": "Effacer le presse-papiers", @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Enregistrer" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ enregistré dans Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ mis à jour dans Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Enregistrer en tant que nouvel identifiant", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Mettre à jour l'identifiant", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Enregistrer l'identifiant ?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Mettre à jour de l'identifiant existant ?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Identifiant enregistré", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Identifiant mis à jour", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Erreur lors de l'enregistrement", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh non ! Nous n'avons pas pu enregistrer cela. Essayez de saisir les détails manuellement.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Demander de mettre à jour un identifiant existant" }, @@ -1133,10 +1169,6 @@ "message": "Clair", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exporter à partir de" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Environnement auto-hébergé" }, - "selfHostedEnvironmentFooter": { - "message": "Spécifiez l'URL de base de votre installation Bitwarden auto-hébergée." - }, "selfHostedBaseUrlHint": { "message": "Spécifiez l'URL de base de votre installation autohébergée par Bitwarden. Exemple : https://bitwarden.compagnie.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Environnement personnalisé" }, - "customEnvironmentFooter": { - "message": "Pour utilisateurs avancés. Vous pouvez spécifier une URL de base indépendante pour chaque service." - }, "baseUrl": { "message": "URL du serveur" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Glissez pour trier" }, + "dragToReorder": { + "message": "Faire glisser pour réorganiser" + }, "cfTypeText": { "message": "Texte" }, @@ -1839,7 +1868,7 @@ "message": "Clé SSH" }, "newItemHeader": { - "message": "Nouveau/nouvelle $TYPE$", + "message": "Créer un(e) $TYPE$", "placeholders": { "type": { "content": "$1", @@ -2150,7 +2179,7 @@ "message": "Personnalisez votre expérience utilisateur du coffre avec des actions de copie rapide, un mode compact et bien plus encore !" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Afficher tous les paramètres d'apparence" }, "lock": { "message": "Verrouiller", @@ -2423,10 +2452,10 @@ "message": "Bitwarden ne demandera pas d'enregistrer les détails de connexion pour ces domaines pour tous les comptes connectés. Vous devez actualiser la page pour que les modifications prennent effet." }, "blockedDomainsDesc": { - "message": "Le remplissage automatique et d'autres fonctionnalités connexes ne seront pas proposés pour ces sites web. Vous devez actualiser la page pour que les modifications soient prises en compte." + "message": "La saisie automatique et d'autres fonctionnalités connexes ne seront pas proposées pour ces sites web. Vous devez actualiser la page pour que les modifications soient prises en compte." }, "autofillBlockedNoticeV2": { - "message": "Le remplissage automatique est bloqué pour ce site web." + "message": "La saisie automatique est bloquée pour ce site web." }, "autofillBlockedNoticeGuidance": { "message": "Modifier ceci dans les paramètres" @@ -2447,7 +2476,7 @@ "message": "Mots de passe à risque" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ vous demande de modifier un mot de passe car il est à risque.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ vous demande de modifier les mots de passe de $COUNT$ parce qu’ils sont à risque.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Vos organisations vous demandent de modifier les mots de passe $COUNT$ car ils sont à risque.", "placeholders": { "count": { "content": "$1", @@ -2493,46 +2522,46 @@ "message": "Modifier plus rapidement les mots de passe à risque" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Mettez à jour vos paramètres afin de pouvoir rapidement saisir automatiquement vos mots de passe et en générer de nouveaux" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Examiner les identifiants à risque" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Examiner les mots de passe à risque" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Les mots de passe de votre organisation sont à risque, car ils sont faibles, réutilisés et/ou exposés.", "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": "Illustration d'une liste d'identifiants à risque" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Générez rapidement un mot de passe fort et unique grâce au menu de saisie automatique de Bitwarden sur le site à risque.", "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": "Illustration du menu de saisie automatique de Bitwarden affichant un mot de passe généré" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Mettre à jour dans Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden vous demandera alors de mettre à jour le mot de passe dans le gestionnaire de mots de passe.", "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": "Illustration d’une notification de Bitwarden invitant l’utilisateur à mettre à jour l'identifiant" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Activer la saisie automatique" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Activer la saisie automatique" }, "dismiss": { - "message": "Dismiss" + "message": "Rejeter" }, "websiteItemLabel": { "message": "Site web $number$ (URI)", @@ -2553,7 +2582,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Modifications apportées aux domaines bloqués enregistrées" }, "excludedDomainsSavedSuccess": { "message": "Changements de domaines exclus enregistrés" @@ -2778,7 +2807,7 @@ "message": "Une erreur s'est produite lors de l'enregistrement de vos dates de suppression et d'expiration." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "Masquer votre adresse courriel aux regards indiscrets." }, "passwordPrompt": { "message": "Ressaisir le mot de passe principal" @@ -2854,7 +2883,7 @@ "message": "Minutes" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Les exigences de la politique de sécurité d'Entreprise ont été appliquées à vos options de délai d'expiration" }, "vaultTimeoutPolicyInEffect": { "message": "Les politiques de sécurité de votre organisation ont défini le délai d'expiration de votre coffre à $HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", @@ -2870,7 +2899,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ heure(s) et $MINUTES$ minute(s) maximum.", "placeholders": { "hours": { "content": "$1", @@ -2883,7 +2912,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Le délai d'expiration dépasse la restriction définie par votre organisation : $HOURS$ heure(s) et $MINUTES$ minute(s) maximum", "placeholders": { "hours": { "content": "$1", @@ -2994,17 +3023,17 @@ "message": "Erreur" }, "decryptionError": { - "message": "Decryption error" + "message": "Erreur de déchiffrement" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden n’a pas pu déchiffrer le(s) élément(s) du coffre listé(s) ci-dessous." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Contacter le service clientèle", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "afin d'éviter toute perte de données supplémentaire.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3139,7 +3168,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ a refusé votre demande. Veuillez contacter votre fournisseur de services pour obtenir de l'aide.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3149,7 +3178,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ a refusé votre demande : $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Les paramètres ont été modifiés" - }, - "environmentEditedClick": { - "message": "Cliquer ici" - }, - "environmentEditedReset": { - "message": "pour réinitialiser aux paramètres par défaut" - }, "serverVersion": { "message": "Version du serveur" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Se connecter avec le mot de passe principal" }, - "loggingInAs": { - "message": "Connexion en tant que" - }, - "notYou": { - "message": "Ce n'est pas vous ?" - }, "newAroundHere": { "message": "Nouveau par ici ?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Se connecter avec l'appareil" }, - "loginWithDeviceEnabledInfo": { - "message": "La connexion avec l'appareil doit être configurée dans les paramètres de l'application Bitwarden. Besoin d'une autre option ?" - }, "fingerprintPhraseHeader": { "message": "Phrase d'empreinte" }, @@ -3312,20 +3323,17 @@ "viewAllLogInOptions": { "message": "Afficher toutes les options de connexion" }, - "viewAllLoginOptionsV1": { - "message": "Afficher toutes les options de connexion" - }, "notificationSentDevice": { "message": "Une notification a été envoyée à votre appareil." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Déverrouillez Bitwarden sur votre appareil ou sur le" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "application web" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant de l'approuver." }, "aNotificationWasSentToYourDevice": { "message": "Une notification a été envoyée à votre appareil" @@ -3340,7 +3348,7 @@ "message": "Connexion initiée" }, "logInRequestSent": { - "message": "Request sent" + "message": "Demande envoyée" }, "exposedMasterPassword": { "message": "Mot de passe principal exposé" @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Demander l'approbation de l'administrateur" }, - "approveWithMasterPassword": { - "message": "Approuver avec le mot de passe principal" - }, "ssoIdentifierRequired": { "message": "Identifiant SSO de l'organisation requis." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Demande transmise à votre administrateur." }, - "youWillBeNotifiedOnceApproved": { - "message": "Vous serez notifié une fois approuvé." - }, "troubleLoggingIn": { "message": "Problème pour vous connecter ?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Compte actif" }, + "bitwardenAccount": { + "message": "Compte Bitwarden" + }, "availableAccounts": { "message": "Comptes disponibles" }, @@ -4198,10 +4203,10 @@ "message": "Clé d'identification (passkey) retirée" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Suggestions de saisie automatique" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Éléments suggérés" }, "autofillSuggestionsTip": { "message": "Enregistrez un élément de connexion à remplir automatiquement pour ce site" @@ -4276,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Copier $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4343,7 +4348,7 @@ } }, "new": { - "message": "Nouveau" + "message": "Créer" }, "removeItem": { "message": "Retirer $NAME$", @@ -4513,7 +4518,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Afficher la détection de correspondance $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4522,7 +4527,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Masquer la détection de correspondance $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4543,7 +4548,7 @@ "message": "Détails de la carte de paiement" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "Détails de la carte $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -4665,8 +4670,11 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Réorganiser les URI des sites web. Utiliser la touche fléchée pour déplacer l'élément vers le haut ou vers le bas." + }, "reorderFieldUp": { - "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ déplacé vers le haut, position $INDEX$ de $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4725,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": { @@ -4753,7 +4752,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ déplacé vers le bas, position $INDEX$ de $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4776,13 +4775,13 @@ "message": "Send en fichier" }, "fileSends": { - "message": "File Sends" + "message": "Envoi de fichiers" }, "textSend": { "message": "Send en texte" }, "textSends": { - "message": "Text Sends" + "message": "Envoi de textes" }, "accountActions": { "message": "Actions du compte" @@ -4863,22 +4862,22 @@ "message": "Vous n'êtes pas autorisé à modifier cet élément" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Le déverrouillage par biométrie n’est pas disponible parce qu'il faut au préalable déverrouiller avec le code PIN ou le mot de passe." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Le déverrouillage par biométrie n'est pas disponible actuellement." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Le déverrouillage par biométrie n'est pas disponible en raison de fichiers système mal configurés." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Le déverrouillage par biométrie n'est pas disponible en raison de fichiers système mal configurés." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Le déverrouillage par biométrie n'est pas disponible car l'application de bureau Bitwarden est fermée." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Le déverrouillage par biométrie n'est pas disponible car elle n'est pas activée pour $EMAIL$ dans l'application de bureau Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -4887,7 +4886,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Le déverrouillage par biométrie n'est pas disponible actuellement pour une raison inconnue." }, "authenticating": { "message": "Authentification" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Très large" }, + "sshKeyWrongPassword": { + "message": "Le mot de passe saisi est incorrect." + }, + "importSshKey": { + "message": "Importer" + }, + "confirmSshKeyPassword": { + "message": "Confirmer le mot de passe" + }, + "enterSshKeyPasswordDesc": { + "message": "Saisir le mot de passe de la clé SSH." + }, + "enterSshKeyPassword": { + "message": "Saisir le mot de passe" + }, + "invalidSshKey": { + "message": "La clé SSH n'est pas valide" + }, + "sshKeyTypeUnsupported": { + "message": "Le type de clé SSH n'est pas pris en charge" + }, + "importSshKeyFromClipboard": { + "message": "Importer une clé à partir du presse-papiers" + }, + "sshKeyImported": { + "message": "Clé SSH importée avec succès" + }, "cannotRemoveViewOnlyCollections": { "message": "Vous ne pouvez pas supprimer des collections avec les autorisations d'affichage uniquement : $COLLECTIONS$", "placeholders": { @@ -5106,9 +5132,12 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Veuillez mettre à jour votre application de bureau" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Pour utiliser le déverrouillage par biométrie, veuillez mettre à jour votre application de bureau ou désactiver le déverrouillage par empreinte digitale dans les paramètres de l'application de bureau." + }, + "changeAtRiskPassword": { + "message": "Changer le mot de passe à risque" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 3a2348072f0..6c0b9cce87b 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduce o teu correo electrónico e enviarémosche a túa pista do contrasinal mestre" }, - "passwordHint": { - "message": "Pista do contrasinal" - }, - "enterEmailToGetHint": { - "message": "Introduce a dirección de correo da túa conta para recibir a pista do contrasinal mestre." - }, "getMasterPasswordHint": { "message": "Obter pista do contrasinal mestre" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editar cartafol" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Novo cartafol" }, @@ -479,22 +482,6 @@ "length": { "message": "Lonxitude" }, - "uppercase": { - "message": "Maiúsculas (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minúsculas (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Números (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Incluír", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Incluír caracteres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palabras" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "O navegador non permite copia doada ó portapapeis. Debes copialo manualmente." }, - "verifyIdentity": { - "message": "Verificar identidade" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Non" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Produciuse un erro inesperado." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Gardar" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ofrecer actualizar as credenciais xa gardadas" }, @@ -1133,10 +1169,6 @@ "message": "Claro", "description": "Light color" }, - "solarizedDark": { - "message": "Solarizado escuro", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportar dende" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Entorno de aloxamento propio" }, - "selfHostedEnvironmentFooter": { - "message": "Especifica a URL base do teu servidor Bitwarden de aloxamento propio." - }, "selfHostedBaseUrlHint": { "message": "Especifica a URL base do teu servidor Bitwarden de aloxamento propio. Ex.: https://bitwarden.compañia.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Entorno personalizado" }, - "customEnvironmentFooter": { - "message": "Para usuarios avanzados. Podes especificar o URL base de cada servizo de xeito independente." - }, "baseUrl": { "message": "URL do servidor" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arrastra para ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Texto" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Os axustes foron modificados" - }, - "environmentEditedClick": { - "message": "Preme aquí" - }, - "environmentEditedReset": { - "message": "para volver á configuración por defecto" - }, "serverVersion": { "message": "Versión do Servidor" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Iniciar sesión co contrasinal mestre" }, - "loggingInAs": { - "message": "Iniciando sesión como" - }, - "notYou": { - "message": "Non es ti?" - }, "newAroundHere": { "message": "Novo por aquí?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Iniciar sesión cun dispositivo" }, - "loginWithDeviceEnabledInfo": { - "message": "O inicio de sesión con dispositivos debe estar activado nos axustes da app de Bitwarden. Precisas doutro método?" - }, "fingerprintPhraseHeader": { "message": "Frase de pegada dixital" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Ver todas as opcións de inicio de sesión" }, - "viewAllLoginOptionsV1": { - "message": "Ver todas as opcións de inicio de sesión" - }, "notificationSentDevice": { "message": "Enviouse unha notificación ó teu dispositivo." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Solicitar aprobación do administrador" }, - "approveWithMasterPassword": { - "message": "Aprobar con contrasinal mestre" - }, "ssoIdentifierRequired": { "message": "Identificador SSO da organización requirido." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "A solicitude foi enviada ó teu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Serás notificado cando se aprobe." - }, "troubleLoggingIn": { "message": "Problemas ao iniciar sesión?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Activar conta" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Contas dispoñibles" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "Subiuse $LABEL$ á posición $INDEX$ de $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Moi ancho" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Non podes eliminar coleccións con permisos de Só lectura: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 174dcd4ede2..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": "העתק סיסמה" @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "הזן את כתובת דוא\"ל החשבון שלך והרמז לסיסמה שלך יישלח אליך" }, - "passwordHint": { - "message": "רמז לסיסמה" - }, - "enterEmailToGetHint": { - "message": "הכנס את פרטי האימייל שלך לקבלת רמז עבור הסיסמה הראשית." - }, "getMasterPasswordHint": { "message": "הצג את הרמז לסיסמה הראשית" }, @@ -323,7 +317,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "כניסה דו-שלבית" + "message": "כניסה דו־שלבית" }, "logOut": { "message": "צא" @@ -347,7 +341,7 @@ "message": "מאמת Bitwarden" }, "continueToAuthenticatorPageDesc": { - "message": "מאמת Bitwarden מאפשר לך לאחסון מפתחות מאמת וליצור קודי TOTP עבור זרימת אימות דו-שלבית. למד עוד באתר האינטרנט bitwarden.com" + "message": "מאמת Bitwarden מאפשר לך לאחסן מפתחות מאמת וליצור קודי TOTP עבור זרימת אימות דו־שלבית. למד עוד באתר האינטרנט bitwarden.com" }, "bitwardenSecretsManager": { "message": "מנהל הסודות של Bitwarden" @@ -362,10 +356,10 @@ "message": "צור חוויית כניסה חלקה ובטוחה חופשית מסיסמאות מסורתיות עם Passwordless.dev. למד עוד באתר האינטרנט bitwarden.com." }, "freeBitwardenFamilies": { - "message": "משפחות Bitwarden בחינם" + "message": "Bitwarden למשפחות בחינם" }, "freeBitwardenFamiliesPageDesc": { - "message": "אתה זכאי למשפחות Bitwarden בחינם. ממש הצעה זו היום ביישום הרשת." + "message": "אתה זכאי ל־Bitwarden למשפחות בחינם. ממש הצעה זו היום ביישום הרשת." }, "version": { "message": "גירסה" @@ -385,6 +379,15 @@ "editFolder": { "message": "ערוך תיקייה" }, + "editFolderWithName": { + "message": "ערוך תיקייה: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "תיקייה חדשה" }, @@ -392,7 +395,7 @@ "message": "שם תיקייה" }, "folderHintText": { - "message": "קונן תיקייה על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" + "message": "צור תיקייה מקוננת על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" }, "noFoldersAdded": { "message": "לא נוספו תיקיות" @@ -479,22 +482,6 @@ "length": { "message": "אורך" }, - "uppercase": { - "message": "אותיות גדולות (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "אותיות קטנות (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "מספרים (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "תווים מיוחדים (*&^%$#@!)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "כלול", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "כלול תווים מיוחדים", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "*&^%$#@!", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "מספר המילים" }, @@ -551,7 +534,7 @@ "message": "מינימום מיוחדים" }, "avoidAmbiguous": { - "message": "הימנע מתווים דו-משמעיים", + "message": "הימנע מתווים דו־משמעיים", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "הדפדפן שלך לא תומך בהעתקה ללוח. אנא העתק בצורה ידנית." }, - "verifyIdentity": { - "message": "אמת זהות" + "verifyYourIdentity": { + "message": "אמת את זהותך" }, "weDontRecognizeThisDevice": { "message": "אנחנו לא מזהים את המכשיר הזה. הזן את הקוד שנשלח לדוא\"ל שלך כדי לאמת את זהותך." @@ -813,7 +796,7 @@ "message": "החשבון החדש שלך נוצר!" }, "youHaveBeenLoggedIn": { - "message": "נכנסת!" + "message": "אתה נכנסת!" }, "youSuccessfullyLoggedIn": { "message": "נכנסת בהצלחה" @@ -844,25 +827,25 @@ } }, "autofillError": { - "message": "לא ניתן למלא אוטומטית את הפריט שנבחר בדף זה. העתק והדבק את המידע במקום זאת." + "message": "לא ניתן למלא אוטומטית את הפריט שנבחר בעמוד זה. העתק והדבק את המידע במקום זאת." }, "totpCaptureError": { - "message": "אי אפשר לסרוק קוד QR מהדף הנוכחי" + "message": "אי אפשר לסרוק קוד QR מהעמוד הנוכחי" }, "totpCaptureSuccess": { - "message": "מפתח מאמת נוסף" + "message": "מפתח המאמת נוסף" }, "totpCapture": { - "message": "סרוק קוד QR מאמת מהדף הנוכחי" + "message": "סרוק קוד QR מאמת מהעמוד הנוכחי" }, "totpHelperTitle": { - "message": "הפוך את האימות הדו-שלבי לחלק" + "message": "הפוך את האימות הדו־שלבי לחלק" }, "totpHelper": { - "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו-שלבי. העתק והדבק את המפתח לשדה זה." + "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו־שלבי. העתק והדבק את המפתח לשדה זה." }, "totpHelperWithCapture": { - "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו-שלבי. בחר את סמל המצלמה כדי לצלם את הקוד QR המאמת של אתר זה, או העתק והדבק את המפתח לתוך שדה זה." + "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו־שלבי. בחר את סמל המצלמה כדי לצלם את הקוד QR המאמת של אתר זה, או העתק והדבק את המפתח לתוך שדה זה." }, "learnMoreAboutAuthenticators": { "message": "למד עוד על מאמתים" @@ -895,7 +878,7 @@ "message": "לחץ על ה־YubiKey שלך כדי לאמת" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "נדרשת כניסה דו-שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." + "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." }, "followTheStepsBelowToFinishLoggingIn": { "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." @@ -921,6 +904,9 @@ "no": { "message": "לא" }, + "location": { + "message": "מיקום" + }, "unexpectedError": { "message": "אירעה שגיאה לא צפויה." }, @@ -931,10 +917,10 @@ "message": "תיקייה נוספה" }, "twoStepLoginConfirmation": { - "message": "כניסה דו-שלבית הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לאמת את הכניסה שלך עם מכשיר אחר כמו מפתח אבטחה, יישום מאמת, מסרון, שיחת טלפון, או דוא\"ל. ניתן להגדיר כניסה דו-שלבית בכספת הרשת bitwarden.com. האם ברצונך לבקר באתר כעת?" + "message": "כניסה דו־שלבית הופכת את החשבון שלך למאובטח יותר בכך שאתה נדרש לאמת את הכניסה שלך עם מכשיר אחר כמו מפתח אבטחה, יישום מאמת, מסרון, שיחת טלפון, או דוא\"ל. ניתן להגדיר כניסה דו־שלבית בכספת הרשת bitwarden.com. האם ברצונך לבקר באתר כעת?" }, "twoStepLoginConfirmationContent": { - "message": "הפוך את החשבון שלך למאובטח יותר על ידי הגדרת כניסה דו-שלבית ביישום הרשת של Bitwarden." + "message": "הפוך את החשבון שלך למאובטח יותר על ידי הגדרת כניסה דו־שלבית ביישום הרשת של Bitwarden." }, "twoStepLoginConfirmationTitle": { "message": "להמשיך אל יישום הרשת?" @@ -1036,19 +1022,19 @@ "message": "הצג תמיד כרטיסים כהצעות מילוי אוטומטי בתצוגת כספת" }, "showCardsCurrentTab": { - "message": "הצג כרטיסים בדף הכרטיסיות" + "message": "הצג כרטיסים בעמוד הכרטיסיות" }, "showCardsCurrentTabDesc": { - "message": "רשום פריטי כרטיס בדף הכרטיסיות עבור מילוי אוטומטי קל." + "message": "רשום פריטי כרטיס בעמוד הכרטיסיות עבור מילוי אוטומטי קל." }, "showIdentitiesInVaultViewV2": { "message": "הצג תמיד זהויות כהצעות למילוי אוטומטי בתצוגת כספת" }, "showIdentitiesCurrentTab": { - "message": "הצג זהויות בדף הכרטיסיות" + "message": "הצג זהויות בעמוד הכרטיסיות" }, "showIdentitiesCurrentTabDesc": { - "message": "הצג פריטי זהות בדף הכרטיסיות עבור מילוי אוטומטי קל." + "message": "הצג פריטי זהות בעמוד הכרטיסיות עבור מילוי אוטומטי קל." }, "clickToAutofillOnVault": { "message": "לחץ על פריטים כדי למלא אוטומטית בתצוגת כספת" @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "שמור" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ נשמר אל Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ עודכן ב־Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "שמור ככניסה חדשה", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "עדכן כניסה", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "לשמור כניסה?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "לעדכן כניסה קיימת?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "כניסה נשמרה", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "כניסה עודכנה", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "שגיאה בשמירה", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "או לא! לא יכלנו לשמור זאת. נסה להזין את הפרטים באופן ידני.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "שאל אם לעדכן פרטי כניסה קיימת" }, @@ -1133,15 +1169,11 @@ "message": "בהיר", "description": "Light color" }, - "solarizedDark": { - "message": "כהה סולארי", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { - "message": "ייצוא מ-" + "message": "ייצא מ־" }, "exportVault": { - "message": "ייצוא כספת" + "message": "ייצא כספת" }, "fileFormat": { "message": "פורמט הקובץ" @@ -1156,7 +1188,7 @@ "message": "סיסמה זו תשמש כדי לייצא ולייבא קובץ זה" }, "accountRestrictedOptionDescription": { - "message": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש שלך והסיסמה הראשית, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." + "message": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש והסיסמה הראשית של חשבונך, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." }, "passwordProtectedOptionDescription": { "message": "הגדר סיסמת קובץ כדי להצפין את הייצוא ולייבא אותו לכל חשבון Bitwarden באמצעות הסיסמה לפענוח." @@ -1168,7 +1200,7 @@ "message": "מוגבל חשבון" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "\"סיסמת קובץ\" ו-\"אשר סיסמת קובץ\" אינם תואמים." + "message": "\"סיסמת קובץ\" ו\"אשר סיסמת קובץ\" אינם תואמים." }, "warning": { "message": "אזהרה", @@ -1179,13 +1211,13 @@ "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { - "message": "אשר ייצוא הכספת" + "message": "אשר ייצוא כספת" }, "exportWarningDesc": { "message": "הקובץ מכיל את פרטי הכספת שלך בפורמט לא מוצפן. מומלץ להעביר את הקובץ רק בדרכים מוצפנות, ומאוד לא מומלץ לשמור או לשלוח את הקובץ הזה בדרכים לא מוצפנות (כדוגמת סתם אימייל). מחק את הקובץ מיד לאחר שסיימת את השימוש בו." }, "encExportKeyWarningDesc": { - "message": "ייצוא זה מצפין את הנתונים שלך באמצעות מפתח ההצפנה של חשבונך. אם אי פעם תבצע סיבוב (רוטציה) למפתח ההצפנה של חשבונך, תצטרך לייצא שוב משום שלא תוכל לפענח קובץ ייצוא זה." + "message": "ייצוא זה מצפין את הנתונים שלך באמצעות מפתח ההצפנה של חשבונך. אם אי פעם תבצע סיבוב למפתח ההצפנה של חשבונך, תצטרך לייצא שוב משום שלא תוכל לפענח קובץ ייצוא זה." }, "encExportAccountWarningDesc": { "message": "מפתחות הצפנת חשבון הם ייחודים לכל חשבון משתמש של Bitwarden, לכן אינך יכול לייבא ייצוא מוצפן אל תוך חשבון אחר." @@ -1203,7 +1235,7 @@ "message": "העבר לארגון" }, "movedItemToOrg": { - "message": "$ITEMNAME$ הועבר ל־$ORGNAME$", + "message": "$ITEMNAME$ הועבר אל $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -1240,16 +1272,16 @@ "message": "האם אתה בטוח שברצונך למחוק קובץ מצורף זה?" }, "deletedAttachment": { - "message": "הקובץ המצורף נמחק" + "message": "הצרופה נמחקה" }, "newAttachment": { - "message": "צרף קובץ חדש" + "message": "הוסף צרופה חדשה" }, "noAttachments": { "message": "אין קבצים מצורפים." }, "attachmentSaved": { - "message": "הקובץ המצורף נשמר" + "message": "הצרופה נשמרה" }, "file": { "message": "קובץ" @@ -1294,7 +1326,7 @@ "message": "גישת חירום." }, "premiumSignUpTwoStepOptions": { - "message": "אפשרויות כניסה דו-שלבית קנייניות כגון YubiKey ו־Duo." + "message": "אפשרויות כניסה דו־שלבית קנייניות כגון YubiKey ו־Duo." }, "ppremiumSignUpReports": { "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה." @@ -1333,7 +1365,7 @@ } }, "premiumPriceV2": { - "message": "הכל רק ב-$PRICE$ לשנה!", + "message": "הכל רק ב־$PRICE$ לשנה!", "placeholders": { "price": { "content": "$1", @@ -1412,13 +1444,13 @@ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, "webAuthnNewTab": { - "message": "על מנת להתחיל אימות WebAuthn דו-שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסייה חדשה ועקוב אחר ההוראות המסופקת בכרטיסייה החדשה." + "message": "על מנת להתחיל אימות WebAuthn דו־שלבי. לחץ על הלחצן למטה כדי לפתוח כרטיסיה חדשה ועקוב אחר ההוראות המסופקת בכרטיסיה החדשה." }, "webAuthnNewTabOpen": { - "message": "פתח כרטיסייה חדשה" + "message": "פתח כרטיסיה חדשה" }, "openInNewTab": { - "message": "פתח בכרטיסייה חדשה" + "message": "פתח בכרטיסיה חדשה" }, "webAuthnAuthenticate": { "message": "אמת WebAuthn" @@ -1433,19 +1465,19 @@ "message": "כניסה לא זמינה" }, "noTwoStepProviders": { - "message": "לחשבון זה מוגדרת כניסה דו-שלבית, עם זאת, אף אחד מהספקים הדו-שלביים שהוגדרו אינו נתמך על ידי דפדפן זה." + "message": "לחשבון זה מוגדרת כניסה דו־שלבית, עם זאת, אף אחד מהספקים הדו־שלביים שהוגדרו אינו נתמך על ידי דפדפן זה." }, "noTwoStepProviders2": { "message": "אנא השתמש בדפדפן נתמך (כמו לדוגמא Chrome) ו\\או הוסף ספק כניסה דו-שלבית הנתמך בדפדפן זה (כמו לדוגמא אפליקצית אימות)." }, "twoStepOptions": { - "message": "אפשרויות כניסה דו-שלבית" + "message": "אפשרויות כניסה דו־שלבית" }, "selectTwoStepLoginMethod": { - "message": "בחר שיטת כניסה דו-שלבית" + "message": "בחר שיטת כניסה דו־שלבית" }, "recoveryCodeDesc": { - "message": "איבדת גישה לכל הספקים הדו-גורמיים שלך? השתמש בקוד השחזור שלך כדי להשבית את כל הספקים הדו-גורמיים בחשבון שלך." + "message": "איבדת גישה לכל הספקים הדו־גורמיים שלך? השתמש בקוד השחזור שלך כדי לכבות את כל הספקים הדו־גורמיים מהחשבון שלך." }, "recoveryCodeTitle": { "message": "קוד שחזור" @@ -1458,7 +1490,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "מפתח אבטחה OTP של YubiKey" + "message": "מפתח אבטחה OTP של Yubico" }, "yubiKeyDesc": { "message": "השתמש בYubiKey עבור גישה לחשבון שלך. עובד עם YubiKey בגירסאות 4, 4C, 4Nano, ומכשירי NEO." @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "סביבה באירוח עצמי" }, - "selfHostedEnvironmentFooter": { - "message": "הזן את כתובת השרת המקומי של Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "ציין את בסיס ה־URL של התקנת Bitwarden באירוח מקומי שלך. דוגמה: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "סביבה מותאמת אישית" }, - "customEnvironmentFooter": { - "message": "למשתמשים מתקדמים. באפשרותך לציין את כתובת השרת עבור כל שירות בנפרד." - }, "baseUrl": { "message": "כתובת שרת" }, @@ -1527,7 +1553,7 @@ "message": "URL של שרת הסמלים" }, "environmentSaved": { - "message": "URL־ים של הסביבה נשמרו" + "message": "כתובות URL של הסביבה נשמרו" }, "showAutoFillMenuOnFormFields": { "message": "הצג תפריט מילוי אוטומטי על שדות טופס", @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "גרור כדי למיין" }, + "dragToReorder": { + "message": "גרור כדי לסדר מחדש" + }, "cfTypeText": { "message": "טקסט" }, @@ -1671,16 +1700,16 @@ "message": "הצג סמלי אתר אינטרנט" }, "faviconDesc": { - "message": "הצג תמונה ניתנת לזיהוי ליד כל כניסה." + "message": "הצג תמונה מוכרת ליד כל כניסה." }, "faviconDescAlt": { - "message": "הצג תמונה ניתנת לזיהוי ליד כל כניסה. חל על כל החשבונות המחוברים." + "message": "הצג תמונה מוכרת ליד כל כניסה. חל על כל החשבונות המחוברים." }, "enableBadgeCounter": { "message": "הצג מונה סמל" }, "badgeCounterDesc": { - "message": "מציין כמה כניסות יש לך עבור דף הרשת הנוכחי." + "message": "מציין כמה כניסות יש לך עבור עמוד הרשת הנוכחי." }, "cardholderName": { "message": "שם בעל הכרטיס" @@ -2200,7 +2229,7 @@ "message": "הפריט מולא אוטומטית " }, "insecurePageWarning": { - "message": "אזהרה: זהו דף HTTP לא מאובטח, וכל מידע שאתה שולח יכול באופן פוטנציאלי להיראות ולהשתנות על ידי אחרים. הכניסה הזאת נשמרה במקור בדף מאובטח (HTTPS)." + "message": "אזהרה: זהו עמוד HTTP לא מאובטח, וכל מידע שאתה שולח יכול באופן פוטנציאלי להיראות ולהשתנות על ידי אחרים. הכניסה הזאת נשמרה במקור בעמוד מאובטח (HTTPS)." }, "insecurePageWarningFillPrompt": { "message": "האם עדיין ברצונך להשלים כניסה זו?" @@ -2347,7 +2376,7 @@ "message": "חוסר התאמה בין חשבונות" }, "nativeMessagingWrongUserKeyTitle": { - "message": "אי-התאמה של מפתח זיהוי ביומטרי" + "message": "אי־התאמה של מפתח זיהוי ביומטרי" }, "nativeMessagingWrongUserKeyDesc": { "message": "ביטול נעילה ביומטרי נכשל. מפתח הסוד הביומטרי נכשל בביטול נעילת הכספת. נא לנסות להגדיר זיהוי ביומטרי שוב." @@ -2423,7 +2452,7 @@ "message": "Bitwarden לא יבקש לשמור פרטי כניסה עבור הדומיינים האלה עבור כל החשבונות המחוברים. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף." }, "blockedDomainsDesc": { - "message": "לא יוצעו מילוי אוטומטי ותכונות קשורות אחרות עבור האתרים האלה. אתה מוכרח לרענן את הדף כדי שהשינויים ייכנסו לתוקף." + "message": "לא יוצעו מילוי אוטומטי ותכונות קשורות אחרות עבור האתרים האלה. אתה מוכרח לרענן את העמוד כדי שהשינויים ייכנסו לתוקף." }, "autofillBlockedNoticeV2": { "message": "מילוי אוטומטי חסום עבור אתר זה." @@ -2769,10 +2798,10 @@ "message": "תאריך המחיקה שסופק אינו חוקי." }, "expirationDateAndTimeRequired": { - "message": "נדרשים תאריך תפוגה וזמן." + "message": "נדרשים תאריך וזמן תפוגה." }, "deletionDateAndTimeRequired": { - "message": "נדרשים תאריך מחיקה וזמן." + "message": "נדרשים תאריך וזמן מחיקה." }, "dateParsingError": { "message": "הייתה שגיאה בשמירת תאריכי המחיקה והתפוגה שלך." @@ -2805,7 +2834,7 @@ "message": "עדכן סיסמה ראשית" }, "updateMasterPasswordWarning": { - "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." + "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "updateWeakMasterPasswordWarning": { "message": "הסיסמה הראשית שלך אינה עומדת באחת או יותר מפוליסות הארגון שלך. כדי לגשת לכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. בהמשך תנותק מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." @@ -2857,7 +2886,7 @@ "message": "דרישות מדיניות ארגונית הוחלו על אפשרויות פסק הזמן שלך" }, "vaultTimeoutPolicyInEffect": { - "message": "פוליסות הארגון שלך הגדירו את פסק הזמן לכספת המרבי שלך ל-$HOURS$ שעות ו-$MINUTES$ דקות.", + "message": "פוליסות הארגון שלך הגדירו את פסק הזמן לכספת המרבי שלך ל־$HOURS$ שעות ו־$MINUTES$ דקות.", "placeholders": { "hours": { "content": "$1", @@ -2870,7 +2899,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ שעות ו-$MINUTES$ דקות לכל היותר.", + "message": "$HOURS$ שעות ו־$MINUTES$ דקות לכל היותר.", "placeholders": { "hours": { "content": "$1", @@ -2883,7 +2912,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "פסק זמן חורג את ההגבלה שהוגדרה על ידי הארגון שלך: $HOURS$ שעות ו-$MINUTES$ דקות לכל היותר", + "message": "פסק זמן חורג את ההגבלה שהוגדרה על ידי הארגון שלך: $HOURS$ שעות ו־$MINUTES$ דקות לכל היותר", "placeholders": { "hours": { "content": "$1", @@ -2896,7 +2925,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "פוליסות הארגון שלך משפיעות על פסק הזמן לכספת שלך. פסק זמן מרבי המותר הוא $HOURS$ שעות ו-$MINUTES$ דקות. פעולת פסק הזמן לכספת שלך מוגדרת ל$ACTION$.", + "message": "פוליסות הארגון שלך משפיעות על פסק הזמן לכספת שלך. פסק זמן מרבי המותר הוא $HOURS$ שעות ו־$MINUTES$ דקות. פעולת פסק הזמן לכספת שלך מוגדרת ל$ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2937,7 +2966,7 @@ "message": "לא נמצא מזהה ייחודי." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", + "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית כבר לא נדרשת כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -2970,7 +2999,7 @@ "message": "מייצא כספת אישית" }, "exportingIndividualVaultDescription": { - "message": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. פריטי כספת ארגון לא יכללו. רק פרטי פריט כספת ייוצאו ולא יכללו קבצים מצורפים משויכים.", + "message": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. פריטי כספת ארגון לא יכללו. רק פרטי פריט כספת ייוצאו ולא יכללו צרופות משויכות.", "placeholders": { "email": { "content": "$1", @@ -2982,7 +3011,7 @@ "message": "מייצא כספת ארגון" }, "exportingOrganizationVaultDesc": { - "message": "רק כספת הארגון המשויכת עם $ORGANIZATION$ ייוצאו. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", + "message": "רק כספת הארגון המשויכת עם $ORGANIZATION$ תיוצא. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", "placeholders": { "organization": { "content": "$1", @@ -3055,10 +3084,10 @@ "message": "השתמש ביכולות מיעון משנה של ספק הדוא\"ל שלך." }, "catchallEmail": { - "message": "דוא\"ל תופס-כל" + "message": "דוא\"ל תופס־כל" }, "catchallEmailDesc": { - "message": "השתמש בתיבת דואר תפוס-כל המוגדרת בדומיין שלך." + "message": "השתמש בתיבת דואר תפוס־כל המוגדרת בדומיין שלך." }, "random": { "message": "אקראי" @@ -3139,7 +3168,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ סירב לבקשה שלך. נא ליצור קשר עם נותן השירות שלך לקבלת סיוע.", + "message": "$SERVICENAME$ סירב לבקשה שלך. נא ליצור קשר עם נותן השירות שלך עבור סיוע.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3223,16 +3252,16 @@ "message": "מפתח API" }, "ssoKeyConnectorError": { - "message": "שגיאת מחבר מפתח: וודא שמחבר המפתח זמין ופועל כראוי." + "message": "שגיאת Key Connector: וודא שה־Key Connector זמין ופועל כראוי." }, "premiumSubcriptionRequired": { "message": "נדרש מנוי פרימיום" }, "organizationIsDisabled": { - "message": "ארגון מושהה." + "message": "ארגון מושעה." }, "disabledOrganizationFilterError": { - "message": "לא ניתן לגשת לפריטים בארגון מושהה. פנה אל בעל הארגון שלך עבור סיוע." + "message": "לא ניתן לגשת לפריטים בארגון מושעה. פנה אל בעל הארגון שלך עבור סיוע." }, "loggingInTo": { "message": "נכנס אל $DOMAIN$", @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "הגדרות נערכו" - }, - "environmentEditedClick": { - "message": "לחץ כאן" - }, - "environmentEditedReset": { - "message": "כדי לאפס את ההגדרות שהוגדרו מראש" - }, "serverVersion": { "message": "גרסת שרת" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "כניסה עם סיסמה ראשית" }, - "loggingInAs": { - "message": "נכנס כ-" - }, - "notYou": { - "message": "לא את/ה?" - }, "newAroundHere": { "message": "חדש כאן?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "כניסה עם מכשיר" }, - "loginWithDeviceEnabledInfo": { - "message": "כניסה עם מכשיר צריכה להיות מוגדרת בהגדרות של היישום Bitwarden. צריך אפשרות אחרת?" - }, "fingerprintPhraseHeader": { "message": "ביטוי טביעת אצבע" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "הצג את כל אפשרויות הכניסה" }, - "viewAllLoginOptionsV1": { - "message": "הצג את כל אפשרויות הכניסה" - }, "notificationSentDevice": { "message": "התראה נשלחה למכשיר שלך." }, @@ -3322,7 +3330,7 @@ "message": "בטל נעילת Bitwarden במכשיר שלך או ב" }, "notificationSentDeviceAnchor": { - "message": "יישום הרשת" + "message": "יישום רשת" }, "notificationSentDevicePart2": { "message": "וודא שביטוי טביעת האצבע תואם את זה שלמטה לפני שתאשר." @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "בקש אישור מנהל" }, - "approveWithMasterPassword": { - "message": "אשר עם סיסמה ראשית" - }, "ssoIdentifierRequired": { "message": "נדרש מזהה SSO של הארגון." }, @@ -3488,7 +3493,7 @@ "description": "European Union" }, "accessDenied": { - "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בדף זה." + "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בעמוד זה." }, "general": { "message": "כללי" @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "הבקשה שלך נשלחה למנהל שלך." }, - "youWillBeNotifiedOnceApproved": { - "message": "תקבל התראה כשתאושר." - }, "troubleLoggingIn": { "message": "בעיות בכניסה?" }, @@ -3586,7 +3588,7 @@ } }, "multipleInputEmails": { - "message": "1 או יותר דוא\"לים אינם חוקיים" + "message": "כתובת דוא\"ל 1 או יותר אינה חוקית" }, "inputTrimValidator": { "message": "אסור שקלט יכיל רק רווח לבן.", @@ -3596,7 +3598,7 @@ "message": "קלט הוא לא כתובת דוא\"ל." }, "fieldsNeedAttention": { - "message": "$COUNT$ שדות למעלה צריכות את תשומת לבך.", + "message": "$COUNT$ שדות למעלה צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -3608,7 +3610,7 @@ "message": "שדה 1 צריך את תשומת לבך." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ שדות צריכות את תשומת לבך.", + "message": "$COUNT$ שדות צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -3663,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": "דלג לתוכן" @@ -3759,7 +3761,7 @@ "message": "התעלם" }, "importData": { - "message": "ייבוא נתונים", + "message": "ייבא נתונים", "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" }, "importError": { @@ -3924,7 +3926,7 @@ "message": "אשר סיסמת קובץ" }, "exportSuccess": { - "message": "נתוני כספת יוצאו" + "message": "נתוני הכספת יוצאו" }, "typePasskey": { "message": "מפתח גישה" @@ -3933,7 +3935,7 @@ "message": "ניגש אל" }, "loggedInExclamation": { - "message": "מחובר!" + "message": "נכנסת!" }, "passkeyNotCopied": { "message": "מפתח גישה לא יועתק" @@ -3948,7 +3950,7 @@ "message": "להיכנס עם מפתח גישה?" }, "passkeyAlreadyExists": { - "message": "מפתח גישה כבר קיים ביישום זה." + "message": "מפתח גישה כבר קיים עבור יישום זה." }, "noPasskeysFoundForThisApplication": { "message": "לא נמצאו מפתחות גישה עבור יישום זה." @@ -3993,7 +3995,7 @@ "message": "אימות נדרש כדי להשתמש במפתח גישה. אמת את זהותך כדי להמשיך." }, "multifactorAuthenticationCancelled": { - "message": "אימות רב-גורמי בוטל" + "message": "אימות רב־גורמי בוטל" }, "noLastPassDataFound": { "message": "לא נמצאו נתוני LastPass" @@ -4011,7 +4013,7 @@ "message": "PIN שגוי" }, "multifactorAuthenticationFailed": { - "message": "אימות רב-גורמי נכשל" + "message": "אימות רב־גורמי נכשל" }, "includeSharedFolders": { "message": "כלול תיקיות משותפות" @@ -4023,7 +4025,7 @@ "message": "מייבא את החשבון שלך..." }, "lastPassMFARequired": { - "message": "נדרש אימות רב-גורמי של LastPass" + "message": "נדרש אימות רב־גורמי של LastPass" }, "lastPassMFADesc": { "message": "הזן את קוד הגישה החד פעמי שלך מיישום האימות שלך" @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "חשבון פעיל" }, + "bitwardenAccount": { + "message": "חשבון Bitwarden" + }, "availableAccounts": { "message": "חשבונות זמינים" }, @@ -4305,7 +4310,7 @@ "message": "העתק כתובת" }, "adminConsole": { - "message": "מסוף ניהול" + "message": "מסוף מנהל" }, "accountSecurity": { "message": "אבטחת החשבון" @@ -4375,7 +4380,7 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { - "message": "לא ניתן לגשת לפריטים של ארגונים מושבתים. פנה לבעל הארגון שלך לקבלת סיוע." + "message": "לא ניתן לגשת לפריטים של ארגונים מושבתים. פנה לבעל הארגון שלך עבור סיוע." }, "additionalInformation": { "message": "פרטים נוספים" @@ -4399,13 +4404,13 @@ "message": "העלה" }, "addAttachment": { - "message": "הוסף קובץ מצורף" + "message": "הוסף צרופה" }, "maxFileSizeSansPunctuation": { "message": "גודל הקובץ המרבי הוא 500MB" }, "deleteAttachmentName": { - "message": "מחק קובץ מצורף $NAME$", + "message": "מחק צרופה $NAME$", "placeholders": { "name": { "content": "$1", @@ -4423,13 +4428,13 @@ } }, "permanentlyDeleteAttachmentConfirmation": { - "message": "האם אתה בטוח שברצונך למחוק לצמיתות קובץ מצורף זה?" + "message": "האם אתה בטוח שברצונך למחוק לצמיתות צרופה זו?" }, "premium": { "message": "פרימיום" }, "freeOrgsCannotUseAttachments": { - "message": "ארגונים חינמיים לא יכולים להשתמש בקבצים מצורפים" + "message": "ארגונים חינמיים לא יכולים להשתמש בצרופות" }, "filters": { "message": "מסננים" @@ -4494,7 +4499,7 @@ } }, "websiteAdded": { - "message": "נוסף אתר אינטרנט" + "message": "אתר האינטרנט נוסף" }, "addWebsite": { "message": "הוסף אתר אינטרנט" @@ -4534,7 +4539,7 @@ "message": "למלא אוטומטית בעת טעינת עמוד?" }, "cardExpiredTitle": { - "message": "כרטיס שפג תוקפו" + "message": "כרטיס פג תוקף" }, "cardExpiredMessage": { "message": "אם חידשת אותו, עדכן את פרטי הכרטיס" @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "סדר מחדש כתובת URI של אתר. השתמש במקש חץ כדי להעביר את הפריט למעלה או למטה." + }, "reorderFieldUp": { "message": "$LABEL$ עבר למעלה, מיקום $INDEX$ מתוך $LENGTH$", "placeholders": { @@ -4725,17 +4733,8 @@ "nothingSelected": { "message": "לא בחרת כלום." }, - "movedItemsToOrg": { - "message": "פריטים נבחרים הועברו ל־$ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { - "message": "פריטים הועברו ל־$ORGNAME$", + "message": "פריטים הועברו אל $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4744,7 +4743,7 @@ } }, "itemMovedToOrg": { - "message": "פריט הועבר ל־$ORGNAME$", + "message": "פריט הועבר אל $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4833,7 +4832,7 @@ "message": "תוכן נוסף זמין" }, "fileSavedToDevice": { - "message": "קובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." + "message": "הקובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." }, "showCharacterCount": { "message": "הצג מונה תווים" @@ -5013,11 +5012,11 @@ "description": "Represents the ' key in screen reader content as a readable word" }, "lessThanCharacterDescriptor": { - "message": "קטן מ-", + "message": "קטן מ־", "description": "Represents the < key in screen reader content as a readable word" }, "greaterThanCharacterDescriptor": { - "message": "גדול מ-", + "message": "גדול מ־", "description": "Represents the > key in screen reader content as a readable word" }, "commaCharacterDescriptor": { @@ -5055,13 +5054,13 @@ "message": "הודעה חשובה" }, "setupTwoStepLogin": { - "message": "הגדר כניסה דו-שלבית" + "message": "הגדר כניסה דו־שלבית" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." + "message": "אתה יכול להגדיר כניסה דו־שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." }, "remindMeLater": { "message": "הזכר לי מאוחר יותר" @@ -5082,7 +5081,7 @@ "message": "כן, אני יכול לגשת לדוא\"ל שלי באופן מהימן" }, "turnOnTwoStepLogin": { - "message": "הפעל כניסה דו-שלבית" + "message": "הפעל כניסה דו־שלבית" }, "changeAcctEmail": { "message": "שנה את דוא\"ל החשבון" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "רחב במיוחד" }, + "sshKeyWrongPassword": { + "message": "הסיסמה שהזנת שגויה." + }, + "importSshKey": { + "message": "ייבוא" + }, + "confirmSshKeyPassword": { + "message": "אשר סיסמה" + }, + "enterSshKeyPasswordDesc": { + "message": "הזן את הסיסמה עבור מפתח ה־SSH." + }, + "enterSshKeyPassword": { + "message": "הזן סיסמה" + }, + "invalidSshKey": { + "message": "מפתח ה־SSH אינו תקין" + }, + "sshKeyTypeUnsupported": { + "message": "סוג מפתח ה־SSH אינו נתמך" + }, + "importSshKeyFromClipboard": { + "message": "ייבא מפתח מלוח ההעתקה" + }, + "sshKeyImported": { + "message": "מפתח SSH יובא בהצלחה" + }, "cannotRemoveViewOnlyCollections": { "message": "אינך יכול להסיר אוספים עם הרשאות צפייה בלבד: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "כדי להשתמש בביטול נעילה ביומטרי, נא לעדכן את יישום שולחן העבודה שלך, להשבית ביטול נעילה בעזרת טביעת אצבע בהגדרות שולחן העבודה." + }, + "changeAtRiskPassword": { + "message": "שנה סיסמה בסיכון" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 430ffbf0849..748d9eb966b 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password Hint" - }, - "enterEmailToGetHint": { - "message": "अपने मास्टर पासवर्ड संकेत प्राप्त करने के लिए अपने खाते का ईमेल पता दर्ज करें।" - }, "getMasterPasswordHint": { "message": "मास्टर पासवर्ड संकेत प्राप्त करें" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit Folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "लंबाई" }, - "uppercase": { - "message": "बड़े अक्षर (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "छोटे अक्षर (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "संख्या (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "विशेष अक्षर (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of Words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "आपका वेब ब्राउज़र आसान क्लिपबोर्ड कॉपीिंग का समर्थन नहीं करता है। इसके बजाय इसे मैन्युअल रूप से कॉपी करें।" }, - "verifyIdentity": { - "message": "पहचान सत्यापित करें" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "नहीं" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occured." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Yes, Save Now" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ को बिटवार्डन में सहेजा गया।", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ को बिटवार्डन में अपडेट किया गया।", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "मौजूदा लॉगिन को अपडेट करने के लिए कहें" }, @@ -1133,10 +1169,6 @@ "message": "प्रकाश", "description": "Light color" }, - "solarizedDark": { - "message": "सौरीकृत अंधेरा", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted Environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom Environment" }, - "customEnvironmentFooter": { - "message": "उन्नत उपयोगकर्ताओं के लिए। आप स्वतंत्र रूप से प्रत्येक सेवा का आधार URL निर्दिष्ट कर सकते हैं।" - }, "baseUrl": { "message": "सर्वर URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "सॉर्ट करने के लिए ड्रैग करें" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "शब्द" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "यहाँ क्लिक करें" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index b1677323605..400e70b864f 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" }, - "passwordHint": { - "message": "Podsjetnik za lozinku" - }, - "enterEmailToGetHint": { - "message": "Unesi adresu e-pošte svog računa za primitak podsjetnika glavne lozinke." - }, "getMasterPasswordHint": { "message": "Slanje podsjetnika glavne lozinke" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Uredi mapu" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nova mapa" }, @@ -479,22 +482,6 @@ "length": { "message": "Duljina" }, - "uppercase": { - "message": "Velika slova (A - Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Mala slova (a - z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Brojevi (0 - 9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Posebni znakovi (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Uključi", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Uključi posebne znakove", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Broj riječi" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Web preglednik ne podržava jednostavno kopiranje međuspremnika. Umjesto toga ručno kopirajte." }, - "verifyIdentity": { - "message": "Potvrdi identitet" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." @@ -921,6 +904,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Došlo je do neočekivane pogreške." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Spremi" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Upitaj za ažuriranje trenutne prijave" }, @@ -1133,10 +1169,6 @@ "message": "Svijetla", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Izvezi iz" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Vlastito hosting okruženje" }, - "selfHostedEnvironmentFooter": { - "message": "Navedi osnovni URL svoje lokalno smještene Bitwarden instalacije." - }, "selfHostedBaseUrlHint": { "message": "Navedi osnovni URL svoje lokalne Bitwarden instalacije, npr.: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Prilagođeno okruženje" }, - "customEnvironmentFooter": { - "message": "Za napredne korisnike. Samostalno možeš odrediti osnovni URL svake usluge." - }, "baseUrl": { "message": "URL poslužitelja" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Povuci za sortiranje" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Postavke su izmijenjene" - }, - "environmentEditedClick": { - "message": "Klikni ovdje" - }, - "environmentEditedReset": { - "message": "za ponovno postavljanje zadanih postavki" - }, "serverVersion": { "message": "Verzija poslužitelja" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Prijava glavnom lozinkom" }, - "loggingInAs": { - "message": "Prijava kao" - }, - "notYou": { - "message": "Nisi ti?" - }, "newAroundHere": { "message": "Novi korisnik?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Prijava uređajem" }, - "loginWithDeviceEnabledInfo": { - "message": "Prijava uređajem mora biti namještena u postavka Bitwarden mobilne aplikacije. Trebaš drugu opciju?" - }, "fingerprintPhraseHeader": { "message": "Jedinstvena fraza" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Pogledaj sve mogućnosti prijave" }, - "viewAllLoginOptionsV1": { - "message": "Pogledaj sve mogućnosti prijave" - }, "notificationSentDevice": { "message": "Obavijest je poslana na tvoj uređaj." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Zatraži odobrenje administratora" }, - "approveWithMasterPassword": { - "message": "Odobri glavnom lozinkom" - }, "ssoIdentifierRequired": { "message": "Potreban je identifikator organizacije." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tvoj zahtjev je poslan administratoru." }, - "youWillBeNotifiedOnceApproved": { - "message": "Dobiti ćeš obavijest kada bude odobreno." - }, "troubleLoggingIn": { "message": "Problem s prijavom?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktivni račun" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Dostupni računi" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ pomaknut gore, pozicija $INDEX$ od $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra široko" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "S dopuštenjima samo za prikaz ne možeš ukloniti zbirke: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "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" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index e134c7f1f26..80b1dbf095d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." }, - "passwordHint": { - "message": "Jelszó emlékeztető" - }, - "enterEmailToGetHint": { - "message": "Írd be a felhasználóhoz kötött e-mail címed, hogy megkapd a mesterjelszó emlékeztetőt." - }, "getMasterPasswordHint": { "message": "Kérj mesterjelszó emlékeztetőt" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Mappa szerkesztése" }, + "editFolderWithName": { + "message": "Mappa szerkesztése: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Új mappa" }, @@ -479,22 +482,6 @@ "length": { "message": "Hossz" }, - "uppercase": { - "message": "Nagybetűs (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Kisbetűs (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Számok (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Speciális karakterek (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Bevonás", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Speciális karakterek bevonása", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Szavak száma" }, @@ -669,7 +652,7 @@ "browserNotSupportClipboard": { "message": "A webböngésződ nem támogat könnyű vágólap másolást. Másold manuálisan inkább." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Személyazonosság ellenőrzése" }, "weDontRecognizeThisDevice": { @@ -921,6 +904,9 @@ "no": { "message": "Nem" }, + "location": { + "message": "Hely" + }, "unexpectedError": { "message": "Váratlan hiba történt." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Mentés" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ mentésre került a Bitwardenben.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ frissítésre került a Bitwardenben.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Mentés új bejelentkezésként", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Bejelentkezés frissítése", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Bejelentkezés mentése?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Létező bejelentkezés frissítése?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "A bejelentkezés mentésre került.", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "A bejelentkezés frissítésre került.", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Hiba történt a bejelentkezés mentésekor.", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Létező bejelentkezés frissítés kérése" }, @@ -1133,10 +1169,6 @@ "message": "Világos", "description": "Light color" }, - "solarizedDark": { - "message": "Szolarizált sötét", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportálás innen:" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Saját üzemeltetésű környezet" }, - "selfHostedEnvironmentFooter": { - "message": "A helyileg működtetett Bitwarden telepítés alap webcímének megadása." - }, "selfHostedBaseUrlHint": { "message": "Adjuk meg a helyileg tárolt Bitwarden telepítés alap webcímét. Példa: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Egyedi környezet" }, - "customEnvironmentFooter": { - "message": "Haladó felhasználóknak. Minden egyes szolgáltatás alap URL-jét külön megadhatod." - }, "baseUrl": { "message": "Szerver URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Húzás a rendezéshez" }, + "dragToReorder": { + "message": "Átrendezés áthúzással" + }, "cfTypeText": { "message": "Szöveg" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "A beállítások szerkesztésre kerültek." - }, - "environmentEditedClick": { - "message": "Kattintás ide" - }, - "environmentEditedReset": { - "message": "az előre konfigurált beállítások visszaállításához." - }, "serverVersion": { "message": "Szerver verzió" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Bejelentkezés mesterjelszóval" }, - "loggingInAs": { - "message": "Bejelentkezve mint" - }, - "notYou": { - "message": "Ez tévedés?" - }, "newAroundHere": { "message": "Új felhasználó vagyunk?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Bejelentkezés eszközzel" }, - "loginWithDeviceEnabledInfo": { - "message": "Az eszközzel történő bejelentkezést a Biwarden mobilalkalmazás beállításaiban kell beállítani. Másik opcióra van szükség?" - }, "fingerprintPhraseHeader": { "message": "Ujjlenyomat kifejezés" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Összes bejelentkezési opció megtekintése" }, - "viewAllLoginOptionsV1": { - "message": "Összes bejelentkezési opció megtekintése" - }, "notificationSentDevice": { "message": "Egy értesítés lett elküldve az eszközre." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Adminisztrátori jóváhagyás kérés" }, - "approveWithMasterPassword": { - "message": "Jóváhagyás mesterjelszóval" - }, "ssoIdentifierRequired": { "message": "A szervezeti SSO azonosító megadása szükséges." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "A kérés elküldésre került az adminisztrátornak." }, - "youWillBeNotifiedOnceApproved": { - "message": "A jóváhagyás után értesítés érkezik." - }, "troubleLoggingIn": { "message": "Probléma van a bejelentkezéssel?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktív fiók" }, + "bitwardenAccount": { + "message": "Bitwarden fiók" + }, "availableAccounts": { "message": "Elérhető fiókok" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "A webhely URI átrendezése. A nyílbillentyűkkel mozgassuk az elemet felfelé vagy lefelé." + }, "reorderFieldUp": { "message": "$LABEL$ feljebb került, $INDEX$/$LENGTH$ pozícióba", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra széles" }, + "sshKeyWrongPassword": { + "message": "A megadott jelszó helytelen." + }, + "importSshKey": { + "message": "Importálás" + }, + "confirmSshKeyPassword": { + "message": "Jelszó megerősítése" + }, + "enterSshKeyPasswordDesc": { + "message": "Adjuk meg az SSH kulcs jelszót." + }, + "enterSshKeyPassword": { + "message": "Jelszó megadása" + }, + "invalidSshKey": { + "message": "Az SSH kulcs érvénytelen." + }, + "sshKeyTypeUnsupported": { + "message": "Az SSH kulcstípus nem támogatott." + }, + "importSshKeyFromClipboard": { + "message": "Kulcs importálása vágólapból" + }, + "sshKeyImported": { + "message": "Az SSH kulcs sikeresen importálásra került." + }, "cannotRemoveViewOnlyCollections": { "message": "Nem távolíthatók el a csak megtekintési engedéllyel bíró gyűjtemények: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "A biometrikus feloldás használatához frissítsük az asztali alkalmazást vagy tiltsuk le az ujjlenyomatos feloldást az asztali beállításokban." + }, + "changeAtRiskPassword": { + "message": "Kockázatos jelszó megváltoztatása" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index c4f3af84e34..33f44c60579 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Masukkan alamat surel akun Anda dan petunjuk kata sandi Anda akan dikirimkan kepada Anda" }, - "passwordHint": { - "message": "Petunjuk Kata Sandi" - }, - "enterEmailToGetHint": { - "message": "Masukkan email akun Anda untuk menerima pentunjuk sandi utama Anda." - }, "getMasterPasswordHint": { "message": "Dapatkan petunjuk sandi utama" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Sunting Folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Folder baru" }, @@ -479,22 +482,6 @@ "length": { "message": "Panjang" }, - "uppercase": { - "message": "Huruf besar (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Huruf kecil (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Angka (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "karakter khusus (contoh.! @#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Sertakan", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Sertakan karakter khusus", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Jumlah Kata" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Peramban Anda tidak mendukung menyalin clipboard dengan mudah. Salin secara manual." }, - "verifyIdentity": { - "message": "Verifikasi Identitas Anda" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Tidak" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Terjadi kesalahan yang tak diduga." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Iya, Simpan Sekarang" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Tanyakan untuk memperbarui masuk yang sudah ada" }, @@ -1133,10 +1169,6 @@ "message": "Terang", "description": "Light color" }, - "solarizedDark": { - "message": "Gelap Solarized", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Ekspor dari" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Lingkungan Penyedia Personal" }, - "selfHostedEnvironmentFooter": { - "message": "Tetapkan URL dasar penyedia personal pemasangan Bitwarden Anda." - }, "selfHostedBaseUrlHint": { "message": "Tentukan URL dasar dari pemasangan Bitwarden di server Anda. Contoh: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Lingkungan Khusus" }, - "customEnvironmentFooter": { - "message": "Untuk pengguna tingkat lanjut. Anda bisa menentukan basis dari URL masing-masing layanan secara independen." - }, "baseUrl": { "message": "URL Server" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Seret untuk mengurutkan" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teks" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Pengaturan telah disunting" - }, - "environmentEditedClick": { - "message": "Tekan di sini" - }, - "environmentEditedReset": { - "message": "untuk mengatur ulang ke pengaturan awal" - }, "serverVersion": { "message": "Versi server" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Masuk dengan kata sandi utama" }, - "loggingInAs": { - "message": "Masuk sebagai" - }, - "notYou": { - "message": "Bukan Anda?" - }, "newAroundHere": { "message": "Baru di sini?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Masuk dengan perangkat" }, - "loginWithDeviceEnabledInfo": { - "message": "Masuk dengan perangkat harus diatur di pengaturan aplikasi Bitwarden. Perlu pilihan lainnya?" - }, "fingerprintPhraseHeader": { "message": "Frasa sidik jari" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Lihat semua pilihan masuk" }, - "viewAllLoginOptionsV1": { - "message": "Lihat semua pilihan masuk" - }, "notificationSentDevice": { "message": "Sebuah pemberitahuan dikirim ke perangkat Anda." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Minta persetujuan admin" }, - "approveWithMasterPassword": { - "message": "Setujui dengan kata sandi utama" - }, "ssoIdentifierRequired": { "message": "Pengenal SSO organisasi diperlukan." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Permintaan Anda telah dikirim ke admin Anda." }, - "youWillBeNotifiedOnceApproved": { - "message": "Anda akan diberitahu setelah disetujui." - }, "troubleLoggingIn": { "message": "Kesulitan masuk?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Akun aktif" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Akun yang tersedia" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra lebar" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Anda tidak dapat menghapus koleksi dengan izin hanya lihat: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index e33d1276ecf..cb8e414ca37 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -20,7 +20,7 @@ "message": "Crea account" }, "newToBitwarden": { - "message": "Nuovo in Bitwarden?" + "message": "Sei un nuovo utente?" }, "logInWithPasskey": { "message": "Accedi con passkey" @@ -29,7 +29,7 @@ "message": "Usa il Single Sign-On" }, "welcomeBack": { - "message": "Bentornato" + "message": "Bentornat*" }, "setAStrongPassword": { "message": "Imposta una password robusta" @@ -62,7 +62,7 @@ "message": "Un suggerimento per la password principale può aiutarti a ricordarla se la dimentichi." }, "masterPassHintText": { - "message": "Se dimentichi la password, il suggerimento password può essere inviato alla tua email. $CURRENT$/$MAXIMUM$ massimo carattere.", + "message": "Se dimentichi la password, il suggerimento password può essere inviato alla tua email. Attualmente $CURRENT$ caratteri, massimo $MAXIMUM$.", "placeholders": { "current": { "content": "$1", @@ -81,7 +81,7 @@ "message": "Suggerimento per la password principale (facoltativo)" }, "passwordStrengthScore": { - "message": "Valutazione complessità parola d'accesso $SCORE$", + "message": "Complessità password: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -159,7 +159,7 @@ "message": "Copia numero passaporto" }, "copyLicenseNumber": { - "message": "Copia numero licenza" + "message": "Copia numero patente" }, "copyPrivateKey": { "message": "Copia chiave privata" @@ -186,7 +186,7 @@ "message": "Copia note" }, "copy": { - "message": "Copy", + "message": "Copia", "description": "Copy to clipboard" }, "fill": { @@ -206,10 +206,10 @@ "message": "Riempi automaticamente identità" }, "fillVerificationCode": { - "message": "Riempi codice di verifica" + "message": "Inserisci codice di verifica" }, "fillVerificationCodeAria": { - "message": "Riempi Codice di Verifica", + "message": "Inserisci codice di verifica", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -252,7 +252,7 @@ "message": "Aggiungi elemento" }, "accountEmail": { - "message": "Email dell'account" + "message": "Account email" }, "requestHint": { "message": "Richiedi suggerimento" @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Inserisci l'indirizzo email dell'account e ti invieremo il tuo suggerimento per la password" }, - "passwordHint": { - "message": "Suggerimento per la password" - }, - "enterEmailToGetHint": { - "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale." - }, "getMasterPasswordHint": { "message": "Ottieni suggerimento della password principale" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Modifica cartella" }, + "editFolderWithName": { + "message": "Modifica cartella: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nuova cartella" }, @@ -479,22 +482,6 @@ "length": { "message": "Lunghezza" }, - "uppercase": { - "message": "Maiuscole (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minuscole (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numeri (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caratteri speciali (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Includi", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Includi caratteri speciali", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Numero di parole" }, @@ -669,11 +652,11 @@ "browserNotSupportClipboard": { "message": "Il tuo browser non supporta copiare dagli appunti. Copialo manualmente." }, - "verifyIdentity": { - "message": "Verifica identità" + "verifyYourIdentity": { + "message": "Verifica la tua identità" }, "weDontRecognizeThisDevice": { - "message": "Non riconosciamo questo dispositivo. Inserisci il codice inviato alla tua e-mail per verificare la tua identità." + "message": "Inserisci il codice inviato alla tua e-mail per verificare la tua identità." }, "continueLoggingIn": { "message": "Continua l'accesso" @@ -892,7 +875,7 @@ "message": "Inserisci il codice dalla tua app di autenticazione" }, "pressYourYubiKeyToAuthenticate": { - "message": "Premi la tua chiave Yubi per autenticare" + "message": "Premi la tua YubiKey per accedere" }, "duoTwoFactorRequiredPageSubtitle": { "message": "Il login Duo in due passaggi è richiesto per il tuo account. Segui i passaggi qui sotto per completare l'accesso." @@ -901,7 +884,7 @@ "message": "Segui i passaggi qui sotto per completare l'accesso." }, "restartRegistration": { - "message": "Riprova la registrazione" + "message": "Ricomincia la registrazione" }, "expiredLink": { "message": "Link scaduto" @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Luogo" + }, "unexpectedError": { "message": "Si è verificato un errore imprevisto." }, @@ -937,7 +923,7 @@ "message": "Rendi il tuo account più sicuro impostando l'autenticazione a due fattori nell'app web di Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Aprire web app?" + "message": "Vuoi continuare sulla web app?" }, "editedFolder": { "message": "Cartella salvata" @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Salva" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ salvato in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ aggiornato in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Salva come nuovo accesso", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Aggiorna accesso", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Salvare l'accesso?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Aggiornare l'accesso esistente?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Accesso salvato", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Accesso aggiornato", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Errore nel salvataggio", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh no! Non abbiamo potuto salvarlo. Prova a inserire manualmente i dettagli.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Chiedi di aggiornare il login esistente" }, @@ -1133,10 +1169,6 @@ "message": "Chiaro", "description": "Light color" }, - "solarizedDark": { - "message": "Scuro solarizzato", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Esporta da" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Ambiente self-hosted" }, - "selfHostedEnvironmentFooter": { - "message": "Specifica l'URL principale della tua installazione self-hosted di Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Specifica lo URL principale della tua installazione self-hosted di Bitwarden. Esempio: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Ambiente personalizzato" }, - "customEnvironmentFooter": { - "message": "Per utenti avanzati. Puoi specificare l'URL principale di ogni servizio indipendentemente." - }, "baseUrl": { "message": "URL del server" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Trascina per ordinare" }, + "dragToReorder": { + "message": "Trascina per riordinare" + }, "cfTypeText": { "message": "Testo" }, @@ -2411,7 +2440,7 @@ "message": "Domini bloccati" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Info sui domini bloccati" }, "excludedDomains": { "message": "Domini esclusi" @@ -2423,7 +2452,7 @@ "message": "Bitwarden non chiederà di salvare le credenziali di accesso per questi domini per tutti gli account sul dispositivo. Ricarica la pagina affinché le modifiche abbiano effetto." }, "blockedDomainsDesc": { - "message": "Per questi siti, l'auto-completamento e funzionalità simili non saranno disponibili. Ricarica la pagina per applicare le modifiche." + "message": "Per questi siti, riempimento automatico e funzionalità simili non saranno disponibili. Ricarica la pagina per applicare le modifiche." }, "autofillBlockedNoticeV2": { "message": "La compilazione automatica è bloccata per questo sito." @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Impostazioni modificate" - }, - "environmentEditedClick": { - "message": "Clicca qui" - }, - "environmentEditedReset": { - "message": "per ritornare alle impostazioni preconfigurate" - }, "serverVersion": { "message": "Versione server" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Accedi con password principale" }, - "loggingInAs": { - "message": "Accedendo come" - }, - "notYou": { - "message": "Non sei tu?" - }, "newAroundHere": { "message": "Nuovo da queste parti?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Accedi con dispositivo" }, - "loginWithDeviceEnabledInfo": { - "message": "L'accesso con dispositivo deve essere abilitato nelle impostazioni dell'app Bitwarden. Ti serve un'altra opzione?" - }, "fingerprintPhraseHeader": { "message": "Frase impronta" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Visualizza tutte le opzioni di accesso" }, - "viewAllLoginOptionsV1": { - "message": "Visualizza tutte le opzioni di accesso" - }, "notificationSentDevice": { "message": "Una notifica è stata inviata al tuo dispositivo." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Richiedi approvazione dell'amministratore" }, - "approveWithMasterPassword": { - "message": "Approva con password principale" - }, "ssoIdentifierRequired": { "message": "Identificatore SSO dell'organizzazione obbligatorio." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La tua richiesta è stata inviata al tuo amministratore." }, - "youWillBeNotifiedOnceApproved": { - "message": "Riceverai una notifica una volta approvato." - }, "troubleLoggingIn": { "message": "Problemi ad accedere?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Account attivo" }, + "bitwardenAccount": { + "message": "Account Bitwarden" + }, "availableAccounts": { "message": "Account disponibili" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Riordina l'URI del sito web. Usa il tasto freccia per spostare l'elemento su o giù." + }, "reorderFieldUp": { "message": "$LABEL$ spostato su, in posizione $INDEX$ di $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Molto larga" }, + "sshKeyWrongPassword": { + "message": "La parola d'accesso inserita non è corretta." + }, + "importSshKey": { + "message": "Importa" + }, + "confirmSshKeyPassword": { + "message": "Conferma parola d'accesso" + }, + "enterSshKeyPasswordDesc": { + "message": "Inserisci la parola d'accesso per la chiave SSH." + }, + "enterSshKeyPassword": { + "message": "Inserisci parola d'accesso" + }, + "invalidSshKey": { + "message": "La chiave SSH non è valida" + }, + "sshKeyTypeUnsupported": { + "message": "Il tipo di chiave SSH non è supportato" + }, + "importSshKeyFromClipboard": { + "message": "Importa chiave dagli Appunti" + }, + "sshKeyImported": { + "message": "Chiave SSH importata correttamente" + }, "cannotRemoveViewOnlyCollections": { "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Per usare lo sblocco biometrico, aggiornare l'applicazione desktop o disabilitare lo sblocco dell'impronta digitale nelle impostazioni del desktop." + }, + "changeAtRiskPassword": { + "message": "Cambia parola d'accesso a rischio" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 34a91f6e74d..b67d0b62a6e 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -81,7 +81,7 @@ "message": "マスターパスワードのヒント (省略可能)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "パスワードの強度スコア $SCORE$", "placeholders": { "score": { "content": "$1", @@ -186,7 +186,7 @@ "message": "メモをコピー" }, "copy": { - "message": "Copy", + "message": "コピー", "description": "Copy to clipboard" }, "fill": { @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" }, - "passwordHint": { - "message": "パスワードのヒント" - }, - "enterEmailToGetHint": { - "message": "マスターパスワードのヒントを受信するアカウントのメールアドレスを入力してください。" - }, "getMasterPasswordHint": { "message": "マスターパスワードのヒントを取得する" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "フォルダーを編集" }, + "editFolderWithName": { + "message": "フォルダーを編集: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "新しいフォルダー" }, @@ -459,16 +462,16 @@ "message": "パスフレーズを生成" }, "passwordGenerated": { - "message": "Password generated" + "message": "パスワードを生成しました" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "パスフレーズを生成しました" }, "usernameGenerated": { - "message": "Username generated" + "message": "ユーザー名を生成しました" }, "emailGenerated": { - "message": "Email generated" + "message": "メールアドレスを生成しました" }, "regeneratePassword": { "message": "パスワードの再生成" @@ -479,22 +482,6 @@ "length": { "message": "長さ" }, - "uppercase": { - "message": "大文字(A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "小文字(a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "数字 (0~9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "特殊文字(!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "含む文字", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "特殊記号を含める", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "単語数" }, @@ -669,14 +652,14 @@ "browserNotSupportClipboard": { "message": "お使いのブラウザはクリップボードへのコピーに対応していません。手動でコピーしてください" }, - "verifyIdentity": { - "message": "本人確認を行う" + "verifyYourIdentity": { + "message": "本人確認" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "このデバイスは未確認です。本人確認のため、メールアドレスに送信されたコードを入力してください。" }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "ログインを続ける" }, "yourVaultIsLocked": { "message": "保管庫がロックされています。続行するには本人確認を行ってください。" @@ -886,19 +869,19 @@ "message": "Bitwarden にログイン" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "メールアドレスに送信されたコードを入力してください" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "認証アプリに表示されているコードを入力してください" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "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": "Follow the steps below to finish logging in." + "message": "以下の手順に従ってログインを完了してください。" }, "restartRegistration": { "message": "登録を再度始める" @@ -921,6 +904,9 @@ "no": { "message": "いいえ" }, + "location": { + "message": "場所" + }, "unexpectedError": { "message": "予期せぬエラーが発生しました。" }, @@ -1033,7 +1019,7 @@ "message": "保管庫にアイテムが見つからない場合は、アイテムを追加するよう要求します。ログインしているすべてのアカウントに適用されます。" }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "保管庫ビューの自動入力の候補として、カードを常に表示する" }, "showCardsCurrentTab": { "message": "タブページにカードを表示" @@ -1042,7 +1028,7 @@ "message": "自動入力を簡単にするために、タブページにカードアイテムを表示します" }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "保管庫ビューの自動入力の候補として、 ID を常に表示する" }, "showIdentitiesCurrentTab": { "message": "タブページに ID を表示" @@ -1054,7 +1040,7 @@ "message": "保管庫で、自動入力するアイテムをクリックしてください" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "入力候補のアイテムをクリックして自動入力する" }, "clearClipboard": { "message": "クリップボードの消去", @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "保存する" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ を Bitwarden に保存しました。", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ を Bitwarden 内で更新しました。", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "新規のログイン情報として保存", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "ログイン情報を更新", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "ログイン情報を保存しますか?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "既存のログイン情報を更新しますか?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "ログイン情報を保存しました", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "ログイン情報が更新されました", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "保存エラー", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "保存できませんでした。詳細を手動で入力してください。", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "既存のログイン情報の更新を尋ねる" }, @@ -1133,10 +1169,6 @@ "message": "ライト", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized ダーク", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "エクスポート元" }, @@ -1390,7 +1422,7 @@ "message": "情報を保存する" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "このデバイスで30日間再表示しない" }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" @@ -1399,11 +1431,11 @@ "message": "他の2段階認証方法を使用" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "別の方法を選択", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "リカバリーコードを使用する" }, "insertYubiKey": { "message": " YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" @@ -1418,16 +1450,16 @@ "message": "新しいタブを開く" }, "openInNewTab": { - "message": "Open in new tab" + "message": "新しいタブで開く" }, "webAuthnAuthenticate": { "message": "WebAuthn の認証" }, "readSecurityKey": { - "message": "Read security key" + "message": "セキュリティキーの読み取り" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "セキュリティキーとの通信を待ち受け中…" }, "loginUnavailable": { "message": "ログインできません。" @@ -1442,7 +1474,7 @@ "message": "2段階認証オプション" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "2段階認証の方法を選択" }, "recoveryCodeDesc": { "message": "すべての2段階認証プロパイダにアクセスできなくなったときは、リカバリーコードを使用するとアカウントの2段階認証を無効化できます。" @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "セルフホスティング環境" }, - "selfHostedEnvironmentFooter": { - "message": "セルフホスティングしている Bitwarden のベース URL を指定してください。" - }, "selfHostedBaseUrlHint": { "message": "オンプレミスホストした Bitwarden のベース URL を指定してください。例: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "カスタム環境" }, - "customEnvironmentFooter": { - "message": "上級者向けです。各サービスのベース URL を個別に指定できます。" - }, "baseUrl": { "message": "サーバー URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "ドラッグして並べ替え" }, + "dragToReorder": { + "message": "ドラッグして並べ替え" + }, "cfTypeText": { "message": "テキスト" }, @@ -2115,7 +2144,7 @@ "message": "ユーザー名生成ツール" }, "useThisEmail": { - "message": "Use this email" + "message": "このメールアドレスを使う" }, "useThisPassword": { "message": "このパスワードを使用する" @@ -2135,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": "保管庫タイムアウト時のアクション" @@ -2144,13 +2173,13 @@ "message": "タイムアウト時のアクション" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "新しいカスタマイズオプション" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "クイックコピーやコンパクトモードなどで保管庫をカスタマイズできます!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "すべての外観設定を表示" }, "lock": { "message": "ロック", @@ -2408,10 +2437,10 @@ "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "ブロックしたドメイン" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "ブロックされたドメインについてもっと詳しく" }, "excludedDomains": { "message": "除外するドメイン" @@ -2423,19 +2452,19 @@ "message": "Bitwarden はログインしているすべてのアカウントで、これらのドメインのログイン情報を保存するよう要求しません。 変更を有効にするにはページを更新する必要があります。" }, "blockedDomainsDesc": { - "message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect." + "message": "自動入力やその他の関連機能はこれらのウェブサイトには提供されません。変更を反映するにはページを更新する必要があります。" }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "このウェブサイトへの自動入力はブロックされています。" }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "設定でこれを変更する" }, "change": { - "message": "Change" + "message": "変更" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "パスワードの変更 - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2444,10 +2473,10 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "リスクがあるパスワード" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ から、 1 件の危険なパスワードを変更するよう求められています。", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ から、 $COUNT$ 件の危険なパスワードを変更するよう求められています。", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "複数の所属先組織から、 $COUNT$ 件の危険なパスワードを変更するよう求められています。", "placeholders": { "count": { "content": "$1", @@ -2478,10 +2507,10 @@ } }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "1 件の危険なパスワードを確認・変更する" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "$COUNT$ 件の危険なパスワードを確認・変更する", "placeholders": { "count": { "content": "$1", @@ -2490,49 +2519,49 @@ } }, "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": "Review at-risk logins" + "message": "危険な状態のログイン情報を確認" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "危険な状態のパスワードを確認" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "組織で使用するパスワードが脆弱である、または再利用されているか流出しており、危険な状態です。", "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": "危険な状態にあるログイン情報の一覧表示の例" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Bitwarden の自動入力メニューで、強力で一意なパスワードをすぐに生成しましょう。", "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": "Bitwarden の自動入力メニューで、生成されたパスワードが表示されている例" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Bitwarden 上のデータを更新" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "続いて、 Bitwarden がパスワードマネージャーに保存されたパスワードを更新するよう促します。", "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": "ユーザーにログイン情報を更新するよう促す Bitwarden の通知例" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "自動入力をオンにする" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "自動入力をオンにしました" }, "dismiss": { - "message": "Dismiss" + "message": "閉じる" }, "websiteItemLabel": { "message": "ウェブサイト $number$ (URI)", @@ -2553,7 +2582,7 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "ブロックするドメインの変更を保存しました" }, "excludedDomainsSavedSuccess": { "message": "除外ドメインの変更を保存しました" @@ -2994,17 +3023,17 @@ "message": "エラー" }, "decryptionError": { - "message": "Decryption error" + "message": "復号エラー" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden は以下の保管庫のアイテムを復号できませんでした。" }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "カスタマーサクセスに問い合わせて、", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "さらなるデータ損失を回避してください。", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3139,7 +3168,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ はリクエストを拒否しました。サービスプロバイダーにお問い合わせください。", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3149,7 +3178,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ があなたのリクエストを拒否しました: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "設定を更新しました" - }, - "environmentEditedClick": { - "message": "ここをクリック" - }, - "environmentEditedReset": { - "message": "すると初期設定に戻します" - }, "serverVersion": { "message": "サーバーのバージョン" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "マスターパスワードでログイン" }, - "loggingInAs": { - "message": "ログイン中:" - }, - "notYou": { - "message": "あなたではないですか?" - }, "newAroundHere": { "message": "初めてですか?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "デバイスでログイン" }, - "loginWithDeviceEnabledInfo": { - "message": "Bitwarden アプリの設定でデバイスでログインする必要があります。別のオプションが必要ですか?" - }, "fingerprintPhraseHeader": { "message": "パスフレーズ" }, @@ -3312,20 +3323,17 @@ "viewAllLogInOptions": { "message": "すべてのログインオプションを表示" }, - "viewAllLoginOptionsV1": { - "message": "すべてのログインオプションを表示" - }, "notificationSentDevice": { "message": "デバイスに通知を送信しました。" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "デバイスまたは" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "ウェブアプリ" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "上で、Bitwarden をロック解除してください。承認する前に、フィンガープリントフレーズが以下と一致していることを確認してください。" }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" @@ -3340,7 +3348,7 @@ "message": "ログイン開始" }, "logInRequestSent": { - "message": "Request sent" + "message": "リクエストが送信されました" }, "exposedMasterPassword": { "message": "流出したマスターパスワード" @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "管理者の承認を要求する" }, - "approveWithMasterPassword": { - "message": "マスターパスワードで承認する" - }, "ssoIdentifierRequired": { "message": "組織の SSO ID が必要です。" }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "要求を管理者に送信しました。" }, - "youWillBeNotifiedOnceApproved": { - "message": "承認されると通知されます。 " - }, "troubleLoggingIn": { "message": "ログインできない場合" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "アクティブなアカウント" }, + "bitwardenAccount": { + "message": "Bitwarden アカウント" + }, "availableAccounts": { "message": "利用可能なアカウント" }, @@ -4198,10 +4203,10 @@ "message": "パスキーを削除しました" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "自動入力の候補" }, "itemSuggestions": { - "message": "Suggested items" + "message": "推奨アイテム" }, "autofillSuggestionsTip": { "message": "自動入力するためにこのサイトのログインアイテムを保存します" @@ -4276,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "$FIELD$ 「$VALUE$」 をコピー", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "ウェブサイトの URI の順序を変更します。矢印キーを押すとアイテムを上下に移動します。" + }, "reorderFieldUp": { "message": "$LABEL$ を上に移動しました。$INDEX$ / $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "何も選択されていません。" }, - "movedItemsToOrg": { - "message": "選択したアイテムを $ORGNAME$ に移動しました", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "アイテムを $ORGNAME$ に移動しました", "placeholders": { @@ -4863,22 +4862,22 @@ "message": "このアイテムを編集する権限がありません" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "PINまたはパスワードによるロック解除が最初に必要なため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "生体認証によるロック解除は現在利用できません。" }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "システムファイルの設定が誤っているため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "システムファイルの設定が誤っているため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Bitwarden デスクトップアプリが閉じているため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "生体認証による $EMAIL$ のロック解除は、 Bitwarden デスクトップアプリ上で有効になっていないため、利用できません。", "placeholders": { "email": { "content": "$1", @@ -4887,7 +4886,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "生体認証によるロック解除は、不明な理由により現在利用できません。" }, "authenticating": { "message": "認証中" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "エクストラワイド" }, + "sshKeyWrongPassword": { + "message": "入力されたパスワードが間違っています。" + }, + "importSshKey": { + "message": "インポート" + }, + "confirmSshKeyPassword": { + "message": "パスワードを確認" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH キーのパスワードを入力します。" + }, + "enterSshKeyPassword": { + "message": "パスワードを入力" + }, + "invalidSshKey": { + "message": "SSH キーが無効です" + }, + "sshKeyTypeUnsupported": { + "message": "サポートされていない種類の SSH キーです" + }, + "importSshKeyFromClipboard": { + "message": "クリップボードからキーをインポート" + }, + "sshKeyImported": { + "message": "SSH キーのインポートに成功しました" + }, "cannotRemoveViewOnlyCollections": { "message": "表示のみの権限が与えられているコレクションを削除することはできません: $COLLECTIONS$", "placeholders": { @@ -5106,9 +5132,12 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "デスクトップアプリを更新してください" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "生体認証によるロック解除を使用するには、デスクトップアプリを更新するか、デスクトップの設定で指紋認証によるロック解除を無効にしてください。" + }, + "changeAtRiskPassword": { + "message": "危険なパスワードの変更" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 2a066ebe1f2..818d7cdcd19 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "საქაღალდის ჩასწორება" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "ახალი საქაღალდე" }, @@ -479,22 +482,6 @@ "length": { "message": "სიგრძე" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "ჩართვა", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "სიტყვათა რაოდენობა" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "არა" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "შენახვა" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "ღია", "description": "Light color" }, - "solarizedDark": { - "message": "სოლარიზებული მუქი", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "სერვერის URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ტექსტი" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "დააწკაპუნეთ აქ" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "სერვერის ვერსია" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index b9f37778020..c8aff3a6488 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" - }, - "enterEmailToGetHint": { - "message": "ವಿಸ್ತರಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಮೆನುವಿನಲ್ಲಿರುವ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಐಕಾನ್ ಟ್ಯಾಪ್ ಮಾಡಿ." - }, "getMasterPasswordHint": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವನ್ನು ಪಡೆಯಿರಿ" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "ಉದ್ದ" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "ಪದಗಳ ಸಂಖ್ಯೆ" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "ನಿಮ್ಮ ವೆಬ್ ಬ್ರೌಸರ್ ಸುಲಭವಾದ ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ನಕಲು ಮಾಡುವುದನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬದಲಿಗೆ ಅದನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಕಲಿಸಿ." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "ಇಲ್ಲ" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "ಅನಿರೀಕ್ಷಿತ ದೋಷ ಸಂಭವಿಸಿದೆ." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "ಹೌದು, ಈಗ ಉಳಿಸಿ" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "ಬೆಳಕು", "description": "Light color" }, - "solarizedDark": { - "message": "ಡಾರ್ಕ್ ಸೌರ", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "ಸ್ವಯಂ ಆತಿಥೇಯ ಪರಿಸರ" }, - "selfHostedEnvironmentFooter": { - "message": "ನಿಮ್ಮ ಆನ್-ಪ್ರಮೇಯ ಹೋಸ್ಟ್ ಮಾಡಿದ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಸ್ಥಾಪನೆಯ ಮೂಲ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "ಕಸ್ಟಮ್ ಪರಿಸರ" }, - "customEnvironmentFooter": { - "message": "ಸುಧಾರಿತ ಬಳಕೆದಾರರಿಗಾಗಿ. ನೀವು ಪ್ರತಿ ಸೇವೆಯ ಮೂಲ URL ಅನ್ನು ಸ್ವತಂತ್ರವಾಗಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು." - }, "baseUrl": { "message": "ಸರ್ವರ್ URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "ವಿಂಗಡಿಸಲು ಎಳೆಯಿರಿ" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ಪಠ್ಯ" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index b607fa3910b..cd54ac47506 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "계정 이메일 주소를 입력하세요. 그 주소로 비밀번호 힌트가 전송될 것 입니다." }, - "passwordHint": { - "message": "비밀번호 힌트" - }, - "enterEmailToGetHint": { - "message": "마스터 비밀번호 힌트를 받으려면 계정의 이메일 주소를 입력하세요." - }, "getMasterPasswordHint": { "message": "마스터 비밀번호 힌트 얻기" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "폴더 편집" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "새 폴더" }, @@ -479,22 +482,6 @@ "length": { "message": "길이" }, - "uppercase": { - "message": "대문자 (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "소문자 (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "숫자 (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "특수 문자 (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "포함", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "특수 문자 포함", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "단어 수" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "사용하고 있는 웹 브라우저가 쉬운 클립보드 복사를 지원하지 않습니다. 직접 복사하세요." }, - "verifyIdentity": { - "message": "신원 확인" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "아니오" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "예기치 못한 오류가 발생했습니다." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "예, 지금 저장하겠습니다." }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "현재 로그인으로 업데이트할 건지 묻기" }, @@ -1133,10 +1169,6 @@ "message": "밝은 테마", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "~(으)로부터 내보내기" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "자체 호스팅 환경" }, - "selfHostedEnvironmentFooter": { - "message": "온-프레미스 Bitwarden이 호스팅되고 있는 서버의 기본 URL을 지정하세요." - }, "selfHostedBaseUrlHint": { "message": "온-프레미스 Bitwarden이 호스팅되고 있는 서버의 기본 URL을 지정하세요. 예: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "사용자 지정 환경" }, - "customEnvironmentFooter": { - "message": "고급 사용자 전용 설정입니다. 각 서비스의 기본 URL을 개별적으로 지정할 수 있습니다." - }, "baseUrl": { "message": "서버 URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "드래그하여 정렬" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "텍스트" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "설정이 편집되었습니다" - }, - "environmentEditedClick": { - "message": "여기를 클릭하세요." - }, - "environmentEditedReset": { - "message": "사전 구성된 설정으로 재설정하려면" - }, "serverVersion": { "message": "서버 버전" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "마스터 비밀번호로 로그인" }, - "loggingInAs": { - "message": "다음으로 로그인 중" - }, - "notYou": { - "message": "본인이 아닌가요?" - }, "newAroundHere": { "message": "새로 찾아오셨나요?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "기기로 로그인" }, - "loginWithDeviceEnabledInfo": { - "message": "기기로 로그인하려면 Bitwarden 모바일 앱 설정에서 설정해야 합니다. 다른 방식이 필요하신가요?" - }, "fingerprintPhraseHeader": { "message": "지문 구절" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "모든 로그인 방식 보기" }, - "viewAllLoginOptionsV1": { - "message": "모든 로그인 옵션 보기" - }, "notificationSentDevice": { "message": "기기에 알림이 전송되었습니다." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "관리자 인증 필요" }, - "approveWithMasterPassword": { - "message": "마스터 비밀번호로 승인" - }, "ssoIdentifierRequired": { "message": "조직의 SSO 식별자가 필요합니다" }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "요청이 관리자에게 전송되었습니다." }, - "youWillBeNotifiedOnceApproved": { - "message": "승인되면 알림을 받게 됩니다." - }, "troubleLoggingIn": { "message": "로그인에 문제가 있나요?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "계정 활성화" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "사용 가능한 계정" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$을 위로 이동했습니다. 위치: $INDEX$ / $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "아무것도 선택하지 않았습니다." }, - "movedItemsToOrg": { - "message": "선택한 항목이 $ORGNAME$(으)로 이동됨", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "항목들이 $ORGNAME$로 이동했습니다", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "매우 넓게" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "보기 권한만 있는 컬렉션은 제거할 수 없습니다: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index f3313844eab..8bf8a8f7518 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Slaptažodžio užuomina" - }, - "enterEmailToGetHint": { - "message": "Įveskite savo paskyros el. pašto adresą, kad gautumėte pagrindinio slaptažodžio užuominą." - }, "getMasterPasswordHint": { "message": "Gauti pagrindinio slaptažodžio užuominą" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Redaguoti aplankalą" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Ilgis" }, - "uppercase": { - "message": "Didžiosiomis (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Mažosiomis (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Skaitmenys (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Specialieji simboliai (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Žodžių skaičius" }, @@ -555,7 +538,7 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Jūsų generatoriaus parinktims taikomi įmonės politikos reikalavimai.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Jūsų žiniatinklio naršyklė nepalaiko automatinio kopijavimo. Vietoj to nukopijuokite rankiniu būdu." }, - "verifyIdentity": { - "message": "Patvirtinti tapatybę" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Įvyko netikėta klaida." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Išsaugoti" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Paprašyti atnaujinti esamą prisijungimą" }, @@ -1133,10 +1169,6 @@ "message": "Šviesi", "description": "Light color" }, - "solarizedDark": { - "message": "Saulėtas tamsą", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Savarankiškai sukurta aplinka" }, - "selfHostedEnvironmentFooter": { - "message": "Nurodykite vietinio priglobto „Bitwarden“ diegimo bazinį URL." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Individualizuota aplinka" }, - "customEnvironmentFooter": { - "message": "Pažengusiems naudotojams. Galite nurodyti kiekvienos paslaugos pagrindinį URL adresą atskirai." - }, "baseUrl": { "message": "Serverio URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Rūšiuok, kad surūšiuotum" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekstas" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Nustatymai buvo paredaguoti" - }, - "environmentEditedClick": { - "message": "Spauskite čia" - }, - "environmentEditedReset": { - "message": "iš naujo nustatyti iš anksto sukonfigūruotus nustatymus" - }, "serverVersion": { "message": "Serverio versija" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Prisijungti su pagrindiniu slaptažodžiu" }, - "loggingInAs": { - "message": "Prisijungimas kaip" - }, - "notYou": { - "message": "Ne jūs?" - }, "newAroundHere": { "message": "Ar jūs naujas čia?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Prisijunkite naudodami įrenginį" }, - "loginWithDeviceEnabledInfo": { - "message": "Prisijungti su įrenginiu turi būti nustatyta Bitwarden aplikacijos nustatymuose. Reikia kito pasirinkimo?" - }, "fingerprintPhraseHeader": { "message": "Pirštų atspaudų frazė" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Prašyti administratoriaus patvirtinimo" }, - "approveWithMasterPassword": { - "message": "Patvirtinti su pagrindiniu slaptažodžiu" - }, "ssoIdentifierRequired": { "message": "Organizacijos SSO identifikatorius yra reikalingas." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tavo prašymas išsiųstas administratoriui." }, - "youWillBeNotifiedOnceApproved": { - "message": "Tu būsi praneštas (-a), kai bus patvirtinta." - }, "troubleLoggingIn": { "message": "Problemos prisijungiant?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Pasiekiamos paskyros" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Negalite pašalinti kolekcijų su Peržiūrėti tik leidimus: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 2c80b0b6f10..7b5f077f69d 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" }, - "passwordHint": { - "message": "Paroles norāde" - }, - "enterEmailToGetHint": { - "message": "Norādīt konta e-pasta adresi, lai saņemtu galvenās paroles norādi." - }, "getMasterPasswordHint": { "message": "Saņemt galvenās paroles norādi" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Labot mapi" }, + "editFolderWithName": { + "message": "Labot mapi: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Jauna mape" }, @@ -479,22 +482,6 @@ "length": { "message": "Garums" }, - "uppercase": { - "message": "Lielie burti (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Mazie burti (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Cipari (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Īpašās rakstzīmes (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Iekļaut", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Iekļaut īpašās rakstzīmes", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Vārdu skaits" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Pārlūks neatbalsta vienkāršo ievietošanu starpliktuvē. Tā vietā tas jāievieto starpliktuvē pašrocīgi." }, - "verifyIdentity": { - "message": "Identitātes apliecināšana" + "verifyYourIdentity": { + "message": "Apliecināt savu identitāti" }, "weDontRecognizeThisDevice": { "message": "Mēs neatpazīstam šo ierīci. Jāievada kods, kas tika nosūtīts e-pastā, lai apliecinātu savu identitāti." @@ -921,6 +904,9 @@ "no": { "message": "Nē" }, + "location": { + "message": "Atrašanās vieta" + }, "unexpectedError": { "message": "Ir radusies neparedzēta kļūda." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Jā, saglabāt" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saglabāts Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ atjaunināts Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Saglabāt kā jaunu pieteikšanās vienumu", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Atjaunināt pieteikšanās vienumu", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Saglabāt pieteikšanās vienumu?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Atjaunināt esošo pieteikšanās vienumu?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Pieteikšanās vienums saglabāts", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Pieteikšanās vienums atjaunināts", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Kļūda saglabāšanas laikā", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Ak nē! Mēs nevarējā šo saglabāt. Jāmēģina pašrocīgi ievadīt informāciju.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Vaicāt atjaunināt esošu pieteikšanās vienumu" }, @@ -1133,10 +1169,6 @@ "message": "Gaišs", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Izgūt no" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Pašuzturēta vide" }, - "selfHostedEnvironmentFooter": { - "message": "Norādīt pašuzstādīta Bitwarden pamata URL." - }, "selfHostedBaseUrlHint": { "message": "Jānorāda sava pašizvietotā Bitward servera pamata URL. Piemērs: https://bitwarden.uznemums.lv" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Pielāgota vide" }, - "customEnvironmentFooter": { - "message": "Pieredzējušiem lietotājiem. Ir iespējams norādīt URL katram pakalpojumam atsevišķi." - }, "baseUrl": { "message": "Servera URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Vilkt, lai kārtotu" }, + "dragToReorder": { + "message": "Vilkt, lai pārkārtotu" + }, "cfTypeText": { "message": "Teksts" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Iestatījumi ir izmainīti" - }, - "environmentEditedClick": { - "message": "Klikšķināt šeit" - }, - "environmentEditedReset": { - "message": "lai atiestatītu pirmsuzstādītos iestatījumus" - }, "serverVersion": { "message": "Servera versija" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Pieteikties ar galveno paroli" }, - "loggingInAs": { - "message": "Piesakās kā" - }, - "notYou": { - "message": "Tas neesi Tu?" - }, "newAroundHere": { "message": "Jauns šeit?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Pieteikties ar ierīci" }, - "loginWithDeviceEnabledInfo": { - "message": "Ir jāuzstāda pieteikšanās ar ierīci Bitwarden lietotnes iestatījumos. Nepieciešama cita iespēja?" - }, "fingerprintPhraseHeader": { "message": "Atpazīšanas vārdkopa" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Skatīt visas pieteikšanās iespējas" }, - "viewAllLoginOptionsV1": { - "message": "Skatīt visas pieteikšanās iespējas" - }, "notificationSentDevice": { "message": "Uz ierīci ir nosūtīts paziņojums." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Pieprasīt pārvaldītāja apstiprinājumu" }, - "approveWithMasterPassword": { - "message": "Apstiprināt ar galveno paroli" - }, "ssoIdentifierRequired": { "message": "Ir nepieciešams apvienības SSO identifikators." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pieprasījums tika nosūtīts pārvaldītājam." }, - "youWillBeNotifiedOnceApproved": { - "message": "Tiks saņemts paziņojums, tiklīdz būs apstiprināts." - }, "troubleLoggingIn": { "message": "Neizdodas pieteikties?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Pašlaik izmantotais konts" }, + "bitwardenAccount": { + "message": "Bitwarden konts" + }, "availableAccounts": { "message": "Pieejamie konti" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Pārkārtot tīmekļvietņu URI. Bultas uz augšu taustiņš ir izmantojams, lai pārvietotu vienumu augšup vai lejup." + }, "reorderFieldUp": { "message": "$LABEL$ pārvietots augšup, $INDEX$. no $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ļoti plats" }, + "sshKeyWrongPassword": { + "message": "Ievadītā parole ir nepareiza." + }, + "importSshKey": { + "message": "Ievietot" + }, + "confirmSshKeyPassword": { + "message": "Apstiprināt paroli" + }, + "enterSshKeyPasswordDesc": { + "message": "Ievadīt SSH atslēgas paroli." + }, + "enterSshKeyPassword": { + "message": "Ievadīt paroli" + }, + "invalidSshKey": { + "message": "SSH atslēga ir nederīga" + }, + "sshKeyTypeUnsupported": { + "message": "SSH atslēgas veids netiek atbalstīts" + }, + "importSshKeyFromClipboard": { + "message": "Ievietot atslēgu no starpliktuves" + }, + "sshKeyImported": { + "message": "SSH atslēga tika sekmīgi ievietota" + }, "cannotRemoveViewOnlyCollections": { "message": "Nevar noņemt krājumus ar tiesībām \"Tikai skatīt\": $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Lai izmantotu atslēgšanu ar biometriju, lūgums atjaunināt darbvirsmas lietotni vai atspējot atslēgšanu ar pirkstu nospiedumu darbvirsmas iestatījumos." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 637f139e816..24a096db0ef 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "പാസ്സ്‌വേഡ് സൂചനാ" - }, - "enterEmailToGetHint": { - "message": "നിങ്ങളുടെ പ്രാഥമിക പാസ്‌വേഡ് സൂചന ലഭിക്കുന്നതിന് നിങ്ങളുടെ അക്കൗണ്ട് ഇമെയിൽ വിലാസം നൽകുക." - }, "getMasterPasswordHint": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സൂചന നേടുക" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "ഫോൾഡർ തിരുത്തുക" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "നീളം" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "വാക്കുകളുടെ എണ്ണം" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "നിങ്ങളുടെ ബ്രൌസർ എളുപ്പമുള്ള ക്ലിപ്പ്ബോർഡ് പകർത്തൽ പിന്തുണയ്ക്കത്തില്ല. പകരം അത് സ്വമേധയാ പകർക്കുക ." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "തെറ്റ്" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "ഒരു അപ്രതീക്ഷിത പിശക് സംഭവിച്ചു." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "ശരി, ഇപ്പോൾ സംരക്ഷിക്കുക" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "ലൈറ്റ്", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "സ്വയം ഹോസ്റ്റുചെയ്‌ത എൻവിയോണ്മെന്റ്" }, - "selfHostedEnvironmentFooter": { - "message": "തങ്ങളുടെ പരിസരത്ത് ചെയ്യുന്ന ബിറ്റ് വാർഡൻ ഇൻസ്റ്റാളേഷന്റെ അടിസ്ഥാന URL വ്യക്തമാക്കുക." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "ഇഷ്‌ടാനുസൃത എൻവിയോണ്മെന്റ്" }, - "customEnvironmentFooter": { - "message": "വിപുലമായ ഉപയോക്താക്കൾക്കായി. ഓരോ സേവനത്തിന്റെയും അടിസ്ഥാന URL നിങ്ങൾക്ക് സ്വതന്ത്രമായി വ്യക്തമാക്കാൻ കഴിയും." - }, "baseUrl": { "message": "സെർവർ URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "അടുക്കാൻ വലിച്ചിടുക" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "വാചകം" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 181627cd358..9a49998d3d9 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "पासवर्ड संकेत" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "मुख्य पासवर्ड संकेत मिळवा" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "फोल्डर संपादित करा" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "लांबी" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "ओळख सत्यापित करा" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 8022d4372d3..0ff4ed9486a 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Passordhint" - }, - "enterEmailToGetHint": { - "message": "Skriv inn e-postadressen din for å motta hintet til hovedpassordet." - }, "getMasterPasswordHint": { "message": "Få et hint om superpassordet" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Rediger mappen" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Ny mappe" }, @@ -479,22 +482,6 @@ "length": { "message": "Lengde" }, - "uppercase": { - "message": "Store bokstaver (A–Å)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Små bokstaver (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Tall (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Spesialtegn (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Inkluder", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antall ord" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Nettleseren din støtter ikke kopiering til utklippstavlen på noe enkelt vis. Prøv å kopiere det manuelt i stedet." }, - "verifyIdentity": { - "message": "Bekreft identitet" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Nei" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "En uventet feil har oppstått." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Ja, lagre nå" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Spør om å oppdatere eksisterende innlogginger" }, @@ -1133,10 +1169,6 @@ "message": "Lyst", "description": "Light color" }, - "solarizedDark": { - "message": "Solarisert mørk", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Selvbetjent miljø" }, - "selfHostedEnvironmentFooter": { - "message": "Spesifiser grunn-nettadressen til din selvbetjente Bitwarden-installasjon." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Tilpasset miljø" }, - "customEnvironmentFooter": { - "message": "For avanserte brukere. Du kan bestemme grunn-nettadressen til hver tjeneste separat." - }, "baseUrl": { "message": "Tjener-nettadresse" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Dra for å sortere" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Innstillingene har blitt endret" - }, - "environmentEditedClick": { - "message": "Klikk her" - }, - "environmentEditedReset": { - "message": "for å tilbakestille til forhåndskonfigurerte innstillinger" - }, "serverVersion": { "message": "Server Versjon" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Logg på med hovedpassord" }, - "loggingInAs": { - "message": "Logger på som" - }, - "notYou": { - "message": "Ikke deg?" - }, "newAroundHere": { "message": "Er du ny her?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Logg inn med enhet" }, - "loginWithDeviceEnabledInfo": { - "message": "Logg på med enhet må settes opp i Bitwarden-innstillingene. Trenger du et annet alternativ?" - }, "fingerprintPhraseHeader": { "message": "Fingeravtrykksfrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Vis alle påloggingsalternativer" }, - "viewAllLoginOptionsV1": { - "message": "Vis alle påloggingsalternativer" - }, "notificationSentDevice": { "message": "Et varsel er sendt til enheten din." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Be om administratorgodkjennelse" }, - "approveWithMasterPassword": { - "message": "Godkjenn med hovedpassord" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Forespørselen din har blitt sendt til administratoren din." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du vil bli varslet når det er godkjent." - }, "troubleLoggingIn": { "message": "Har du problemer med å logge inn?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktiv konto" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Tilgjengelige kontoer" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra bred" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "For å bruke biometrisk opplåsing, må du oppdatere skrivebordsprogrammet eller skru av fingeravtrykksopplåsing i skrivebordsinnstillingene." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index c07244d8cde..65d8d6f740f 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" }, - "passwordHint": { - "message": "Wachtwoordhint" - }, - "enterEmailToGetHint": { - "message": "Voer het e-mailadres van je account in om je hoofdwachtwoordhint te ontvangen." - }, "getMasterPasswordHint": { "message": "Hoofdwachtwoordhint opvragen" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Map bewerken" }, + "editFolderWithName": { + "message": "Map bewerken: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nieuwe map" }, @@ -479,22 +482,6 @@ "length": { "message": "Lengte" }, - "uppercase": { - "message": "Hoofdletters (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Kleine letters (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Cijfers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Speciale tekens (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Toevoegen", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Speciale tekens toevoegen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Aantal woorden" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Je webbrowser ondersteunt kopiëren naar plakbord niet. Kopieer handmatig." }, - "verifyIdentity": { - "message": "Identiteit verifiëren" + "verifyYourIdentity": { + "message": "Verifieer je identiteit" }, "weDontRecognizeThisDevice": { "message": "We herkennen dit apparaat niet. Voer de code in die naar je e-mail is verzonden om je identiteit te verifiëren." @@ -921,6 +904,9 @@ "no": { "message": "Nee" }, + "location": { + "message": "Locatie" + }, "unexpectedError": { "message": "Er is een onverwachte fout opgetreden." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Ja, nu opslaan" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ opgeslagen in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ bijgewerkt in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Als nieuwe login opslaan", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Login bijwerken", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Login opslaan?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Bestaande login bijwerken?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login opgeslagen", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login bijgewerkt", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Fout bij opslaan", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh nee! We konden dit niet opslaan. Probeer de gegevens handmatig in te voeren.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Vraag om bijwerken bestaande login" }, @@ -1133,10 +1169,6 @@ "message": "Licht", "description": "Light color" }, - "solarizedDark": { - "message": "Overbelicht donker", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exporteren vanuit" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Zelfgehoste omgeving" }, - "selfHostedEnvironmentFooter": { - "message": "Geef de basis-URL van jouw zelfgehoste Bitwarden-installatie." - }, "selfHostedBaseUrlHint": { "message": "Specificeer de basis-URL van je zelfgehoste Bitwarden-installatie. Bijvoorbeeld: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Aangepaste omgeving" }, - "customEnvironmentFooter": { - "message": "Voor gevorderde gebruikers. Je kunt de basis-URL van elke dienst afzonderlijk instellen." - }, "baseUrl": { "message": "Server-URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Slepen om te sorteren" }, + "dragToReorder": { + "message": "Sleep om te herschikken" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Instellingen zijn bijgewerkt" - }, - "environmentEditedClick": { - "message": "Klik hier" - }, - "environmentEditedReset": { - "message": "om terug te gaan naar vooraf geconfigureerde instellingen" - }, "serverVersion": { "message": "Serverversie" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Inloggen met je hoofdwachtwoord" }, - "loggingInAs": { - "message": "Inloggen als" - }, - "notYou": { - "message": "Ben jij dit niet?" - }, "newAroundHere": { "message": "Nieuw hier?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Inloggen met apparaat" }, - "loginWithDeviceEnabledInfo": { - "message": "Inloggen met apparaat moet aangezet worden in de instellingen van de Bitwarden app. Nood aan een andere optie?" - }, "fingerprintPhraseHeader": { "message": "Vingerafdrukzin" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Alle inlogopties bekijken" }, - "viewAllLoginOptionsV1": { - "message": "Alle inlogopties weergeven" - }, "notificationSentDevice": { "message": "Er is een melding naar je apparaat verzonden." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Goedkeuring van beheerder vragen" }, - "approveWithMasterPassword": { - "message": "Goedkeuren met hoofdwachtwoord" - }, "ssoIdentifierRequired": { "message": "Organisatie SSO-identificatie vereist." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Je verzoek is naar je beheerder verstuurd." }, - "youWillBeNotifiedOnceApproved": { - "message": "Je krijgt een melding zodra je bent goedgekeurd." - }, "troubleLoggingIn": { "message": "Problemen met inloggen?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Actief account" }, + "bitwardenAccount": { + "message": "Bitwarden-account" + }, "availableAccounts": { "message": "Beschikbare accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Website URI herschikken. Gebruik de pijltjestoets om het item omhoog of omlaag te verplaatsen." + }, "reorderFieldUp": { "message": "$LABEL$ is naar boven verplaatst, positie $INDEX$ van $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra breed" }, + "sshKeyWrongPassword": { + "message": "Het door jou ingevoerde wachtwoord is onjuist." + }, + "importSshKey": { + "message": "Importeren" + }, + "confirmSshKeyPassword": { + "message": "Wachtwoord bevestigen" + }, + "enterSshKeyPasswordDesc": { + "message": "Voer het wachtwoord voor de SSH sleutel in." + }, + "enterSshKeyPassword": { + "message": "Wachtwoord invoeren" + }, + "invalidSshKey": { + "message": "De SSH-sleutel is ongeldig" + }, + "sshKeyTypeUnsupported": { + "message": "Het type SSH-sleutel is niet ondersteund" + }, + "importSshKeyFromClipboard": { + "message": "Sleutel van klembord importeren" + }, + "sshKeyImported": { + "message": "SSH-sleutel succesvol geïmporteerd" + }, "cannotRemoveViewOnlyCollections": { "message": "Je kunt verzamelingen niet verwijderen met alleen rechten voor weergeven: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Als je biometrische gegevens wilt gebruiken, moet je de desktopapplicatie bijwerken of vingerafdrukontgrendeling uitschakelen in de instellingen van de desktopapplicatie." + }, + "changeAtRiskPassword": { + "message": "Risicovol wachtwoord wijzigen" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 70c567f1938..f4c1303bd18 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Wprowadź adres e-mail swojego konta, a podpowiedź hasła zostanie wysłana do Ciebie" }, - "passwordHint": { - "message": "Podpowiedź do hasła" - }, - "enterEmailToGetHint": { - "message": "Wpisz adres e-mail powiązany z kontem, aby otrzymać podpowiedź do hasła głównego." - }, "getMasterPasswordHint": { "message": "Uzyskaj podpowiedź do hasła głównego" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edytuj folder" }, + "editFolderWithName": { + "message": "Edytuj folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nowy folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Długość" }, - "uppercase": { - "message": "Wielkie litery (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Małe litery (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Cyfry (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Znaki specjalne (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Uwzględnij", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Uwzględnij znaki specjalne", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Liczba słów" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Przeglądarka nie obsługuje łatwego kopiowania schowka. Skopiuj element ręcznie." }, - "verifyIdentity": { - "message": "Zweryfikuj tożsamość" + "verifyYourIdentity": { + "message": "Potwierdź swoją tożsamość" }, "weDontRecognizeThisDevice": { "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." @@ -921,6 +904,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Lokalizacja" + }, "unexpectedError": { "message": "Wystąpił nieoczekiwany błąd." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Zapisz" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ został zapisany w Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ został zaktualizowany w Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Zapisz jako nowy login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Zaktualizuj dane logowania", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Zapisać dane logowania?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Zaktualizować istniejące dane logowania?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Dane logowania zapisane", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Dane logowania zostały zaktualizowane", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Błąd podczas zapisywania", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "O nie! Nie mogliśmy zapisać tego. Spróbuj wprowadzić szczegóły ręcznie.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Poproś o aktualizację istniejących danych logowania" }, @@ -1133,10 +1169,6 @@ "message": "Jasny", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Eksportuj z" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Samodzielnie hostowane środowisko" }, - "selfHostedEnvironmentFooter": { - "message": "Wpisz podstawowy adres URL hostowanej instalacji Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Określ bazowy adres URL swojej instalacji Bitwarden. Przykład: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Niestandardowe środowisko" }, - "customEnvironmentFooter": { - "message": "Dla zaawansowanych użytkowników. Możesz wpisać podstawowy adres URL niezależnie dla każdej usługi." - }, "baseUrl": { "message": "Adres URL serwera" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Przeciągnij, aby posortować" }, + "dragToReorder": { + "message": "Przeciągnij, aby zmienić kolejność" + }, "cfTypeText": { "message": "Tekst" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Ustawienia zostały zmienione" - }, - "environmentEditedClick": { - "message": "Kliknij tutaj" - }, - "environmentEditedReset": { - "message": "aby zresetować do wstępnie skonfigurowanych ustawień" - }, "serverVersion": { "message": "Wersja serwera" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Logowanie hasłem głównym" }, - "loggingInAs": { - "message": "Logowanie jako" - }, - "notYou": { - "message": "To nie Ty?" - }, "newAroundHere": { "message": "Nowy użytkownik?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Zaloguj się za pomocą urządzenia" }, - "loginWithDeviceEnabledInfo": { - "message": "Logowanie za pomocą urządzenia musi być włączone w ustawieniach aplikacji Bitwarden. Potrzebujesz innej opcji?" - }, "fingerprintPhraseHeader": { "message": "Unikalny identyfikator konta" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Zobacz wszystkie sposoby logowania" }, - "viewAllLoginOptionsV1": { - "message": "Zobacz wszystkie sposoby logowania" - }, "notificationSentDevice": { "message": "Powiadomienie zostało wysłane na urządzenie." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Poproś administratora o zatwierdzenie" }, - "approveWithMasterPassword": { - "message": "Zatwierdź przy użyciu hasła głównego" - }, "ssoIdentifierRequired": { "message": "Identyfikator organizacji jest wymagany." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Twoja prośba została wysłana do Twojego administratora." }, - "youWillBeNotifiedOnceApproved": { - "message": "Zostaniesz powiadomiony po zatwierdzeniu." - }, "troubleLoggingIn": { "message": "Problem z zalogowaniem?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktywne konto" }, + "bitwardenAccount": { + "message": "Konto Bitwarden" + }, "availableAccounts": { "message": "Dostępne konta" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Zmień kolejność URI strony. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół." + }, "reorderFieldUp": { "message": "$LABEL$ przeniósł się w górę, pozycja $INDEX$ z $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Bardzo szerokie" }, + "sshKeyWrongPassword": { + "message": "Wprowadzone hasło jest nieprawidłowe." + }, + "importSshKey": { + "message": "Importuj" + }, + "confirmSshKeyPassword": { + "message": "Potwierdź hasło" + }, + "enterSshKeyPasswordDesc": { + "message": "Wprowadź hasło dla klucza SSH." + }, + "enterSshKeyPassword": { + "message": "Wprowadź hasło" + }, + "invalidSshKey": { + "message": "Klucz SSH jest nieprawidłowy" + }, + "sshKeyTypeUnsupported": { + "message": "Typ klucza SSH nie jest obsługiwany" + }, + "importSshKeyFromClipboard": { + "message": "Importuj klucz ze schowka" + }, + "sshKeyImported": { + "message": "Klucz SSH zaimportowano pomyślnie" + }, "cannotRemoveViewOnlyCollections": { "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Aby używać odblokowywania biometrycznego, zaktualizuj aplikację na komputerze lub wyłącz odblokowywanie odciskiem palca w ustawieniach aplikacji na komputerze." + }, + "changeAtRiskPassword": { + "message": "Zmień hasło zagrożone" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 8066ece4829..0b5d569f443 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -81,7 +81,7 @@ "message": "Dica de Senha Mestra (opcional)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Pontos fortes da senha: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -186,7 +186,7 @@ "message": "Copiar Notas" }, "copy": { - "message": "Copy", + "message": "Copiar", "description": "Copy to clipboard" }, "fill": { @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de seu correio eletrônico da sua conta e sua dica da senha será enviada para você" }, - "passwordHint": { - "message": "Dica da Senha" - }, - "enterEmailToGetHint": { - "message": "Insira o seu endereço de e-mail para receber a dica da sua senha mestra." - }, "getMasterPasswordHint": { "message": "Obter dica da senha mestra" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editar Pasta" }, + "editFolderWithName": { + "message": "Editar pasta: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nova pasta" }, @@ -459,16 +462,16 @@ "message": "Gerar frase secreta" }, "passwordGenerated": { - "message": "Password generated" + "message": "Senha gerada" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Senha gerada" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nome de usuário gerado" }, "emailGenerated": { - "message": "Email generated" + "message": "E-mail gerado" }, "regeneratePassword": { "message": "Gerar Nova Senha" @@ -479,22 +482,6 @@ "length": { "message": "Comprimento" }, - "uppercase": { - "message": "Maiúsculas (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minúsculas (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Números (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Incluir", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Incluir caracteres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de Palavras" }, @@ -669,14 +652,14 @@ "browserNotSupportClipboard": { "message": "O seu navegador web não suporta cópia para a área de transferência. Em alternativa, copie manualmente." }, - "verifyIdentity": { - "message": "Verificar Identidade" + "verifyYourIdentity": { + "message": "Verifique a sua identidade" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Não reconhecemos este dispositivo. Digite o código enviado por e-mail para verificar a sua identidade." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Manter sessão" }, "yourVaultIsLocked": { "message": "Seu cofre está trancado. Verifique sua identidade para continuar." @@ -886,19 +869,19 @@ "message": "Inicie a sessão no Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Digite o código enviado por e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Digite o código a partir do seu autenticador" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Insira sua YubiKey para autenticar" }, "duoTwoFactorRequiredPageSubtitle": { "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Siga os passos abaixo para finalizar o login." }, "restartRegistration": { "message": "Reiniciar registro" @@ -921,6 +904,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Localização" + }, "unexpectedError": { "message": "Ocorreu um erro inesperado." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Salvar" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ salvo no Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ atualizado no Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Salvar como nova sessão", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Atualizar sessão", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Salvar sessão?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Atualizar a sessão atual?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Sessão salva", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Sessão atualizada", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Erro ao salvar", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Ops! Não foi possível salvar isso. Tente digitar os detalhes manualmente.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Pedir para atualizar os dados de login existentes" }, @@ -1133,10 +1169,6 @@ "message": "Claro", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized (escuro)", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportar de" }, @@ -1390,7 +1422,7 @@ "message": "Lembrar de mim" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Não perguntar novamente neste dispositivo por 30 dias" }, "sendVerificationCodeEmailAgain": { "message": "Enviar código de verificação para o e-mail novamente" @@ -1399,11 +1431,11 @@ "message": "Utilizar outro método de verificação em duas etapas" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Escolher outro método", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Use seu código de recuperação" }, "insertYubiKey": { "message": "Insira a sua YubiKey na porta USB do seu computador, e depois toque no botão da mesma." @@ -1418,16 +1450,16 @@ "message": "Abrir nova aba" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Abrir numa nova aba" }, "webAuthnAuthenticate": { "message": "Autenticar WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Ler chave de segurança" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Aguardando interação com a chave de segurança..." }, "loginUnavailable": { "message": "Sessão Indisponível" @@ -1442,7 +1474,7 @@ "message": "Opções de Login em Duas Etapas" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Escolher iniciar sessão em duas etapas" }, "recoveryCodeDesc": { "message": "Perdeu o acesso a todos os seus provedores de duas etapas? Utilize o seu código de recuperação para desativar todos os provedores de duas etapas da sua conta." @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Ambiente Auto-hospedado" }, - "selfHostedEnvironmentFooter": { - "message": "Especifique a URL de base da sua instalação local do Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Especifique a URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Ambiente Personalizado" }, - "customEnvironmentFooter": { - "message": "Para usuários avançados. Você pode especificar a URL de base de cada serviço independentemente." - }, "baseUrl": { "message": "URL do Servidor" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arrastar para ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Texto" }, @@ -2115,7 +2144,7 @@ "message": "Gerador de usuário" }, "useThisEmail": { - "message": "Use this email" + "message": "Usar este e-mail" }, "useThisPassword": { "message": "Use esta senha" @@ -2135,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": "Personalização do cofre" }, "vaultTimeoutAction": { "message": "Ação de Tempo Limite do Cofre" @@ -2144,13 +2173,13 @@ "message": "Ação do tempo" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Novas opções de personalização" }, "newCustomizationOptionsCalloutContent": { "message": "Customize your vault experience with quick copy actions, compact mode, and more!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Ver todas as configurações de aparência" }, "lock": { "message": "Bloquear", @@ -2408,10 +2437,10 @@ "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Domínios bloqueados" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Saiba mais sobre domínios bloqueados" }, "excludedDomains": { "message": "Domínios Excluídos" @@ -2432,10 +2461,10 @@ "message": "Change this in settings" }, "change": { - "message": "Change" + "message": "Alterar" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Alterar senha - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2444,7 +2473,7 @@ } }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Senhas em risco" }, "atRiskPasswordDescSingleOrg": { "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", @@ -2516,7 +2545,7 @@ "message": "Illustration of the Bitwarden autofill menu displaying a generated password" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Atualizar no Bitwarden" }, "updateInBitwardenSlideDesc": { "message": "Bitwarden will then prompt you to update the password in the password manager.", @@ -2526,13 +2555,13 @@ "message": "Illustration of a Bitwarden’s notification prompting the user to update the login" }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Ativar preenchimento automático" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Desativar preenchimento automático" }, "dismiss": { - "message": "Dismiss" + "message": "Dispensar" }, "websiteItemLabel": { "message": "Site $number$ (URI)", @@ -2994,10 +3023,10 @@ "message": "Erro" }, "decryptionError": { - "message": "Decryption error" + "message": "Erro ao descriptografar" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "O Bitwarden não pode descriptografar o(s) item(ns) do cofre listado abaixo." }, "contactCSToAvoidDataLossPart1": { "message": "Contact customer success", @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "As configurações foram editadas" - }, - "environmentEditedClick": { - "message": "Clique aqui" - }, - "environmentEditedReset": { - "message": "para redefinir para as configurações pré-configuradas" - }, "serverVersion": { "message": "Versão do servidor" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Entrar com a senha mestra" }, - "loggingInAs": { - "message": "Logar como" - }, - "notYou": { - "message": "Não é você?" - }, "newAroundHere": { "message": "Novo por aqui?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Fazer login com dispositivo" }, - "loginWithDeviceEnabledInfo": { - "message": "Login com dispositivo deve ser habilitado nas configurações do aplicativo móvel do Bitwarden. Necessita de outra opção?" - }, "fingerprintPhraseHeader": { "message": "Frase de impressão digital" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Visualizar todas as opções de login" }, - "viewAllLoginOptionsV1": { - "message": "Visualizar todas as opções de login" - }, "notificationSentDevice": { "message": "Uma notificação foi enviada para seu dispositivo." }, @@ -3340,7 +3348,7 @@ "message": "Login iniciado" }, "logInRequestSent": { - "message": "Request sent" + "message": "Pedido enviado" }, "exposedMasterPassword": { "message": "Senha mestra comprometida" @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Solicitar aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com senha mestra" - }, "ssoIdentifierRequired": { "message": "Identificador SSO da organização é necessário." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Seu pedido foi enviado para seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado assim que for aprovado." - }, "troubleLoggingIn": { "message": "Problemas em efetuar login?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Conta ativa" }, + "bitwardenAccount": { + "message": "Conta Bitwarden" + }, "availableAccounts": { "message": "Contas disponíveis" }, @@ -4198,10 +4203,10 @@ "message": "Chave de acesso removida" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Sugestões de preenchimento automático" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Itens sugeridos" }, "autofillSuggestionsTip": { "message": "Salvar um item de login para este site autopreenchimento" @@ -4276,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Copiar $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ se moveu para cima, posição $INDEX$ de $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra Grande" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Você não pode remover coleções com permissões de Somente leitura: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 007a4092431..c1f1f51609c 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" }, - "passwordHint": { - "message": "Dica da palavra-passe" - }, - "enterEmailToGetHint": { - "message": "Introduza o endereço de e-mail da sua conta para receber a dica da sua palavra-passe mestra." - }, "getMasterPasswordHint": { "message": "Obter a dica da palavra-passe mestra" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editar pasta" }, + "editFolderWithName": { + "message": "Editar pasta: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nova pasta" }, @@ -479,22 +482,6 @@ "length": { "message": "Comprimento" }, - "uppercase": { - "message": "Maiúsculas (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Minúsculas (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Números (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Carateres especiais (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Incluir", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Incluir carateres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palavras" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "O seu navegador Web não suporta a cópia fácil da área de transferência. Em vez disso, copie manualmente." }, - "verifyIdentity": { - "message": "Verificar identidade" + "verifyYourIdentity": { + "message": "Verifique a sua identidade" }, "weDontRecognizeThisDevice": { "message": "Não reconhecemos este dispositivo. Introduza o código enviado para o seu e-mail para verificar a sua identidade." @@ -921,6 +904,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Localização" + }, "unexpectedError": { "message": "Ocorreu um erro inesperado." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Guardar" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ guardado no Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ atualizado no Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Guardar como nova credencial", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Atualizar credencial", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Guardar credencial?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Atualizar credencial existente?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Credencial guardada", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Credencial atualizada", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Erro ao guardar", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Oh não! Não conseguimos guardar isto. Tente introduzir os detalhes manualmente.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Pedir para atualizar credencial existente" }, @@ -1133,10 +1169,6 @@ "message": "Claro", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized (escuro)", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportar de" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, - "selfHostedEnvironmentFooter": { - "message": "Especifique o URL de base da sua instalação Bitwarden hospedada no local." - }, "selfHostedBaseUrlHint": { "message": "Especifique o URL de base da sua instalação Bitwarden hospedada no local. Exemplo: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Ambiente personalizado" }, - "customEnvironmentFooter": { - "message": "Para utilizadores avançados. Pode especificar o URL de base de cada serviço de forma independente." - }, "baseUrl": { "message": "URL do servidor" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Arraste para ordenar" }, + "dragToReorder": { + "message": "Arraste para reordenar" + }, "cfTypeText": { "message": "Texto" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "As definições foram editadas" - }, - "environmentEditedClick": { - "message": "Clique aqui" - }, - "environmentEditedReset": { - "message": "para voltar às definições predefinidas" - }, "serverVersion": { "message": "Versão do servidor" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Iniciar sessão com a palavra-passe mestra" }, - "loggingInAs": { - "message": "A iniciar sessão como" - }, - "notYou": { - "message": "Utilizador incorreto?" - }, "newAroundHere": { "message": "É novo por cá?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Iniciar sessão com o dispositivo" }, - "loginWithDeviceEnabledInfo": { - "message": "O início de sessão com o dispositivo deve ser ativado nas definições da aplicação Bitwarden. Precisa de outra opção?" - }, "fingerprintPhraseHeader": { "message": "Frase de impressão digital" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Ver todas as opções de início de sessão" }, - "viewAllLoginOptionsV1": { - "message": "Ver todas as opções de início de sessão" - }, "notificationSentDevice": { "message": "Foi enviada uma notificação para o seu dispositivo." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Pedir aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com a palavra-passe mestra" - }, "ssoIdentifierRequired": { "message": "É necessário o identificador de SSO da organização." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "O seu pedido foi enviado ao seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado quando for aprovado." - }, "troubleLoggingIn": { "message": "Problemas a iniciar sessão?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Conta ativa" }, + "bitwardenAccount": { + "message": "Conta Bitwarden" + }, "availableAccounts": { "message": "Contas disponíveis" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reordenar o URI do site. Utilize a tecla de seta para mover o item para cima ou para baixo." + }, "reorderFieldUp": { "message": "$LABEL$ movido para cima, posição $INDEX$ de $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Muito ampla" }, + "sshKeyWrongPassword": { + "message": "A palavra-passe que introduziu está incorreta." + }, + "importSshKey": { + "message": "Importar" + }, + "confirmSshKeyPassword": { + "message": "Confirmar palavra-passe" + }, + "enterSshKeyPasswordDesc": { + "message": "Introduza a palavra-passe para a chave SSH." + }, + "enterSshKeyPassword": { + "message": "Introduzir palavra-passe" + }, + "invalidSshKey": { + "message": "A chave SSH é inválida" + }, + "sshKeyTypeUnsupported": { + "message": "O tipo de chave SSH não é suportado" + }, + "importSshKeyFromClipboard": { + "message": "Importar chave da área de transferência" + }, + "sshKeyImported": { + "message": "Chave SSH importada com sucesso" + }, "cannotRemoveViewOnlyCollections": { "message": "Não é possível remover coleções com permissões de Apenas visualização: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Para utilizar o desbloqueio biométrico, atualize a sua aplicação para computador ou desative o desbloqueio por impressão digital nas definições dessa mesma app." + }, + "changeAtRiskPassword": { + "message": "Alterar palavra-passe em risco" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 8f6b2fdf6bb..5ce73eb2e49 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduceți adresa de e-mail a contului și indiciul pentru parolă va fi trimis pe email" }, - "passwordHint": { - "message": "Indiciu parolă" - }, - "enterEmailToGetHint": { - "message": "Adresa de e-mail a contului pentru primirea indiciului parolei principale." - }, "getMasterPasswordHint": { "message": "Obținere indiciu parolă principală" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Editare dosar" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Folder nou" }, @@ -479,22 +482,6 @@ "length": { "message": "Lungime" }, - "uppercase": { - "message": "Litere mari (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Litere mici (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numere (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Caractere speciale (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Număr de cuvinte" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Browserul dvs. nu acceptă copierea în clipboard. Transcrieți datele manual." }, - "verifyIdentity": { - "message": "Verificare identitate" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Nu" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "A survenit o eroare neașteptată." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Salvare" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Solicitați actualizarea autentificării existente" }, @@ -1133,10 +1169,6 @@ "message": "Luminos", "description": "Light color" }, - "solarizedDark": { - "message": "Întuneric solarizat", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Mediu autogăzduit" }, - "selfHostedEnvironmentFooter": { - "message": "Specificați URL-ul de bază al implementări Bitwarden găzduită local." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Mediu personalizat" }, - "customEnvironmentFooter": { - "message": "Pentru utilizatorii avansați. Puteți specifica URL-ul de bază al fiecărui serviciu în mod independent." - }, "baseUrl": { "message": "URL server" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Tragere pentru sortare" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Setările au fost editate" - }, - "environmentEditedClick": { - "message": "Faceți clic aici" - }, - "environmentEditedReset": { - "message": "pentru a restabili setările preconfigurate" - }, "serverVersion": { "message": "Versiune server" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Autentificați-vă cu parola principală" }, - "loggingInAs": { - "message": "Autentificare ca" - }, - "notYou": { - "message": "Nu sunteți dvs.?" - }, "newAroundHere": { "message": "Sunteți nou pe aici?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Conectați-vă cu dispozitivul" }, - "loginWithDeviceEnabledInfo": { - "message": "Conectarea cu dispozitivul trebuie să fie configurată în setările aplicației Bitwarden. Aveți nevoie de o altă opțiune?" - }, "fingerprintPhraseHeader": { "message": "Fraza amprentă" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "O notificare a fost trimisă pe dispozitivul dvs." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Cereți aprobarea administratorului" }, - "approveWithMasterPassword": { - "message": "Aprobați cu parola principală" - }, "ssoIdentifierRequired": { "message": "Identificatorul SSO al organizației este necesar." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Cererea dvs. a fost trimisă administratorului." }, - "youWillBeNotifiedOnceApproved": { - "message": "Veți primi o notificare după aprobare." - }, "troubleLoggingIn": { "message": "Aveți probleme la logare?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 71dab1574e7..11d8de4acbe 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" }, - "passwordHint": { - "message": "Подсказка к паролю" - }, - "enterEmailToGetHint": { - "message": "Введите email аккаунта для получения подсказки к мастер-паролю." - }, "getMasterPasswordHint": { "message": "Получить подсказку к мастер-паролю" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Изменить папку" }, + "editFolderWithName": { + "message": "Редактировать папку: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Новый папка" }, @@ -479,22 +482,6 @@ "length": { "message": "Длина" }, - "uppercase": { - "message": "Прописные буквы (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Строчные буквы (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Цифры (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Специальные символы (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Включить", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Включить специальные символы", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Количество слов" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Ваш браузер не поддерживает копирование данных в буфер обмена. Скопируйте вручную." }, - "verifyIdentity": { - "message": "Подтвердить личность" + "verifyYourIdentity": { + "message": "Подтвердите вашу личность" }, "weDontRecognizeThisDevice": { "message": "Мы не распознали это устройство. Введите код, отправленный на ваш email, чтобы подтвердить вашу личность." @@ -895,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": "Следуйте указаниям ниже, чтобы завершить авторизацию." @@ -921,6 +904,9 @@ "no": { "message": "Нет" }, + "location": { + "message": "Местоположение" + }, "unexpectedError": { "message": "Произошла непредвиденная ошибка." }, @@ -1054,7 +1040,7 @@ "message": "Кликните элементы для автозаполнения в режиме просмотра хранилища" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Выберите элементы в предложении автозаполнения для вставки" }, "clearClipboard": { "message": "Очистить буфер обмена", @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Сохранить" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ сохранен в Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ обновлен в Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Сохранить как новый логин", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Обновить логин", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Сохранить логин?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Обновить существующий логин?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Логин сохранен", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Логин обновлен", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Ошибка при сохранении", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "О нет! Мы не смогли сохранить это. Попробуйте ввести данные вручную.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Спрашивать при обновлении существующего логина" }, @@ -1133,10 +1169,6 @@ "message": "Светлая", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Экспорт из" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Окружение пользовательского хостинга" }, - "selfHostedEnvironmentFooter": { - "message": "Укажите URL Bitwarden на вашем сервере." - }, "selfHostedBaseUrlHint": { "message": "Укажите базовый URL вашего локального хостинга Bitwarden. Пример: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Пользовательское окружение" }, - "customEnvironmentFooter": { - "message": "Для опытных пользователей. Можно указать URL отдельно для каждой службы." - }, "baseUrl": { "message": "URL сервера" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Перетащите для сортировки" }, + "dragToReorder": { + "message": "Перетащите для изменения порядка" + }, "cfTypeText": { "message": "Текстовое" }, @@ -2135,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": "Действие по тайм-ауту хранилища" @@ -2447,7 +2476,7 @@ "message": "Пароли, подверженные риску" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ запрашивает смену одного пароля, так как он находится под угрозой.", + "message": "$ORGANIZATION$ запрашивает смену одного пароля, так как он подвержен риску.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", + "message": "$ORGANIZATION$ запрашивает смену $COUNT$ паролей, так как они подвержены риску.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Ваша организация запрашивает смену $COUNT$ паролей, так как они находятся под угрозой.", + "message": "Ваша организация запрашивает смену $COUNT$ паролей, так как они подвержены риску.", "placeholders": { "count": { "content": "$1", @@ -2478,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", @@ -2490,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": { @@ -2526,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)", @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Настройки были изменены" - }, - "environmentEditedClick": { - "message": "Нажмите здесь" - }, - "environmentEditedReset": { - "message": "для сброса к предварительно настроенным параметрам" - }, "serverVersion": { "message": "Версия сервера" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Войти с мастер-паролем" }, - "loggingInAs": { - "message": "Войти как" - }, - "notYou": { - "message": "Не вы?" - }, "newAroundHere": { "message": "Вы здесь впервые?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Войти с помощью устройства" }, - "loginWithDeviceEnabledInfo": { - "message": "Вход с устройства должен быть настроен в настройках мобильного приложения Bitwarden. Нужен другой вариант?" - }, "fingerprintPhraseHeader": { "message": "Фраза отпечатка" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Посмотреть все варианты авторизации" }, - "viewAllLoginOptionsV1": { - "message": "Посмотреть все варианты авторизации" - }, "notificationSentDevice": { "message": "На ваше устройство отправлено уведомление." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Запросить одобрение администратора" }, - "approveWithMasterPassword": { - "message": "Одобрить с мастер-паролем" - }, "ssoIdentifierRequired": { "message": "Требуется идентификатор SSO организации." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запрос был отправлен администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вас уведомят об одобрении." - }, "troubleLoggingIn": { "message": "Не удалось войти?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Активный аккаунт" }, + "bitwardenAccount": { + "message": "Аккаунт Bitwarden" + }, "availableAccounts": { "message": "Доступные аккаунты" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Изменить порядок URI. Используйте клавиши курсора для перемещения элемента вверх или вниз." + }, "reorderFieldUp": { "message": "$LABEL$ перемещено вверх, позиция $INDEX$ $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Вы ничего не выбрали." }, - "movedItemsToOrg": { - "message": "Выбранные элементы перемещены в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Элементы перемещены в $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Очень широкое" }, + "sshKeyWrongPassword": { + "message": "Введенный пароль неверен." + }, + "importSshKey": { + "message": "Импорт" + }, + "confirmSshKeyPassword": { + "message": "Подтвердите пароль" + }, + "enterSshKeyPasswordDesc": { + "message": "Введите пароль для ключа SSH." + }, + "enterSshKeyPassword": { + "message": "Введите пароль" + }, + "invalidSshKey": { + "message": "Ключ SSH недействителен" + }, + "sshKeyTypeUnsupported": { + "message": "Тип ключа SSH не поддерживается" + }, + "importSshKeyFromClipboard": { + "message": "Импорт ключа из буфера обмена" + }, + "sshKeyImported": { + "message": "Ключ SSH успешно импортирован" + }, "cannotRemoveViewOnlyCollections": { "message": "Вы не можете удалить коллекции с правами только на просмотр: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Чтобы использовать биометрическую разблокировку, обновите приложение для компьютера или отключите разблокировку по отпечатку пальца в настройках компьютера." + }, + "changeAtRiskPassword": { + "message": "Изменить пароль, подверженный риску" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 07d252dde4e..721d16a2eee 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "මුරපදය ඉඟිය" - }, - "enterEmailToGetHint": { - "message": "ඔබගේ ප්රධාන මුරපදය ඉඟියක් ලබා ගැනීමට ඔබගේ ගිණුම ඊ-තැපැල් ලිපිනය ඇතුලත් කරන්න." - }, "getMasterPasswordHint": { "message": "ප්රධාන මුරපදය ඉඟියක් ලබා ගන්න" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "බහාලුම සංස්කරණය" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "දිග" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "වචන ගණන" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "ඔබේ වෙබ් බ්රව්සරය පහසු පසුරු පුවරුවක් පිටපත් කිරීමට සහාය නොදක්වයි. ඒ වෙනුවට එය අතින් පිටපත් කරන්න." }, - "verifyIdentity": { - "message": "අනන්යතාවය සත්යාපනය කරන්න" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "නැත" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "අනපේක්ෂිත දෝෂයක් සිදුවී ඇත." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "සුරකින්න" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "ආලෝකය", "description": "Light color" }, - "solarizedDark": { - "message": "අඳුරු අඳුරු", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "ස්වයං සත්කාරක පරිසරය" }, - "selfHostedEnvironmentFooter": { - "message": "බිට්වර්ඩන් ස්ථාපනය සත්කාරකත්වය දරනු ලබන ඔබගේ පරිශ්රයේ මූලික URL එක සඳහන් කරන්න." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "අභිරුචි පරිසරය" }, - "customEnvironmentFooter": { - "message": "උසස් පරිශීලකයින් සඳහා. එක් එක් සේවාවෙහි මූලික URL එක ස්වාධීනව සඳහන් කළ හැකිය." - }, "baseUrl": { "message": "සේවාදායකය URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "වර්ග කිරීමට ඇද දමන්න" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "පෙළ" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index efdf9b6177d..897db9f3176 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" }, - "passwordHint": { - "message": "Nápoveď k heslu" - }, - "enterEmailToGetHint": { - "message": "Zadajte emailovú adresu na zaslanie nápovede pre vaše hlavné heslo." - }, "getMasterPasswordHint": { "message": "Získať nápoveď k hlavnému heslu" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Upraviť priečinok" }, + "editFolderWithName": { + "message": "Upraviť priečinok: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Nový priečinok" }, @@ -479,22 +482,6 @@ "length": { "message": "Dĺžka" }, - "uppercase": { - "message": "Veľké písmená (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Malé písmená (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Čísla (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Špeciálne znaky (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Zahrnúť", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Zahrnúť špeciálne znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Počet slov" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Váš webový prehliadač nepodporuje automatické kopírovanie do schránky. Kopírujte manuálne." }, - "verifyIdentity": { - "message": "Overiť identitu" + "verifyYourIdentity": { + "message": "Overte svoju totožnosť" }, "weDontRecognizeThisDevice": { "message": "Toto zariadenie nepoznáme. Na overenie vašej totožnosti zadajte kód, ktorý bol zaslaný na váš e-mail." @@ -921,6 +904,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Poloha" + }, "unexpectedError": { "message": "Vyskytla sa neočakávaná chyba." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Uložiť" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ uložené do Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ aktualizované v Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Uložiť ako nové prihlasovacie údaje", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Aktualizovať prihlasovacie údaje", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Uložiť prihlasovacie údaje?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Aktualizovať existujúce prihlasovacie údaje?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Prihlasovacie údaje uložené", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Prihlasovacie údaje aktualizované", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Chyba pri ukladaní", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Ale nie! Nepodarilo sa nám to uložiť. Skúste zadať údaje manuálne.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Požiadať o aktualizáciu existujúceho prihlasovania" }, @@ -1133,10 +1169,6 @@ "message": "Svetlý", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized –⁠ tmavý", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportovať z" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Prostredie s vlastným hostingom" }, - "selfHostedEnvironmentFooter": { - "message": "Zadajte základnú URL adresu lokálne hosťovanej inštalácie Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Zadajte základnú URL adresu lokálne hosťovanej inštalácie Bitwarden. Napríklad: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Vlastné prostredie" }, - "customEnvironmentFooter": { - "message": "Pre pokročilých používateľov. Základnú adresu URL každej služby môžete určiť samostatne." - }, "baseUrl": { "message": "URL servera" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Zoradiť presúvaním" }, + "dragToReorder": { + "message": "Ťahaním preskupiť" + }, "cfTypeText": { "message": "Text" }, @@ -2447,7 +2476,7 @@ "message": "Rizikové heslá" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ vás žiada o zmenu hesla, pretože je ohrozené.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ vás žiada o zmenu $COUNT$ hesiel, pretože sú ohrozené.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Vaše organizácie vás žiadajú o zmenu $COUNT$ hesiel, pretože sú ohrozené.", "placeholders": { "count": { "content": "$1", @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Nastavenia boli upravené" - }, - "environmentEditedClick": { - "message": "Kliknite sem" - }, - "environmentEditedReset": { - "message": "na obnovenie predvolených nastavení" - }, "serverVersion": { "message": "Verzia servera" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Prihlásenie pomocou hlavného hesla" }, - "loggingInAs": { - "message": "Prihlasujete sa ako" - }, - "notYou": { - "message": "Nie ste to vy?" - }, "newAroundHere": { "message": "Ste tu nový?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Prihlásiť pomocou zariadenia" }, - "loginWithDeviceEnabledInfo": { - "message": "Prihlásenie pomocou zariadenia musí byť nastavené v nastaveniach aplikácie Bitwarden. Potrebujete inú možnosť?" - }, "fingerprintPhraseHeader": { "message": "Fráza odtlačku prsta" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Zobraziť všetky možnosti prihlásenia" }, - "viewAllLoginOptionsV1": { - "message": "Zobraziť všetky možnosti prihlásenia" - }, "notificationSentDevice": { "message": "Do vášho zariadenia bolo odoslané upozornenie." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Žiadosť o schválenie správcom" }, - "approveWithMasterPassword": { - "message": "Schváliť pomocou hlavného hesla" - }, "ssoIdentifierRequired": { "message": "Pole identifikátora SSO je povinné." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Vaša žiadosť bola odoslaná správcovi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete informovaný." - }, "troubleLoggingIn": { "message": "Máte problémy s prihlásením?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktívny účet" }, + "bitwardenAccount": { + "message": "Účet Bitwarden" + }, "availableAccounts": { "message": "Dostupné účty" }, @@ -4343,7 +4348,7 @@ } }, "new": { - "message": "Nová" + "message": "Nové" }, "removeItem": { "message": "Odstrániť $NAME$", @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Zmeniť poradie URI webovej stránky. Na presun položky hore alebo dole použite klávesy so šípkami." + }, "reorderFieldUp": { "message": "$LABEL$ presunuté vyššie, pozícia $INDEX$/$LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra široké" }, + "sshKeyWrongPassword": { + "message": "Zadané heslo je nesprávne." + }, + "importSshKey": { + "message": "Importovať" + }, + "confirmSshKeyPassword": { + "message": "Potvrdiť heslo" + }, + "enterSshKeyPasswordDesc": { + "message": "Zadajte heslo pre kľúč SSH." + }, + "enterSshKeyPassword": { + "message": "Zadať heslo" + }, + "invalidSshKey": { + "message": "Kľúč SSH je neplatný" + }, + "sshKeyTypeUnsupported": { + "message": "Tento typ kľúča SSH nie je podporovaný" + }, + "importSshKeyFromClipboard": { + "message": "Importovať kľúč zo schránky" + }, + "sshKeyImported": { + "message": "Kľúč SSH bol úspešne importovaný" + }, "cannotRemoveViewOnlyCollections": { "message": "Zbierky, ktoré môžete len zobraziť nemôžete odstrániť: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Ak chcete používať biometrické odomykanie, aktualizujte desktopovú aplikáciu alebo vypnite odomykanie odtlačkom prsta v nastaveniach desktopovej aplikácie." + }, + "changeAtRiskPassword": { + "message": "Zmeniť rizikové heslá" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 2023ecbd5f1..f6a543ea5ea 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Namig za geslo" - }, - "enterEmailToGetHint": { - "message": "Vnesite e-poštni naslov svojega računa in poslali vam bomo namig za vaše glavno geslo." - }, "getMasterPasswordHint": { "message": "Pridobi namig za glavno geslo" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Uredi mapo" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Dolžina" }, - "uppercase": { - "message": "Velike črke (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Male črke (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Števke (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Posebni znaki (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Število besed" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Vaš brskalnik ne podpira enostavnega kopiranja na odložišče. Prosimo, kopirajte ročno." }, - "verifyIdentity": { - "message": "Preverjanje istovetnosti" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Prišlo je do nepričakovane napake." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Da, shrani zdaj" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Predlagaj posodobitev obstoječe prijave" }, @@ -1133,10 +1169,6 @@ "message": "Svetlo", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Okolje po meri" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "URL naslov strežnika" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Sortirajte z vlečenjem" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Besedilo" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Kliknite tukaj" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Verzija strežnika" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Niste vi?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Identifikacijsko geslo" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 8d35a517bc8..3c7bef94c13 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Унесите имејл свог налога и биће вам послат савет за лозинку" }, - "passwordHint": { - "message": "Савет лозинке" - }, - "enterEmailToGetHint": { - "message": "Унесите Ваш имејл да би добили савет за Вашу Главну Лозинку." - }, "getMasterPasswordHint": { "message": "Добити савет за Главну Лозинку" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Уреди фасциклу" }, + "editFolderWithName": { + "message": "Уредити фасциклу: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Нова фасцикла" }, @@ -479,22 +482,6 @@ "length": { "message": "Дужина" }, - "uppercase": { - "message": "Велика слова (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Мала слова (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Цифре (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Специјална слова (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Укључити", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Укључити специјална слова", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Број речи" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Ваш прегледач не подржава једноставно копирање у клипборду. Уместо тога копирајте га ручно." }, - "verifyIdentity": { - "message": "Потврдите идентитет" + "verifyYourIdentity": { + "message": "Потврдите свој идентитет" }, "weDontRecognizeThisDevice": { "message": "Не препознајемо овај уређај. Унесите код послат на адресу ваше електронске поште да би сте потврдили ваш идентитет." @@ -921,6 +904,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Локација" + }, "unexpectedError": { "message": "Дошло је до неочекиване грешке." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Сачувај" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ сачуван и Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ ажурирано у Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Сачувати као нову пријаву", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Ажурирати пријаву", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Сачувати пријаву?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Ажурирајте постојећу пријаву?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Пријава сачувана", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Пријава ажурирана", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Грешка при снимању", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Ох не! Нисмо могли да то сачувамо. Покушајте да ручно унесете детаље.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Питај за ажурирање постојеће пријаве" }, @@ -1133,10 +1169,6 @@ "message": "Светла", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized црно", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Извоз од" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Самостално окружење" }, - "selfHostedEnvironmentFooter": { - "message": "Наведите основни УРЛ ваше локалне Bitwarden инсталације." - }, "selfHostedBaseUrlHint": { "message": "Наведите основну УРЛ адресу вашег локалног хостовања Bitwarden-а. Пример: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Прилагођено окружење" }, - "customEnvironmentFooter": { - "message": "За напредне кориснике. Можете да одредите независно основни УРЛ сваког сервиса." - }, "baseUrl": { "message": "УРЛ Сервера" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Превуците за сортирање" }, + "dragToReorder": { + "message": "Превуците да бисте организовали" + }, "cfTypeText": { "message": "Текст" }, @@ -2447,7 +2476,7 @@ "message": "Лозинке под ризиком" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ тражи да промените једну лозинку јер је ризична.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ тражи да промените $COUNT$ лозинке пошто су под ризиком.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Ваша организација тражи да промените $COUNT$ лозинке пошто су под ризиком.", "placeholders": { "count": { "content": "$1", @@ -2496,34 +2525,34 @@ "message": "Ажурирајте поставке да бисте брзо поставили лозинке и генерисати нове" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Прегледајте ризичне пријаве" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Прегледати ризичне лозинке" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Ваше организационе лозинке су ризичне јер су слабе, поново употребљене и/или изложене.", "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": "Илустрација листе пријаве које су ризичне" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Брзо генеришите снажну, јединствену лозинку са Bitwarden менијем аутопуњења за коришћење на ризичном сајту.", "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": "Илустрација Bitwarden-ског менија аутопуњења који приказују генерисану лозинку" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Ажурирања у Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden ће тада затражити да ажурирате лозинку у менаџеру лозинке.", "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": "Илустрација Bitwarden-ског обавештења за ажирриање пријаве" }, "turnOnAutofill": { "message": "Омогућите ауто-пуњење" @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Поставке су уређене" - }, - "environmentEditedClick": { - "message": "Кликните овде" - }, - "environmentEditedReset": { - "message": "за рисетовање на подразумевана подешавања" - }, "serverVersion": { "message": "Верзија сервера" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Пријавите се са главном лозинком" }, - "loggingInAs": { - "message": "Пријављивање као" - }, - "notYou": { - "message": "Нисте Ви?" - }, "newAroundHere": { "message": "Нов овде?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Пријавите се са уређајем" }, - "loginWithDeviceEnabledInfo": { - "message": "Пријава помоћу уређаја мора бити подешена у подешавањима Bitwarden апликације. Потребна је друга опција?" - }, "fingerprintPhraseHeader": { "message": "Сигурносна фраза сефа" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Погледајте сав извештај у опције" }, - "viewAllLoginOptionsV1": { - "message": "Погледајте сав извештај у опције" - }, "notificationSentDevice": { "message": "Обавештење је послато на ваш уређај." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Затражити одобрење администратора" }, - "approveWithMasterPassword": { - "message": "Одобрити са главном лозинком" - }, "ssoIdentifierRequired": { "message": "Потребан је SSO идентификатор организације." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш захтев је послат вашем администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Бићете обавештени када буде одобрено." - }, "troubleLoggingIn": { "message": "Имате проблема са пријављивањем?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Активан налог" }, + "bitwardenAccount": { + "message": "Bitwarden налог" + }, "availableAccounts": { "message": "Доступни налози" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Преместити УРЛ сајта. Користите тастер са стрелицом да бисте померили ставку." + }, "reorderFieldUp": { "message": "$LABEL$ премештено на горе, позиција $INDEX$ од $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Нисте ништа изабрали." }, - "movedItemsToOrg": { - "message": "Одабране ставке премештене у $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Ставке премештене у $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Врло широко" }, + "sshKeyWrongPassword": { + "message": "Лозинка коју сте унели није тачна." + }, + "importSshKey": { + "message": "Увоз" + }, + "confirmSshKeyPassword": { + "message": "Потврда лозинке" + }, + "enterSshKeyPasswordDesc": { + "message": "Унети лозинку за SSH кључ." + }, + "enterSshKeyPassword": { + "message": "Унесите лозинку" + }, + "invalidSshKey": { + "message": "SSH кључ је неважећи" + }, + "sshKeyTypeUnsupported": { + "message": "Тип SSH кључа није подржан" + }, + "importSshKeyFromClipboard": { + "message": "Увезите кључ из оставе" + }, + "sshKeyImported": { + "message": "SSH кључ је успешно увезен" + }, "cannotRemoveViewOnlyCollections": { "message": "Не можете уклонити колекције са дозволама само за приказ: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Да би сте користили биометријско откључавање, надоградите вашу апликацију на рачунару, или онемогућите откључавање отиском прста у подешавањима на рачунару." + }, + "changeAtRiskPassword": { + "message": "Променити ризичну лозинку" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index d501572be76..6db7a22490e 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Lösenordsledtråd" - }, - "enterEmailToGetHint": { - "message": "Ange din e-postadress för att hämta din huvudlösenordsledtråd." - }, "getMasterPasswordHint": { "message": "Hämta huvudlösenordsledtråd" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Redigera mapp" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Ny mapp" }, @@ -479,22 +482,6 @@ "length": { "message": "Längd" }, - "uppercase": { - "message": "Versaler (A-Ö)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Gemener (a-ö)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Siffror (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Specialtecken (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Inkludera", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Inkludera specialtecken", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antal ord" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Din webbläsare har inte stöd för att enkelt kopiera till urklipp. Kopiera till urklipp manuellt istället." }, - "verifyIdentity": { - "message": "Verifiera identitet" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Ett okänt fel har inträffat." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Spara" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Be om att uppdatera befintlig inloggning" }, @@ -1133,10 +1169,6 @@ "message": "Ljust", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized mörk", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Exportera från" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Egen-hostad miljö" }, - "selfHostedEnvironmentFooter": { - "message": "Ange bas-URL:en för din \"on-premise\"-hostade Bitwarden-installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Anpassad miljö" }, - "customEnvironmentFooter": { - "message": "För avancerade användare. Du kan ange bas-URL:en för varje tjänst oberoende av varandra." - }, "baseUrl": { "message": "Server-URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Dra för att sortera" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Inställningarna har ändrats" - }, - "environmentEditedClick": { - "message": "Klicka här" - }, - "environmentEditedReset": { - "message": "för att återställa till förkonfigurerade inställningar" - }, "serverVersion": { "message": "Serverversion" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Logga in med huvudlösenord" }, - "loggingInAs": { - "message": "Loggar in som" - }, - "notYou": { - "message": "Är det inte du?" - }, "newAroundHere": { "message": "Är du ny här?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Logga in med enhet" }, - "loginWithDeviceEnabledInfo": { - "message": "\"Logga in med enhet\" måste ställas in i inställningarna i Bitwardens app. Behöver du ett annat alternativ?" - }, "fingerprintPhraseHeader": { "message": "Fingeravtrycksfras" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Visa alla inloggningsalternativ" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "En avisering har skickats till din enhet." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Be om godkännande från administratör" }, - "approveWithMasterPassword": { - "message": "Godkänn med huvudlösenord" - }, "ssoIdentifierRequired": { "message": "Organisationens SSO-identifierare krävs." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Din begäran har skickats till din administratör." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du kommer att meddelas vid godkännande." - }, "troubleLoggingIn": { "message": "Problem med att logga in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktivt konto" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Tillgängliga konton" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 41ca7e5dcd2..c9c29611deb 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Edit folder" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "Length" }, - "uppercase": { - "message": "Uppercase (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Lowercase (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Numbers (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Special characters (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, - "verifyIdentity": { - "message": "Verify identity" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occurred." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Save" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1133,10 +1169,6 @@ "message": "Light", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index e2a9b099baf..c545f802d64 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "คำใบ้รหัสผ่าน" - }, - "enterEmailToGetHint": { - "message": "กรอกอีเมลของบัญชีของคุณ เพื่อรับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" - }, "getMasterPasswordHint": { "message": "รับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "แก้ไขโฟลเดอร์" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -479,22 +482,6 @@ "length": { "message": "ความยาว" }, - "uppercase": { - "message": "ตัวพิมพ์ใหญ่ (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "ตัวพิมพ์เล็ก (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "ตัวเลข (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "อักขระพิเศษ (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Include", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of Words" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "เว็บเบราว์เซอร์ของคุณไม่รองรับการคัดลอกคลิปบอร์ดอย่างง่าย คัดลอกด้วยตนเองแทน" }, - "verifyIdentity": { - "message": "ยืนยันตัวตน" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "ไม่ใช่" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "An unexpected error has occured." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Yes, Save Now" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "ขอให้ปรับปรุงการเข้าสู่ระบบที่มีอยู่" }, @@ -1133,10 +1169,6 @@ "message": "สว่าง", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Export from" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Self-hosted Environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Custom Environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "URL ของเซิร์ฟเวอร์" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ข้อความ" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Settings have been edited" - }, - "environmentEditedClick": { - "message": "Click here" - }, - "environmentEditedReset": { - "message": "to reset to pre-configured settings" - }, "serverVersion": { "message": "Server version" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Log in with device" }, - "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" - }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "A notification has been sent to your device." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Active account" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Available accounts" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 6087b05bedb..e69b33d63af 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" }, - "passwordHint": { - "message": "Parola ipucu" - }, - "enterEmailToGetHint": { - "message": "Ana parola ipucunu almak için hesabınızın e-posta adresini girin." - }, "getMasterPasswordHint": { "message": "Ana parola ipucunu al" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Klasörü düzenle" }, + "editFolderWithName": { + "message": "Klasörü düzenle: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Yeni klasör" }, @@ -479,22 +482,6 @@ "length": { "message": "Uzunluk" }, - "uppercase": { - "message": "Büyük harf (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Küçük harf (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Rakamlar (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Özel karakterler (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Dahil et", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Özel karakterleri dahil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Kelime sayısı" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Web tarayıcınız panoya kopyalamayı desteklemiyor. Parolayı elle kopyalayın." }, - "verifyIdentity": { - "message": "Kimliği doğrula" + "verifyYourIdentity": { + "message": "Kimliğinizi doğrulayın" }, "weDontRecognizeThisDevice": { "message": "Bu cihazı tanıyamadık. Kimliğinizi doğrulamak için e-postanıza gönderilen kodu girin." @@ -921,6 +904,9 @@ "no": { "message": "Hayır" }, + "location": { + "message": "Konum" + }, "unexpectedError": { "message": "Beklenmedik bir hata oluştu." }, @@ -1024,7 +1010,7 @@ "message": "Hesap eklemeyi öner" }, "vaultSaveOptionsTitle": { - "message": "Kasa seçeneklerine kaydet" + "message": "Kasaya kaydetme seçenekleri" }, "addLoginNotificationDesc": { "message": "\"Hesap ekle\" bildirimi, ilk kez kullandığınız hesap bilgilerini kasanıza kaydetmek isteyip istemediğinizi otomatik olarak sorar." @@ -1051,7 +1037,7 @@ "message": "Kolay otomatik doldurma için sekme sayfasında kimlikleri listele." }, "clickToAutofillOnVault": { - "message": "Kasa görünümünde otomatik doldurmak istediğiniz kayıtlara tıklayın" + "message": "Kasa görünümünde kayıtlara tıklayınca otomatik doldur" }, "clickToAutofill": { "message": "Otomatik doldurma önerisindeki kayıtlara tıkladığımda doldur" @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Kaydet" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ Bitwarden'a kaydedildi.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ Bitwarden'da güncellendi.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Yeni hesap olarak kaydet", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Hesabı güncelle", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Hesap kaydedilsin mi?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Mevcut hesap güncellensin mi?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Hesap kaydedildi", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Hesap güncellendi", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Kaydetme hatası", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "Bu hesabı kaydedemedik. Bilgileri elle girmeyi deneyin.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Mevcut hesapları güncellemeyi öner" }, @@ -1133,10 +1169,6 @@ "message": "Açık", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized koyu", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Dışa aktarılacak konum" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Şirket içinde barındırılan ortam" }, - "selfHostedEnvironmentFooter": { - "message": "Kurum içinde barındırılan Bitwarden kurulumunuzun taban URL'sini belirtin." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Özel ortam" }, - "customEnvironmentFooter": { - "message": "İleri düzey kullanıcılar için. Her hizmetin taban URL'sini bağımsız olarak belirleyebilirsiniz." - }, "baseUrl": { "message": "Sunucu URL'si" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Sıralamak için sürükleyin" }, + "dragToReorder": { + "message": "Sıralamak için sürükleyin" + }, "cfTypeText": { "message": "Metin" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Ayarlar düzenlendi" - }, - "environmentEditedClick": { - "message": "Buraya tıklayarak" - }, - "environmentEditedReset": { - "message": "ön tanımlı ayarları sıfırlayabilirsiniz" - }, "serverVersion": { "message": "Sunucu sürümü" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Ana parola ile giriş yap" }, - "loggingInAs": { - "message": "Giriş yapılan kullanıcı:" - }, - "notYou": { - "message": "Siz değil misiniz?" - }, "newAroundHere": { "message": "Buralarda yeni misiniz?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Cihazla giriş yap" }, - "loginWithDeviceEnabledInfo": { - "message": "Cihazla girişi Bitwarden mobil uygulamasının ayarlarından etkinleştirmelisiniz. Başka bir seçeneğe mi ihtiyacınız var?" - }, "fingerprintPhraseHeader": { "message": "Parmak izi ifadesi" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Tüm giriş seçeneklerini gör" }, - "viewAllLoginOptionsV1": { - "message": "Tüm giriş seçeneklerini gör" - }, "notificationSentDevice": { "message": "Cihazınıza bir bildirim gönderildi." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Yönetici onayı iste" }, - "approveWithMasterPassword": { - "message": "Ana parola ile onayla" - }, "ssoIdentifierRequired": { "message": "Kuruluş SSO tanımlayıcısı gereklidir." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "İsteğiniz yöneticinize gönderildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Onaylandıktan sonra bilgilendirileceksiniz." - }, "troubleLoggingIn": { "message": "Giriş yaparken sorun mu yaşıyorsunuz?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Aktif hesap" }, + "bitwardenAccount": { + "message": "Bitwarden hesabı" + }, "availableAccounts": { "message": "Mevcut hesaplar" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Ekstra geniş" }, + "sshKeyWrongPassword": { + "message": "Girdiğiniz parola yanlış." + }, + "importSshKey": { + "message": "İçe aktar" + }, + "confirmSshKeyPassword": { + "message": "Parolayı onaylayın" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH anahtarının parolasını girin." + }, + "enterSshKeyPassword": { + "message": "Parolayı girin" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 7568eff9ea4..d18d90babff 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -81,7 +81,7 @@ "message": "Підказка для головного пароля (необов'язково)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Рейтинг надійності пароля $SCORE$", "placeholders": { "score": { "content": "$1", @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" }, - "passwordHint": { - "message": "Підказка для пароля" - }, - "enterEmailToGetHint": { - "message": "Введіть свою адресу е-пошти, щоб отримати підказку для головного пароля." - }, "getMasterPasswordHint": { "message": "Отримати підказку для головного пароля" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Редагування" }, + "editFolderWithName": { + "message": "Редагувати теку: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Нова тека" }, @@ -479,22 +482,6 @@ "length": { "message": "Довжина" }, - "uppercase": { - "message": "Верхній регістр (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Нижній регістр (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Числа (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Спеціальні символи (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Включити", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Спеціальні символи", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Кількість слів" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Ваш браузер не підтримує копіювання даних в буфер обміну. Скопіюйте вручну." }, - "verifyIdentity": { - "message": "Виконати перевірку" + "verifyYourIdentity": { + "message": "Підтвердьте свою особу" }, "weDontRecognizeThisDevice": { "message": "Ми не розпізнаємо цей пристрій. Введіть код, надісланий на вашу електронну пошту, щоб підтвердити вашу особу." @@ -886,19 +869,19 @@ "message": "Увійти в Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Введіть код, надісланий вам електронною поштою" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Введіть код з програми автентифікації" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "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": "Follow the steps below to finish logging in." + "message": "Виконайте наведені нижче кроки, щоб завершити вхід." }, "restartRegistration": { "message": "Перезапустити реєстрацію" @@ -921,6 +904,9 @@ "no": { "message": "Ні" }, + "location": { + "message": "Розташування" + }, "unexpectedError": { "message": "Сталася неочікувана помилка." }, @@ -1054,7 +1040,7 @@ "message": "Натисніть на запис у режимі перегляду сховища для автозаповнення" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Натисніть запис у пропозиціях для автозаповнення" }, "clearClipboard": { "message": "Очистити буфер обміну", @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Зберегти" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ збережено до Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ оновлено у Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Зберегти як новий запис", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Оновити запис", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Зберегти запис?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Оновити наявний запис?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Запис збережено", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Запис оновлено", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Помилка збереження", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "На жаль, не вдається зберегти. Введіть дані вручну.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Запитувати про оновлення запису" }, @@ -1133,10 +1169,6 @@ "message": "Світла", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized темна", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Експортувати з" }, @@ -1390,7 +1422,7 @@ "message": "Запам'ятати мене" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Більше не запитувати на цьому пристрої протягом 30 днів" }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" @@ -1399,11 +1431,11 @@ "message": "Інший спосіб двоетапної перевірки" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Обрати інший спосіб", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Скористайтеся своїм кодом відновлення" }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." @@ -1418,16 +1450,16 @@ "message": "Відкрити нову вкладку" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Відкрити в новій вкладці" }, "webAuthnAuthenticate": { "message": "Автентифікація WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Зчитати ключ безпеки" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Очікується взаємодія з ключем безпеки..." }, "loginUnavailable": { "message": "Вхід недоступний" @@ -1442,7 +1474,7 @@ "message": "Налаштування двоетапної перевірки" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Виберіть спосіб двоетапної перевірки" }, "recoveryCodeDesc": { "message": "Втратили доступ до всіх провайдерів двоетапної перевірки? Скористайтеся кодом відновлення, щоб вимкнути двоетапну перевірку для свого облікового запису." @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Середовище власного хостингу" }, - "selfHostedEnvironmentFooter": { - "message": "Вкажіть основну URL-адресу вашого встановлення Bitwarden на власному хостингу." - }, "selfHostedBaseUrlHint": { "message": "Вкажіть основну URL-адресу вашого встановлення Bitwarden на власному хостингу. Зразок: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Власне середовище" }, - "customEnvironmentFooter": { - "message": "Для досвідчених користувачів. Ви можете вказати основну URL-адресу окремо для кожної служби." - }, "baseUrl": { "message": "URL-адреса сервера" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Перетягніть, щоб відсортувати" }, + "dragToReorder": { + "message": "Потягніть, щоб упорядкувати" + }, "cfTypeText": { "message": "Текст" }, @@ -2135,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": "Дія після часу очікування сховища" @@ -2144,13 +2173,13 @@ "message": "Дія після часу очікування" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Нові можливості налаштування" }, "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" + "message": "Налаштуйте своє сховище за допомогою швидких дій копіювання, компактного режиму та інших можливостей!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Всі налаштування подання" }, "lock": { "message": "Блокувати", @@ -2447,7 +2476,7 @@ "message": "Ризиковані паролі" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ вимагає зміни один пароль, оскільки він ризикований.", "placeholders": { "organization": { "content": "$1", @@ -2456,7 +2485,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ вимагає зміни $COUNT$ паролів, оскільки вони ризиковані.", "placeholders": { "organization": { "content": "$1", @@ -2469,7 +2498,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Ваші організації вимагають зміни $COUNT$ паролів, оскільки вони ризиковані.", "placeholders": { "count": { "content": "$1", @@ -2496,34 +2525,34 @@ "message": "Оновіть налаштування, щоб швидше автоматично заповнювати й створювати паролі" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Переглянути записи з ризиком" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Переглянути ризиковані паролі" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Паролі вашої організації ризиковані, оскільки вони ненадійні, повторно використовуються, та/або викриті.", "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": "Ілюстрація списку ризикованих записів" }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Швидко згенеруйте надійний, унікальний пароль через меню автозаповнення Bitwarden на сайті з ризикованим паролем.", "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": "Ілюстрація меню автозаповнення Bitwarden, що показує згенерований пароль" }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Оновити в Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Потім Bitwarden запропонує вам оновити пароль у менеджері паролів.", "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": "Ілюстрація сповіщення Bitwarden, що спонукає користувача оновити пароль" }, "turnOnAutofill": { "message": "Увімкніть автозаповнення" @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Налаштування змінено" - }, - "environmentEditedClick": { - "message": "Натисніть тут," - }, - "environmentEditedReset": { - "message": "щоб скинути налаштування" - }, "serverVersion": { "message": "Версія сервера" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Увійти з головним паролем" }, - "loggingInAs": { - "message": "Вхід у систему як" - }, - "notYou": { - "message": "Не ви?" - }, "newAroundHere": { "message": "Виконуєте вхід вперше?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Увійти з пристроєм" }, - "loginWithDeviceEnabledInfo": { - "message": "Потрібно увімкнути схвалення запитів на вхід у налаштуваннях програми Bitwarden. Потрібен інший варіант?" - }, "fingerprintPhraseHeader": { "message": "Фраза відбитка" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "Переглянути всі варіанти входу" }, - "viewAllLoginOptionsV1": { - "message": "Переглянути всі варіанти входу" - }, "notificationSentDevice": { "message": "Сповіщення було надіслано на ваш пристрій." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Запит підтвердження адміністратора" }, - "approveWithMasterPassword": { - "message": "Затвердити з головним паролем" - }, "ssoIdentifierRequired": { "message": "Потрібен SSO-ідентифікатор організації." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запит відправлено адміністратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ви отримаєте сповіщення після затвердження." - }, "troubleLoggingIn": { "message": "Проблема під час входу?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Активний обліковий запис" }, + "bitwardenAccount": { + "message": "Обліковий запис Bitwarden" + }, "availableAccounts": { "message": "Доступні облікові записи" }, @@ -4276,7 +4281,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Копіювати $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4314,7 +4319,7 @@ "message": "Сповіщення" }, "appearance": { - "message": "Вигляд" + "message": "Подання" }, "errorAssigningTargetCollection": { "message": "Помилка призначення цільової збірки." @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Змініть порядок URI вебсайтів. Використовуйте стрілки, щоб перемістити елемент вгору чи вниз." + }, "reorderFieldUp": { "message": "$LABEL$ переміщено вгору, позиція $INDEX$ з $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "Ви нічого не вибрали." }, - "movedItemsToOrg": { - "message": "Вибрані записи переміщено до $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Записи переміщено до $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Дуже широке" }, + "sshKeyWrongPassword": { + "message": "Ви ввели неправильний пароль." + }, + "importSshKey": { + "message": "Імпорт" + }, + "confirmSshKeyPassword": { + "message": "Підтвердити пароль" + }, + "enterSshKeyPasswordDesc": { + "message": "Введіть пароль для ключа SSH." + }, + "enterSshKeyPassword": { + "message": "Введіть пароль" + }, + "invalidSshKey": { + "message": "Ключ SSH недійсний" + }, + "sshKeyTypeUnsupported": { + "message": "Тип ключа SSH не підтримується" + }, + "importSshKeyFromClipboard": { + "message": "Імпортувати ключ із буфера обміну" + }, + "sshKeyImported": { + "message": "Ключ SSH успішно імпортовано" + }, "cannotRemoveViewOnlyCollections": { "message": "Ви не можете вилучати збірки, маючи дозвіл лише на перегляд: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "Щоб використовувати біометричне розблокування, оновіть комп'ютерну програму, або вимкніть розблокування відбитком пальця в налаштуваннях системи." + }, + "changeAtRiskPassword": { + "message": "Змінити ризикований пароль" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 8e7bc5545f2..db0da3b5874 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Gợi ý mật khẩu" - }, - "enterEmailToGetHint": { - "message": "Nhập địa chỉ email tài khoản của bạn để nhận gợi ý mật khẩu chính." - }, "getMasterPasswordHint": { "message": "Nhận gợi ý mật khẩu chính" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "Chỉnh sửa thư mục" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "Thư mục mới" }, @@ -479,22 +482,6 @@ "length": { "message": "Độ dài" }, - "uppercase": { - "message": "Chữ in hoa (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "Chữ in thường (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "Chữ số (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "Ký tự đặc biệt (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "Bao gồm", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "Bao gồm các ký tự đặc biệt", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Số từ" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "Trình duyệt web của bạn không hỗ trợ dễ dàng sao chép bộ nhớ tạm. Bạn có thể sao chép nó theo cách thủ công để thay thế." }, - "verifyIdentity": { - "message": "Xác minh danh tính" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -921,6 +904,9 @@ "no": { "message": "Không" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "Một lỗi bất ngờ đã xảy ra." }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "Lưu" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "Hỏi để cập nhật đăng nhập hiện có" }, @@ -1133,10 +1169,6 @@ "message": "Sáng", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized Dark", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "Xuất từ" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "Môi trường tự lưu trữ" }, - "selfHostedEnvironmentFooter": { - "message": "Chỉ định liên kết cơ bản của cài đặt bitwarden tại chỗ của bạn." - }, "selfHostedBaseUrlHint": { "message": "Nhập địa chỉ cơ sở của bản cài đặt Bitwarden được lưu trữ tại máy chủ của bạn. Ví dụ: https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "Môi trường tùy chỉnh" }, - "customEnvironmentFooter": { - "message": "Đối với người dùng nâng cao. Bạn có thể chỉ định URL cơ bản của mỗi dịch vụ một cách độc lập." - }, "baseUrl": { "message": "URL máy chủ" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "Kéo để sắp xếp" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Văn bản" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "Cài đặt đã được chỉnh sửa" - }, - "environmentEditedClick": { - "message": "Nhấn vào đây" - }, - "environmentEditedReset": { - "message": "để đặt lại cài đặt đã thiết đặt từ trước" - }, "serverVersion": { "message": "Phiên bản máy chủ" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "Đăng nhập bằng mật khẩu chính" }, - "loggingInAs": { - "message": "Đang đăng nhập với tên" - }, - "notYou": { - "message": "Không phải bạn?" - }, "newAroundHere": { "message": "Bạn mới tới đây sao?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "Đăng nhập bằng thiết bị" }, - "loginWithDeviceEnabledInfo": { - "message": "Đăng nhập bằng thiết bị phải được thiết lập trong cài đặt của ứng dụng Bitwarden. Dùng cách khác?" - }, "fingerprintPhraseHeader": { "message": "Cụm vân tay" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "View all log in options" }, - "viewAllLoginOptionsV1": { - "message": "View all log in options" - }, "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "Yêu cầu quản trị viên phê duyệt" }, - "approveWithMasterPassword": { - "message": "Phê duyệt bằng mật khẩu chính" - }, "ssoIdentifierRequired": { "message": "Cần có mã định danh SSO của tổ chức." }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Yêu cầu của bạn đã được gửi đến quản trị viên." }, - "youWillBeNotifiedOnceApproved": { - "message": "Bạn sẽ có thông báo nếu được phê duyệt." - }, "troubleLoggingIn": { "message": "Không thể đăng nhập?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "Tài khoản đang hoạt động" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "Các tài khoản khả dụng" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "$LABEL$ đã di chuyển lên vị trí $INDEX$ / $LENGTH$", "placeholders": { @@ -4725,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": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "Extra wide" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index c7ad885de92..4595b20ddbf 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "输入您的账户电子邮箱地址,您的密码提示将发送给您" }, - "passwordHint": { - "message": "密码提示" - }, - "enterEmailToGetHint": { - "message": "请输入您的账户电子邮箱地址来接收主密码提示。" - }, "getMasterPasswordHint": { "message": "获取主密码提示" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "编辑文件夹" }, + "editFolderWithName": { + "message": "编辑文件夹:$FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "新增文件夹" }, @@ -479,22 +482,6 @@ "length": { "message": "长度" }, - "uppercase": { - "message": "大写 (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "小写 (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "数字 (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "特殊字符 (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "包含", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "包含特殊字符", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "单词个数" }, @@ -604,7 +587,7 @@ "message": "私密备注" }, "note": { - "message": "笔记" + "message": "备注" }, "editItem": { "message": "编辑项目" @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "您的浏览器不支持剪贴板简单复制,请手动复制。" }, - "verifyIdentity": { - "message": "验证身份" + "verifyYourIdentity": { + "message": "验证您的身份" }, "weDontRecognizeThisDevice": { "message": "我们无法识别这个设备。请输入发送到您电子邮箱中的代码以验证您的身份。" @@ -921,6 +904,9 @@ "no": { "message": "否" }, + "location": { + "message": "位置" + }, "unexpectedError": { "message": "发生意外错误。" }, @@ -1017,7 +1003,7 @@ "message": "搜索类型" }, "noneFolder": { - "message": "无文件夹", + "message": "默认文件夹", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -1030,7 +1016,7 @@ "message": "在密码库中找不到匹配项目时询问添加一个。" }, "addLoginNotificationDescAlt": { - "message": "如果在密码库中找不到项目,询问添加一个。适用于所有已登录的账户。" + "message": "在密码库中找不到匹配项目时询问添加一个。适用于所有已登录的账户。" }, "showCardsInVaultViewV2": { "message": "在密码库视图中将支付卡始终显示为自动填充建议" @@ -1070,14 +1056,64 @@ "notificationAddSave": { "message": "保存" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ 已保存到 Bitwarden。", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ 已在 Bitwarden 中更新。", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "保存为新的登录", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "更新登录", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "保存登录吗?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "更新现有的登录吗?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "登录已保存", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "登录已更新", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "保存时出错", + "description": "Error message shown when the system fails to save login details." + }, + "saveFailureDetails": { + "message": "哦不!我们无法保存它。请尝试手动输入详细信息。", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "询问更新现有的登录" }, "changedPasswordNotificationDesc": { - "message": "在网站上检测到更改时询问更新登录密码。" + "message": "在网站上检测到更改时询问更新登录的密码。" }, "changedPasswordNotificationDescAlt": { - "message": "当在网站上检测到更改时,询问更新登录项目的密码。适用于所有已登录的账户。" + "message": "在网站上检测到更改时询问更新登录的密码。适用于所有已登录的账户。" }, "enableUsePasskeys": { "message": "询问保存和使用通行密钥" @@ -1133,10 +1169,6 @@ "message": "浅色", "description": "Light color" }, - "solarizedDark": { - "message": "过曝暗", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "导出自" }, @@ -1324,7 +1356,7 @@ "message": "升级到高级版并接收:" }, "premiumPrice": { - "message": "全部仅需 $PRICE$ /年!", + "message": "所有功能仅需 $PRICE$ /年!", "placeholders": { "price": { "content": "$1", @@ -1333,7 +1365,7 @@ } }, "premiumPriceV2": { - "message": "全部仅需 $PRICE$ 每年!", + "message": "所有功能仅需 $PRICE$ /年!", "placeholders": { "price": { "content": "$1", @@ -1351,7 +1383,7 @@ "message": "如果登录包含验证器密钥,当自动填充此登录时,将 TOTP 验证码复制到剪贴板。" }, "enableAutoBiometricsPrompt": { - "message": "启动时要求生物识别" + "message": "启动时提示生物识别" }, "premiumRequired": { "message": "需要高级会员" @@ -1427,7 +1459,7 @@ "message": "读取安全密钥" }, "awaitingSecurityKeyInteraction": { - "message": "等待安全密钥交互……" + "message": "等待安全密钥交互..." }, "loginUnavailable": { "message": "登录不可用" @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "自托管环境" }, - "selfHostedEnvironmentFooter": { - "message": "指定您本地托管的 Bitwarden 安装的基础 URL。" - }, "selfHostedBaseUrlHint": { "message": "指定您的本地托管 Bitwarden 安装的基础 URL。例如:https://bitwarden.company.com" }, @@ -1496,14 +1525,11 @@ "message": "对于高级配置,您可以单独指定每个服务的基础 URL。" }, "selfHostedEnvFormInvalid": { - "message": "您必须添加基础服务器 URL 或至少一个自定义环境。" + "message": "您必须添加基础服务器 URL 或至少添加一个自定义环境。" }, "customEnvironment": { "message": "自定义环境" }, - "customEnvironmentFooter": { - "message": "适用于高级用户。您可以分别指定各个服务的基础 URL。" - }, "baseUrl": { "message": "服务器 URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "拖动排序" }, + "dragToReorder": { + "message": "拖动以重新排序" + }, "cfTypeText": { "message": "文本型" }, @@ -2091,13 +2120,13 @@ "message": "等待来自桌面端的确认" }, "awaitDesktopDesc": { - "message": "请确认在 Bitwarden 桌面应用程序中设置了生物识别以设置浏览器的生物识别。" + "message": "请确认在 Bitwarden 桌面应用程序中使用了生物识别以设置浏览器的生物识别。" }, "lockWithMasterPassOnRestart": { "message": "浏览器重启后使用主密码锁定" }, "lockWithMasterPassOnRestart1": { - "message": "浏览器重启时需要主密码" + "message": "浏览器重启时要求主密码" }, "selectOneCollection": { "message": "您必须至少选择一个集合。" @@ -2356,7 +2385,7 @@ "message": "生物识别未设置" }, "biometricsNotEnabledDesc": { - "message": "需要首先在桌面应用程序的设置中设置生物识别才能使用浏览器的生物识别。" + "message": "需要首先在桌面端的设置中设置生物识别,才能使用浏览器的生物识别。" }, "biometricsNotSupportedTitle": { "message": "不支持生物识别" @@ -2417,10 +2446,10 @@ "message": "排除域名" }, "excludedDomainsDesc": { - "message": "Bitwarden 将不会询问是否为这些域名保存登录信息。您必须刷新页面才能使更改生效。" + "message": "Bitwarden 将不会提示保存这些域名的登录信息。您必须刷新页面才能使更改生效。" }, "excludedDomainsDescAlt": { - "message": "Bitwarden 将不会询问是否为所有已登录账户的这些域名保存登录信息。您必须刷新页面才能使更改生效。" + "message": "Bitwarden 将不会提示为所有已登录账户保存这些域名的登录信息。您必须刷新页面才能使更改生效。" }, "blockedDomainsDesc": { "message": "将不会为这些网站提供自动填充和其他相关功能。您必须刷新页面才能使更改生效。" @@ -2559,7 +2588,7 @@ "message": "排除域名更改已保存" }, "limitSendViews": { - "message": "限制查看" + "message": "查看次数限制" }, "limitSendViewsHint": { "message": "达到限额后,任何人无法查看此 Send。", @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "设置已编辑" - }, - "environmentEditedClick": { - "message": "点击此处" - }, - "environmentEditedReset": { - "message": "重置为预设设置" - }, "serverVersion": { "message": "服务器版本" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "使用主密码登录" }, - "loggingInAs": { - "message": "正登录为" - }, - "notYou": { - "message": "不是您吗?" - }, "newAroundHere": { "message": "初来乍到吗?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "使用设备登录" }, - "loginWithDeviceEnabledInfo": { - "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他登录选项吗?" - }, "fingerprintPhraseHeader": { "message": "指纹短语" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "查看所有登录选项" }, - "viewAllLoginOptionsV1": { - "message": "查看所有登录选项" - }, "notificationSentDevice": { "message": "通知已发送到您的设备。" }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "请求管理员批准" }, - "approveWithMasterPassword": { - "message": "使用主密码批准" - }, "ssoIdentifierRequired": { "message": "必须填写组织 SSO 标识符。" }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的请求已发送给您的管理员。" }, - "youWillBeNotifiedOnceApproved": { - "message": "批准后,您将收到通知。" - }, "troubleLoggingIn": { "message": "登录遇到问题吗?" }, @@ -3541,7 +3543,7 @@ "message": "搜索" }, "inputMinLength": { - "message": "至少输入 $COUNT$ 个字符。", + "message": "输入长度不能低于 $COUNT$ 个字符。", "placeholders": { "count": { "content": "$1", @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "活动账户" }, + "bitwardenAccount": { + "message": "Bitwarden 账户" + }, "availableAccounts": { "message": "可用账户" }, @@ -4213,7 +4218,7 @@ "message": "没有搜索到匹配的项目" }, "clearFiltersOrTryAnother": { - "message": "清除筛选或尝试另一个搜索词" + "message": "清除筛选或尝试其他搜索词" }, "copyInfoTitle": { "message": "复制信息 - $ITEMNAME$", @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "重新排序网站 URI。使用箭头键向上或向下移动项目。" + }, "reorderFieldUp": { "message": "$LABEL$ 已上移,位置 $INDEX$ / $LENGTH$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "您尚未选择任何内容。" }, - "movedItemsToOrg": { - "message": "所选项目已移动到 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "项目已移动到 $ORGNAME$", "placeholders": { @@ -4830,7 +4829,7 @@ "message": "自定义超时时间最小为 1 分钟。" }, "additionalContentAvailable": { - "message": "其他内容可用" + "message": "有更多内容可用" }, "fileSavedToDevice": { "message": "文件已保存到设备。可以在设备下载中进行管理。" @@ -5096,6 +5095,33 @@ "extraWide": { "message": "超宽" }, + "sshKeyWrongPassword": { + "message": "您输入的密码不正确。" + }, + "importSshKey": { + "message": "导入" + }, + "confirmSshKeyPassword": { + "message": "确认密码" + }, + "enterSshKeyPasswordDesc": { + "message": "输入 SSH 密钥的密码。" + }, + "enterSshKeyPassword": { + "message": "输入密码" + }, + "invalidSshKey": { + "message": "此 SSH 密钥无效" + }, + "sshKeyTypeUnsupported": { + "message": "不支持此 SSH 密钥类型" + }, + "importSshKeyFromClipboard": { + "message": "从剪贴板导入密钥" + }, + "sshKeyImported": { + "message": "SSH 密钥导入成功" + }, "cannotRemoveViewOnlyCollections": { "message": "您无法删除仅具有「查看」权限的集合:$COLLECTIONS$", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "要使用生物识别解锁,请更新您的桌面应用程序,或在桌面设置中禁用指纹解锁。" + }, + "changeAtRiskPassword": { + "message": "更改有风险的密码" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 37d5239622d..37e450c8fd2 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -263,12 +263,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "輸入您帳號的電子郵件,您的密碼提示會傳送給您" }, - "passwordHint": { - "message": "密碼提示" - }, - "enterEmailToGetHint": { - "message": "請輸入您的帳户電子郵件地址以接收主密碼提示。" - }, "getMasterPasswordHint": { "message": "取得主密碼提示" }, @@ -385,6 +379,15 @@ "editFolder": { "message": "編輯資料夾" }, + "editFolderWithName": { + "message": "Edit folder: $FOLDERNAME$", + "placeholders": { + "foldername": { + "content": "$1", + "example": "Social" + } + } + }, "newFolder": { "message": "新增資料夾" }, @@ -479,22 +482,6 @@ "length": { "message": "長度" }, - "uppercase": { - "message": "大寫 (A-Z)", - "description": "deprecated. Use uppercaseLabel instead." - }, - "lowercase": { - "message": "小寫 (a-z)", - "description": "deprecated. Use lowercaseLabel instead." - }, - "numbers": { - "message": "數字 (0-9)", - "description": "deprecated. Use numbersLabel instead." - }, - "specialCharacters": { - "message": "特殊字元 (!@#$%^&*)", - "description": "deprecated. Use specialCharactersLabel instead." - }, "include": { "message": "包含", "description": "Card header for password generator include block" @@ -527,10 +514,6 @@ "message": "包含特殊字元", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "單字數量" }, @@ -669,8 +652,8 @@ "browserNotSupportClipboard": { "message": "您的瀏覽器不支援剪貼簿簡單複製,請手動複製。" }, - "verifyIdentity": { - "message": "驗證身份" + "verifyYourIdentity": { + "message": "Verify your identity" }, "weDontRecognizeThisDevice": { "message": "我們無法識別此裝置。請輸入已傳送到您電子郵件的驗證碼以驗證您的身分。" @@ -921,6 +904,9 @@ "no": { "message": "否" }, + "location": { + "message": "Location" + }, "unexpectedError": { "message": "發生了未預期的錯誤。" }, @@ -1070,6 +1056,56 @@ "notificationAddSave": { "message": "儲存" }, + "loginSaveSuccessDetails": { + "message": "$USERNAME$ saved to Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is saved." + }, + "loginUpdatedSuccessDetails": { + "message": "$USERNAME$ updated in Bitwarden.", + "placeholders": { + "username": { + "content": "$1" + } + }, + "description": "Shown to user after login is updated." + }, + "saveAsNewLoginAction": { + "message": "Save as new login", + "description": "Button text for saving login details as a new entry." + }, + "updateLoginAction": { + "message": "Update login", + "description": "Button text for updating an existing login entry." + }, + "saveLoginPrompt": { + "message": "Save login?", + "description": "Prompt asking the user if they want to save their login details." + }, + "updateLoginPrompt": { + "message": "Update existing login?", + "description": "Prompt asking the user if they want to update an existing login entry." + }, + "loginSaveSuccess": { + "message": "Login saved", + "description": "Message displayed when login details are successfully saved." + }, + "loginUpdateSuccess": { + "message": "Login updated", + "description": "Message displayed when login details are successfully updated." + }, + "saveFailure": { + "message": "Error saving", + "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.", + "description": "Detailed error message shown when saving login details fails." + }, "enableChangedPasswordNotification": { "message": "詢問更新現有的登入資料" }, @@ -1133,10 +1169,6 @@ "message": "淺色", "description": "Light color" }, - "solarizedDark": { - "message": "Solarized 深色主題", - "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." - }, "exportFrom": { "message": "匯出自" }, @@ -1486,9 +1518,6 @@ "selfHostedEnvironment": { "message": "自我裝載環境" }, - "selfHostedEnvironmentFooter": { - "message": "指定您內部部署的 Bitwarden 安裝之基礎 URL。" - }, "selfHostedBaseUrlHint": { "message": "指定您自建的 Bitwarden 伺服器的網域 URL。例如:https://bitwarden.company.com" }, @@ -1501,9 +1530,6 @@ "customEnvironment": { "message": "自訂環境" }, - "customEnvironmentFooter": { - "message": "適用於進階使用者。您可以單獨指定各個服務的基礎 URL。" - }, "baseUrl": { "message": "伺服器 URL" }, @@ -1641,6 +1667,9 @@ "dragToSort": { "message": "透過拖曳來排序" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "文字型" }, @@ -3243,15 +3272,6 @@ } } }, - "settingsEdited": { - "message": "設定已編輯" - }, - "environmentEditedClick": { - "message": "點選此處" - }, - "environmentEditedReset": { - "message": "重設為預設設定" - }, "serverVersion": { "message": "伺服器版本" }, @@ -3282,12 +3302,6 @@ "loginWithMasterPassword": { "message": "使用主密碼登入" }, - "loggingInAs": { - "message": "正登入為" - }, - "notYou": { - "message": "不是您嗎?" - }, "newAroundHere": { "message": "第一次使用?" }, @@ -3297,9 +3311,6 @@ "loginWithDevice": { "message": "使用裝置登入" }, - "loginWithDeviceEnabledInfo": { - "message": "裝置登入必須在 Bitwarden 應用程式的設定中啟用。需要其他選項嗎?" - }, "fingerprintPhraseHeader": { "message": "指紋短語" }, @@ -3312,9 +3323,6 @@ "viewAllLogInOptions": { "message": "檢視所有登入選項" }, - "viewAllLoginOptionsV1": { - "message": "檢視所有登入選項" - }, "notificationSentDevice": { "message": "已傳送通知至您的裝置。" }, @@ -3456,9 +3464,6 @@ "requestAdminApproval": { "message": "要求管理員核准" }, - "approveWithMasterPassword": { - "message": "使用主密碼核准" - }, "ssoIdentifierRequired": { "message": "需要組織 SSO 識別碼。" }, @@ -3505,9 +3510,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的要求已傳送給您的管理員。" }, - "youWillBeNotifiedOnceApproved": { - "message": "核准後將通知您。" - }, "troubleLoggingIn": { "message": "登入時遇到困難?" }, @@ -4077,6 +4079,9 @@ "activeAccount": { "message": "目前帳戶" }, + "bitwardenAccount": { + "message": "Bitwarden account" + }, "availableAccounts": { "message": "可用帳戶" }, @@ -4665,6 +4670,9 @@ } } }, + "reorderWebsiteUriButton": { + "message": "Reorder website URI. Use arrow key to move item up or down." + }, "reorderFieldUp": { "message": "往上移動 $LABEL$,位置 $LENGTH$ 之 $INDEX$", "placeholders": { @@ -4725,15 +4733,6 @@ "nothingSelected": { "message": "您沒有選擇任何項目。" }, - "movedItemsToOrg": { - "message": "將已選取項目移動至 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "項目已移到 $ORGNAME$", "placeholders": { @@ -5096,6 +5095,33 @@ "extraWide": { "message": "更寬" }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, "cannotRemoveViewOnlyCollections": { "message": "若您只有檢視權限,無法移除集合 $COLLECTIONS$。", "placeholders": { @@ -5110,5 +5136,8 @@ }, "updateDesktopAppOrDisableFingerprintDialogMessage": { "message": "為了使用生物辨識解鎖,請更新您的桌面應用程式,或在設定中停用指紋解鎖。" + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/browser/src/auth/popup/environment.component.html b/apps/browser/src/auth/popup/environment.component.html deleted file mode 100644 index ff19739548a..00000000000 --- a/apps/browser/src/auth/popup/environment.component.html +++ /dev/null @@ -1,122 +0,0 @@ -
-
-
- -
-

- {{ "appName" | i18n }} -

-
- -
-
-
- - - {{ "environmentEditedClick" | i18n }} - - {{ "environmentEditedReset" | i18n }} - - -
-

- {{ "selfHostedEnvironment" | i18n }} -

-
-
- - -
-
- -
-
-

- {{ "customEnvironment" | i18n }} -

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
-
diff --git a/apps/browser/src/auth/popup/environment.component.ts b/apps/browser/src/auth/popup/environment.component.ts deleted file mode 100644 index c922c61b7e8..00000000000 --- a/apps/browser/src/auth/popup/environment.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, OnInit } from "@angular/core"; -import { Router } from "@angular/router"; - -import { EnvironmentComponent as BaseEnvironmentComponent } from "@bitwarden/angular/auth/components/environment.component"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service"; - -@Component({ - selector: "app-environment", - templateUrl: "environment.component.html", -}) -export class EnvironmentComponent extends BaseEnvironmentComponent implements OnInit { - showEditedManagedSettings = false; - - constructor( - platformUtilsService: PlatformUtilsService, - public environmentService: BrowserEnvironmentService, - i18nService: I18nService, - private router: Router, - modalService: ModalService, - toastService: ToastService, - ) { - super(platformUtilsService, environmentService, i18nService, modalService, toastService); - this.showCustom = true; - } - - async ngOnInit() { - this.showEditedManagedSettings = await this.environmentService.settingsHaveChanged(); - } - - async resetEnvironment() { - const urls = await this.environmentService.getManagedEnvironment(); - - this.baseUrl = urls.base; - this.webVaultUrl = urls.webVault; - this.apiUrl = urls.api; - this.iconsUrl = urls.icons; - this.identityUrl = urls.identity; - this.notificationsUrl = urls.notifications; - this.iconsUrl = urls.icons; - } - - saved() { - super.saved(); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([""]); - } -} diff --git a/apps/browser/src/auth/popup/hint.component.html b/apps/browser/src/auth/popup/hint.component.html deleted file mode 100644 index c3d5ef3d8b7..00000000000 --- a/apps/browser/src/auth/popup/hint.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
-
- -
-

- {{ "passwordHint" | i18n }} -

-
- -
-
-
-
-
-
- - -
-
- -
-
-
diff --git a/apps/browser/src/auth/popup/hint.component.ts b/apps/browser/src/auth/popup/hint.component.ts deleted file mode 100644 index e97236fe6a8..00000000000 --- a/apps/browser/src/auth/popup/hint.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; - -import { HintComponent as BaseHintComponent } from "@bitwarden/angular/auth/components/hint.component"; -import { LoginEmailServiceAbstraction } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -@Component({ - selector: "app-hint", - templateUrl: "hint.component.html", -}) -export class HintComponent extends BaseHintComponent { - constructor( - router: Router, - platformUtilsService: PlatformUtilsService, - i18nService: I18nService, - apiService: ApiService, - logService: LogService, - private route: ActivatedRoute, - loginEmailService: LoginEmailServiceAbstraction, - toastService: ToastService, - ) { - super( - router, - i18nService, - apiService, - platformUtilsService, - logService, - loginEmailService, - toastService, - ); - - this.onSuccessfulSubmit = async () => { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.successRoute]); - }; - } -} diff --git a/apps/browser/src/auth/popup/home.component.html b/apps/browser/src/auth/popup/home.component.html deleted file mode 100644 index 08043cf88bb..00000000000 --- a/apps/browser/src/auth/popup/home.component.html +++ /dev/null @@ -1,36 +0,0 @@ - -
-
-
-

{{ "loginOrCreateNewAccount" | i18n }}

-
-
-
-
- - -
- -
- - -
-
-
-
- -
-
- -
-
diff --git a/apps/browser/src/auth/popup/home.component.ts b/apps/browser/src/auth/popup/home.component.ts deleted file mode 100644 index 0c4510204d1..00000000000 --- a/apps/browser/src/auth/popup/home.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; -import { FormBuilder, Validators } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { Subject, firstValueFrom, switchMap, takeUntil, tap } from "rxjs"; - -import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component"; -import { LoginEmailServiceAbstraction } from "@bitwarden/auth/common"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -import { AccountSwitcherService } from "./account-switching/services/account-switcher.service"; - -@Component({ - selector: "app-home", - templateUrl: "home.component.html", -}) -export class HomeComponent implements OnInit, OnDestroy { - @ViewChild(EnvironmentSelectorComponent, { static: true }) - environmentSelector!: EnvironmentSelectorComponent; - private destroyed$: Subject = new Subject(); - - loginInitiated = false; - formGroup = this.formBuilder.group({ - email: ["", [Validators.required, Validators.email]], - rememberEmail: [false], - }); - - constructor( - protected platformUtilsService: PlatformUtilsService, - private formBuilder: FormBuilder, - private router: Router, - private i18nService: I18nService, - private loginEmailService: LoginEmailServiceAbstraction, - private accountSwitcherService: AccountSwitcherService, - private toastService: ToastService, - private configService: ConfigService, - private route: ActivatedRoute, - ) {} - - async ngOnInit(): Promise { - this.listenForUnauthUiRefreshFlagChanges(); - - const email = await firstValueFrom(this.loginEmailService.loginEmail$); - const rememberEmail = this.loginEmailService.getRememberEmail(); - - if (email != null) { - this.formGroup.patchValue({ email, rememberEmail }); - } else { - const storedEmail = await firstValueFrom(this.loginEmailService.storedEmail$); - - if (storedEmail != null) { - this.formGroup.patchValue({ email: storedEmail, rememberEmail: true }); - } - } - - this.environmentSelector.onOpenSelfHostedSettings - .pipe( - switchMap(async () => { - await this.setLoginEmailValues(); - await this.router.navigate(["environment"]); - }), - takeUntil(this.destroyed$), - ) - .subscribe(); - } - - ngOnDestroy(): void { - this.destroyed$.next(); - this.destroyed$.complete(); - } - - private listenForUnauthUiRefreshFlagChanges() { - this.configService - .getFeatureFlag$(FeatureFlag.UnauthenticatedExtensionUIRefresh) - .pipe( - tap(async (flag) => { - // If the flag is turned ON, we must force a reload to ensure the correct UI is shown - if (flag) { - const qParams = await firstValueFrom(this.route.queryParams); - - const uniqueQueryParams = { - ...qParams, - // adding a unique timestamp to the query params to force a reload - t: new Date().getTime().toString(), - }; - - await this.router.navigate(["/login"], { - queryParams: uniqueQueryParams, - }); - } - }), - takeUntil(this.destroyed$), - ) - .subscribe(); - } - - get availableAccounts$() { - return this.accountSwitcherService.availableAccounts$; - } - - async submit() { - this.formGroup.markAllAsTouched(); - - if (this.formGroup.invalid) { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccured"), - message: this.i18nService.t("invalidEmail"), - }); - return; - } - - await this.setLoginEmailValues(); - await this.router.navigate(["login"], { - queryParams: { email: this.formGroup.controls.email.value }, - }); - } - - async setLoginEmailValues() { - // Note: Browser saves email settings here instead of the login component - this.loginEmailService.setRememberEmail(this.formGroup.controls.rememberEmail.value); - await this.loginEmailService.setLoginEmail(this.formGroup.controls.email.value); - await this.loginEmailService.saveEmailSettings(); - } -} diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.html b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.html deleted file mode 100644 index e996f9a6ff4..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.html +++ /dev/null @@ -1,111 +0,0 @@ -
- -
- -
-

- {{ "loginInitiated" | i18n }} -

-
-
- -
diff --git a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.ts b/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.ts deleted file mode 100644 index bd8f808c910..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/login-decryption-options-v1.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component } from "@angular/core"; -import { firstValueFrom } from "rxjs"; - -import { BaseLoginDecryptionOptionsComponentV1 } from "@bitwarden/angular/auth/components/base-login-decryption-options-v1.component"; - -import { postLogoutMessageListener$ } from "../utils/post-logout-message-listener"; - -@Component({ - selector: "browser-login-decryption-options", - templateUrl: "login-decryption-options-v1.component.html", -}) -export class LoginDecryptionOptionsComponentV1 extends BaseLoginDecryptionOptionsComponentV1 { - override async createUser(): Promise { - try { - await super.createUser(); - await this.router.navigate(["/tabs/vault"]); - } catch (error) { - this.validationService.showError(error); - } - } - - override async logOut(): Promise { - // start listening for "switchAccountFinish" or "doneLoggingOut" - const messagePromise = firstValueFrom(postLogoutMessageListener$); - super.logOut(); - // wait for messages - const command = await messagePromise; - - // We should be routed/routing very soon but just in case, turn loading back off. - this.loading = false; - - // doneLoggingOut already has a message handler that will navigate us - if (command === "switchAccountFinish") { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["/"]); - } - } -} diff --git a/apps/browser/src/auth/popup/login-v1.component.html b/apps/browser/src/auth/popup/login-v1.component.html deleted file mode 100644 index 145a9cbc754..00000000000 --- a/apps/browser/src/auth/popup/login-v1.component.html +++ /dev/null @@ -1,81 +0,0 @@ -
-
-

- {{ "logIn" | i18n }} -

-
-
-
-
-
-
- - - - -
-
- -
-
-
- -
-
- -
- -
-
diff --git a/apps/browser/src/auth/popup/login-v1.component.ts b/apps/browser/src/auth/popup/login-v1.component.ts deleted file mode 100644 index b2c52f248c6..00000000000 --- a/apps/browser/src/auth/popup/login-v1.component.ts +++ /dev/null @@ -1,142 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, NgZone, OnInit } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; - -import { LoginComponentV1 as BaseLoginComponent } from "@bitwarden/angular/auth/components/login-v1.component"; -import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -@Component({ - selector: "app-login", - templateUrl: "login-v1.component.html", -}) -export class LoginComponentV1 extends BaseLoginComponent implements OnInit { - constructor( - devicesApiService: DevicesApiServiceAbstraction, - appIdService: AppIdService, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - protected platformUtilsService: PlatformUtilsService, - protected i18nService: I18nService, - protected stateService: StateService, - protected environmentService: EnvironmentService, - protected passwordGenerationService: PasswordGenerationServiceAbstraction, - protected cryptoFunctionService: CryptoFunctionService, - syncService: SyncService, - logService: LogService, - ngZone: NgZone, - formBuilder: FormBuilder, - formValidationErrorService: FormValidationErrorsService, - route: ActivatedRoute, - loginEmailService: LoginEmailServiceAbstraction, - ssoLoginService: SsoLoginServiceAbstraction, - toastService: ToastService, - ) { - super( - devicesApiService, - appIdService, - loginStrategyService, - router, - platformUtilsService, - i18nService, - stateService, - environmentService, - passwordGenerationService, - cryptoFunctionService, - logService, - ngZone, - formBuilder, - formValidationErrorService, - route, - loginEmailService, - ssoLoginService, - toastService, - ); - this.onSuccessfulLogin = async () => { - await syncService.fullSync(true); - }; - this.successRoute = "/tabs/vault"; - } - - async ngOnInit(): Promise { - await super.ngOnInit(); - await this.validateEmail(); - } - - settings() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["environment"]); - } - - async launchSsoBrowser() { - // Save off email for SSO - await this.ssoLoginService.setSsoEmail(this.formGroup.value.email); - - // Generate necessary sso params - const passwordOptions: any = { - type: "password", - length: 64, - uppercase: true, - lowercase: true, - numbers: true, - special: false, - }; - - const state = - (await this.passwordGenerationService.generatePassword(passwordOptions)) + - ":clientId=browser"; - const codeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); - const codeVerifierHash = await this.cryptoFunctionService.hash(codeVerifier, "sha256"); - const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); - - await this.ssoLoginService.setCodeVerifier(codeVerifier); - await this.ssoLoginService.setSsoState(state); - - const env = await firstValueFrom(this.environmentService.environment$); - let url = env.getWebVaultUrl(); - if (url == null) { - url = "https://vault.bitwarden.com"; - } - - const redirectUri = url + "/sso-connector.html"; - - // Launch browser - this.platformUtilsService.launchUri( - url + - "/#/sso?clientId=browser" + - "&redirectUri=" + - encodeURIComponent(redirectUri) + - "&state=" + - state + - "&codeChallenge=" + - codeChallenge + - "&email=" + - encodeURIComponent(this.formGroup.controls.email.value), - ); - } - - async saveEmailSettings() { - // values should be saved on home component - return; - } -} diff --git a/apps/browser/src/auth/popup/login-via-auth-request-v1.component.html b/apps/browser/src/auth/popup/login-via-auth-request-v1.component.html deleted file mode 100644 index 34c0cbe9614..00000000000 --- a/apps/browser/src/auth/popup/login-via-auth-request-v1.component.html +++ /dev/null @@ -1,68 +0,0 @@ - diff --git a/apps/browser/src/auth/popup/login-via-auth-request-v1.component.ts b/apps/browser/src/auth/popup/login-via-auth-request-v1.component.ts deleted file mode 100644 index 66c69d0a41a..00000000000 --- a/apps/browser/src/auth/popup/login-via-auth-request-v1.component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Location } from "@angular/common"; -import { Component } from "@angular/core"; -import { Router } from "@angular/router"; - -import { LoginViaAuthRequestComponentV1 as BaseLoginViaAuthRequestComponentV1 } from "@bitwarden/angular/auth/components/login-via-auth-request-v1.component"; -import { - AuthRequestServiceAbstraction, - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AnonymousHubService } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { KeyService } from "@bitwarden/key-management"; - -@Component({ - selector: "app-login-via-auth-request", - templateUrl: "login-via-auth-request-v1.component.html", -}) -export class LoginViaAuthRequestComponentV1 extends BaseLoginViaAuthRequestComponentV1 { - constructor( - router: Router, - keyService: KeyService, - cryptoFunctionService: CryptoFunctionService, - appIdService: AppIdService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - apiService: ApiService, - authService: AuthService, - logService: LogService, - environmentService: EnvironmentService, - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - anonymousHubService: AnonymousHubService, - validationService: ValidationService, - loginEmailService: LoginEmailServiceAbstraction, - syncService: SyncService, - deviceTrustService: DeviceTrustServiceAbstraction, - authRequestService: AuthRequestServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - accountService: AccountService, - private location: Location, - toastService: ToastService, - ) { - super( - router, - keyService, - cryptoFunctionService, - appIdService, - passwordGenerationService, - apiService, - authService, - logService, - environmentService, - i18nService, - platformUtilsService, - anonymousHubService, - validationService, - accountService, - loginEmailService, - deviceTrustService, - authRequestService, - loginStrategyService, - toastService, - ); - this.onSuccessfulLogin = async () => { - await syncService.fullSync(true); - }; - } - - protected back() { - this.location.back(); - } -} diff --git a/apps/browser/src/auth/popup/set-password.component.html b/apps/browser/src/auth/popup/set-password.component.html index 6261608c345..71a2e3ac588 100644 --- a/apps/browser/src/auth/popup/set-password.component.html +++ b/apps/browser/src/auth/popup/set-password.component.html @@ -1,7 +1,7 @@
- +

{{ "setMasterPassword" | i18n }} diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 871d1b3014d..8cdfdab9524 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -99,7 +99,6 @@ import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; VaultTimeoutInputComponent, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class AccountSecurityComponent implements OnInit, OnDestroy { protected readonly VaultTimeoutAction = VaultTimeoutAction; diff --git a/apps/browser/src/auth/popup/sso-v1.component.ts b/apps/browser/src/auth/popup/sso-v1.component.ts index ecb743848c7..f56fe697e70 100644 --- a/apps/browser/src/auth/popup/sso-v1.component.ts +++ b/apps/browser/src/auth/popup/sso-v1.component.ts @@ -11,9 +11,9 @@ import { import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/apps/browser/src/auth/popup/two-factor-v1.component.ts b/apps/browser/src/auth/popup/two-factor-v1.component.ts index 723432501e1..884e42bf73a 100644 --- a/apps/browser/src/auth/popup/two-factor-v1.component.ts +++ b/apps/browser/src/auth/popup/two-factor-v1.component.ts @@ -14,10 +14,10 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts index 0b47fa4287e..b2c20ba2849 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts @@ -72,7 +72,7 @@ describe("AuthPopoutWindow", () => { it("closes any existing popup window types that are open to the login extension route", async () => { const loginTab = createChromeTabMock({ - url: chrome.runtime.getURL("popup/index.html#/home"), + url: chrome.runtime.getURL("popup/index.html#/login"), }); jest.spyOn(BrowserApi, "tabsQuery").mockResolvedValue([loginTab]); jest.spyOn(BrowserApi, "removeWindow"); diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.ts index 2f135038315..0646b684b22 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.ts @@ -13,7 +13,7 @@ const AuthPopoutType = { const extensionUnlockUrls = new Set([ chrome.runtime.getURL("popup/index.html#/lock"), - chrome.runtime.getURL("popup/index.html#/home"), + chrome.runtime.getURL("popup/index.html#/login"), ]); /** diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts index 408bb5b0ca4..2247328acab 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts @@ -15,6 +15,7 @@ jest.mock("../popup/utils/auth-popout-window", () => { jest.mock("../../platform/popup/browser-popup-utils", () => ({ inSingleActionPopout: jest.fn(), + inPopout: jest.fn(), })); import { DuoLaunchAction } from "@bitwarden/auth/angular"; @@ -173,6 +174,8 @@ describe("ExtensionTwoFactorAuthComponentService", () => { return key === AuthPopoutType.twoFactorAuthDuo; }); + jest.spyOn(BrowserPopupUtils, "inPopout").mockImplementation(() => false); + expect(extensionTwoFactorAuthComponentService.determineDuoLaunchAction()).toBe( DuoLaunchAction.DIRECT_LAUNCH, ); @@ -180,10 +183,20 @@ describe("ExtensionTwoFactorAuthComponentService", () => { it("should return SINGLE_ACTION_POPOUT if not in two factor auth duo popout", () => { jest.spyOn(BrowserPopupUtils, "inSingleActionPopout").mockImplementation(() => false); + jest.spyOn(BrowserPopupUtils, "inPopout").mockImplementation(() => false); expect(extensionTwoFactorAuthComponentService.determineDuoLaunchAction()).toBe( DuoLaunchAction.SINGLE_ACTION_POPOUT, ); }); + + it("should return DIRECT_LAUNCH if in popout", () => { + jest.spyOn(BrowserPopupUtils, "inSingleActionPopout").mockImplementation(() => false); + jest.spyOn(BrowserPopupUtils, "inPopout").mockImplementation(() => true); + + expect(extensionTwoFactorAuthComponentService.determineDuoLaunchAction()).toBe( + DuoLaunchAction.DIRECT_LAUNCH, + ); + }); }); }); diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts index c11baadb595..f768b223984 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts @@ -106,7 +106,9 @@ export class ExtensionTwoFactorAuthComponentService AuthPopoutType.twoFactorAuthDuo, ); - if (inTwoFactorAuthDuoPopout) { + const inPopout = BrowserPopupUtils.inPopout(this.window); + + if (inTwoFactorAuthDuoPopout || inPopout) { return DuoLaunchAction.DIRECT_LAUNCH; } diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.spec.ts index b53f05172ce..dfbf69f1a7f 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.spec.ts @@ -1,39 +1,17 @@ -import { MockProxy, mock } from "jest-mock-extended"; - -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; - import { ExtensionTwoFactorAuthWebAuthnComponentService } from "./extension-two-factor-auth-webauthn-component.service"; describe("ExtensionTwoFactorAuthWebAuthnComponentService", () => { let extensionTwoFactorAuthWebAuthnComponentService: ExtensionTwoFactorAuthWebAuthnComponentService; - let platformUtilsService: MockProxy; - beforeEach(() => { jest.clearAllMocks(); - platformUtilsService = mock(); - extensionTwoFactorAuthWebAuthnComponentService = - new ExtensionTwoFactorAuthWebAuthnComponentService(platformUtilsService); + new ExtensionTwoFactorAuthWebAuthnComponentService(); }); describe("shouldOpenWebAuthnInNewTab", () => { - it("should return false if the browser is Chrome", () => { - // Arrange - platformUtilsService.isChrome.mockReturnValue(true); - - // Act - const result = extensionTwoFactorAuthWebAuthnComponentService.shouldOpenWebAuthnInNewTab(); - - // Assert - expect(result).toBe(false); - }); - - it("should return true if the browser is not Chrome", () => { - // Arrange - platformUtilsService.isChrome.mockReturnValue(false); - + it("should return true", () => { // Act const result = extensionTwoFactorAuthWebAuthnComponentService.shouldOpenWebAuthnInNewTab(); diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.ts index 84a54cbc12e..2af3dbe3f2b 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-webauthn-component.service.ts @@ -2,29 +2,18 @@ import { DefaultTwoFactorAuthWebAuthnComponentService, TwoFactorAuthWebAuthnComponentService, } from "@bitwarden/auth/angular"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; export class ExtensionTwoFactorAuthWebAuthnComponentService extends DefaultTwoFactorAuthWebAuthnComponentService implements TwoFactorAuthWebAuthnComponentService { - constructor(private platformUtilsService: PlatformUtilsService) { - super(); - } - /** - * In the browser extension, we open webAuthn in a new web client tab sometimes due to inline - * WebAuthn Iframe's not working in some browsers. We open a 2FA popout upon successful - * completion of WebAuthn submission with query parameters to finish the 2FA process. + * In the browser extension, we open webAuthn in a new web client tab due to inline + * WebAuthn Iframe's not working due "WebAuthn is not supported on sites with TLS certificate errors". + * We open a 2FA popout upon successful completion of WebAuthn submission with query parameters to finish the 2FA process. * @returns boolean */ shouldOpenWebAuthnInNewTab(): boolean { - const isChrome = this.platformUtilsService.isChrome(); - if (isChrome) { - // Chrome now supports WebAuthn in the iframe in the extension now. - return false; - } - return true; } } diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 22531788d37..3085dbc2f8d 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -190,7 +190,9 @@ describe("OverlayBackground", () => { inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); themeStateService = mock(); themeStateService.selectedTheme$ = selectedThemeMock$; - totpService = mock(); + totpService = mock({ + getCode$: jest.fn().mockReturnValue(of(undefined)), + }); overlayBackground = new OverlayBackground( logService, cipherService, @@ -967,7 +969,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-credit-card", - image: undefined, + image: null, imageEnabled: true, }, id: "inline-menu-cipher-0", @@ -1005,7 +1007,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-id-card", - image: undefined, + image: null, imageEnabled: true, }, id: "inline-menu-cipher-1", @@ -1046,7 +1048,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-id-card", - image: undefined, + image: null, imageEnabled: true, }, id: "inline-menu-cipher-0", @@ -1118,7 +1120,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-id-card", - image: undefined, + image: null, imageEnabled: true, }, id: "inline-menu-cipher-1", diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 1d55a154ee3..454b12cdcea 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -707,13 +707,15 @@ export class OverlayBackground implements OverlayBackgroundInterface { }; if (cipher.type === CipherType.Login) { - const totpCode = await this.totpService.getCode(cipher.login?.totp); - const totpCodeTimeInterval = this.totpService.getTimeInterval(cipher.login?.totp); + const totpResponse = cipher.login?.totp + ? await firstValueFrom(this.totpService.getCode$(cipher.login.totp)) + : undefined; + inlineMenuData.login = { username: cipher.login.username, - totp: totpCode, + totp: totpResponse?.code, totpField: this.isTotpFieldForCurrentField(), - totpCodeTimeInterval: totpCodeTimeInterval, + totpCodeTimeInterval: totpResponse?.period, passkey: hasPasskey ? { rpName: cipher.login.fido2Credentials[0].rpName, @@ -1131,9 +1133,13 @@ export class OverlayBackground implements OverlayBackgroundInterface { this.updateLastUsedInlineMenuCipher(inlineMenuCipherId, cipher); if (cipher.login?.totp) { - this.platformUtilsService.copyToClipboard( - await this.totpService.getCode(cipher.login.totp), - ); + const totpResponse = await firstValueFrom(this.totpService.getCode$(cipher.login.totp)); + + if (totpResponse?.code) { + this.platformUtilsService.copyToClipboard(totpResponse.code); + } else { + this.logService.error("Failed to get TOTP code for inline menu cipher"); + } } return; } diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts index c8cb7e81f72..61d6b9dc480 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.spec.ts @@ -1,4 +1,5 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { of } from "rxjs"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; @@ -159,19 +160,25 @@ describe("ContextMenuClickedHandler", () => { it("copies totp code to clipboard", async () => { cipherService.getAllDecrypted.mockResolvedValue([createCipher({ totp: "TEST_TOTP_SEED" })]); - totpService.getCode.mockImplementation((seed) => { + jest.spyOn(totpService, "getCode$").mockImplementation((seed: string) => { if (seed === "TEST_TOTP_SEED") { - return Promise.resolve("123456"); + return of({ + code: "123456", + period: 30, + }); } - return Promise.resolve("654321"); + return of({ + code: "654321", + period: 30, + }); }); await sut.run(createData(`${COPY_VERIFICATION_CODE_ID}_1`, COPY_VERIFICATION_CODE_ID), { url: "https://test.com", } as any); - expect(totpService.getCode).toHaveBeenCalledTimes(1); + expect(totpService.getCode$).toHaveBeenCalledTimes(1); expect(copyToClipboard).toHaveBeenCalledWith({ text: "123456", diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 69c8b6e70b8..2fb435a4c67 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -205,8 +205,9 @@ export class ContextMenuClickedHandler { action: COPY_VERIFICATION_CODE_ID, }); } else { + const totpResponse = await firstValueFrom(this.totpService.getCode$(cipher.login.totp)); this.copyToClipboard({ - text: await this.totpService.getCode(cipher.login.totp), + text: totpResponse.code, tab: tab, }); } diff --git a/apps/browser/src/autofill/content/components/buttons/action-button.ts b/apps/browser/src/autofill/content/components/buttons/action-button.ts index a9b4742b448..f0642d4233a 100644 --- a/apps/browser/src/autofill/content/components/buttons/action-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts @@ -6,27 +6,27 @@ import { Theme } from "@bitwarden/common/platform/enums"; import { border, themes, typography, spacing } from "../constants/styles"; export function ActionButton({ - buttonAction, buttonText, disabled = false, theme, + handleClick, }: { - buttonAction: (e: Event) => void; buttonText: string; disabled?: boolean; theme: Theme; + handleClick: (e: Event) => void; }) { const handleButtonClick = (event: Event) => { if (!disabled) { - buttonAction(event); + handleClick(event); } }; return html` + `; +} + +const iconSize = "15px"; + +const selectionButtonStyles = ({ + disabled, + toggledOn, + theme, +}: { + disabled: boolean; + toggledOn: boolean; + theme: Theme; +}) => css` + ${typography.body2} + + gap: ${spacing["1.5"]}; + user-select: none; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; + columns: ${iconSize} max-content ${iconSize}; + border-radius: ${border.radius.full}; + padding: ${spacing["1"]} ${spacing["2"]}; + max-height: fit-content; + overflow: hidden; + text-align: center; + text-overflow: ellipsis; + font-weight: 400; + + ${disabled + ? ` + border: 1px solid ${themes[theme].secondary["300"]}; + background-color: ${themes[theme].secondary["300"]}; + cursor: not-allowed; + color: ${themes[theme].text.muted}; + ` + : ` + border: 1px solid ${themes[theme].text.muted}; + background-color: ${toggledOn ? themes[theme].secondary["100"] : "transparent"}; + cursor: pointer; + color: ${themes[theme].text.muted}; + + :hover { + border-color: ${themes[theme].secondary["700"]}; + background-color: ${themes[theme].secondary["100"]}; + } + `} + + > svg { + max-width: ${iconSize}; + height: fit-content; + } +`; + +const dropdownButtonTextStyles = css` + overflow-x: hidden; + text-overflow: ellipsis; +`; diff --git a/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts index 38b4292f8e5..39d4dd28f24 100644 --- a/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts +++ b/apps/browser/src/autofill/content/components/cipher/cipher-indicator-icons.ts @@ -9,17 +9,17 @@ import { Business, Family } from "../../../content/components/icons"; // @TODO connect data source to icon checks // @TODO support other indicator types (attachments, etc) export function CipherInfoIndicatorIcons({ - isBusinessOrg, - isFamilyOrg, + showBusinessIcon, + showFamilyIcon, theme, }: { - isBusinessOrg?: boolean; - isFamilyOrg?: boolean; + showBusinessIcon?: boolean; + showFamilyIcon?: boolean; theme: Theme; }) { const indicatorIcons = [ - ...(isBusinessOrg ? [Business({ color: themes[theme].text.muted, theme })] : []), - ...(isFamilyOrg ? [Family({ color: themes[theme].text.muted, theme })] : []), + ...(showBusinessIcon ? [Business({ color: themes[theme].text.muted, theme })] : []), + ...(showFamilyIcon ? [Family({ color: themes[theme].text.muted, theme })] : []), ]; return indicatorIcons.length diff --git a/apps/browser/src/autofill/content/components/common-types.ts b/apps/browser/src/autofill/content/components/common-types.ts new file mode 100644 index 00000000000..df11e140d70 --- /dev/null +++ b/apps/browser/src/autofill/content/components/common-types.ts @@ -0,0 +1,28 @@ +import { TemplateResult } from "lit"; + +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { Theme } from "@bitwarden/common/platform/enums"; + +export type IconProps = { + color?: string; + disabled?: boolean; + theme: Theme; +}; + +export type Option = { + default?: boolean; + icon?: (props: IconProps) => TemplateResult; + text?: string; + value: any; +}; + +export type FolderView = { + id: string; + name: string; +}; + +export type OrgView = { + id: string; + name: string; + productTierType?: ProductTierType; +}; diff --git a/apps/browser/src/autofill/content/components/constants/styles.ts b/apps/browser/src/autofill/content/components/constants/styles.ts index cd6054e90ba..f7c9ffd4d92 100644 --- a/apps/browser/src/autofill/content/components/constants/styles.ts +++ b/apps/browser/src/autofill/content/components/constants/styles.ts @@ -124,8 +124,6 @@ export const themes = { // For compatibility system: lightTheme, - nord: lightTheme, - solarizedDark: darkTheme, }; export const spacing = { @@ -176,14 +174,17 @@ export const buildIconColorRule = (color: string, rule: RuleName = ruleNames.fil ${rule}: ${color}; `; -export function scrollbarStyles(theme: Theme) { +export function scrollbarStyles(theme: Theme, color?: { thumb?: string; track?: string }) { + const thumbColor = color?.thumb || themes[theme].secondary["500"]; + const trackColor = color?.track || themes[theme].background.alt; + return { + /* FireFox & Chrome support */ default: ` - /* FireFox & Chrome support */ - scrollbar-color: ${themes[theme].secondary["500"]} ${themes[theme].background.alt}; + scrollbar-color: ${thumbColor} ${trackColor}; `, + /* Safari Support */ safari: ` - /* Safari Support */ ::-webkit-scrollbar { overflow: auto; } @@ -193,10 +194,10 @@ export function scrollbarStyles(theme: Theme) { border-radius: 0.5rem; border-color: transparent; background-clip: content-box; - background-color: ${themes[theme].secondary["500"]}; + background-color: ${thumbColor}; } ::-webkit-scrollbar-track { - ${themes[theme].background.alt}; + ${trackColor}; } ::-webkit-scrollbar-thumb:hover { ${themes[theme].secondary["600"]}; diff --git a/apps/browser/src/autofill/content/components/dropdown-menu.ts b/apps/browser/src/autofill/content/components/dropdown-menu.ts deleted file mode 100644 index 3e3874b37d7..00000000000 --- a/apps/browser/src/autofill/content/components/dropdown-menu.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { css } from "@emotion/css"; -import { html, TemplateResult } from "lit"; - -import { Theme } from "@bitwarden/common/platform/enums"; - -import { border, themes, typography, spacing } from "./constants/styles"; -import { AngleDown } from "./icons"; - -export function DropdownMenu({ - buttonText, - icon, - disabled = false, - selectAction, - theme, -}: { - selectAction?: (e: Event) => void; - buttonText: string; - icon?: TemplateResult; - disabled?: boolean; - theme: Theme; -}) { - // @TODO placeholder/will not work; make stateful - const showDropdown = false; - const handleButtonClick = (event: Event) => { - // if (!disabled) { - // // show dropdown - // showDropdown = !showDropdown; - // this.requestUpdate(); - // } - }; - - const dropdownMenuItems: TemplateResult[] = []; - - return html` -
- - ${showDropdown - ? html`
${dropdownMenuItems}
` - : null} -
- `; -} - -const iconSize = "15px"; - -const dropdownContainerStyles = css` - display: flex; - - > div, - > button { - width: 100%; - } -`; - -const dropdownButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: Theme }) => css` - ${typography.body2} - - font-weight: 400; - gap: ${spacing["1.5"]}; - user-select: none; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - align-items: center; - justify-content: space-between; - border-radius: ${border.radius.full}; - padding: ${spacing["1"]} ${spacing["2"]}; - max-height: fit-content; - overflow: hidden; - text-align: center; - text-overflow: ellipsis; - - > svg { - max-width: ${iconSize}; - height: fit-content; - } - - ${disabled - ? ` - border: 1px solid ${themes[theme].secondary["300"]}; - background-color: ${themes[theme].secondary["300"]}; - color: ${themes[theme].text.muted}; - ` - : ` - border: 1px solid ${themes[theme].text.muted}; - background-color: transparent; - cursor: pointer; - color: ${themes[theme].text.muted}; - - :hover { - border-color: ${themes[theme].secondary["700"]}; - background-color: ${themes[theme].secondary["100"]}; - } - `} -`; - -const dropdownButtonTextStyles = css` - max-width: calc(100% - ${iconSize} - ${iconSize}); - overflow-x: hidden; - text-overflow: ellipsis; -`; - -const dropdownMenuStyles = ({ theme }: { theme: Theme }) => css` - color: ${themes[theme].text.main}; - border: 1px solid ${themes[theme].secondary["500"]}; - border-radius: 0.5rem; - background-clip: padding-box; - background-color: ${themes[theme].background.DEFAULT}; - padding: 0.25rem 0.75rem; - position: absolute; - overflow-y: auto; -`; diff --git a/apps/browser/src/autofill/content/components/icons/angle-down.ts b/apps/browser/src/autofill/content/components/icons/angle-down.ts index 4b85319c18a..db5275aafa9 100644 --- a/apps/browser/src/autofill/content/components/icons/angle-down.ts +++ b/apps/browser/src/autofill/content/components/icons/angle-down.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function AngleDown({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function AngleDown({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/angle-up.ts b/apps/browser/src/autofill/content/components/icons/angle-up.ts new file mode 100644 index 00000000000..7344123d5ad --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/angle-up.ts @@ -0,0 +1,23 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { IconProps } from "../common-types"; +import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; + +export function AngleUp({ color, disabled, theme }: IconProps) { + const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; + + return html` + + + + `; +} diff --git a/apps/browser/src/autofill/content/components/icons/business.ts b/apps/browser/src/autofill/content/components/icons/business.ts index 547ee82b547..ef8e082c21f 100644 --- a/apps/browser/src/autofill/content/components/icons/business.ts +++ b/apps/browser/src/autofill/content/components/icons/business.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function Business({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function Business({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/close.ts b/apps/browser/src/autofill/content/components/icons/close.ts index c94a4b20a6a..c9d9286ca3f 100644 --- a/apps/browser/src/autofill/content/components/icons/close.ts +++ b/apps/browser/src/autofill/content/components/icons/close.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function Close({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function Close({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts b/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts index bcc7b3d5432..d87d5621e30 100644 --- a/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts +++ b/apps/browser/src/autofill/content/components/icons/exclamation-triangle.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function ExclamationTriangle({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function ExclamationTriangle({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/family.ts b/apps/browser/src/autofill/content/components/icons/family.ts index 33e2e422ced..9870c5d37c0 100644 --- a/apps/browser/src/autofill/content/components/icons/family.ts +++ b/apps/browser/src/autofill/content/components/icons/family.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function Family({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function Family({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/folder.ts b/apps/browser/src/autofill/content/components/icons/folder.ts index 7e1f8f197f6..84577aef820 100644 --- a/apps/browser/src/autofill/content/components/icons/folder.ts +++ b/apps/browser/src/autofill/content/components/icons/folder.ts @@ -1,26 +1,17 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function Folder({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function Folder({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` - + `; diff --git a/apps/browser/src/autofill/content/components/icons/globe.ts b/apps/browser/src/autofill/content/components/icons/globe.ts index 6697fa93b70..fc0a975284d 100644 --- a/apps/browser/src/autofill/content/components/icons/globe.ts +++ b/apps/browser/src/autofill/content/components/icons/globe.ts @@ -1,19 +1,10 @@ import { css } from "@emotion/css"; import { html } from "lit"; -import { Theme } from "@bitwarden/common/platform/enums"; - +import { IconProps } from "../common-types"; import { buildIconColorRule, ruleNames, themes } from "../constants/styles"; -export function Globe({ - color, - disabled, - theme, -}: { - color?: string; - disabled?: boolean; - theme: Theme; -}) { +export function Globe({ color, disabled, theme }: IconProps) { const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; return html` diff --git a/apps/browser/src/autofill/content/components/icons/index.ts b/apps/browser/src/autofill/content/components/icons/index.ts index 6cc56e079d4..c4769a0e69d 100644 --- a/apps/browser/src/autofill/content/components/icons/index.ts +++ b/apps/browser/src/autofill/content/components/icons/index.ts @@ -1,4 +1,5 @@ export { AngleDown } from "./angle-down"; +export { AngleUp } from "./angle-up"; export { BrandIconContainer } from "./brand-icon-container"; export { Business } from "./business"; export { Close } from "./close"; diff --git a/apps/browser/src/autofill/content/components/icons/party-horn.ts b/apps/browser/src/autofill/content/components/icons/party-horn.ts index e807df1d86e..439d60a79de 100644 --- a/apps/browser/src/autofill/content/components/icons/party-horn.ts +++ b/apps/browser/src/autofill/content/components/icons/party-horn.ts @@ -1,9 +1,11 @@ import { html } from "lit"; -import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; +import { ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { IconProps } from "../common-types"; // This icon has static multi-colors for each theme -export function PartyHorn({ theme }: { theme: Theme }) { +export function PartyHorn({ theme }: IconProps) { if (theme === ThemeTypes.Dark) { return html` + `; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/cipher-indicator-icon.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/cipher-indicator-icon.mdx index 9bac07afe26..6c338276c02 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/cipher-indicator-icon.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/cipher-indicator-icon.mdx @@ -15,11 +15,11 @@ dynamically based on the provided theme. ## Props -| **Prop** | **Type** | **Required** | **Description** | -| --------------- | --------- | ------------ | ----------------------------------------------------------------------- | -| `isBusinessOrg` | `boolean` | No | Displays the business organization icon when set to `true`. | -| `isFamilyOrg` | `boolean` | No | Displays the family organization icon when set to `true`. | -| `theme` | `Theme` | Yes | Defines the theme used to style the icons. Must match the `Theme` enum. | +| **Prop** | **Type** | **Required** | **Description** | +| ------------------ | --------- | ------------ | ----------------------------------------------------------------------- | +| `showBusinessIcon` | `boolean` | No | Displays the business organization icon when set to `true`. | +| `showFamilyIcon` | `boolean` | No | Displays the family organization icon when set to `true`. | +| `theme` | `Theme` | Yes | Defines the theme used to style the icons. Must match the `Theme` enum. | ## Installation and Setup @@ -29,8 +29,8 @@ dynamically based on the provided theme. - `@emotion/css`: Used for styling. 2. Pass the required props when using the component: - - `isBusinessOrg`: A boolean that, when `true`, displays the business icon. - - `isFamilyOrg`: A boolean that, when `true`, displays the family icon. + - `showBusinessIcon`: A boolean that, when `true`, displays the business icon. + - `showFamilyIcon`: A boolean that, when `true`, displays the family icon. - `theme`: Specifies the theme for styling the icons. ## Accessibility (WCAG) Compliance @@ -57,8 +57,8 @@ import { CipherInfoIndicatorIcons } from "./cipher-info-indicator-icons"; import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; ; ``` @@ -77,5 +77,5 @@ family organization icon. ### Notes -- If neither isBusinessOrg nor isFamilyOrg is set to true, the component renders nothing. This +- If neither showBusinessIcon nor showFamilyIcon is set to true, the component renders nothing. This behavior should be handled by the parent component. diff --git a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts index 4e0efd5955c..2aa61c627b7 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts @@ -8,7 +8,7 @@ type Args = { buttonText: string; disabled: boolean; theme: Theme; - buttonAction: (e: Event) => void; + handleClick: (e: Event) => void; }; export default { @@ -17,13 +17,13 @@ export default { buttonText: { control: "text" }, disabled: { control: "boolean" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, - buttonAction: { control: false }, + handleClick: { control: false }, }, args: { buttonText: "Click Me", disabled: false, theme: ThemeTypes.Light, - buttonAction: () => alert("Clicked"), + handleClick: () => alert("Clicked"), }, parameters: { design: { diff --git a/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts index 2d031fa3afd..89c3ecbcb1c 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/ciphers/cipher-indicator-icon.lit-stories.ts @@ -6,22 +6,22 @@ import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.e import { CipherInfoIndicatorIcons } from "../../cipher/cipher-indicator-icons"; type Args = { - isBusinessOrg?: boolean; - isFamilyOrg?: boolean; + showBusinessIcon?: boolean; + showFamilyIcon?: boolean; theme: Theme; }; export default { title: "Components/Ciphers/Cipher Indicator Icon", argTypes: { - isBusinessOrg: { control: "boolean" }, - isFamilyOrg: { control: "boolean" }, + showBusinessIcon: { control: "boolean" }, + showFamilyIcon: { control: "boolean" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, }, args: { theme: ThemeTypes.Light, - isBusinessOrg: true, - isFamilyOrg: false, + showBusinessIcon: true, + showFamilyIcon: false, }, } as Meta; diff --git a/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts b/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts new file mode 100644 index 00000000000..024ac9e22b7 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts @@ -0,0 +1,68 @@ +import { ProductTierType } from "@bitwarden/common/billing/enums"; + +export const mockFolderData = [ + { + id: "unique-id1", + name: "A folder", + }, + { + id: "unique-id2", + name: "Another folder", + }, + { + id: "unique-id3", + name: "One more folder", + }, + { + id: "unique-id4", + name: "Definitely not a folder", + }, + { + id: "unique-id5", + name: "Yet another folder", + }, + { + id: "unique-id6", + name: "Something else entirely, with an essence being completely unfolder-like in all the unimportant ways and none of the important ones", + }, + { + id: "unique-id7", + name: 'A "folder"', + }, + { + id: "unique-id8", + name: "Two folders", + }, +]; + +export const mockOrganizationData = [ + { + id: "unique-id0", + name: "Another personal vault", + }, + { + id: "unique-id1", + name: "Acme, inc", + productTierType: ProductTierType.Teams, + }, + { + id: "unique-id2", + name: "A Really Long Business Name That Just Kinda Goes On For A Really Long Time", + productTierType: ProductTierType.TeamsStarter, + }, + { + id: "unique-id3", + name: "Family Vault", + productTierType: ProductTierType.Families, + }, + { + id: "unique-id4", + name: "Family Vault Trial", + productTierType: ProductTierType.Free, + }, + { + id: "unique-id5", + name: "Exciting Enterprises, LLC", + productTierType: ProductTierType.Enterprise, + }, +]; diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts index 5ad0a5a2aca..ea2bbdc2e15 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/footer.lit-stories.ts @@ -1,33 +1,29 @@ import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; -import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; +import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; -import { NotificationType } from "../../../../notification/abstractions/notification-bar"; -import { NotificationFooter } from "../../notification/footer"; - -type Args = { - notificationType: NotificationType; - theme: Theme; - handleSaveAction: (e: Event) => void; - i18n: { [key: string]: string }; -}; +import { NotificationFooter, NotificationFooterProps } from "../../notification/footer"; +import { mockFolderData, mockOrganizationData } from "../mock-data"; export default { title: "Components/Notifications/Notification Footer", argTypes: { - theme: { control: "select", options: [...Object.values(ThemeTypes)] }, notificationType: { control: "select", options: ["add", "change", "unlock", "fileless-import"], }, + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, }, args: { - theme: ThemeTypes.Light, - notificationType: "add", + folders: mockFolderData, i18n: { - saveAsNewLoginAction: "Save as New Login", saveAction: "Save", + saveAsNewLoginAction: "Save as New Login", }, + notificationType: "add", + organizations: mockOrganizationData, + theme: ThemeTypes.Light, handleSaveAction: () => alert("Save action triggered"), }, parameters: { @@ -36,10 +32,11 @@ export default { url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=32-4949&m=dev", }, }, -} as Meta; +} as Meta; -const Template = (args: Args) => NotificationFooter({ ...args }); +const Template = (args: NotificationFooterProps) => + html`
${NotificationFooter({ ...args })}
`; -export const Default: StoryObj = { +export const Default: StoryObj = { render: Template, }; diff --git a/apps/browser/src/autofill/content/components/lit-stories/options-selection/option-selection.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/options-selection/option-selection.lit-stories.ts new file mode 100644 index 00000000000..2e8b1653546 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/options-selection/option-selection.lit-stories.ts @@ -0,0 +1,81 @@ +import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; + +import { Option } from "../../common-types"; +import { themes } from "../../constants/styles"; +import { User, Business } from "../../icons"; +import "../../option-selection/option-selection"; +import { mockOrganizationData } from "../mock-data"; + +const mockOptions: Option[] = [ + { icon: User, text: "My Vault", value: "0" }, + ...mockOrganizationData.map(({ id, name }) => ({ icon: Business, text: name, value: id })), +]; + +type ComponentProps = { + disabled?: boolean; + label?: string; + options: Option[]; + theme: Theme; +}; + +export default { + title: "Components/Option Selection", + argTypes: { + disabled: { control: "boolean" }, + label: { control: "text" }, + options: { control: "object" }, + theme: { control: "select", options: [ThemeTypes.Light, ThemeTypes.Dark] }, + }, + args: { + disabled: false, + label: undefined, + options: mockOptions, + theme: ThemeTypes.Light, + }, +} as Meta; + +const BaseComponent = ({ disabled, label, options, theme }: ComponentProps) => { + return html` + + `; +}; + +export const Light: StoryObj = { + render: BaseComponent, + argTypes: { + theme: { control: "radio", options: [ThemeTypes.Light] }, + }, + args: { + theme: ThemeTypes.Light, + }, + parameters: { + backgrounds: { + values: [{ name: "Light", value: themes.light.background.alt }], + default: "Light", + }, + }, +}; + +export const Dark: StoryObj = { + render: BaseComponent, + argTypes: { + theme: { control: "radio", options: [ThemeTypes.Dark] }, + }, + args: { + theme: ThemeTypes.Dark, + }, + parameters: { + backgrounds: { + values: [{ name: "Dark", value: themes.dark.background.alt }], + default: "Dark", + }, + }, +}; diff --git a/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts index 7f833f2a1f6..83b498df7cb 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/rows/button-row.lit-stories.ts @@ -1,29 +1,53 @@ import { Meta, StoryObj } from "@storybook/web-components"; -import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; +import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; -import { ButtonRow } from "../../rows/button-row"; - -type Args = { - theme: Theme; - buttonAction: (e: Event) => void; - buttonText: string; -}; +import { themes } from "../../constants/styles"; +import { ButtonRow, ButtonRowProps } from "../../rows/button-row"; export default { title: "Components/Rows/Button Row", + argTypes: {}, + args: { + primaryButton: { + text: "Action", + handlePrimaryButtonClick: (e: Event) => { + window.alert("Button clicked!"); + }, + }, + }, +} as Meta; + +const Component = (args: ButtonRowProps) => ButtonRow({ ...args }); + +export const Light: StoryObj = { + render: Component, argTypes: { - theme: { control: "select", options: [...Object.values(ThemeTypes)] }, - buttonText: { control: "text" }, + theme: { control: "radio", options: [ThemeTypes.Light] }, }, args: { theme: ThemeTypes.Light, - buttonText: "Action", }, -} as Meta; - -const Template = (args: Args) => ButtonRow({ ...args }); - -export const Default: StoryObj = { - render: Template, + parameters: { + backgrounds: { + values: [{ name: "Light", value: themes.light.background.alt }], + default: "Light", + }, + }, +}; + +export const Dark: StoryObj = { + render: Component, + argTypes: { + theme: { control: "radio", options: [ThemeTypes.Dark] }, + }, + args: { + theme: ThemeTypes.Dark, + }, + parameters: { + backgrounds: { + values: [{ name: "Dark", value: themes.dark.background.alt }], + default: "Dark", + }, + }, }; diff --git a/apps/browser/src/autofill/content/components/notification/button-row.ts b/apps/browser/src/autofill/content/components/notification/button-row.ts new file mode 100644 index 00000000000..1eb0a4ac5f4 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/button-row.ts @@ -0,0 +1,109 @@ +import { html } from "lit"; + +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { Theme } from "@bitwarden/common/platform/enums"; + +import { Option, OrgView, FolderView } from "../common-types"; +import { Business, Family, Folder, User } from "../icons"; +import { ButtonRow } from "../rows/button-row"; + +function getVaultIconByProductTier(productTierType?: ProductTierType): Option["icon"] { + switch (productTierType) { + case ProductTierType.Free: + case ProductTierType.Families: + return Family; + case ProductTierType.Teams: + case ProductTierType.Enterprise: + case ProductTierType.TeamsStarter: + return Business; + default: + return User; + } +} + +export type NotificationButtonRowProps = { + theme: Theme; + primaryButton: { + text: string; + handlePrimaryButtonClick: (args: any) => void; + }; + folders?: FolderView[]; + organizations?: OrgView[]; +}; + +export function NotificationButtonRow({ + folders, + organizations, + primaryButton, + theme, +}: NotificationButtonRowProps) { + const currentUserVaultOption: Option = { + icon: User, + default: true, + text: "My vault", // @TODO localize + value: "0", + }; + const organizationOptions: Option[] = organizations?.length + ? organizations.reduce( + (options, { id, name, productTierType }: OrgView) => { + const icon = getVaultIconByProductTier(productTierType); + return [ + ...options, + { + icon, + text: name, + value: id, + }, + ]; + }, + [currentUserVaultOption], + ) + : ([] as Option[]); + + const noFolderOption: Option = { + default: true, + icon: Folder, + text: "No folder", // @TODO localize + value: "0", + }; + const folderOptions: Option[] = folders?.length + ? folders.reduce( + (options, { id, name }: FolderView) => [ + ...options, + { + icon: Folder, + text: name, + value: id, + }, + ], + [noFolderOption], + ) + : []; + + return html` + ${ButtonRow({ + theme, + primaryButton, + selectButtons: [ + ...(organizationOptions.length > 1 + ? [ + { + id: "organization", + label: "Vault", // @TODO localize + options: organizationOptions, + }, + ] + : []), + ...(folderOptions.length > 1 + ? [ + { + id: "folder", + label: "Folder", // @TODO localize + options: folderOptions, + }, + ] + : []), + ], + })} + `; +} diff --git a/apps/browser/src/autofill/content/components/notification/confirmation-container.ts b/apps/browser/src/autofill/content/components/notification/confirmation-container.ts index 8fdc5474486..0666859ac44 100644 --- a/apps/browser/src/autofill/content/components/notification/confirmation-container.ts +++ b/apps/browser/src/autofill/content/components/notification/confirmation-container.ts @@ -28,7 +28,7 @@ export function NotificationConfirmationContainer({ handleCloseNotification: (e: Event) => void; handleOpenVault: (e: Event) => void; } & { - error: string; + error?: string; i18n: { [key: string]: string }; type: NotificationType; username: string; diff --git a/apps/browser/src/autofill/content/components/notification/footer.ts b/apps/browser/src/autofill/content/components/notification/footer.ts index 6de4a333dfe..8ed69a96ad9 100644 --- a/apps/browser/src/autofill/content/components/notification/footer.ts +++ b/apps/browser/src/autofill/content/components/notification/footer.ts @@ -1,5 +1,5 @@ import { css } from "@emotion/css"; -import { html } from "lit"; +import { html, nothing } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; @@ -7,34 +7,44 @@ import { NotificationType, NotificationTypes, } from "../../../notification/abstractions/notification-bar"; +import { OrgView, FolderView } from "../common-types"; import { spacing, themes } from "../constants/styles"; -import { ActionRow } from "../rows/action-row"; -import { ButtonRow } from "../rows/button-row"; -export function NotificationFooter({ - handleSaveAction, - notificationType, - theme, - i18n, -}: { - handleSaveAction: (e: Event) => void; +import { NotificationButtonRow } from "./button-row"; + +export type NotificationFooterProps = { + folders?: FolderView[]; i18n: { [key: string]: string }; notificationType?: NotificationType; + organizations?: OrgView[]; theme: Theme; -}) { + handleSaveAction: (e: Event) => void; +}; + +export function NotificationFooter({ + folders, + i18n, + notificationType, + organizations, + theme, + handleSaveAction, +}: NotificationFooterProps) { const isChangeNotification = notificationType === NotificationTypes.Change; - const saveNewItemText = i18n.saveAsNewLoginAction; - const buttonText = i18n.saveAction; + const primaryButtonText = i18n.saveAction; return html`
- ${isChangeNotification - ? ActionRow({ - itemText: saveNewItemText, - handleAction: handleSaveAction, + ${!isChangeNotification + ? NotificationButtonRow({ + folders, + organizations, + primaryButton: { + handlePrimaryButtonClick: handleSaveAction, + text: primaryButtonText, + }, theme, }) - : ButtonRow({ theme, buttonAction: handleSaveAction, buttonText })} + : nothing}
`; } @@ -46,5 +56,6 @@ const notificationFooterStyles = ({ theme }: { theme: Theme }) => css` :last-child { border-radius: 0 0 ${spacing["4"]} ${spacing["4"]}; + padding-bottom: ${spacing[4]}; } `; diff --git a/apps/browser/src/autofill/content/components/option-selection/option-item.ts b/apps/browser/src/autofill/content/components/option-selection/option-item.ts new file mode 100644 index 00000000000..619d77e63d3 --- /dev/null +++ b/apps/browser/src/autofill/content/components/option-selection/option-item.ts @@ -0,0 +1,81 @@ +import createEmotion from "@emotion/css/create-instance"; +import { html, nothing } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { IconProps, Option } from "../common-types"; +import { themes, spacing } from "../constants/styles"; + +export const optionItemTagName = "option-item"; + +const { css } = createEmotion({ + key: optionItemTagName, +}); + +export function OptionItem({ + icon, + text, + value, + theme, + handleSelection, +}: Option & { + theme: Theme; + handleSelection: () => void; +}) { + const handleSelectionKeyUpProxy = (event: KeyboardEvent) => { + const listenedForKeys = new Set(["Enter", "Space"]); + if (listenedForKeys.has(event.code) && event.target instanceof Element) { + handleSelection(); + } + + return; + }; + + const iconProps: IconProps = { color: themes[theme].text.main, theme }; + const itemIcon = icon?.(iconProps); + + return html`
+ ${itemIcon ? html`
${itemIcon}
` : nothing} + ${text || value} +
`; +} + +export const optionItemIconWidth = 16; +const optionItemGap = spacing["2"]; + +const optionItemStyles = css` + gap: ${optionItemGap}; + user-select: none; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; + cursor: pointer; +`; + +const optionItemIconContainerStyles = css` + flex-grow: 1; + flex-shrink: 1; + width: ${optionItemIconWidth}px; + height: ${optionItemIconWidth}px; + + > svg { + width: 100%; + height: fit-content; + } +`; + +const optionItemTextStyles = css` + flex: 1 1 calc(100% - ${optionItemIconWidth}px - ${optionItemGap}); + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; diff --git a/apps/browser/src/autofill/content/components/option-selection/option-items.ts b/apps/browser/src/autofill/content/components/option-selection/option-items.ts new file mode 100644 index 00000000000..b87eea2a3a5 --- /dev/null +++ b/apps/browser/src/autofill/content/components/option-selection/option-items.ts @@ -0,0 +1,90 @@ +import createEmotion from "@emotion/css/create-instance"; +import { html, nothing } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { Option } from "../common-types"; +import { themes, typography, scrollbarStyles, spacing } from "../constants/styles"; + +import { OptionItem, optionItemTagName } from "./option-item"; + +export const optionItemsTagName = "option-items"; + +const { css } = createEmotion({ + key: optionItemsTagName, +}); + +export function OptionItems({ + theme, + topOffset, + label, + options, + handleOptionSelection, +}: { + theme: Theme; + topOffset: number; + label?: string; + options: Option[]; + handleOptionSelection: (selectedOption: Option) => void; +}) { + // @TODO get client vendor from context + const isSafari = false; + + return html` +
+ ${label ? html`
${label}
` : nothing} +
+ ${options.map((option) => + OptionItem({ ...option, theme, handleSelection: () => handleOptionSelection(option) }), + )} +
+
+ `; +} + +const optionsStyles = ({ theme, topOffset }: { theme: Theme; topOffset: number }) => css` + ${typography.body1} + + -webkit-font-smoothing: antialiased; + position: absolute; + /* top offset + line-height of dropdown button + top and bottom padding of button + border-width */ + top: calc(${topOffset}px + 20px + ${spacing["1"]} + ${spacing["1"]} + 1px); + border: 1px solid ${themes[theme].secondary["500"]}; + border-radius: 0.5rem; + background-clip: padding-box; + background-color: ${themes[theme].background.DEFAULT}; + padding: 0.25rem 0; + max-width: fit-content; + overflow-y: hidden; + color: ${themes[theme].text.main}; +`; + +const optionsLabelStyles = ({ theme }: { theme: Theme }) => css` + ${typography.helperMedium} + + user-select: none; + padding: 0.375rem ${spacing["3"]}; + color: ${themes[theme].text.muted}; + font-weight: 600; +`; + +export const optionsMenuItemMaxWidth = 260; +export const optionsMenuItemsMaxHeight = 114; + +const optionsWrapper = ({ isSafari, theme }: { isSafari: boolean; theme: Theme }) => css` + max-height: ${optionsMenuItemsMaxHeight}px; + overflow-y: auto; + + > [class*="${optionItemTagName}-"] { + padding: ${spacing["1.5"]} ${spacing["3"]}; + max-width: ${optionsMenuItemMaxWidth}px; + + :hover { + background-color: ${themes[theme].primary["100"]}; + } + } + + ${isSafari + ? scrollbarStyles(theme, { track: "transparent" }).safari + : scrollbarStyles(theme, { track: "transparent" }).default} +`; diff --git a/apps/browser/src/autofill/content/components/option-selection/option-selection.ts b/apps/browser/src/autofill/content/components/option-selection/option-selection.ts new file mode 100644 index 00000000000..5f43e7a0256 --- /dev/null +++ b/apps/browser/src/autofill/content/components/option-selection/option-selection.ts @@ -0,0 +1,138 @@ +import createEmotion from "@emotion/css/create-instance"; +import { html, LitElement, nothing } from "lit"; +import { property, state } from "lit/decorators.js"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { OptionSelectionButton } from "../buttons/option-selection-button"; +import { Option } from "../common-types"; + +import { optionItemIconWidth } from "./option-item"; +import { OptionItems, optionsMenuItemMaxWidth } from "./option-items"; + +export const optionSelectionTagName = "option-selection"; + +const { css } = createEmotion({ + key: optionSelectionTagName, +}); + +export class OptionSelection extends LitElement { + @property() + disabled: boolean = false; + + @property() + label?: string; + + @property({ type: Array }) + options: Option[] = []; + + @property() + theme: Theme = ThemeTypes.Light; + + @property({ type: (selectedOption: Option["value"]) => selectedOption }) + handleSelectionUpdate?: (args: any) => void; + + @state() + private showMenu = false; + + @state() + private menuTopOffset: number = 0; + + // Determines if the opened menu should be "anchored" to the right or left side of the opening button + @state() + private menuIsEndJustified: boolean = false; + + @state() + private selection?: Option; + + private handleButtonClick = (event: Event) => { + if (!this.disabled) { + // Menu is about to be shown + if (!this.showMenu) { + this.menuTopOffset = this.offsetTop; + + // Distance from right edge of button to left edge of the viewport + // Assumes no enclosing frames between the intended host frame and the component + const boundingClientRect = this.getBoundingClientRect(); + + // Width of the client (minus scrollbar) + const documentWidth = document.documentElement.clientWidth; + + // Distance between left edge of the button and right edge of the viewport + // (e.g. the max space the menu can use when left-aligned) + const distanceFromViewportRightEdge = documentWidth - boundingClientRect.left; + + // The full width the option menu can take up + // (base + icon + border + gap + padding) + const maxDifferenceThreshold = + optionsMenuItemMaxWidth + optionItemIconWidth + 2 + 8 + 12 * 2; + + this.menuIsEndJustified = distanceFromViewportRightEdge < maxDifferenceThreshold; + } + + this.showMenu = !this.showMenu; + } + }; + + private handleOptionSelection = (selectedOption: Option) => { + this.showMenu = false; + this.selection = selectedOption; + + // Any side-effects that should occur from the selection + this.handleSelectionUpdate?.(selectedOption.value); + }; + + protected createRenderRoot() { + return this; + } + + render() { + if (!this.selection) { + this.selection = getDefaultOption(this.options); + } + + return html` +
+ ${OptionSelectionButton({ + disabled: this.disabled, + icon: this.selection?.icon, + text: this.selection?.text, + theme: this.theme, + toggledOn: this.showMenu, + handleButtonClick: this.handleButtonClick, + })} + ${this.showMenu + ? OptionItems({ + label: this.label, + options: this.options, + theme: this.theme, + topOffset: this.menuTopOffset, + handleOptionSelection: this.handleOptionSelection, + }) + : nothing} +
+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + [optionSelectionTagName]: OptionSelection; + } +} + +export default customElements.define(optionSelectionTagName, OptionSelection); + +function getDefaultOption(options: Option[] = []) { + return options.find((option: Option) => option.default) || options[0]; +} + +const optionSelectionStyles = ({ menuIsEndJustified }: { menuIsEndJustified: boolean }) => css` + display: flex; + justify-content: ${menuIsEndJustified ? "flex-end" : "flex-start"}; + + > div, + > button { + width: 100%; + } +`; diff --git a/apps/browser/src/autofill/content/components/rows/button-row.ts b/apps/browser/src/autofill/content/components/rows/button-row.ts index 1feef016a81..80dcd0de125 100644 --- a/apps/browser/src/autofill/content/components/rows/button-row.ts +++ b/apps/browser/src/autofill/content/components/rows/button-row.ts @@ -1,54 +1,53 @@ import { css } from "@emotion/css"; -import { html, TemplateResult } from "lit"; +import { html, nothing } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; import { ActionButton } from "../../../content/components/buttons/action-button"; -import { spacing, themes } from "../../../content/components/constants/styles"; -import { Folder, User } from "../../../content/components/icons"; -import { DropdownMenu } from "../dropdown-menu"; +import { spacing } from "../../../content/components/constants/styles"; +import { Option } from "../common-types"; +import { optionSelectionTagName } from "../option-selection/option-selection"; -export function ButtonRow({ - theme, - buttonAction, - buttonText, -}: { +export type ButtonRowProps = { theme: Theme; - buttonAction: (e: Event) => void; - buttonText: string; -}) { + primaryButton: { + text: string; + handlePrimaryButtonClick: (args: any) => void; + }; + selectButtons?: { + id: string; + label?: string; + options: Option[]; + handleSelectionUpdate?: (args: any) => void; + }[]; +}; + +export function ButtonRow({ theme, primaryButton, selectButtons }: ButtonRowProps) { return html`
- ${[ - ActionButton({ - buttonAction: buttonAction, - buttonText, - theme, - }), - DropdownContainer({ - children: [ - DropdownMenu({ - buttonText: "You", - icon: User({ color: themes[theme].text.muted, theme }), - theme, - }), - DropdownMenu({ - buttonText: "Folder", - icon: Folder({ color: themes[theme].text.muted, theme }), - disabled: true, - theme, - }), - ], - }), - ]} + ${ActionButton({ + handleClick: primaryButton.handlePrimaryButtonClick, + buttonText: primaryButton.text, + theme, + })} +
+ ${selectButtons?.map( + ({ id, label, options, handleSelectionUpdate }) => + html` + + ` || nothing, + )} +
`; } -function DropdownContainer({ children }: { children: TemplateResult[] }) { - return html`
${children}
`; -} - const buttonRowStyles = css` gap: 16px; display: flex; @@ -57,6 +56,7 @@ const buttonRowStyles = css` width: 100%; max-height: 52px; white-space: nowrap; + padding-top: ${spacing[1]}; > button { max-width: min-content; @@ -68,14 +68,16 @@ const buttonRowStyles = css` } `; -const dropdownContainerStyles = css` - gap: 8px; +const optionSelectionsStyles = css` + gap: ${spacing["2"]}; display: flex; align-items: center; justify-content: flex-end; overflow: hidden; - > div { - min-width: calc(50% - ${spacing["1.5"]}); + > ${optionSelectionTagName} { + /* assumes two option selections */ + max-width: calc(50% - ${spacing["1.5"]}); + min-width: 120px; } `; diff --git a/apps/browser/src/autofill/content/content-message-handler.ts b/apps/browser/src/autofill/content/content-message-handler.ts index 5f98cf348a3..55e0c071a55 100644 --- a/apps/browser/src/autofill/content/content-message-handler.ts +++ b/apps/browser/src/autofill/content/content-message-handler.ts @@ -5,6 +5,21 @@ import { ContentMessageWindowEventHandlers, } from "./abstractions/content-message-handler"; +/** + * Handlers for window messages from the content script. + * NOTE: These handlers should be above the event listener to ensure they are defined before being used. + */ +const windowMessageHandlers: ContentMessageWindowEventHandlers = { + authResult: ({ data, referrer }: { data: any; referrer: string }) => + handleAuthResultMessage(data, referrer), + webAuthnResult: ({ data, referrer }: { data: any; referrer: string }) => + handleWebAuthnResultMessage(data, referrer), + [VaultMessages.checkBwInstalled]: () => handleExtensionInstallCheck(), + duoResult: ({ data, referrer }: { data: any; referrer: string }) => + handleDuoResultMessage(data, referrer), + [VaultMessages.OpenPopup]: () => handleOpenPopupMessage(), +}; + /** * IMPORTANT: Safari seems to have a bug where it doesn't properly handle * window message events from content scripts when the listener these events @@ -18,20 +33,6 @@ setupExtensionDisconnectAction(() => { chrome.runtime.onMessage.removeListener(handleExtensionMessage); }); -/** - * Handlers for window messages from the content script. - */ -const windowMessageHandlers: ContentMessageWindowEventHandlers = { - authResult: ({ data, referrer }: { data: any; referrer: string }) => - handleAuthResultMessage(data, referrer), - webAuthnResult: ({ data, referrer }: { data: any; referrer: string }) => - handleWebAuthnResultMessage(data, referrer), - [VaultMessages.checkBwInstalled]: () => handleExtensionInstallCheck(), - duoResult: ({ data, referrer }: { data: any; referrer: string }) => - handleDuoResultMessage(data, referrer), - [VaultMessages.OpenPopup]: () => handleOpenPopupMessage(), -}; - /** * Handles the post to the web vault showing the extension has been installed */ diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 58480cd6d83..ae489ea956b 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -845,6 +845,7 @@ async function loadNotificationBar() { theme: typeData.theme, removeIndividualVault: typeData.removeIndividualVault, importType: typeData.importType, + launchTimestamp: typeData.launchTimestamp, }; const notificationBarUrl = "notification/bar.html"; @@ -873,11 +874,32 @@ async function loadNotificationBar() { const barPageUrl: string = chrome.runtime.getURL(barPage); function getIframeStyle(useComponentBar: boolean): string { - return ( - (useComponentBar - ? "height: calc(276px + 25px); width: 450px; right: 0;" - : "height: 42px; width: 100%;") + " border: 0; min-height: initial;" - ); + const isNotificationFresh = + notificationBarInitData.launchTimestamp && + Date.now() - notificationBarInitData.launchTimestamp < 500; + + const baseStyle = useComponentBar + ? isNotificationFresh + ? "height: calc(276px + 25px); 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%;"; + + const transitionStyle = + isNotificationFresh && useComponentBar + ? "transition: transform 0.15s ease-in, opacity 0.15s ease; transform:translateX(0%); opacity:1; transition-delay: 0.25s;" + : ""; + + notificationBarIframe.style.cssText = baseStyle + " border: 0; min-height: initial;"; + + if (isNotificationFresh && useComponentBar) { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + notificationBarIframe.style.cssText += transitionStyle; + }); + }); + } + + return baseStyle + " border: 0; min-height: initial;"; } notificationBarIframe = document.createElement("iframe"); diff --git a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts index 497664542ad..128dd189878 100644 --- a/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts +++ b/apps/browser/src/autofill/deprecated/background/overlay.background.deprecated.spec.ts @@ -355,7 +355,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-credit-card", - image: undefined, + image: null, imageEnabled: true, }, id: "overlay-cipher-2", @@ -370,7 +370,7 @@ describe("OverlayBackground", () => { icon: { fallbackImage: "", icon: "bwi-credit-card", - image: undefined, + image: null, imageEnabled: true, }, id: "overlay-cipher-3", @@ -479,7 +479,6 @@ describe("OverlayBackground", () => { it("will set up onMessage and onConnect listeners", () => { overlayBackground["setupExtensionMessageListeners"](); - // eslint-disable-next-line expect(chrome.runtime.onMessage.addListener).toHaveBeenCalled(); expect(chrome.runtime.onConnect.addListener).toHaveBeenCalled(); }); diff --git a/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.spec.ts b/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.spec.ts index 67f7ed66885..e79cba71763 100644 --- a/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.spec.ts +++ b/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.spec.ts @@ -277,32 +277,6 @@ describe("AutofillOverlayIframeService", () => { borderColor: "#4c525f", }); }); - - it("updates the border to match the `nord` theme", () => { - const message = { - command: "initAutofillOverlayList", - theme: ThemeType.Nord, - }; - - sendPortMessage(portSpy, message); - - expect(updateElementStylesSpy).toBeCalledWith(autofillOverlayIframeService["iframe"], { - borderColor: "#2E3440", - }); - }); - - it("updates the border to match the `solarizedDark` theme", () => { - const message = { - command: "initAutofillOverlayList", - theme: ThemeType.SolarizedDark, - }; - - sendPortMessage(portSpy, message); - - expect(updateElementStylesSpy).toBeCalledWith(autofillOverlayIframeService["iframe"], { - borderColor: "#073642", - }); - }); }); describe("updating the iframe's position", () => { diff --git a/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.ts b/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.ts index 402c384b8be..e0df9eb60b6 100644 --- a/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.ts +++ b/apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.ts @@ -221,12 +221,6 @@ class AutofillOverlayIframeService implements AutofillOverlayIframeServiceInterf if (verifiedTheme === ThemeTypes.Dark) { borderColor = "#4c525f"; } - if (theme === ThemeTypes.Nord) { - borderColor = "#2E3440"; - } - if (theme === ThemeTypes.SolarizedDark) { - borderColor = "#073642"; - } if (borderColor) { this.updateElementStyles(this.iframe, { borderColor }); } diff --git a/apps/browser/src/autofill/notification/bar.scss b/apps/browser/src/autofill/notification/bar.scss index cd995a115ff..2f1a7f1d318 100644 --- a/apps/browser/src/autofill/notification/bar.scss +++ b/apps/browser/src/autofill/notification/bar.scss @@ -334,19 +334,3 @@ button { } } } - -.theme_solarizedDark { - .notification-bar-redesign #content .inner-wrapper { - #select-folder { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nbm9uZSc+PHBhdGggc3Ryb2tlPScjZWVlOGQ1JyBkPSdtNSA2IDMgMyAzLTMnLz48L3N2Zz4="); - } - } -} - -.theme_nord { - .notification-bar-redesign #content .inner-wrapper { - #select-folder { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgZmlsbD0nbm9uZSc+PHBhdGggc3Ryb2tlPScjRTVFOUYwJyBkPSdtNSA2IDMgMyAzLTMnLz48L3N2Zz4="); - } - } -} diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index c3f29e1332f..617b1e58c14 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { render } from "lit"; import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; @@ -72,12 +70,51 @@ function getI18n() { saveFailure: chrome.i18n.getMessage("saveFailure"), saveFailureDetails: chrome.i18n.getMessage("saveFailureDetails"), saveLoginPrompt: chrome.i18n.getMessage("saveLoginPrompt"), + typeLogin: chrome.i18n.getMessage("typeLogin"), updateLoginAction: chrome.i18n.getMessage("updateLoginAction"), updateLoginPrompt: chrome.i18n.getMessage("updateLoginPrompt"), view: chrome.i18n.getMessage("view"), }; } +/** + * Attempts to locate an element by ID within a template’s content and casts it to the specified type. + * + * @param templateElement - The template whose content will be searched for the element. + * @param elementId - The ID of the element being searched for. + * @returns The typed element if found, otherwise log error. + * + */ +const findElementById = ( + templateElement: HTMLTemplateElement, + elementId: string, +): ElementType => { + const element = templateElement.content.getElementById(elementId); + if (!element) { + throw new Error(`Element with ID "${elementId}" not found in template.`); + } + return element as ElementType; +}; + +/** + * Sets the text content of an element identified by ID within a template's content. + * + * @param template - The template whose content will be searched for the element. + * @param elementId - The ID of the element whose text content is to be set. + * @param text - The text content to set for the specified element. + * @returns void + * + * This function attempts to locate an element by its ID within the content of a given HTML template. + * If the element is found, it updates the element's text content with the provided text. + * If the element is not found, the function does nothing, ensuring that the operation is safe and does not throw errors. + */ +function setElementText(template: HTMLTemplateElement, elementId: string, text: string): void { + const element = template.content.getElementById(elementId); + if (element) { + element.textContent = text; + } +} + function initNotificationBar(message: NotificationBarWindowMessage) { const { initData } = message; if (!initData) { @@ -87,7 +124,7 @@ function initNotificationBar(message: NotificationBarWindowMessage) { notificationBarIframeInitData = initData; const { isVaultLocked, theme } = notificationBarIframeInitData; const i18n = getI18n(); - const resolvedTheme = getResolvedTheme(theme); + const resolvedTheme = getResolvedTheme(theme ?? ThemeTypes.Light); if (useComponentBar) { document.body.innerHTML = ""; @@ -122,45 +159,47 @@ function initNotificationBar(message: NotificationBarWindowMessage) { // i18n for "Add" template const addTemplate = document.getElementById("template-add") as HTMLTemplateElement; - const neverButton = addTemplate.content.getElementById("never-save"); + const neverButton = findElementById(addTemplate, "never-save"); neverButton.textContent = i18n.never; - const selectFolder = addTemplate.content.getElementById("select-folder"); + const selectFolder = findElementById(addTemplate, "select-folder"); selectFolder.hidden = isVaultLocked || removeIndividualVault(); selectFolder.setAttribute("aria-label", i18n.folder); - const addButton = addTemplate.content.getElementById("add-save"); + const addButton = findElementById(addTemplate, "add-save"); addButton.textContent = i18n.notificationAddSave; - const addEditButton = addTemplate.content.getElementById("add-edit"); + const addEditButton = findElementById(addTemplate, "add-edit"); // If Remove Individual Vault policy applies, "Add" opens the edit tab, so we hide the Edit button addEditButton.hidden = removeIndividualVault(); addEditButton.textContent = i18n.notificationEdit; - addTemplate.content.getElementById("add-text").textContent = i18n.notificationAddDesc; + setElementText(addTemplate, "add-text", i18n.notificationAddDesc); // i18n for "Change" (update password) template const changeTemplate = document.getElementById("template-change") as HTMLTemplateElement; - const changeButton = changeTemplate.content.getElementById("change-save"); + const changeButton = findElementById(changeTemplate, "change-save"); changeButton.textContent = i18n.notificationChangeSave; - const changeEditButton = changeTemplate.content.getElementById("change-edit"); + const changeEditButton = findElementById(changeTemplate, "change-edit"); changeEditButton.textContent = i18n.notificationEdit; - changeTemplate.content.getElementById("change-text").textContent = i18n.notificationChangeDesc; + setElementText(changeTemplate, "change-text", i18n.notificationChangeDesc); // i18n for "Unlock" (unlock extension) template const unlockTemplate = document.getElementById("template-unlock") as HTMLTemplateElement; - const unlockButton = unlockTemplate.content.getElementById("unlock-vault"); + const unlockButton = findElementById(unlockTemplate, "unlock-vault"); unlockButton.textContent = i18n.notificationUnlock; - unlockTemplate.content.getElementById("unlock-text").textContent = i18n.notificationUnlockDesc; + setElementText(unlockTemplate, "unlock-text", i18n.notificationUnlockDesc); // i18n for body content const closeButton = document.getElementById("close-button"); - closeButton.title = i18n.close; + if (closeButton) { + closeButton.title = i18n.close; + } const notificationType = initData.type; if (notificationType === "add") { @@ -171,13 +210,13 @@ function initNotificationBar(message: NotificationBarWindowMessage) { handleTypeUnlock(); } - closeButton.addEventListener("click", handleCloseNotification); + closeButton?.addEventListener("click", handleCloseNotification); globalThis.addEventListener("resize", adjustHeight); adjustHeight(); } function handleEditOrUpdateAction(e: Event) { - const notificationType = initData.type; + const notificationType = initData?.type; e.preventDefault(); notificationType === "add" ? sendSaveCipherMessage(true) : sendSaveCipherMessage(false); } @@ -202,7 +241,7 @@ function handleTypeAdd() { setContent(document.getElementById("template-add") as HTMLTemplateElement); const addButton = document.getElementById("add-save"); - addButton.addEventListener("click", (e) => { + addButton?.addEventListener("click", (e) => { e.preventDefault(); // If Remove Individual Vault policy applies, "Add" opens the edit tab @@ -215,14 +254,14 @@ function handleTypeAdd() { } const editButton = document.getElementById("add-edit"); - editButton.addEventListener("click", (e) => { + editButton?.addEventListener("click", (e) => { e.preventDefault(); sendSaveCipherMessage(true, getSelectedFolder()); }); const neverButton = document.getElementById("never-save"); - neverButton.addEventListener("click", (e) => { + neverButton?.addEventListener("click", (e) => { e.preventDefault(); sendPlatformMessage({ command: "bgNeverSave", @@ -235,14 +274,14 @@ function handleTypeAdd() { function handleTypeChange() { setContent(document.getElementById("template-change") as HTMLTemplateElement); const changeButton = document.getElementById("change-save"); - changeButton.addEventListener("click", (e) => { + changeButton?.addEventListener("click", (e) => { e.preventDefault(); sendSaveCipherMessage(false); }); const editButton = document.getElementById("change-edit"); - editButton.addEventListener("click", (e) => { + editButton?.addEventListener("click", (e) => { e.preventDefault(); sendSaveCipherMessage(true); @@ -264,7 +303,7 @@ function handleSaveCipherAttemptCompletedMessage(message: NotificationBarWindowM addSaveButtonContainers.forEach((element) => { element.textContent = chrome.i18n.getMessage("saveCipherAttemptFailed"); element.classList.add("error-message"); - notificationBarOuterWrapper.classList.add("error-event"); + notificationBarOuterWrapper?.classList.add("error-event"); }); adjustHeight(); @@ -278,7 +317,7 @@ function handleSaveCipherAttemptCompletedMessage(message: NotificationBarWindowM element.textContent = chrome.i18n.getMessage(messageName); element.prepend(buildSvgDomElement(circleCheckIcon)); element.classList.add("success-message"); - notificationBarOuterWrapper.classList.add("success-event"); + notificationBarOuterWrapper?.classList.add("success-event"); }); adjustHeight(); globalThis.setTimeout( @@ -299,7 +338,7 @@ function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { const { theme, type } = notificationBarIframeInitData; const { error, username, cipherId } = message; const i18n = getI18n(); - const resolvedTheme = getResolvedTheme(theme); + const resolvedTheme = getResolvedTheme(theme ?? ThemeTypes.Light); globalThis.setTimeout(() => sendPlatformMessage({ command: "bgCloseNotificationBar" }), 5000); @@ -311,8 +350,8 @@ function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { handleCloseNotification, i18n, error, - username, - handleOpenVault: (e) => openViewVaultItemPopout(e, cipherId), + username: username ?? i18n.typeLogin, + handleOpenVault: (e) => cipherId && openViewVaultItemPopout(e, cipherId), }), document.body, ); @@ -322,7 +361,7 @@ function handleTypeUnlock() { setContent(document.getElementById("template-unlock") as HTMLTemplateElement); const unlockButton = document.getElementById("unlock-vault"); - unlockButton.addEventListener("click", (e) => { + unlockButton?.addEventListener("click", (e) => { sendPlatformMessage({ command: "bgReopenUnlockPopout", }); @@ -331,12 +370,12 @@ function handleTypeUnlock() { function setContent(template: HTMLTemplateElement) { const content = document.getElementById("content"); - while (content.firstChild) { - content.removeChild(content.firstChild); + while (content?.firstChild) { + content?.removeChild(content.firstChild); } const newElement = template.content.cloneNode(true) as HTMLElement; - content.appendChild(newElement); + content?.appendChild(newElement); } function sendPlatformMessage( @@ -353,13 +392,17 @@ function sendPlatformMessage( function loadFolderSelector() { const populateFolderData = (folderData: FolderView[]) => { const select = document.getElementById("select-folder"); + if (!select) { + return; + } + if (!folderData?.length) { - select.appendChild(new Option(chrome.i18n.getMessage("noFoldersFound"), null, true)); + select.appendChild(new Option(chrome.i18n.getMessage("noFoldersFound"), undefined, true)); select.setAttribute("disabled", "true"); return; } - select.appendChild(new Option(chrome.i18n.getMessage("selectFolder"), null, true)); + select.appendChild(new Option(chrome.i18n.getMessage("selectFolder"), undefined, true)); folderData.forEach((folder: FolderView) => { // Select "No Folder" (id=null) folder by default select.appendChild(new Option(folder.name, folder.id || "", false)); @@ -374,12 +417,16 @@ function getSelectedFolder(): string { } function removeIndividualVault(): boolean { - return notificationBarIframeInitData.removeIndividualVault; + return Boolean(notificationBarIframeInitData?.removeIndividualVault); } function adjustHeight() { + const body = document.querySelector("body"); + if (!body) { + return; + } const data: AdjustNotificationBarMessageData = { - height: document.querySelector("body").scrollHeight, + height: body.scrollHeight, }; sendPlatformMessage({ command: "bgAdjustNotificationBar", diff --git a/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.spec.ts b/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.spec.ts index 7d7b48f83cb..9f2947c2e99 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.spec.ts +++ b/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.spec.ts @@ -302,38 +302,6 @@ describe("AutofillInlineMenuIframeService", () => { }, ); }); - - it("updates the border to match the `nord` theme", () => { - const message = { - command: "initAutofillInlineMenuList", - theme: ThemeType.Nord, - }; - - sendPortMessage(portSpy, message); - - expect(updateElementStylesSpy).toHaveBeenCalledWith( - autofillInlineMenuIframeService["iframe"], - { - borderColor: "#2E3440", - }, - ); - }); - - it("updates the border to match the `solarizedDark` theme", () => { - const message = { - command: "initAutofillInlineMenuList", - theme: ThemeType.SolarizedDark, - }; - - sendPortMessage(portSpy, message); - - expect(updateElementStylesSpy).toHaveBeenCalledWith( - autofillInlineMenuIframeService["iframe"], - { - borderColor: "#073642", - }, - ); - }); }); describe("updating the iframe's position", () => { diff --git a/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.ts b/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.ts index 72bf631f50b..9a9821f643c 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.ts +++ b/apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.ts @@ -250,12 +250,6 @@ export class AutofillInlineMenuIframeService implements AutofillInlineMenuIframe if (verifiedTheme === ThemeTypes.Dark) { borderColor = "#4c525f"; } - if (theme === ThemeTypes.Nord) { - borderColor = "#2E3440"; - } - if (theme === ThemeTypes.SolarizedDark) { - borderColor = "#073642"; - } if (borderColor) { this.updateElementStyles(this.iframe, { borderColor }); } diff --git a/apps/browser/src/autofill/popup/fido2/fido2.component.ts b/apps/browser/src/autofill/popup/fido2/fido2.component.ts index 24c14c98685..0471d460fd5 100644 --- a/apps/browser/src/autofill/popup/fido2/fido2.component.ts +++ b/apps/browser/src/autofill/popup/fido2/fido2.component.ts @@ -389,11 +389,14 @@ export class Fido2Component implements OnInit, OnDestroy { } protected async search() { + const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.hasSearched = true; - const isSearchable = await this.searchService.isSearchable(this.searchText); + const isSearchable = await this.searchService.isSearchable(userId, this.searchText); if (isSearchable) { this.displayedCiphers = await this.searchService.searchCiphers( + userId, this.searchText, null, this.ciphers, diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index f0b73838ba4..7bd6c93bb64 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -364,7 +364,7 @@ export class AutofillComponent implements OnInit { return; } - BrowserApi.updateDefaultBrowserAutofillSettings(!this.defaultBrowserAutofillDisabled); + await BrowserApi.updateDefaultBrowserAutofillSettings(!this.defaultBrowserAutofillDisabled); } private handleOverrideDialogAccept = async () => { diff --git a/apps/browser/src/autofill/popup/settings/blocked-domains.component.html b/apps/browser/src/autofill/popup/settings/blocked-domains.component.html index 302b14247e9..8156525301b 100644 --- a/apps/browser/src/autofill/popup/settings/blocked-domains.component.html +++ b/apps/browser/src/autofill/popup/settings/blocked-domains.component.html @@ -76,5 +76,8 @@ > {{ "save" | i18n }} + diff --git a/apps/browser/src/autofill/popup/settings/blocked-domains.component.ts b/apps/browser/src/autofill/popup/settings/blocked-domains.component.ts index 16e4b6f6751..c59ce24c7c4 100644 --- a/apps/browser/src/autofill/popup/settings/blocked-domains.component.ts +++ b/apps/browser/src/autofill/popup/settings/blocked-domains.component.ts @@ -39,6 +39,7 @@ import { PopOutComponent } from "../../../platform/popup/components/pop-out.comp import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; @Component({ selector: "app-blocked-domains", @@ -88,6 +89,7 @@ export class BlockedDomainsComponent implements AfterViewInit, OnDestroy { private i18nService: I18nService, private toastService: ToastService, private formBuilder: FormBuilder, + private popupRouterCacheService: PopupRouterCacheService, ) {} get domainForms() { @@ -220,6 +222,10 @@ export class BlockedDomainsComponent implements AfterViewInit, OnDestroy { } } + async goBack() { + await this.popupRouterCacheService.back(); + } + trackByFunction(index: number, _: string) { return index; } diff --git a/apps/browser/src/autofill/popup/settings/excluded-domains.component.html b/apps/browser/src/autofill/popup/settings/excluded-domains.component.html index 92abef3730c..a963c2608a6 100644 --- a/apps/browser/src/autofill/popup/settings/excluded-domains.component.html +++ b/apps/browser/src/autofill/popup/settings/excluded-domains.component.html @@ -72,5 +72,8 @@ > {{ "save" | i18n }} + diff --git a/apps/browser/src/autofill/popup/settings/excluded-domains.component.ts b/apps/browser/src/autofill/popup/settings/excluded-domains.component.ts index 0447d8076c2..504d2dbfc17 100644 --- a/apps/browser/src/autofill/popup/settings/excluded-domains.component.ts +++ b/apps/browser/src/autofill/popup/settings/excluded-domains.component.ts @@ -40,6 +40,7 @@ import { PopOutComponent } from "../../../platform/popup/components/pop-out.comp import { PopupFooterComponent } from "../../../platform/popup/layout/popup-footer.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; +import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; @Component({ selector: "app-excluded-domains", @@ -90,6 +91,7 @@ export class ExcludedDomainsComponent implements AfterViewInit, OnDestroy { private i18nService: I18nService, private toastService: ToastService, private formBuilder: FormBuilder, + private popupRouterCacheService: PopupRouterCacheService, ) { this.accountSwitcherEnabled = enableAccountSwitching(); } @@ -150,6 +152,10 @@ export class ExcludedDomainsComponent implements AfterViewInit, OnDestroy { await this.fieldChange(); } + async goBack() { + await this.popupRouterCacheService.back(); + } + async fieldChange() { if (this.dataIsPristine) { this.dataIsPristine = false; diff --git a/apps/browser/src/autofill/services/autofill.service.spec.ts b/apps/browser/src/autofill/services/autofill.service.spec.ts index 3843734ad64..7bc66ea322c 100644 --- a/apps/browser/src/autofill/services/autofill.service.spec.ts +++ b/apps/browser/src/autofill/services/autofill.service.spec.ts @@ -921,12 +921,12 @@ describe("AutofillService", () => { .spyOn(billingAccountProfileStateService, "hasPremiumFromAnySource$") .mockImplementation(() => of(true)); jest.spyOn(autofillService, "getShouldAutoCopyTotp").mockResolvedValue(true); - jest.spyOn(totpService, "getCode").mockResolvedValue(totpCode); + totpService.getCode$.mockReturnValue(of({ code: totpCode, period: 30 })); const autofillResult = await autofillService.doAutoFill(autofillOptions); expect(autofillService.getShouldAutoCopyTotp).toHaveBeenCalled(); - expect(totpService.getCode).toHaveBeenCalledWith(autofillOptions.cipher.login.totp); + expect(totpService.getCode$).toHaveBeenCalledWith(autofillOptions.cipher.login.totp); expect(autofillResult).toBe(totpCode); }); @@ -940,7 +940,7 @@ describe("AutofillService", () => { const autofillResult = await autofillService.doAutoFill(autofillOptions); expect(autofillService.getShouldAutoCopyTotp).not.toHaveBeenCalled(); - expect(totpService.getCode).not.toHaveBeenCalled(); + expect(totpService.getCode$).not.toHaveBeenCalled(); expect(autofillResult).toBeNull(); }); @@ -956,12 +956,12 @@ describe("AutofillService", () => { it("returns a null value if the login does not contain a TOTP value", async () => { autofillOptions.cipher.login.totp = undefined; jest.spyOn(autofillService, "getShouldAutoCopyTotp"); - jest.spyOn(totpService, "getCode"); + jest.spyOn(totpService, "getCode$"); const autofillResult = await autofillService.doAutoFill(autofillOptions); expect(autofillService.getShouldAutoCopyTotp).not.toHaveBeenCalled(); - expect(totpService.getCode).not.toHaveBeenCalled(); + expect(totpService.getCode$).not.toHaveBeenCalled(); expect(autofillResult).toBeNull(); }); @@ -984,12 +984,12 @@ describe("AutofillService", () => { .spyOn(billingAccountProfileStateService, "hasPremiumFromAnySource$") .mockImplementation(() => of(true)); jest.spyOn(autofillService, "getShouldAutoCopyTotp").mockResolvedValue(false); - jest.spyOn(totpService, "getCode"); + jest.spyOn(totpService, "getCode$"); const autofillResult = await autofillService.doAutoFill(autofillOptions); expect(autofillService.getShouldAutoCopyTotp).toHaveBeenCalled(); - expect(totpService.getCode).not.toHaveBeenCalled(); + expect(totpService.getCode$).not.toHaveBeenCalled(); expect(autofillResult).toBeNull(); }); }); diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index fc7d0ebcc99..ed8b2033209 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -1,7 +1,16 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { filter, firstValueFrom, merge, Observable, ReplaySubject, scan, startWith } from "rxjs"; -import { pairwise } from "rxjs/operators"; +import { + filter, + firstValueFrom, + merge, + Observable, + ReplaySubject, + scan, + startWith, + timer, +} from "rxjs"; +import { map, pairwise, share, takeUntil } from "rxjs/operators"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -146,7 +155,19 @@ export default class AutofillService implements AutofillServiceInterface { pageDetailsFallback$.next([]); } - return merge(pageDetailsFromTab$, pageDetailsFallback$); + // Share the pageDetailsFromTab$ observable so that multiple subscribers don't trigger multiple executions. + const sharedPageDetailsFromTab$ = pageDetailsFromTab$.pipe(share()); + + // Create a timeout observable that emits an empty array if pageDetailsFromTab$ hasn't emitted within 1 second. + const pageDetailsTimeout$ = timer(1000).pipe( + map(() => []), + takeUntil(sharedPageDetailsFromTab$), + ); + + // Merge the responses so that if pageDetailsFromTab$ emits, that value is used. + // Otherwise, if it doesn't emit in time, the timeout observable emits an empty array. + // Also, pageDetailsFallback$ will emit in error cases. + return merge(sharedPageDetailsFromTab$, pageDetailsFallback$, pageDetailsTimeout$); } /** @@ -494,7 +515,7 @@ export default class AutofillService implements AutofillServiceInterface { const shouldAutoCopyTotp = await this.getShouldAutoCopyTotp(); totp = shouldAutoCopyTotp - ? await this.totpService.getCode(options.cipher.login.totp) + ? (await firstValueFrom(this.totpService.getCode$(options.cipher.login.totp))).code : null; }), ); @@ -992,7 +1013,10 @@ export default class AutofillService implements AutofillServiceInterface { } filledFields[t.opid] = t; - let totpValue = await this.totpService.getCode(login.totp); + const totpResponse = await firstValueFrom( + this.totpService.getCode$(options.cipher.login.totp), + ); + let totpValue = totpResponse.code; if (totpValue.length == totps.length) { totpValue = totpValue.charAt(i); } @@ -1409,7 +1433,6 @@ export default class AutofillService implements AutofillServiceInterface { let doesContainValue = false; CreditCardAutoFillConstants.CardAttributesExtended.forEach((attributeName) => { - // eslint-disable-next-line no-prototype-builtins if (doesContainValue || !field[attributeName]) { return; } diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts index dc59e05a18b..f3047947c82 100644 --- a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.spec.ts @@ -21,8 +21,7 @@ describe("InlineMenuFieldQualificationService", () => { }); describe("isFieldForLoginForm", () => { - it("does not disqualify totp fields for premium users with flag set to true", () => { - inlineMenuFieldQualificationService["inlineMenuTotpFeatureFlag"] = true; + it("does not disqualify totp fields for premium users", () => { inlineMenuFieldQualificationService["premiumEnabled"] = true; const field = mock({ type: "text", @@ -37,24 +36,7 @@ describe("InlineMenuFieldQualificationService", () => { ); }); - it("disqualifies totp fields for premium users with flag set to false", () => { - inlineMenuFieldQualificationService["inlineMenuTotpFeatureFlag"] = false; - inlineMenuFieldQualificationService["inlineMenuTotpFeatureFlag"] = true; - const field = mock({ - type: "text", - autoCompleteType: "one-time-code", - htmlName: "totp", - htmlID: "totp", - placeholder: "totp", - }); - - expect(inlineMenuFieldQualificationService.isFieldForLoginForm(field, pageDetails)).toBe( - false, - ); - }); - - it("disqualifies totp fields for non-premium users with flag set to true", () => { - inlineMenuFieldQualificationService["inlineMenuTotpFeatureFlag"] = true; + it("disqualifies totp fields for non-premium users", () => { inlineMenuFieldQualificationService["premiumEnabled"] = false; const field = mock({ type: "text", diff --git a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts index dff40a3ab93..046381d956c 100644 --- a/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts +++ b/apps/browser/src/autofill/services/inline-menu-field-qualification.service.ts @@ -151,17 +151,14 @@ export class InlineMenuFieldQualificationService ]); private totpFieldAutocompleteValue = "one-time-code"; private inlineMenuFieldQualificationFlagSet = false; - private inlineMenuTotpFeatureFlag = false; private premiumEnabled = false; constructor() { void Promise.all([ sendExtensionMessage("getInlineMenuFieldQualificationFeatureFlag"), - sendExtensionMessage("getInlineMenuTotpFeatureFlag"), sendExtensionMessage("getUserPremiumStatus"), - ]).then(([fieldQualificationFlag, totpFeatureFlag, premiumStatus]) => { + ]).then(([fieldQualificationFlag, premiumStatus]) => { this.inlineMenuFieldQualificationFlagSet = !!fieldQualificationFlag?.result; - this.inlineMenuTotpFeatureFlag = !!totpFeatureFlag?.result; this.premiumEnabled = !!premiumStatus?.result; }); } @@ -180,7 +177,7 @@ export class InlineMenuFieldQualificationService /** * Totp inline menu is available only for premium users. */ - if (this.inlineMenuTotpFeatureFlag && this.premiumEnabled) { + if (this.premiumEnabled) { const isTotpField = this.isTotpField(field); // Autofill does not fill totp inputs with a "password" `type` attribute value const passwordType = field.type === "password"; diff --git a/apps/browser/src/autofill/shared/styles/variables.scss b/apps/browser/src/autofill/shared/styles/variables.scss index 12d55ad8be6..ae6a060798a 100644 --- a/apps/browser/src/autofill/shared/styles/variables.scss +++ b/apps/browser/src/autofill/shared/styles/variables.scss @@ -1,6 +1,4 @@ -@import "~nord/src/sass/nord.scss"; - -$dark-icon-themes: "theme_dark", "theme_solarizedDark", "theme_nord"; +$dark-icon-themes: "theme_dark"; $font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-source-code-pro: "Source Code Pro", monospace; @@ -34,14 +32,6 @@ $border-color: #ced4dc; $border-radius: 3px; $focus-outline-color: #1252a3; -$solarizedDarkBase0: #839496; -$solarizedDarkBase03: #002b36; -$solarizedDarkBase02: #073642; -$solarizedDarkBase01: #586e75; -$solarizedDarkBase2: #eee8d5; -$solarizedDarkCyan: #2aa198; -$solarizedDarkGreen: #859900; - $themes: ( light: ( textColor: $text-color-light, @@ -79,41 +69,6 @@ $themes: ( passwordSpecialColor: $password-special-color-dark, passwordNumberColor: $password-number-color-dark, ), - nord: ( - textColor: $nord5, - mutedTextColor: $nord4, - backgroundColor: $nord1, - backgroundOffsetColor: darken($nord1, 2.75%), - buttonPrimaryColor: $nord8, - primaryColor: $nord9, - textContrast: $nord2, - inputBorderColor: $nord0, - inputBackgroundColor: $nord2, - borderColor: $nord0, - focusOutlineColor: lighten($focus-outline-color, 25%), - successColor: $success-color-dark, - passkeysAuthenticating: $nord4, - passwordSpecialColor: $nord12, - passwordNumberColor: $nord8, - ), - solarizedDark: ( - textColor: $solarizedDarkBase2, - // Muted uses main text color to avoid contrast issues - mutedTextColor: $solarizedDarkBase2, - backgroundColor: $solarizedDarkBase03, - backgroundOffsetColor: darken($solarizedDarkBase03, 2.75%), - buttonPrimaryColor: $solarizedDarkCyan, - primaryColor: $solarizedDarkGreen, - textContrast: $solarizedDarkBase02, - inputBorderColor: rgba($solarizedDarkBase2, 0.2), - inputBackgroundColor: $solarizedDarkBase01, - borderColor: $solarizedDarkBase2, - focusOutlineColor: lighten($focus-outline-color, 15%), - successColor: $success-color-dark, - passkeysAuthenticating: $solarizedDarkBase2, - passwordSpecialColor: #b58900, - passwordNumberColor: $solarizedDarkCyan, - ), ); @mixin themify($themes: $themes) { diff --git a/apps/browser/src/autofill/spec/autofill-mocks.ts b/apps/browser/src/autofill/spec/autofill-mocks.ts index 6e175906d30..8279c98c5b4 100644 --- a/apps/browser/src/autofill/spec/autofill-mocks.ts +++ b/apps/browser/src/autofill/spec/autofill-mocks.ts @@ -103,6 +103,7 @@ export function createChromeTabMock(customFields = {}): chrome.tabs.Tab { selected: true, discarded: false, autoDiscardable: false, + frozen: false, groupId: 2, url: "https://jest-testing-website.com", ...customFields, diff --git a/apps/browser/src/background/idle.background.ts b/apps/browser/src/background/idle.background.ts index 8dccc933375..90276eaea0a 100644 --- a/apps/browser/src/background/idle.background.ts +++ b/apps/browser/src/background/idle.background.ts @@ -34,12 +34,8 @@ export default class IdleBackground { const idleHandler = (newState: string) => { if (newState === "active") { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.reconnectFromActivity(); } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.disconnectFromInactivity(); } }; diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 7251dea0580..f8f86e6a277 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -32,11 +32,8 @@ import { ProviderService } from "@bitwarden/common/admin-console/services/provid import { AccountService as AccountServiceAbstraction } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices/devices.service.abstraction"; import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/abstractions/token.service"; import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; @@ -46,11 +43,8 @@ import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/for import { AccountServiceImplementation } from "@bitwarden/common/auth/services/account.service"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { AvatarService } from "@bitwarden/common/auth/services/avatar.service"; -import { DeviceTrustService } from "@bitwarden/common/auth/services/device-trust.service.implementation"; import { DevicesServiceImplementation } from "@bitwarden/common/auth/services/devices/devices.service.implementation"; import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; -import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; -import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service"; import { SsoLoginService } from "@bitwarden/common/auth/services/sso-login.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; @@ -82,6 +76,12 @@ import { BulkEncryptServiceImplementation } from "@bitwarden/common/key-manageme import { EncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/encrypt.service.implementation"; import { FallbackBulkEncryptService } from "@bitwarden/common/key-management/crypto/services/fallback-bulk-encrypt.service"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/multithread-encrypt.service.implementation"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { DeviceTrustService } from "@bitwarden/common/key-management/device-trust/services/device-trust.service.implementation"; +import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/services/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; import { DefaultProcessReloadService } from "@bitwarden/common/key-management/services/default-process-reload.service"; import { DefaultVaultTimeoutSettingsService, @@ -267,6 +267,7 @@ import { OffscreenDocumentService } from "../platform/offscreen-document/abstrac import { DefaultOffscreenDocumentService } from "../platform/offscreen-document/offscreen-document.service"; import { BrowserTaskSchedulerService } from "../platform/services/abstractions/browser-task-scheduler.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; +import BrowserInitialInstallService from "../platform/services/browser-initial-install.service"; import BrowserLocalStorageService from "../platform/services/browser-local-storage.service"; import BrowserMemoryStorageService from "../platform/services/browser-memory-storage.service"; import { BrowserScriptInjectorService } from "../platform/services/browser-script-injector.service"; @@ -390,6 +391,7 @@ export default class MainBackground { kdfConfigService: KdfConfigService; offscreenDocumentService: OffscreenDocumentService; syncServiceListener: SyncServiceListener; + browserInitialInstallService: BrowserInitialInstallService; webPushConnectionService: WorkerWebPushConnectionService | UnsupportedWebPushConnectionService; themeStateService: DefaultThemeStateService; @@ -834,10 +836,7 @@ export default class MainBackground { this.configService, ); - this.themeStateService = new DefaultThemeStateService( - this.globalStateProvider, - this.configService, - ); + this.themeStateService = new DefaultThemeStateService(this.globalStateProvider); this.bulkEncryptService = new FallbackBulkEncryptService(this.encryptService); @@ -978,7 +977,7 @@ export default class MainBackground { this.authService, this.accountService, ); - this.totpService = new TotpService(this.cryptoFunctionService, this.logService); + this.totpService = new TotpService(this.sdkService); this.scriptInjectorService = new BrowserScriptInjectorService( this.domainSettingsService, @@ -1015,6 +1014,7 @@ export default class MainBackground { this.encryptService, this.pinService, this.accountService, + this.sdkService, ); this.individualVaultExportService = new IndividualVaultExportService( @@ -1045,6 +1045,8 @@ export default class MainBackground { this.organizationVaultExportService, ); + this.browserInitialInstallService = new BrowserInitialInstallService(this.stateProvider); + if (BrowserApi.isManifestVersion(3)) { const registration = (self as unknown as { registration: ServiceWorkerRegistration }) ?.registration; @@ -1148,6 +1150,7 @@ export default class MainBackground { this.accountService, lockService, this.billingAccountProfileStateService, + this.browserInitialInstallService, ); this.nativeMessagingBackground = new NativeMessagingBackground( this.keyService, @@ -1283,6 +1286,7 @@ export default class MainBackground { this.collectionService, this.organizationService, this.accountService, + this.configService, ); this.inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index a5fea0651fc..7db72f38139 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -28,6 +28,7 @@ import { LockedVaultPendingNotificationsData } from "../autofill/background/abst import { AutofillService } from "../autofill/services/abstractions/autofill.service"; import { BrowserApi } from "../platform/browser/browser-api"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; +import BrowserInitialInstallService from "../platform/services/browser-initial-install.service"; import { BrowserPlatformUtilsService } from "../platform/services/platform-utils/browser-platform-utils.service"; import MainBackground from "./main.background"; @@ -53,6 +54,7 @@ export default class RuntimeBackground { private accountService: AccountService, private readonly lockService: LockService, private billingAccountProfileStateService: BillingAccountProfileStateService, + private browserInitialInstallService: BrowserInitialInstallService, ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -78,7 +80,6 @@ export default class RuntimeBackground { BiometricsCommands.GetBiometricsStatusForUser, "getUseTreeWalkerApiForPageDetailsCollectionFeatureFlag", "getInlineMenuFieldQualificationFeatureFlag", - "getInlineMenuTotpFeatureFlag", "getUserPremiumStatus", ]; @@ -217,9 +218,6 @@ export default class RuntimeBackground { ); return result; } - case "getInlineMenuTotpFeatureFlag": { - return await this.configService.getFeatureFlag(FeatureFlag.InlineMenuTotp); - } } } @@ -386,7 +384,10 @@ export default class RuntimeBackground { void this.autofillService.loadAutofillScriptsOnInstall(); if (this.onInstalledReason != null) { - if (this.onInstalledReason === "install") { + if ( + this.onInstalledReason === "install" && + !(await firstValueFrom(this.browserInitialInstallService.extensionInstalled$)) + ) { if (!devFlagEnabled("skipWelcomeOnInstall")) { void BrowserApi.createNewTab("https://bitwarden.com/browser-start/"); } @@ -398,6 +399,7 @@ export default class RuntimeBackground { if (await this.environmentService.hasManagedEnvironment()) { await this.environmentService.setUrlsToManagedEnvironment(); } + await this.browserInitialInstallService.setExtensionInstalled(true); } this.onInstalledReason = null; diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index 63bdcf0ccf0..5bfca440b99 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.2.2", + "version": "2025.3.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index 6a537a11fc4..1e2ac1812ca 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.2.2", + "version": "2025.3.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/platform/browser/browser-api.spec.ts b/apps/browser/src/platform/browser/browser-api.spec.ts index 6e8a0f3002d..f6bf7d4069b 100644 --- a/apps/browser/src/platform/browser/browser-api.spec.ts +++ b/apps/browser/src/platform/browser/browser-api.spec.ts @@ -2,6 +2,8 @@ import { mock } from "jest-mock-extended"; import { BrowserApi } from "./browser-api"; +type ChromeSettingsGet = chrome.types.ChromeSetting["get"]; + describe("BrowserApi", () => { const executeScriptResult = ["value"]; @@ -468,19 +470,23 @@ describe("BrowserApi", () => { describe("browserAutofillSettingsOverridden", () => { it("returns true if the browser autofill settings are overridden", async () => { - const expectedDetails = { - value: false, - levelOfControl: "controlled_by_this_extension", - } as chrome.types.ChromeSettingGetResultDetails; - chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); + const mockFn = jest.fn< + void, + [ + details: chrome.types.ChromeSettingGetDetails, + callback: (details: chrome.types.ChromeSettingGetResult) => void, + ], + never + >((details, callback) => { + callback({ + value: false, + levelOfControl: "controlled_by_this_extension", + }); + }); + chrome.privacy.services.autofillAddressEnabled.get = mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.autofillCreditCardEnabled.get = + mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.passwordSavingEnabled.get = mockFn as unknown as ChromeSettingsGet; const result = await BrowserApi.browserAutofillSettingsOverridden(); @@ -488,19 +494,24 @@ describe("BrowserApi", () => { }); it("returns false if the browser autofill settings are not overridden", async () => { - const expectedDetails = { - value: true, - levelOfControl: "controlled_by_this_extension", - } as chrome.types.ChromeSettingGetResultDetails; - chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); + const mockFn = jest.fn< + void, + [ + details: chrome.types.ChromeSettingGetDetails, + callback: (details: chrome.types.ChromeSettingGetResult) => void, + ], + never + >((details, callback) => { + callback({ + value: true, + levelOfControl: "controlled_by_this_extension", + }); + }); + + chrome.privacy.services.autofillAddressEnabled.get = mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.autofillCreditCardEnabled.get = + mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.passwordSavingEnabled.get = mockFn as unknown as ChromeSettingsGet; const result = await BrowserApi.browserAutofillSettingsOverridden(); @@ -508,19 +519,23 @@ describe("BrowserApi", () => { }); it("returns false if the browser autofill settings are not controlled by the extension", async () => { - const expectedDetails = { - value: false, - levelOfControl: "controlled_by_other_extensions", - } as chrome.types.ChromeSettingGetResultDetails; - chrome.privacy.services.autofillAddressEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.autofillCreditCardEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); - chrome.privacy.services.passwordSavingEnabled.get = jest.fn((details, callback) => - callback(expectedDetails), - ); + const mockFn = jest.fn< + void, + [ + details: chrome.types.ChromeSettingGetDetails, + callback: (details: chrome.types.ChromeSettingGetResult) => void, + ], + never + >((details, callback) => { + callback({ + value: false, + levelOfControl: "controlled_by_other_extensions", + }); + }); + chrome.privacy.services.autofillAddressEnabled.get = mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.autofillCreditCardEnabled.get = + mockFn as unknown as ChromeSettingsGet; + chrome.privacy.services.passwordSavingEnabled.get = mockFn as unknown as ChromeSettingsGet; const result = await BrowserApi.browserAutofillSettingsOverridden(); diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 293fca4d029..ec16c883bfb 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -504,7 +504,9 @@ export class BrowserApi { * * @param permissions - The permissions to check. */ - static async permissionsGranted(permissions: string[]): Promise { + static async permissionsGranted( + permissions: chrome.runtime.ManifestPermissions[], + ): Promise { return new Promise((resolve) => chrome.permissions.contains({ permissions }, (result) => resolve(result)), ); @@ -594,7 +596,7 @@ export class BrowserApi { * Identifies if the browser autofill settings are overridden by the extension. */ static async browserAutofillSettingsOverridden(): Promise { - const checkOverrideStatus = (details: chrome.types.ChromeSettingGetResultDetails) => + const checkOverrideStatus = (details: chrome.types.ChromeSettingGetResult) => details.levelOfControl === "controlled_by_this_extension" && !details.value; const autofillAddressOverridden: boolean = await new Promise((resolve) => @@ -623,10 +625,10 @@ export class BrowserApi { * * @param value - Determines whether to enable or disable the autofill settings. */ - static updateDefaultBrowserAutofillSettings(value: boolean) { - chrome.privacy.services.autofillAddressEnabled.set({ value }); - chrome.privacy.services.autofillCreditCardEnabled.set({ value }); - chrome.privacy.services.passwordSavingEnabled.set({ value }); + static async updateDefaultBrowserAutofillSettings(value: boolean) { + await chrome.privacy.services.autofillAddressEnabled.set({ value }); + await chrome.privacy.services.autofillCreditCardEnabled.set({ value }); + await chrome.privacy.services.passwordSavingEnabled.set({ value }); } /** diff --git a/apps/browser/src/platform/popup/view-cache/popup-view-cache.service.ts b/apps/browser/src/platform/popup/view-cache/popup-view-cache.service.ts index 2c29f1e5763..457198eaa4e 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-view-cache.service.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-view-cache.service.ts @@ -64,8 +64,16 @@ export class PopupViewCacheService implements ViewCacheService { filter((e) => e instanceof NavigationEnd), /** Skip the first navigation triggered by `popupRouterCacheGuard` */ skip(1), + filter((e: NavigationEnd) => + // viewing/editing a cipher and navigating back to the vault list should not clear the cache + ["/view-cipher", "/edit-cipher", "/tabs/vault"].every( + (route) => !e.urlAfterRedirects.startsWith(route), + ), + ), ) - .subscribe(() => this.clearState()); + .subscribe((e) => { + return this.clearState(); + }); } /** diff --git a/apps/browser/src/platform/services/browser-initial-install.service.ts b/apps/browser/src/platform/services/browser-initial-install.service.ts new file mode 100644 index 00000000000..12b2ea95b9c --- /dev/null +++ b/apps/browser/src/platform/services/browser-initial-install.service.ts @@ -0,0 +1,31 @@ +import { Observable, map } from "rxjs"; + +import { + GlobalState, + EXTENSION_INITIAL_INSTALL_DISK, + KeyDefinition, + StateProvider, +} from "@bitwarden/common/platform/state"; + +const EXTENSION_INSTALLED = new KeyDefinition( + EXTENSION_INITIAL_INSTALL_DISK, + "extensionInstalled", + { + deserializer: (obj) => obj, + }, +); + +export default class BrowserInitialInstallService { + private extensionInstalled: GlobalState = + this.stateProvider.getGlobal(EXTENSION_INSTALLED); + + readonly extensionInstalled$: Observable = this.extensionInstalled.state$.pipe( + map((x) => x ?? false), + ); + + constructor(private stateProvider: StateProvider) {} + + async setExtensionInstalled(value: boolean) { + await this.extensionInstalled.update(() => value); + } +} diff --git a/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts index d72ba942051..0c85e8a8e4b 100644 --- a/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts +++ b/apps/browser/src/platform/services/task-scheduler/browser-task-scheduler.service.spec.ts @@ -85,7 +85,6 @@ describe("BrowserTaskSchedulerService", () => { callback, ); // @ts-expect-error mocking global browser object - // eslint-disable-next-line no-global-assign globalThis.browser = {}; chrome.alarms.get = jest.fn().mockImplementation((_name, callback) => callback(undefined)); }); @@ -95,8 +94,7 @@ describe("BrowserTaskSchedulerService", () => { jest.clearAllTimers(); jest.useRealTimers(); - // eslint-disable-next-line no-global-assign - globalThis.browser = undefined; + (globalThis.browser as any) = undefined; }); describe("setTimeout", () => { diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 76894b23d0a..e73f56fa2f6 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -7,7 +7,6 @@ import { EnvironmentSelectorRouteData, ExtensionDefaultOverlayPosition, } from "@bitwarden/angular/auth/components/environment-selector.component"; -import { unauthUiRefreshRedirect } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-redirect"; import { unauthUiRefreshSwap } from "@bitwarden/angular/auth/functions/unauth-ui-refresh-route-swap"; import { activeAuthGuard, @@ -53,20 +52,13 @@ import { import { fido2AuthGuard } from "../auth/guards/fido2-auth.guard"; import { AccountSwitcherComponent } from "../auth/popup/account-switching/account-switcher.component"; -import { EnvironmentComponent } from "../auth/popup/environment.component"; import { ExtensionAnonLayoutWrapperComponent, ExtensionAnonLayoutWrapperData, } from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component"; -import { HintComponent } from "../auth/popup/hint.component"; -import { HomeComponent } from "../auth/popup/home.component"; -import { LoginDecryptionOptionsComponentV1 } from "../auth/popup/login-decryption-options/login-decryption-options-v1.component"; -import { LoginComponentV1 } from "../auth/popup/login-v1.component"; -import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; -import { SsoComponentV1 } from "../auth/popup/sso-v1.component"; import { TwoFactorOptionsComponentV1 } from "../auth/popup/two-factor-options-v1.component"; import { TwoFactorComponentV1 } from "../auth/popup/two-factor-v1.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; @@ -131,20 +123,19 @@ const routes: Routes = [ children: [], // Children lets us have an empty component. canActivate: [ popupRouterCacheGuard, - redirectGuard({ loggedIn: "/tabs/current", loggedOut: "/home", locked: "/lock" }), + redirectGuard({ loggedIn: "/tabs/current", loggedOut: "/login", locked: "/lock" }), ], }, + { + path: "home", + redirectTo: "login", + pathMatch: "full", + }, { path: "vault", redirectTo: "/tabs/vault", pathMatch: "full", }, - { - path: "home", - component: HomeComponent, - canActivate: [unauthGuardFn(unauthRouteOverrides), unauthUiRefreshRedirect("/login")], - data: { elevation: 1 } satisfies RouteDataProperties, - }, { path: "fido2", component: Fido2Component, @@ -171,7 +162,7 @@ const routes: Routes = [ data: { elevation: 1, pageTitle: { - key: "verifyIdentity", + key: "verifyYourIdentity", }, showBackButton: true, } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, @@ -206,40 +197,6 @@ const routes: Routes = [ canActivate: [unauthGuardFn(unauthRouteOverrides)], data: { elevation: 1 } satisfies RouteDataProperties, }, - ...unauthUiRefreshSwap( - SsoComponentV1, - ExtensionAnonLayoutWrapperComponent, - { - path: "sso", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { elevation: 1 } satisfies RouteDataProperties, - }, - { - path: "sso", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { - pageIcon: VaultIcon, - pageTitle: { - key: "enterpriseSingleSignOn", - }, - pageSubtitle: { - key: "singleSignOnEnterOrgIdentifierText", - }, - elevation: 1, - } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, - children: [ - { path: "", component: SsoComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - data: { - overlayPosition: ExtensionDefaultOverlayPosition, - } satisfies EnvironmentSelectorRouteData, - }, - ], - }, - ), { path: "device-verification", component: ExtensionAnonLayoutWrapperComponent, @@ -248,7 +205,7 @@ const routes: Routes = [ data: { pageIcon: DeviceVerificationIcon, pageTitle: { - key: "verifyIdentity", + key: "verifyYourIdentity", }, pageSubtitle: { key: "weDontRecognizeThisDevice", @@ -268,12 +225,6 @@ const routes: Routes = [ canActivate: [authGuard], data: { elevation: 1 } satisfies RouteDataProperties, }, - { - path: "environment", - component: EnvironmentComponent, - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { elevation: 1 } satisfies RouteDataProperties, - }, { path: "view-cipher", component: ViewV2Component, @@ -420,158 +371,7 @@ const routes: Routes = [ canActivate: [authGuard], data: { elevation: 1 } satisfies RouteDataProperties, }, - ...unauthUiRefreshSwap( - LoginViaAuthRequestComponentV1, - ExtensionAnonLayoutWrapperComponent, - { - path: "login-with-device", - data: { elevation: 1 } satisfies RouteDataProperties, - }, - { - path: "login-with-device", - data: { - pageIcon: DevicesIcon, - pageTitle: { - key: "logInRequestSent", - }, - pageSubtitle: { - key: "aNotificationWasSentToYourDevice", - }, - showLogo: false, - showBackButton: true, - elevation: 1, - } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, - children: [ - { path: "", component: LoginViaAuthRequestComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - ), - ...unauthUiRefreshSwap( - LoginViaAuthRequestComponentV1, - ExtensionAnonLayoutWrapperComponent, - { - path: "admin-approval-requested", - data: { elevation: 1 } satisfies RouteDataProperties, - }, - { - path: "admin-approval-requested", - data: { - pageIcon: DevicesIcon, - pageTitle: { - key: "adminApprovalRequested", - }, - pageSubtitle: { - key: "adminApprovalRequestSentToAdmins", - }, - showLogo: false, - showBackButton: true, - elevation: 1, - } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, - children: [{ path: "", component: LoginViaAuthRequestComponent }], - }, - ), - ...unauthUiRefreshSwap( - HintComponent, - ExtensionAnonLayoutWrapperComponent, - { - path: "hint", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { - elevation: 1, - } satisfies RouteDataProperties, - }, - { - path: "", - children: [ - { - path: "hint", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { - pageTitle: { - key: "requestPasswordHint", - }, - pageSubtitle: { - key: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", - }, - pageIcon: UserLockIcon, - showBackButton: true, - elevation: 1, - } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, - children: [ - { path: "", component: PasswordHintComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - data: { - overlayPosition: ExtensionDefaultOverlayPosition, - } satisfies EnvironmentSelectorRouteData, - }, - ], - }, - ], - }, - ), - ...unauthUiRefreshSwap( - LoginComponentV1, - ExtensionAnonLayoutWrapperComponent, - { - path: "login", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { elevation: 1 }, - }, - { - path: "", - children: [ - { - path: "login", - canActivate: [unauthGuardFn(unauthRouteOverrides)], - data: { - pageIcon: VaultIcon, - pageTitle: { - key: "logInToBitwarden", - }, - elevation: 1, - showAcctSwitcher: true, - } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, - children: [ - { path: "", component: LoginComponent }, - { path: "", component: LoginSecondaryContentComponent, outlet: "secondary" }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - data: { - overlayPosition: ExtensionDefaultOverlayPosition, - } satisfies EnvironmentSelectorRouteData, - }, - ], - }, - ], - }, - ), - ...unauthUiRefreshSwap( - LoginDecryptionOptionsComponentV1, - ExtensionAnonLayoutWrapperComponent, - { - path: "login-initiated", - canActivate: [tdeDecryptionRequiredGuard()], - data: { elevation: 1 } satisfies RouteDataProperties, - }, - { - path: "login-initiated", - canActivate: [tdeDecryptionRequiredGuard()], - data: { - pageIcon: DevicesIcon, - }, - children: [{ path: "", component: LoginDecryptionOptionsComponent }], - }, - ), + { path: "", component: ExtensionAnonLayoutWrapperComponent, @@ -597,7 +397,7 @@ const routes: Routes = [ component: RegistrationStartSecondaryComponent, outlet: "secondary", data: { - loginRoute: "/home", + loginRoute: "/login", } satisfies RegistrationStartSecondaryComponentData, }, ], @@ -617,6 +417,127 @@ const routes: Routes = [ }, ], }, + { + path: "login", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + pageIcon: VaultIcon, + pageTitle: { + key: "logInToBitwarden", + }, + elevation: 1, + showAcctSwitcher: true, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: LoginComponent }, + { path: "", component: LoginSecondaryContentComponent, outlet: "secondary" }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + data: { + overlayPosition: ExtensionDefaultOverlayPosition, + } satisfies EnvironmentSelectorRouteData, + }, + ], + }, + { + path: "sso", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + pageIcon: VaultIcon, + pageTitle: { + key: "enterpriseSingleSignOn", + }, + pageSubtitle: { + key: "singleSignOnEnterOrgIdentifierText", + }, + elevation: 1, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: SsoComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + data: { + overlayPosition: ExtensionDefaultOverlayPosition, + } satisfies EnvironmentSelectorRouteData, + }, + ], + }, + { + path: "login-with-device", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "logInRequestSent", + }, + pageSubtitle: { + key: "aNotificationWasSentToYourDevice", + }, + showBackButton: true, + elevation: 1, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: LoginViaAuthRequestComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + }, + ], + }, + { + path: "hint", + canActivate: [unauthGuardFn(unauthRouteOverrides)], + data: { + pageTitle: { + key: "requestPasswordHint", + }, + pageSubtitle: { + key: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", + }, + pageIcon: UserLockIcon, + showBackButton: true, + elevation: 1, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [ + { path: "", component: PasswordHintComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + data: { + overlayPosition: ExtensionDefaultOverlayPosition, + } satisfies EnvironmentSelectorRouteData, + }, + ], + }, + { + path: "admin-approval-requested", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "adminApprovalRequested", + }, + pageSubtitle: { + key: "adminApprovalRequestSentToAdmins", + }, + showLogo: false, + showBackButton: true, + elevation: 1, + } satisfies RouteDataProperties & ExtensionAnonLayoutWrapperData, + children: [{ path: "", component: LoginViaAuthRequestComponent }], + }, + { + path: "login-initiated", + canActivate: [tdeDecryptionRequiredGuard()], + data: { + pageIcon: DevicesIcon, + }, + children: [{ path: "", component: LoginDecryptionOptionsComponent }], + }, { path: "lock", canActivate: [lockGuard()], diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 9a3b6429e61..6a08bf007bb 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -1,9 +1,11 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, inject } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { NavigationEnd, Router, RouterOutlet } from "@angular/router"; import { Subject, takeUntil, firstValueFrom, concatMap, filter, tap } from "rxjs"; +import { DeviceTrustToastService } from "@bitwarden/angular/auth/services/device-trust-toast.service.abstraction"; import { LogoutReason } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; @@ -68,7 +70,10 @@ export class AppComponent implements OnInit, OnDestroy { private animationControlService: AnimationControlService, private biometricStateService: BiometricStateService, private biometricsService: BiometricsService, - ) {} + private deviceTrustToastService: DeviceTrustToastService, + ) { + this.deviceTrustToastService.setupListeners$.pipe(takeUntilDestroyed()).subscribe(); + } async ngOnInit() { initPopupClosedListener(); @@ -113,9 +118,7 @@ export class AppComponent implements OnInit, OnDestroy { }); this.changeDetectorRef.detectChanges(); } else if (msg.command === "authBlocked" || msg.command === "goHome") { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["home"]); + await this.router.navigate(["login"]); } else if ( msg.command === "locked" && (msg.userId == null || msg.userId == this.activeUserId) diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index a190cb134ac..80cffa03b17 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -19,13 +19,7 @@ import { AvatarModule, ButtonModule, FormFieldModule, ToastModule } from "@bitwa import { AccountComponent } from "../auth/popup/account-switching/account.component"; import { CurrentAccountComponent } from "../auth/popup/account-switching/current-account.component"; -import { EnvironmentComponent } from "../auth/popup/environment.component"; import { ExtensionAnonLayoutWrapperComponent } from "../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.component"; -import { HintComponent } from "../auth/popup/hint.component"; -import { HomeComponent } from "../auth/popup/home.component"; -import { LoginDecryptionOptionsComponentV1 } from "../auth/popup/login-decryption-options/login-decryption-options-v1.component"; -import { LoginComponentV1 } from "../auth/popup/login-v1.component"; -import { LoginViaAuthRequestComponentV1 } from "../auth/popup/login-via-auth-request-v1.component"; import { RemovePasswordComponent } from "../auth/popup/remove-password.component"; import { SetPasswordComponent } from "../auth/popup/set-password.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; @@ -96,12 +90,6 @@ import "../platform/popup/locales"; AppComponent, ColorPasswordPipe, ColorPasswordCountPipe, - EnvironmentComponent, - HintComponent, - HomeComponent, - LoginViaAuthRequestComponentV1, - LoginComponentV1, - LoginDecryptionOptionsComponentV1, SetPasswordComponent, SsoComponentV1, TabsV2Component, diff --git a/apps/browser/src/popup/scss/base.scss b/apps/browser/src/popup/scss/base.scss index bfa037eea23..59893b5050d 100644 --- a/apps/browser/src/popup/scss/base.scss +++ b/apps/browser/src/popup/scss/base.scss @@ -447,69 +447,3 @@ main:not(popup-page main) { .cdk-virtual-scroll-content-wrapper { width: 100%; } - -.login-with-device { - .fingerprint-phrase-header { - padding-top: 1rem; - display: block; - } - - @include themify($themes) { - .fingerprint-text { - color: themed("codeColor"); - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", - monospace; - padding: 1rem 0; - } - } - - .resend-notification { - padding-bottom: 1rem; - a { - cursor: pointer; - } - } - - .footer { - padding-top: 1rem; - - a { - padding-top: 1rem; - display: block; - } - } -} - -#login-initiated { - .margin-auto { - margin: auto; - } - .mb-20px { - margin-bottom: 20px; - } - - .mx-5px { - margin-left: 5px !important; - margin-right: 5px !important; - } - - .muted-hr { - margin-top: 1rem; - margin-bottom: 1rem; - border-top: 1px solid rgba(0, 0, 0, 0.1); - } - - .standard-x-margin { - margin-left: 5px; - margin-right: 5px; - } - - .btn-top-margin { - margin-top: 12px; - } - - #rememberThisDeviceHintText { - font-size: $font-size-small; - color: $text-muted; - } -} diff --git a/apps/browser/src/popup/scss/environment.scss b/apps/browser/src/popup/scss/environment.scss index 042bcd1b450..cd8f6379e2c 100644 --- a/apps/browser/src/popup/scss/environment.scss +++ b/apps/browser/src/popup/scss/environment.scss @@ -40,8 +40,4 @@ html.browser_safari { &.theme_light app-root { border-color: #777777; } - - &.theme_nord app-root { - border-color: #2e3440; - } } diff --git a/apps/browser/src/popup/scss/variables.scss b/apps/browser/src/popup/scss/variables.scss index cfd61cd6a2b..b78f06f2f3f 100644 --- a/apps/browser/src/popup/scss/variables.scss +++ b/apps/browser/src/popup/scss/variables.scss @@ -1,6 +1,4 @@ -@import "~nord/src/sass/nord.scss"; - -$dark-icon-themes: "theme_dark", "theme_solarizedDark", "theme_nord"; +$dark-icon-themes: "theme_dark"; $font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; @@ -47,24 +45,6 @@ $button-color-danger: darken($brand-danger, 10%); $code-color: #c01176; $code-color-dark: #f08dc7; -$code-color-nord: #dbb1d5; - -$solarizedDarkBase03: #002b36; -$solarizedDarkBase02: #073642; -$solarizedDarkBase01: #586e75; -$solarizedDarkBase00: #657b83; -$solarizedDarkBase0: #839496; -$solarizedDarkBase1: #93a1a1; -$solarizedDarkBase2: #eee8d5; -$solarizedDarkBase3: #fdf6e3; -$solarizedDarkYellow: #b58900; -$solarizedDarkOrange: #cb4b16; -$solarizedDarkRed: #dc322f; -$solarizedDarkMagenta: #d33682; -$solarizedDarkViolet: #6c71c4; -$solarizedDarkBlue: #268bd2; -$solarizedDarkCyan: #2aa198; -$solarizedDarkGreen: #859900; $themes: ( light: ( @@ -194,131 +174,6 @@ $themes: ( saturate(0%) hue-rotate(93deg) brightness(103%) contrast(103%), codeColor: $code-color-dark, ), - nord: ( - textColor: $nord5, - hoverColorTransparent: rgba($text-color, 0.15), - borderColor: $nord0, - backgroundColor: $nord1, - borderColorAlt: $nord5, - backgroundColorAlt: $nord2, - scrollbarColor: $nord4, - scrollbarHoverColor: $nord6, - boxBackgroundColor: $nord2, - boxBackgroundHoverColor: $nord3, - boxBorderColor: $nord1, - tabBackgroundColor: $nord1, - tabBackgroundHoverColor: $nord2, - headerColor: $nord5, - headerBackgroundColor: $nord1, - headerBackgroundHoverColor: $nord2, - headerBorderColor: $nord0, - headerInputBackgroundColor: $nord6, - headerInputBackgroundFocusColor: $nord5, - headerInputColor: $nord2, - headerInputPlaceholderColor: $nord3, - listItemBackgroundHoverColor: $nord3, - disabledIconColor: $nord4, - disabledBoxOpacity: 0.5, - headingColor: $nord4, - labelColor: $nord4, - mutedColor: $nord4, - totpStrokeColor: $nord4, - boxRowButtonColor: $nord4, - boxRowButtonHoverColor: $nord6, - inputBorderColor: $nord0, - inputBackgroundColor: $nord2, - inputPlaceholderColor: lighten($nord3, 20%), - buttonBackgroundColor: $nord3, - buttonBorderColor: $nord0, - buttonColor: $nord5, - buttonPrimaryColor: $nord8, - buttonDangerColor: $nord11, - primaryColor: $nord9, - primaryAccentColor: $nord8, - dangerColor: $nord11, - successColor: $nord14, - infoColor: $nord9, - warningColor: $nord12, - logoSuffix: "white", - mfaLogoSuffix: "-w.png", - passwordNumberColor: $nord8, - passwordSpecialColor: $nord12, - passwordCountText: $nord5, - calloutBorderColor: $nord0, - calloutBackgroundColor: $nord2, - toastTextColor: #000000, - svgSuffix: "-dark.svg", - transparentColor: rgba(0, 0, 0, 0), - dateInputColorScheme: dark, - webkitCalendarPickerFilter: brightness(0) saturate(100%) invert(94%) sepia(5%) saturate(454%) - hue-rotate(185deg) brightness(93%) contrast(96%), - // has no hover so use same color - webkitCalendarPickerHoverFilter: brightness(0) saturate(100%) invert(94%) sepia(5%) - saturate(454%) hue-rotate(185deg) brightness(93%) contrast(96%), - codeColor: $code-color-nord, - ), - solarizedDark: ( - textColor: $solarizedDarkBase2, - hoverColorTransparent: rgba($text-color, 0.15), - borderColor: $solarizedDarkBase03, - backgroundColor: $solarizedDarkBase03, - borderColorAlt: $solarizedDarkBase01, - backgroundColorAlt: $solarizedDarkBase02, - scrollbarColor: $solarizedDarkBase0, - scrollbarHoverColor: $solarizedDarkBase2, - boxBackgroundColor: $solarizedDarkBase02, - boxBackgroundHoverColor: lighten($solarizedDarkBase02, 5%), - boxBorderColor: $solarizedDarkBase02, - tabBackgroundColor: $solarizedDarkBase02, - tabBackgroundHoverColor: $solarizedDarkBase01, - headerColor: $solarizedDarkBase1, - headerBackgroundColor: $solarizedDarkBase02, - headerBackgroundHoverColor: $solarizedDarkBase01, - headerBorderColor: $solarizedDarkBase03, - headerInputBackgroundColor: darken($solarizedDarkBase0, 5%), - headerInputBackgroundFocusColor: $solarizedDarkBase1, - headerInputColor: $solarizedDarkBase02, - headerInputPlaceholderColor: lighten($solarizedDarkBase02, 5%), - listItemBackgroundHoverColor: lighten($solarizedDarkBase02, 5%), - disabledIconColor: $solarizedDarkBase0, - disabledBoxOpacity: 0.5, - headingColor: $solarizedDarkBase0, - labelColor: $solarizedDarkBase0, - mutedColor: $solarizedDarkBase0, - totpStrokeColor: $solarizedDarkBase0, - boxRowButtonColor: $solarizedDarkBase0, - boxRowButtonHoverColor: $solarizedDarkBase2, - inputBorderColor: $solarizedDarkBase03, - inputBackgroundColor: $solarizedDarkBase01, - inputPlaceholderColor: lighten($solarizedDarkBase00, 20%), - buttonBackgroundColor: $solarizedDarkBase00, - buttonBorderColor: $solarizedDarkBase03, - buttonColor: $solarizedDarkBase1, - buttonPrimaryColor: $solarizedDarkCyan, - buttonDangerColor: $solarizedDarkRed, - primaryColor: $solarizedDarkGreen, - primaryAccentColor: $solarizedDarkCyan, - dangerColor: $solarizedDarkRed, - successColor: $solarizedDarkGreen, - infoColor: $solarizedDarkGreen, - warningColor: $solarizedDarkYellow, - logoSuffix: "white", - mfaLogoSuffix: "-w.png", - passwordNumberColor: $solarizedDarkCyan, - passwordSpecialColor: $solarizedDarkYellow, - passwordCountText: $solarizedDarkBase2, - calloutBorderColor: $solarizedDarkBase03, - calloutBackgroundColor: $solarizedDarkBase01, - toastTextColor: #000000, - svgSuffix: "-solarized.svg", - transparentColor: rgba(0, 0, 0, 0), - dateInputColorScheme: dark, - webkitCalendarPickerFilter: brightness(0) saturate(100%) invert(61%) sepia(13%) saturate(289%) - hue-rotate(138deg) brightness(92%) contrast(90%), - webkitCalendarPickerHoverFilter: brightness(0) saturate(100%) invert(94%) sepia(10%) - saturate(462%) hue-rotate(345deg) brightness(103%) contrast(87%), - codeColor: $code-color-dark, - ), ); @mixin themify($themes: $themes) { diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 9d59cdee36a..86ab11a374a 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -47,7 +47,6 @@ import { AccountService as AccountServiceAbstraction, } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { @@ -65,6 +64,7 @@ import { import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutService, VaultTimeoutStringType, @@ -84,6 +84,7 @@ import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/comm import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { AbstractStorageService, @@ -129,7 +130,11 @@ import { KeyService, } from "@bitwarden/key-management"; import { LockComponentService } from "@bitwarden/key-management-ui"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { + DefaultSshImportPromptService, + PasswordRepromptService, + SshImportPromptService, +} from "@bitwarden/vault"; import { ForegroundLockService } from "../../auth/popup/accounts/foreground-lock.service"; import { ExtensionAnonLayoutWrapperDataService } from "../../auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; @@ -285,7 +290,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: TotpServiceAbstraction, useClass: TotpService, - deps: [CryptoFunctionService, LogService], + deps: [SdkService], }), safeProvider({ provide: OffscreenDocumentService, @@ -557,7 +562,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: TwoFactorAuthWebAuthnComponentService, useClass: ExtensionTwoFactorAuthWebAuthnComponentService, - deps: [PlatformUtilsService], + deps: [], }), safeProvider({ provide: TwoFactorAuthDuoComponentService, @@ -652,6 +657,11 @@ const safeProviders: SafeProvider[] = [ useClass: ExtensionLoginDecryptionOptionsService, deps: [MessagingServiceAbstraction, Router], }), + safeProvider({ + provide: SshImportPromptService, + useClass: DefaultSshImportPromptService, + deps: [DialogService, ToastService, PlatformUtilsService, I18nServiceAbstraction], + }), ]; @NgModule({ diff --git a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html index 152c500d6ca..21b298fb30a 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/add-edit/add-edit-v2.component.html @@ -2,7 +2,7 @@ @@ -27,6 +27,10 @@ {{ "save" | i18n }} + + + diff --git a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html index 071873b40c9..40f00ab4332 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/autofill-vault-list-items/autofill-vault-list-items.component.html @@ -6,6 +6,7 @@ (onRefresh)="refreshCurrentTab()" [description]="(showEmptyAutofillTip$ | async) ? ('autofillSuggestionsTip' | i18n) : null" showAutofillButton + [disableDescriptionMargin]="showEmptyAutofillTip$ | async" [primaryActionAutofill]="clickItemsToAutofillVaultView" [groupByType]="groupByType()" > diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html index 4d617ff7786..c952260a9a9 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.html @@ -27,12 +27,7 @@ {{ "note" | i18n }} - + {{ "typeSshKey" | i18n }} diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts index db3fff04bbb..bb452b89c7b 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/new-item-dropdown/new-item-dropdown-v2.component.ts @@ -5,8 +5,6 @@ import { Component, Input, OnInit } from "@angular/core"; import { Router, RouterLink } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -40,13 +38,9 @@ export class NewItemDropdownV2Component implements OnInit { constructor( private router: Router, private dialogService: DialogService, - private configService: ConfigService, ) {} - sshKeysEnabled = false; - async ngOnInit() { - this.sshKeysEnabled = await this.configService.getFeatureFlag(FeatureFlag.SSHKeyVaultItem); this.tab = await BrowserApi.getTabFromCurrentWindow(); } diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html index a6abe8ed3ac..6cc60eed6d5 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html @@ -17,6 +17,7 @@ -
+
{{ description }}
diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts index cb758e7a48d..9d70c0ba236 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.ts @@ -245,6 +245,12 @@ export class VaultListItemsContainerComponent implements OnInit, AfterViewInit { @Input({ transform: booleanAttribute }) disableSectionMargin: boolean = false; + /** + * Remove the description margin + */ + @Input({ transform: booleanAttribute }) + disableDescriptionMargin: boolean = false; + /** * The tooltip text for the organization icon for ciphers that belong to an organization. * @param cipher diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html index bb7cd8e52d0..2a50eb43960 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.html @@ -28,10 +28,7 @@ > - + diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts index 1ae1b205af3..92276ef633f 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-v2.component.ts @@ -2,7 +2,6 @@ import { CdkVirtualScrollableElement, ScrollingModule } from "@angular/cdk/scrol import { CommonModule } from "@angular/common"; import { AfterViewInit, Component, DestroyRef, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { RouterLink } from "@angular/router"; import { combineLatest, filter, @@ -12,29 +11,24 @@ import { shareReplay, switchMap, take, + startWith, } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { VaultProfileService } from "@bitwarden/angular/vault/services/vault-profile.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { CipherId, CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; -import { - BannerComponent, - ButtonModule, - DialogService, - Icons, - NoItemsModule, -} from "@bitwarden/components"; +import { ButtonModule, DialogService, Icons, NoItemsModule } from "@bitwarden/components"; import { DecryptionFailureDialogComponent, VaultIcons } from "@bitwarden/vault"; import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; import { PopOutComponent } from "../../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { VaultPopupCopyButtonsService } from "../../services/vault-popup-copy-buttons.service"; import { VaultPopupItemsService } from "../../services/vault-popup-items.service"; import { VaultPopupListFiltersService } from "../../services/vault-popup-list-filters.service"; import { VaultPopupScrollPositionService } from "../../services/vault-popup-scroll-position.service"; @@ -73,12 +67,9 @@ enum VaultState { AutofillVaultListItemsComponent, VaultListItemsContainerComponent, ButtonModule, - RouterLink, NewItemDropdownV2Component, ScrollingModule, VaultHeaderV2Component, - DecryptionFailureDialogComponent, - BannerComponent, AtRiskPasswordCalloutComponent, NewSettingsCalloutComponent, ], @@ -93,9 +84,15 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { protected remainingCiphers$ = this.vaultPopupItemsService.remainingCiphers$; protected allFilters$ = this.vaultPopupListFiltersService.allFilters$; - protected loading$ = combineLatest([this.vaultPopupItemsService.loading$, this.allFilters$]).pipe( + protected loading$ = combineLatest([ + this.vaultPopupItemsService.loading$, + this.allFilters$, + // Added as a dependency to avoid flashing the copyActions on slower devices + this.vaultCopyButtonsService.showQuickCopyActions$, + ]).pipe( map(([itemsLoading, filters]) => itemsLoading || !filters), shareReplay({ bufferSize: 1, refCount: true }), + startWith(true), ); protected newItemItemValues$: Observable = @@ -130,8 +127,7 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { private destroyRef: DestroyRef, private cipherService: CipherService, private dialogService: DialogService, - private vaultProfileService: VaultProfileService, - private vaultPageService: VaultPageService, + private vaultCopyButtonsService: VaultPopupCopyButtonsService, ) { combineLatest([ this.vaultPopupItemsService.emptyVault$, diff --git a/apps/browser/src/vault/popup/services/vault-popup-copy-buttons.service.ts b/apps/browser/src/vault/popup/services/vault-popup-copy-buttons.service.ts index d6bd12c6200..6ea01f9b109 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-copy-buttons.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-copy-buttons.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable } from "@angular/core"; -import { map, Observable } from "rxjs"; +import { map, Observable, shareReplay } from "rxjs"; import { GlobalStateProvider, @@ -31,6 +31,7 @@ export class VaultPopupCopyButtonsService { showQuickCopyActions$: Observable = this.displayMode$.pipe( map((displayMode) => displayMode === "quick"), + shareReplay({ bufferSize: 1, refCount: true }), ); async setShowQuickCopyActions(value: boolean) { diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts index 4d7957930ab..52cb393c684 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.spec.ts @@ -87,7 +87,7 @@ describe("VaultPopupItemsService", () => { failedToDecryptCiphersSubject.asObservable(), ); - searchService.searchCiphers.mockImplementation(async (_, __, ciphers) => ciphers); + searchService.searchCiphers.mockImplementation(async (userId, _, __, ciphers) => ciphers); cipherServiceMock.filterCiphersForUrl.mockImplementation(async (ciphers) => ciphers.filter((c) => ["0", "1"].includes(c.id)), ); @@ -276,7 +276,7 @@ describe("VaultPopupItemsService", () => { it("should filter autoFillCiphers$ down to search term", (done) => { const searchText = "Login"; - searchService.searchCiphers.mockImplementation(async (q, _, ciphers) => { + searchService.searchCiphers.mockImplementation(async (userId, q, _, ciphers) => { return ciphers.filter((cipher) => { return cipher.name.includes(searchText); }); @@ -472,7 +472,12 @@ describe("VaultPopupItemsService", () => { service.applyFilter(searchText); service.favoriteCiphers$.subscribe(() => { - expect(searchServiceSpy).toHaveBeenCalledWith(searchText, undefined, expect.anything()); + expect(searchServiceSpy).toHaveBeenCalledWith( + "UserId", + searchText, + undefined, + expect.anything(), + ); done(); }); }); diff --git a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts index 22d4b2eca36..dac6a141d41 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-items.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-items.service.ts @@ -23,6 +23,7 @@ import { CollectionService } from "@bitwarden/admin-console/common"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/platform/sync"; import { CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; @@ -138,22 +139,29 @@ export class VaultPopupItemsService { * Observable that indicates whether there is search text present that is searchable. * @private */ - private _hasSearchText = this.searchText$.pipe( - switchMap((searchText) => this.searchService.isSearchable(searchText)), + private _hasSearchText = combineLatest([ + this.searchText$, + getUserId(this.accountService.activeAccount$), + ]).pipe( + switchMap(([searchText, userId]) => { + return this.searchService.isSearchable(userId, searchText); + }), ); private _filteredCipherList$: Observable = combineLatest([ this._activeCipherList$, this.searchText$, this.vaultPopupListFiltersService.filterFunction$, + getUserId(this.accountService.activeAccount$), ]).pipe( - map(([ciphers, searchText, filterFunction]): [CipherView[], string] => [ + map(([ciphers, searchText, filterFunction, userId]): [CipherView[], string, UserId] => [ filterFunction(ciphers), searchText, + userId, ]), switchMap( - ([ciphers, searchText]) => - this.searchService.searchCiphers(searchText, undefined, ciphers) as Promise< + ([ciphers, searchText, userId]) => + this.searchService.searchCiphers(userId, searchText, undefined, ciphers) as Promise< PopupCipherView[] >, ), diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts b/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts index 7d67a9458b2..30715ebaedf 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.spec.ts @@ -47,7 +47,7 @@ describe("AppearanceV2Component", () => { const showFavicons$ = new BehaviorSubject(true); const enableBadgeCounter$ = new BehaviorSubject(true); - const selectedTheme$ = new BehaviorSubject(ThemeType.Nord); + const selectedTheme$ = new BehaviorSubject(ThemeType.Light); const enableRoutingAnimation$ = new BehaviorSubject(true); const enableCompactMode$ = new BehaviorSubject(false); const showQuickCopyActions$ = new BehaviorSubject(false); @@ -135,7 +135,7 @@ describe("AppearanceV2Component", () => { enableAnimations: true, enableFavicon: true, enableBadgeCounter: true, - theme: ThemeType.Nord, + theme: ThemeType.Light, enableCompactMode: false, showQuickCopyActions: false, width: "default", diff --git a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts index d6fca96c08c..1462a2d7ab4 100644 --- a/apps/browser/src/vault/popup/settings/appearance-v2.component.ts +++ b/apps/browser/src/vault/popup/settings/appearance-v2.component.ts @@ -12,7 +12,7 @@ import { DomainSettingsService } from "@bitwarden/common/autofill/services/domai import { AnimationControlService } from "@bitwarden/common/platform/abstractions/animation-control.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { ThemeType } from "@bitwarden/common/platform/enums"; +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; import { @@ -60,7 +60,7 @@ export class AppearanceV2Component implements OnInit { appearanceForm = this.formBuilder.group({ enableFavicon: false, enableBadgeCounter: true, - theme: ThemeType.System, + theme: ThemeTypes.System as Theme, enableAnimations: true, enableCompactMode: false, showQuickCopyActions: false, @@ -72,7 +72,7 @@ export class AppearanceV2Component implements OnInit { formLoading = true; /** Available theme options */ - themeOptions: { name: string; value: ThemeType }[]; + themeOptions: { name: string; value: Theme }[]; /** Available width options */ protected readonly widthOptions: Option[] = [ @@ -93,9 +93,9 @@ export class AppearanceV2Component implements OnInit { private vaultSettingsService: VaultSettingsService, ) { this.themeOptions = [ - { name: i18nService.t("systemDefault"), value: ThemeType.System }, - { name: i18nService.t("light"), value: ThemeType.Light }, - { name: i18nService.t("dark"), value: ThemeType.Dark }, + { name: i18nService.t("systemDefault"), value: ThemeTypes.System }, + { name: i18nService.t("light"), value: ThemeTypes.Light }, + { name: i18nService.t("dark"), value: ThemeTypes.Dark }, ]; } @@ -191,7 +191,7 @@ export class AppearanceV2Component implements OnInit { this.messagingService.send("bgUpdateContextMenu"); } - async saveTheme(newTheme: ThemeType) { + async saveTheme(newTheme: Theme) { await this.themeStateService.setSelectedTheme(newTheme); } diff --git a/apps/browser/src/vault/popup/settings/folders-v2.component.html b/apps/browser/src/vault/popup/settings/folders-v2.component.html index 21e00757a29..35a0fbec0a9 100644 --- a/apps/browser/src/vault/popup/settings/folders-v2.component.html +++ b/apps/browser/src/vault/popup/settings/folders-v2.component.html @@ -19,7 +19,7 @@ slot="end" type="button" (click)="openAddEditFolderDialog(folder)" - [appA11yTitle]="'editFolder' | i18n" + [appA11yTitle]="'editFolderWithName' | i18n: folder.name" bitIconButton="bwi-pencil-square" class="tw-self-end" data-testid="edit-folder-button" diff --git a/apps/browser/store/locales/fr/copy.resx b/apps/browser/store/locales/fr/copy.resx index 5c690049d0d..327d39a23c4 100644 --- a/apps/browser/store/locales/fr/copy.resx +++ b/apps/browser/store/locales/fr/copy.resx @@ -124,49 +124,51 @@ À la maison, au travail ou en déplacement, Bitwarden sécurise facilement tous vos mots de passe, clés d'accès et informations sensibles. - Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! + Reconnu comme le meilleur gestionnaire de mots de passe par PCMag, WIRED, The Verge, CNET, G2, et bien d'autres ! -SECURE YOUR DIGITAL LIFE -Secure your digital life and protect against data breaches by generating and saving unique, strong passwords for every account. Maintain everything in an end-to-end encrypted password vault that only you can access. +SÉCURISEZ VOTRE VIE NUMÉRIQUE +Sécurisez votre vie numérique et protégez-vous contre les brèches de données en générant et en enregistrant des mots de passe uniques et forts pour chaque compte. Conservez tout dans un coffre chiffré de bout en bout auquel vous êtes le seul à avoir accès. -ACCESS YOUR DATA, ANYWHERE, ANYTIME, ON ANY DEVICE -Easily manage, store, secure, and share unlimited passwords across unlimited devices without restrictions. +ACCÉDER À VOS DONNÉES, PARTOUT, À TOUT MOMENT ET SUR N'IMPORTE QUEL APPAREIL +Gérez, stockez, sécurisez et partagez facilement un nombre illimité de mots de passe sur un nombre illimité d'appareils, sans aucune restriction. -EVERYONE SHOULD HAVE THE TOOLS TO STAY SAFE ONLINE -Utilize Bitwarden for free with no ads or selling data. Bitwarden believes everyone should have the ability to stay safe online. Premium plans offer access to advanced features. +TOUT LE MONDE DEVRAIT DISPOSER DES OUTILS NÉCESSAIRES POUR ASSURER SA SÉCURITÉ EN LIGNE +Utilisez Bitwarden gratuitement, sans publicité ni vente de données. Bitwarden estime que tout le monde devrait avoir la possibilité de rester en sécurité en ligne. Les plans Premium et Familles permettent d'accéder à des fonctionnalités avancées. -EMPOWER YOUR TEAMS WITH BITWARDEN -Plans for Teams and Enterprise come with professional business features. Some examples include SSO integration, self-hosting, directory integration and SCIM provisioning, global policies, API access, event logs, and more. +RESPONSABILISEZ VOS ÉQUIPES AVEC BITWARDEN +Les plans Équipes et Entreprises sont dotées de fonctionnalités professionnelles. Citons par exemple l'intégration SSO, l'auto-hébergement, l'intégration de l'annuaire et le SCIM provisioning, les politiques globales de sécurité, l'accès API, les journaux d'événements, etc. -Use Bitwarden to secure your workforce and share sensitive information with colleagues. +Utilisez Bitwarden pour sécuriser votre personnel et partager des informations sensibles avec vos collègues. -More reasons to choose Bitwarden: +D'autres raisons de choisir Bitwarden : -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private. +Chiffrement de classe mondiale +Les mots de passe sont protégés par un cryptage avancé de bout en bout (AES-256 bits, hachage salé et PBKDF2 SHA-256) afin que vos données restent sécurisées et privées. -3rd-party Audits -Bitwarden regularly conducts comprehensive third-party security audits with notable security firms. These annual audits include source code assessments and penetration testing across Bitwarden IPs, servers, and web applications. +Chiffrement de classe mondiale +Les mots de passe sont protégés par un cryptage avancé de bout en bout (AES-256 bits, hashtag salé et PBKDF2 SHA-256) afin que vos données restent sécurisées et privées. -Advanced 2FA -Secure your login with a third-party authenticator, emailed codes, or FIDO2 WebAuthn credentials such as a hardware security key or passkey. +Audits de tierces parties +Bitwarden effectue régulièrement des audits de sécurité complets avec des sociétés tierces de sécurité renommées. Ces audits annuels comprennent des évaluations du code source et des tests de pénétration sur les IP, les serveurs et les applications web de Bitwarden. + +2FA avancé +Sécurisez votre connexion à l'aide d'un authentificateur tiers, de codes envoyés par courriel ou d'identifiants FIDO2 WebAuthn tels qu'une clé de sécurité matérielle ou une clé d'identificatio (passkey). Bitwarden Send -Transmit data directly to others while maintaining end-to-end encrypted security and limiting exposure. +Transmettez des données directement à d'autres personnes tout en maintenant une sécurité cryptée de bout en bout et en limitant l'exposition. -Built-in Generator -Create long, complex, and distinct passwords and unique usernames for every site you visit. Integrate with email alias providers for additional privacy. +Générateur intégré +Créez des mots de passe longs, complexes et distincts et des noms d'utilisateur uniques pour chaque site que vous visitez. Intégration avec des fournisseurs d'alias de courriels pour plus de confidentialité. -Global Translations -Bitwarden translations exist for more than 60 languages, translated by the global community though Crowdin. +Traductions globales +Il existe des traductions de Bitwarden dans plus de 60 langues, traduites par la communauté mondiale via Crowdin. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Applications multiplateformes +Sécurisez et partagez des données sensibles dans votre coffre Bitwarden à partir de n'importe quel navigateur, appareil mobile ou système d'exploitation de bureau, et plus encore. -Bitwarden secures more than just passwords -End-to-end encrypted credential management solutions from Bitwarden empower organizations to secure everything, including developer secrets and passkey experiences. Visit Bitwarden.com to learn more about Bitwarden Secrets Manager and Bitwarden Passwordless.dev! - +Bitwarden sécurise bien plus que les mots de passe +Les solutions de gestion de bout en bout des identifiants chiffrés de Bitwarden permettent aux organisations de tout sécuriser, y compris les secrets des développeurs et les expériences de clés de passe. Visitez Bitwarden.com pour en savoir plus sur Bitwarden Secrets Manager et Bitwarden Passwordless.dev ! À la maison, au travail ou en déplacement, Bitwarden sécurise facilement tous vos mots de passe, clés d'accès et informations sensibles. diff --git a/apps/browser/store/locales/he/copy.resx b/apps/browser/store/locales/he/copy.resx index 6edd86c4a68..372467a7bee 100644 --- a/apps/browser/store/locales/he/copy.resx +++ b/apps/browser/store/locales/he/copy.resx @@ -127,7 +127,7 @@ מוכר בתור מנהל הסיסמאות הטוב ביותר על ידי G2, CNET, The Verge, WIRED, PCMag, ועוד! אבטח את החיים הדיגיטליים שלך -אבטח את החיים הדיגיטלים שלך והגן מפני פרצות נתונים על ידי יצירת ושמירת סיסמה ייחודית וחזקה עבור כל חשבון. שמור הכל בכספת סיסמאות מוצפנת מקצה-לקצה שרק אתה יכול לגשת אליה. +אבטח את החיים הדיגיטלים שלך והגן מפני פרצות נתונים על ידי יצירת ושמירת סיסמה ייחודית וחזקה עבור כל חשבון. שמור הכל בכספת סיסמאות מוצפנת מקצה־לקצה שרק אתה יכול לגשת אליה. לגשת לנתונים שלך בכל מקום, זמן, ומכשיר נהל, אחסן, אבטח, ושתף בקלות מספר בלתי מוגבל של סיסמאות בין מספר בלתי מוגבל של מכשירים ללא הגבלות. @@ -144,7 +144,7 @@ עוד סיבות לבחור ב־Bitwarden: הצפנה ברמה עולמית -סיסמאות מוגנת עם הצפנה מקצה-לקצה מתקדמת (AES‏-256 סיביות, גיבוב מלוח, ו־PBKDF2 SHA-256) כך שהנתונים שלך נשארים מאובטחים ופרטיים. +סיסמאות מוגנת עם הצפנה מקצה־לקצה מתקדמת (AES-256 סיביות, גיבוב מלוח, ו־PBKDF2 SHA-256) כך שהנתונים שלך נשארים מאובטחים ופרטיים. ביקורות צד שלישי Bitwarden באופן קבוע מבצעת ביקורות אבטחה מקיפות של צד שלישי עם חברות אבטחה בולטות. הביקורות השנתיות הללו כוללות הערכות קוד מקור ובדיקות חדירה על פני פרוטוקולי אינטרנט, שרתים, ויישומי רשת של Bitwarden. @@ -153,7 +153,7 @@ Bitwarden באופן קבוע מבצעת ביקורות אבטחה מקיפות אבטח את הכניסות שלך עם מאמת צד שלישי, קודים בדוא"ל, או אישורי FIDO2 WebAuthn כמו מפתח אבטחת חומרה או מפתח גישה. Bitwarden סֵנְד -שדר נתונים ישירות אל אחרים תוך שמירה על אבטחת הצפנה מקצה-לקצה והגבלת חשיפה. +שדר נתונים ישירות אל אחרים תוך שמירה על אבטחת הצפנה מקצה־לקצה והגבלת חשיפה. מחולל מובנה צור סיסמאות ארוכות, מורכבות, ושונות ושמות משתמש ייחודיים עבור כל אתר שאתה מבקר. שלב עם ספקי כינויי דוא"ל עבור פרטיות נוספת. @@ -162,10 +162,10 @@ Bitwarden סֵנְד תרגומים של Bitwarden קיימים ביותר מ־60 שפות, תורגמו על ידי הקהילה הגלובלית דרך Crowdin. יישומים חוצי פלטפורמות -אבטח ושתף מידע רגיש בתוך כספת ה-Bitwarden שלך מכל דפדפן, מכשיר נייד, או מערכת הפעלה של שולחן עבודה, ועוד. +אבטח ושתף מידע רגיש בתוך כספת ה־Bitwarden שלך מכל דפדפן, מכשיר נייד, או מערכת הפעלה של שולחן עבודה, ועוד. Bitwarden מאבטח יותר מרק סיסמאות -פתרונות ניהול אישורים מוצפנים מקצה-לקצה מאת Bitwarden מעצימות ארגונים לאבטח הכל, כולל סודות פיתוח וחוויות מפתח גישה. בקר ב־Bitwarden.com כדי ללמוד עוד על מנהל הסודות של Bitwarden ו־Bitwarden Passwordless.dev! +פתרונות ניהול אישורים מוצפנים מקצה־לקצה מאת Bitwarden מעצימות ארגונים לאבטח הכל, כולל סודות פיתוח וחוויות מפתח גישה. בקר ב־Bitwarden.com כדי ללמוד עוד על מנהל הסודות של Bitwarden ו־Bitwarden Passwordless.dev! diff --git a/apps/browser/store/locales/pt_BR/copy.resx b/apps/browser/store/locales/pt_BR/copy.resx index f4643115237..266f4008523 100644 --- a/apps/browser/store/locales/pt_BR/copy.resx +++ b/apps/browser/store/locales/pt_BR/copy.resx @@ -168,7 +168,7 @@ Com nossas soluções em gerenciamento de credenciais criptografadas ponta a pon - Em casa, no trabalho ou em qualquer lugar, a Bitwarden protege facilmente todas as suas senhas, chaves de acesso e informações sensíveis. + Onde quer que você esteja, a Bitwarden protege facilmente todas as suas senha, chaves de acesso e informações sensíveis. Sincronize e acesse o seu cofre através de múltiplos dispositivos diff --git a/apps/browser/tailwind.config.js b/apps/browser/tailwind.config.js index f0a7db8e8bc..02e1d86f5ac 100644 --- a/apps/browser/tailwind.config.js +++ b/apps/browser/tailwind.config.js @@ -1,4 +1,4 @@ -/* eslint-disable no-undef, @typescript-eslint/no-require-imports */ +/* eslint-disable @typescript-eslint/no-require-imports */ const config = require("../../libs/components/tailwind.config.base"); config.content = [ diff --git a/apps/cli/package.json b/apps/cli/package.json index 4b650e58805..7d9f4af0ffe 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2025.2.0", + "version": "2025.3.0", "keywords": [ "bitwarden", "password", @@ -68,7 +68,7 @@ "chalk": "4.1.2", "commander": "11.1.0", "form-data": "4.0.1", - "https-proxy-agent": "7.0.5", + "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jsdom": "26.0.0", "jszip": "3.10.1", diff --git a/apps/cli/src/vault/models/collection.response.ts b/apps/cli/src/admin-console/models/response/collection.response.ts similarity index 84% rename from apps/cli/src/vault/models/collection.response.ts rename to apps/cli/src/admin-console/models/response/collection.response.ts index 5136e85774f..a0d1ce1047d 100644 --- a/apps/cli/src/vault/models/collection.response.ts +++ b/apps/cli/src/admin-console/models/response/collection.response.ts @@ -1,7 +1,7 @@ import { CollectionView } from "@bitwarden/admin-console/common"; import { CollectionWithIdExport } from "@bitwarden/common/models/export/collection-with-id.export"; -import { BaseResponse } from "../../models/response/base.response"; +import { BaseResponse } from "../../../models/response/base.response"; export class CollectionResponse extends CollectionWithIdExport implements BaseResponse { object: string; diff --git a/apps/cli/src/admin-console/models/response/organization-collection.response.ts b/apps/cli/src/admin-console/models/response/organization-collection.response.ts index 3d93502af88..a0d62b4c7b6 100644 --- a/apps/cli/src/admin-console/models/response/organization-collection.response.ts +++ b/apps/cli/src/admin-console/models/response/organization-collection.response.ts @@ -1,8 +1,9 @@ import { CollectionView } from "@bitwarden/admin-console/common"; -import { CollectionResponse } from "../../../vault/models/collection.response"; import { SelectionReadOnly } from "../selection-read-only"; +import { CollectionResponse } from "./collection.response"; + export class OrganizationCollectionResponse extends CollectionResponse { groups: SelectionReadOnly[]; users: SelectionReadOnly[]; diff --git a/apps/cli/src/auth/commands/login.command.ts b/apps/cli/src/auth/commands/login.command.ts index 985816fb0dd..9af6e1f0613 100644 --- a/apps/cli/src/auth/commands/login.command.ts +++ b/apps/cli/src/auth/commands/login.command.ts @@ -20,7 +20,7 @@ import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abs import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; @@ -30,6 +30,7 @@ import { PasswordRequest } from "@bitwarden/common/auth/models/request/password. import { TwoFactorEmailRequest } from "@bitwarden/common/auth/models/request/two-factor-email.request"; import { UpdateTempPasswordRequest } from "@bitwarden/common/auth/models/request/update-temp-password.request"; import { ClientType } from "@bitwarden/common/enums"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; @@ -58,6 +59,7 @@ export class LoginCommand { protected loginStrategyService: LoginStrategyServiceAbstraction, protected authService: AuthService, protected apiService: ApiService, + protected masterPasswordApiService: MasterPasswordApiService, protected cryptoFunctionService: CryptoFunctionService, protected environmentService: EnvironmentService, protected passwordGenerationService: PasswordGenerationServiceAbstraction, @@ -321,7 +323,7 @@ export class LoginCommand { })({ type: "input", name: "token", - message: "New device login code:", + message: "New device verification required. Enter OTP sent to login email:", }); newDeviceToken = answer.token; } @@ -454,7 +456,7 @@ export class LoginCommand { request.newMasterPasswordHash = newPasswordHash; request.key = newUserKey[1].encryptedString; - await this.apiService.postPassword(request); + await this.masterPasswordApiService.postPassword(request); return await this.handleUpdatePasswordSuccessResponse(); } catch (e) { @@ -491,7 +493,7 @@ export class LoginCommand { request.newMasterPasswordHash = newPasswordHash; request.masterPasswordHint = hint; - await this.apiService.putUpdateTempPassword(request); + await this.masterPasswordApiService.putUpdateTempPassword(request); return await this.handleUpdatePasswordSuccessResponse(); } catch (e) { diff --git a/apps/cli/src/auth/commands/unlock.command.ts b/apps/cli/src/auth/commands/unlock.command.ts index f33a9cf347a..34546f3d56f 100644 --- a/apps/cli/src/auth/commands/unlock.command.ts +++ b/apps/cli/src/auth/commands/unlock.command.ts @@ -4,11 +4,11 @@ import { firstValueFrom, map } from "rxjs"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; import { MasterPasswordVerification } from "@bitwarden/common/auth/types/verification"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/apps/cli/src/commands/convert-to-key-connector.command.ts b/apps/cli/src/commands/convert-to-key-connector.command.ts index 8c8a3fc9a10..cdebfd7b55a 100644 --- a/apps/cli/src/commands/convert-to-key-connector.command.ts +++ b/apps/cli/src/commands/convert-to-key-connector.command.ts @@ -4,7 +4,7 @@ import * as inquirer from "inquirer"; import { firstValueFrom } from "rxjs"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { EnvironmentService, Region, diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 92c3a8baeaf..1bdbd051585 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -37,6 +37,7 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { KeyService } from "@bitwarden/key-management"; import { OrganizationCollectionRequest } from "../admin-console/models/request/organization-collection.request"; +import { CollectionResponse } from "../admin-console/models/response/collection.response"; import { OrganizationCollectionResponse } from "../admin-console/models/response/organization-collection.response"; import { OrganizationResponse } from "../admin-console/models/response/organization.response"; import { SelectionReadOnly } from "../admin-console/models/selection-read-only"; @@ -46,7 +47,6 @@ import { TemplateResponse } from "../models/response/template.response"; import { SendResponse } from "../tools/send/models/send.response"; import { CliUtils } from "../utils"; import { CipherResponse } from "../vault/models/cipher.response"; -import { CollectionResponse } from "../vault/models/collection.response"; import { FolderResponse } from "../vault/models/folder.response"; import { DownloadCommand } from "./download.command"; @@ -254,8 +254,8 @@ export class GetCommand extends DownloadCommand { return Response.error("No TOTP available for this login."); } - const totp = await this.totpService.getCode(cipher.login.totp); - if (totp == null) { + const totpResponse = await firstValueFrom(this.totpService.getCode$(cipher.login.totp)); + if (!totpResponse.code) { return Response.error("Couldn't generate TOTP code."); } @@ -276,7 +276,7 @@ export class GetCommand extends DownloadCommand { } } - const res = new StringResponse(totp); + const res = new StringResponse(totpResponse.code); return Response.success(res); } @@ -571,7 +571,7 @@ export class GetCommand extends DownloadCommand { const pubKey = Utils.fromB64ToArray(response.publicKey); fingerprint = await this.keyService.getFingerprint(id, pubKey); } catch { - // eslint-disable-next-line + // empty - handled by the null check below } } diff --git a/apps/cli/src/commands/list.command.ts b/apps/cli/src/commands/list.command.ts index 5d512d81bf5..018e742baad 100644 --- a/apps/cli/src/commands/list.command.ts +++ b/apps/cli/src/commands/list.command.ts @@ -21,13 +21,13 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { CollectionResponse } from "../admin-console/models/response/collection.response"; import { OrganizationUserResponse } from "../admin-console/models/response/organization-user.response"; import { OrganizationResponse } from "../admin-console/models/response/organization.response"; import { Response } from "../models/response"; import { ListResponse } from "../models/response/list.response"; import { CliUtils } from "../utils"; import { CipherResponse } from "../vault/models/cipher.response"; -import { CollectionResponse } from "../vault/models/collection.response"; import { FolderResponse } from "../vault/models/folder.response"; export class ListCommand { diff --git a/apps/cli/src/program.ts b/apps/cli/src/program.ts index a118985bf0d..c6b79c7dff2 100644 --- a/apps/cli/src/program.ts +++ b/apps/cli/src/program.ts @@ -155,6 +155,7 @@ export class Program extends BaseProgram { this.serviceContainer.loginStrategyService, this.serviceContainer.authService, this.serviceContainer.apiService, + this.serviceContainer.masterPasswordApiService, this.serviceContainer.cryptoFunctionService, this.serviceContainer.environmentService, this.serviceContainer.passwordGenerationService, diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 67237e46f33..b7f423e8ff7 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -34,19 +34,16 @@ import { ProviderApiService } from "@bitwarden/common/admin-console/services/pro import { ProviderService } from "@bitwarden/common/admin-console/services/provider.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService as MasterPasswordApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { AccountServiceImplementation, getUserId, } from "@bitwarden/common/auth/services/account.service"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { AvatarService } from "@bitwarden/common/auth/services/avatar.service"; -import { DeviceTrustService } from "@bitwarden/common/auth/services/device-trust.service.implementation"; import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; -import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; -import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/services/master-password/master-password-api.service.implementation"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; @@ -64,6 +61,11 @@ import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/bill import { ClientType } from "@bitwarden/common/enums"; import { EncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/encrypt.service.implementation"; import { FallbackBulkEncryptService } from "@bitwarden/common/key-management/crypto/services/fallback-bulk-encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { DeviceTrustService } from "@bitwarden/common/key-management/device-trust/services/device-trust.service.implementation"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/services/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; import { DefaultVaultTimeoutService, DefaultVaultTimeoutSettingsService, @@ -280,6 +282,7 @@ export class ServiceContainer { sdkLoadService: SdkLoadService; cipherAuthorizationService: CipherAuthorizationService; ssoUrlService: SsoUrlService; + masterPasswordApiService: MasterPasswordApiServiceAbstraction; constructor() { let p = null; @@ -766,7 +769,7 @@ export class ServiceContainer { this.stateProvider, ); - this.totpService = new TotpService(this.cryptoFunctionService, this.logService); + this.totpService = new TotpService(this.sdkService); this.importApiService = new ImportApiService(this.apiService); @@ -780,6 +783,7 @@ export class ServiceContainer { this.encryptService, this.pinService, this.accountService, + this.sdkService, ); this.individualExportService = new IndividualVaultExportService( @@ -841,7 +845,10 @@ export class ServiceContainer { this.collectionService, this.organizationService, this.accountService, + this.configService, ); + + this.masterPasswordApiService = new MasterPasswordApiService(this.apiService, this.logService); } async logout() { diff --git a/apps/desktop/desktop_native/Cargo.toml b/apps/desktop/desktop_native/Cargo.toml index 5478d397651..5d4c547b750 100644 --- a/apps/desktop/desktop_native/Cargo.toml +++ b/apps/desktop/desktop_native/Cargo.toml @@ -9,11 +9,55 @@ edition = "2021" publish = false [workspace.dependencies] +aes = "=0.8.4" anyhow = "=1.0.94" +arboard = { version = "=3.4.1", default-features = false } +argon2 = "=0.5.3" +base64 = "=0.22.1" +bindgen = "0.71.1" +bitwarden-russh = { git = "https://github.com/bitwarden/bitwarden-russh.git", rev = "3d48f140fd506412d186203238993163a8c4e536" } +byteorder = "=1.5.0" +bytes = "1.9.0" +cbc = "=0.1.2" +core-foundation = "=0.10.0" +dirs = "=6.0.0" +ed25519 = "=2.2.3" +embed_plist = "=1.2.2" +futures = "=0.3.31" +hex = "=0.4.3" +homedir = "=0.3.4" +interprocess = "=2.2.1" +keytar = "=0.1.6" +libc = "=0.2.169" log = "=0.4.25" +napi = "=2.16.15" +napi-build = "=2.1.4" +napi-derive = "=2.16.13" +oo7 = "=0.3.3" +oslog = "=0.2.0" +pin-project = "=1.1.8" +pkcs8 = "=0.10.2" +rand = "=0.8.5" +rsa = "=0.9.6" +russh-cryptovec = "=0.7.3" +scopeguard = "=1.2.0" +security-framework = "=3.1.0" +security-framework-sys = "=2.13.0" serde = "=1.0.209" serde_json = "=1.0.127" -tokio = "=1.43.0" -tokio-util = "=0.7.13" -tokio-stream = "=0.1.15" +sha2 = "=0.10.8" +simplelog = "=0.12.2" +ssh-encoding = "=0.2.0" +ssh-key = {version = "=0.6.7", default-features = false } +sysinfo = "0.33.1" thiserror = "=1.0.69" +tokio = "=1.43.0" +tokio-stream = "=0.1.15" +tokio-util = "=0.7.13" +typenum = "=1.17.0" +uniffi = "=0.28.3" +widestring = "=1.1.0" +windows = "=0.58.0" +windows-registry = "=0.4.0" +zbus = "=4.4.0" +zbus_polkit = "=4.0.0" diff --git a/apps/desktop/desktop_native/core/Cargo.toml b/apps/desktop/desktop_native/core/Cargo.toml index 8a0bcd0e0a7..346f3bde96b 100644 --- a/apps/desktop/desktop_native/core/Cargo.toml +++ b/apps/desktop/desktop_native/core/Cargo.toml @@ -18,47 +18,47 @@ default = [ manual_test = [] [dependencies] -aes = "=0.8.4" +aes = { workspace = true } anyhow = { workspace = true } -arboard = { version = "=3.4.1", default-features = false, features = [ +arboard = { workspace = true, features = [ "wayland-data-control", ] } -argon2 = { version = "=0.5.3", features = ["zeroize"] } -base64 = "=0.22.1" -byteorder = "=1.5.0" -cbc = { version = "=0.1.2", features = ["alloc"] } -homedir = "=0.3.4" -pin-project = "=1.1.8" -dirs = "=6.0.0" -futures = "=0.3.31" -interprocess = { version = "=2.2.1", features = ["tokio"] } +argon2 = { workspace = true, features = ["zeroize"] } +base64 = { workspace = true } +byteorder = { workspace = true } +cbc = { workspace = true, features = ["alloc"] } +homedir = { workspace = true } +pin-project = { workspace = true } +dirs = { workspace = true } +futures = { workspace = true } +interprocess = { workspace = true, features = ["tokio"] } log = { workspace = true } -rand = "=0.8.5" -russh-cryptovec = "=0.7.3" -scopeguard = "=1.2.0" -sha2 = "=0.10.8" -ssh-encoding = "=0.2.0" -ssh-key = { version = "=0.6.7", default-features = false, features = [ +rand = { workspace = true } +russh-cryptovec = { workspace = true } +scopeguard = { workspace = true } +sha2 = { workspace = true } +ssh-encoding = { workspace = true } +ssh-key = { workspace = true, features = [ "encryption", "ed25519", "rsa", "getrandom", ] } -bitwarden-russh = { git = "https://github.com/bitwarden/bitwarden-russh.git", rev = "3d48f140fd506412d186203238993163a8c4e536" } +bitwarden-russh = { workspace = true } tokio = { workspace = true, features = ["io-util", "sync", "macros", "net"] } tokio-stream = { workspace = true, features = ["net"] } tokio-util = { workspace = true, features = ["codec"] } thiserror = { workspace = true } -typenum = "=1.17.0" -pkcs8 = { version = "=0.10.2", features = ["alloc", "encryption", "pem"] } -rsa = "=0.9.6" -ed25519 = { version = "=2.2.3", features = ["pkcs8"] } -bytes = "1.9.0" -sysinfo = { version = "0.33.1", features = ["windows"] } +typenum = { workspace = true } +pkcs8 = { workspace = true, features = ["alloc", "encryption", "pem"] } +rsa = { workspace = true } +ed25519 = { workspace = true, features = ["pkcs8"] } +bytes = { workspace = true } +sysinfo = { workspace = true, features = ["windows"] } [target.'cfg(windows)'.dependencies] -widestring = { version = "=1.1.0", optional = true } -windows = { version = "=0.58.0", features = [ +widestring = { workspace = true, optional = true } +windows = { workspace = true, features = [ "Foundation", "Security_Credentials_UI", "Security_Cryptography", @@ -72,17 +72,17 @@ windows = { version = "=0.58.0", features = [ ], optional = true } [target.'cfg(windows)'.dev-dependencies] -keytar = "=0.1.6" +keytar = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] -core-foundation = { version = "=0.10.0", optional = true } -security-framework = { version = "=3.1.0", optional = true } -security-framework-sys = { version = "=2.13.0", optional = true } +core-foundation = { workspace = true, optional = true } +security-framework = { workspace = true, optional = true } +security-framework-sys = { workspace = true, optional = true } desktop_objc = { path = "../objc" } [target.'cfg(target_os = "linux")'.dependencies] -oo7 = "=0.3.3" -libc = "=0.2.169" +oo7 = { workspace = true } +libc = { workspace = true } -zbus = { version = "=4.4.0", optional = true } -zbus_polkit = { version = "=4.0.0", optional = true } +zbus = { workspace = true, optional = true } +zbus_polkit = { workspace = true, optional = true } diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/importer.rs b/apps/desktop/desktop_native/core/src/ssh_agent/importer.rs deleted file mode 100644 index 52464487ec5..00000000000 --- a/apps/desktop/desktop_native/core/src/ssh_agent/importer.rs +++ /dev/null @@ -1,402 +0,0 @@ -use ed25519; -use pkcs8::{ - der::Decode, EncryptedPrivateKeyInfo, ObjectIdentifier, PrivateKeyInfo, SecretDocument, -}; -use ssh_key::{ - private::{Ed25519Keypair, Ed25519PrivateKey, RsaKeypair}, - HashAlg, LineEnding, -}; - -const PKCS1_HEADER: &str = "-----BEGIN RSA PRIVATE KEY-----"; -const PKCS8_UNENCRYPTED_HEADER: &str = "-----BEGIN PRIVATE KEY-----"; -const PKCS8_ENCRYPTED_HEADER: &str = "-----BEGIN ENCRYPTED PRIVATE KEY-----"; -const OPENSSH_HEADER: &str = "-----BEGIN OPENSSH PRIVATE KEY-----"; - -pub const RSA_PKCS8_ALGORITHM_OID: ObjectIdentifier = - ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.1"); - -#[derive(Debug)] -enum KeyType { - Ed25519, - Rsa, - Unknown, -} - -pub fn import_key( - encoded_key: String, - password: String, -) -> Result { - match encoded_key.lines().next() { - Some(PKCS1_HEADER) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::UnsupportedKeyType, - ssh_key: None, - }), - Some(PKCS8_UNENCRYPTED_HEADER) => match import_pkcs8_key(encoded_key, None) { - Ok(result) => Ok(result), - Err(_) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - }, - Some(PKCS8_ENCRYPTED_HEADER) => match import_pkcs8_key(encoded_key, Some(password)) { - Ok(result) => Ok(result), - Err(err) => match err { - SshKeyImportError::PasswordRequired => Ok(SshKeyImportResult { - status: SshKeyImportStatus::PasswordRequired, - ssh_key: None, - }), - SshKeyImportError::WrongPassword => Ok(SshKeyImportResult { - status: SshKeyImportStatus::WrongPassword, - ssh_key: None, - }), - SshKeyImportError::ParsingError => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - }, - }, - Some(OPENSSH_HEADER) => import_openssh_key(encoded_key, password), - Some(_) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - None => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - } -} - -fn import_pkcs8_key( - encoded_key: String, - password: Option, -) -> Result { - let der = match SecretDocument::from_pem(&encoded_key) { - Ok((_, doc)) => doc, - Err(_) => { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }); - } - }; - - let decrypted_der = match password.clone() { - Some(password) => { - let encrypted_private_key_info = match EncryptedPrivateKeyInfo::from_der(der.as_bytes()) - { - Ok(info) => info, - Err(_) => { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }); - } - }; - match encrypted_private_key_info.decrypt(password.as_bytes()) { - Ok(der) => der, - Err(_) => { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::WrongPassword, - ssh_key: None, - }); - } - } - } - None => der, - }; - - let key_type: KeyType = match PrivateKeyInfo::from_der(decrypted_der.as_bytes()) - .map_err(|_| SshKeyImportError::ParsingError)? - .algorithm - .oid - { - ed25519::pkcs8::ALGORITHM_OID => KeyType::Ed25519, - RSA_PKCS8_ALGORITHM_OID => KeyType::Rsa, - _ => KeyType::Unknown, - }; - - match key_type { - KeyType::Ed25519 => { - let pk: ed25519::KeypairBytes = match password { - Some(password) => { - pkcs8::DecodePrivateKey::from_pkcs8_encrypted_pem(&encoded_key, password) - .map_err(|err| match err { - ed25519::pkcs8::Error::EncryptedPrivateKey(_) => { - SshKeyImportError::WrongPassword - } - _ => SshKeyImportError::ParsingError, - })? - } - None => ed25519::pkcs8::DecodePrivateKey::from_pkcs8_pem(&encoded_key) - .map_err(|_| SshKeyImportError::ParsingError)?, - }; - let pk: Ed25519Keypair = - Ed25519Keypair::from(Ed25519PrivateKey::from_bytes(&pk.secret_key)); - let private_key = ssh_key::private::PrivateKey::from(pk); - Ok(SshKeyImportResult { - status: SshKeyImportStatus::Success, - ssh_key: Some(SshKey { - private_key: private_key.to_openssh(LineEnding::LF).unwrap().to_string(), - public_key: private_key.public_key().to_string(), - key_fingerprint: private_key.fingerprint(HashAlg::Sha256).to_string(), - }), - }) - } - KeyType::Rsa => { - let pk: rsa::RsaPrivateKey = match password { - Some(password) => { - pkcs8::DecodePrivateKey::from_pkcs8_encrypted_pem(&encoded_key, password) - .map_err(|err| match err { - pkcs8::Error::EncryptedPrivateKey(_) => { - SshKeyImportError::WrongPassword - } - _ => SshKeyImportError::ParsingError, - })? - } - None => pkcs8::DecodePrivateKey::from_pkcs8_pem(&encoded_key) - .map_err(|_| SshKeyImportError::ParsingError)?, - }; - let rsa_keypair: Result = RsaKeypair::try_from(pk); - match rsa_keypair { - Ok(rsa_keypair) => { - let private_key = ssh_key::private::PrivateKey::from(rsa_keypair); - Ok(SshKeyImportResult { - status: SshKeyImportStatus::Success, - ssh_key: Some(SshKey { - private_key: private_key - .to_openssh(LineEnding::LF) - .unwrap() - .to_string(), - public_key: private_key.public_key().to_string(), - key_fingerprint: private_key.fingerprint(HashAlg::Sha256).to_string(), - }), - }) - } - Err(_) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - } - } - _ => Ok(SshKeyImportResult { - status: SshKeyImportStatus::UnsupportedKeyType, - ssh_key: None, - }), - } -} - -fn import_openssh_key( - encoded_key: String, - password: String, -) -> Result { - let private_key = ssh_key::private::PrivateKey::from_openssh(&encoded_key); - let private_key = match private_key { - Ok(k) => k, - Err(err) => { - match err { - ssh_key::Error::AlgorithmUnknown - | ssh_key::Error::AlgorithmUnsupported { algorithm: _ } => { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::UnsupportedKeyType, - ssh_key: None, - }); - } - _ => {} - } - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }); - } - }; - - if private_key.is_encrypted() && password.is_empty() { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::PasswordRequired, - ssh_key: None, - }); - } - let private_key = if private_key.is_encrypted() { - match private_key.decrypt(password.as_bytes()) { - Ok(k) => k, - Err(_) => { - return Ok(SshKeyImportResult { - status: SshKeyImportStatus::WrongPassword, - ssh_key: None, - }); - } - } - } else { - private_key - }; - - match private_key.to_openssh(LineEnding::LF) { - Ok(private_key_openssh) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::Success, - ssh_key: Some(SshKey { - private_key: private_key_openssh.to_string(), - public_key: private_key.public_key().to_string(), - key_fingerprint: private_key.fingerprint(HashAlg::Sha256).to_string(), - }), - }), - Err(_) => Ok(SshKeyImportResult { - status: SshKeyImportStatus::ParsingError, - ssh_key: None, - }), - } -} - -#[derive(PartialEq, Debug)] -pub enum SshKeyImportStatus { - /// ssh key was parsed correctly and will be returned in the result - Success, - /// ssh key was parsed correctly but is encrypted and requires a password - PasswordRequired, - /// ssh key was parsed correctly, and a password was provided when calling the import, but it was incorrect - WrongPassword, - /// ssh key could not be parsed, either due to an incorrect / unsupported format (pkcs#8) or key type (ecdsa), or because the input is not an ssh key - ParsingError, - /// ssh key type is not supported - UnsupportedKeyType, -} - -pub enum SshKeyImportError { - ParsingError, - PasswordRequired, - WrongPassword, -} - -pub struct SshKeyImportResult { - pub status: SshKeyImportStatus, - pub ssh_key: Option, -} - -pub struct SshKey { - pub private_key: String, - pub public_key: String, - pub key_fingerprint: String, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn import_key_ed25519_openssh_unencrypted() { - let private_key = include_str!("./test_keys/ed25519_openssh_unencrypted"); - let public_key = include_str!("./test_keys/ed25519_openssh_unencrypted.pub").trim(); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_ed25519_openssh_encrypted() { - let private_key = include_str!("./test_keys/ed25519_openssh_encrypted"); - let public_key = include_str!("./test_keys/ed25519_openssh_encrypted.pub").trim(); - let result = import_key(private_key.to_string(), "password".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_rsa_openssh_unencrypted() { - let private_key = include_str!("./test_keys/rsa_openssh_unencrypted"); - let public_key = include_str!("./test_keys/rsa_openssh_unencrypted.pub").trim(); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_rsa_openssh_encrypted() { - let private_key = include_str!("./test_keys/rsa_openssh_encrypted"); - let public_key = include_str!("./test_keys/rsa_openssh_encrypted.pub").trim(); - let result = import_key(private_key.to_string(), "password".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_ed25519_pkcs8_unencrypted() { - let private_key = include_str!("./test_keys/ed25519_pkcs8_unencrypted"); - let public_key = - include_str!("./test_keys/ed25519_pkcs8_unencrypted.pub").replace("testkey", ""); - let public_key = public_key.trim(); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_rsa_pkcs8_unencrypted() { - let private_key = include_str!("./test_keys/rsa_pkcs8_unencrypted"); - // for whatever reason pkcs8 + rsa does not include the comment in the public key - let public_key = - include_str!("./test_keys/rsa_pkcs8_unencrypted.pub").replace("testkey", ""); - let public_key = public_key.trim(); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_rsa_pkcs8_encrypted() { - let private_key = include_str!("./test_keys/rsa_pkcs8_encrypted"); - let public_key = include_str!("./test_keys/rsa_pkcs8_encrypted.pub").replace("testkey", ""); - let public_key = public_key.trim(); - let result = import_key(private_key.to_string(), "password".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::Success); - assert_eq!(result.ssh_key.unwrap().public_key, public_key); - } - - #[test] - fn import_key_ed25519_openssh_encrypted_wrong_password() { - let private_key = include_str!("./test_keys/ed25519_openssh_encrypted"); - let result = import_key(private_key.to_string(), "wrongpassword".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::WrongPassword); - } - - #[test] - fn import_non_key_error() { - let result = import_key("not a key".to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::ParsingError); - } - - #[test] - fn import_ecdsa_error() { - let private_key = include_str!("./test_keys/ecdsa_openssh_unencrypted"); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::UnsupportedKeyType); - } - - // Putty-exported keys should be supported, but are not due to a parser incompatibility. - // Should this test start failing, please change it to expect a correct key, and - // make sure the documentation support for putty-exported keys this is updated. - // https://bitwarden.atlassian.net/browse/PM-14989 - #[test] - fn import_key_ed25519_putty() { - let private_key = include_str!("./test_keys/ed25519_putty_openssh_unencrypted"); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::ParsingError); - } - - // Putty-exported keys should be supported, but are not due to a parser incompatibility. - // Should this test start failing, please change it to expect a correct key, and - // make sure the documentation support for putty-exported keys this is updated. - // https://bitwarden.atlassian.net/browse/PM-14989 - #[test] - fn import_key_rsa_openssh_putty() { - let private_key = include_str!("./test_keys/rsa_putty_openssh_unencrypted"); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::ParsingError); - } - - #[test] - fn import_key_rsa_pkcs8_putty() { - let private_key = include_str!("./test_keys/rsa_putty_pkcs1_unencrypted"); - let result = import_key(private_key.to_string(), "".to_string()).unwrap(); - assert_eq!(result.status, SshKeyImportStatus::UnsupportedKeyType); - } -} diff --git a/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs b/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs index 3fe327948f8..5f794b49c73 100644 --- a/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs +++ b/apps/desktop/desktop_native/core/src/ssh_agent/mod.rs @@ -16,7 +16,6 @@ mod platform_ssh_agent; #[cfg(any(target_os = "linux", target_os = "macos"))] mod peercred_unix_listener_stream; -pub mod importer; pub mod peerinfo; mod request_parser; diff --git a/apps/desktop/desktop_native/macos_provider/Cargo.toml b/apps/desktop/desktop_native/macos_provider/Cargo.toml index e160f7f35d6..cf7338f23cf 100644 --- a/apps/desktop/desktop_native/macos_provider/Cargo.toml +++ b/apps/desktop/desktop_native/macos_provider/Cargo.toml @@ -15,16 +15,16 @@ bench = false [dependencies] desktop_core = { path = "../core" } -futures = "=0.3.31" +futures = { workspace = true } log = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } tokio = { workspace = true, features = ["sync"] } tokio-util = { workspace = true } -uniffi = { version = "=0.28.3", features = ["cli"] } +uniffi = { workspace = true, features = ["cli"] } [target.'cfg(target_os = "macos")'.dependencies] -oslog = "=0.2.0" +oslog = { workspace = true } [build-dependencies] -uniffi = { version = "=0.28.3", features = ["build"] } +uniffi = { workspace = true, features = ["build"] } diff --git a/apps/desktop/desktop_native/napi/Cargo.toml b/apps/desktop/desktop_native/napi/Cargo.toml index a9513fa49a8..f5b6d6b7c04 100644 --- a/apps/desktop/desktop_native/napi/Cargo.toml +++ b/apps/desktop/desktop_native/napi/Cargo.toml @@ -14,12 +14,12 @@ default = [] manual_test = [] [dependencies] -base64 = "=0.22.1" -hex = "=0.4.3" +base64 = { workspace = true } +hex = { workspace = true } anyhow = { workspace = true } desktop_core = { path = "../core" } -napi = { version = "=2.16.15", features = ["async"] } -napi-derive = "=2.16.13" +napi = { workspace = true, features = ["async"] } +napi-derive = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } tokio = { workspace = true } @@ -27,7 +27,7 @@ tokio-util = { workspace = true } tokio-stream = { workspace = true } [target.'cfg(windows)'.dependencies] -windows-registry = "=0.4.0" +windows-registry = { workspace = true } [build-dependencies] -napi-build = "=2.1.4" +napi-build = { workspace = true } diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index c40b7aed487..92f31cf5f89 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -51,22 +51,6 @@ export declare namespace sshagent { publicKey: string keyFingerprint: string } - export const enum SshKeyImportStatus { - /** ssh key was parsed correctly and will be returned in the result */ - Success = 0, - /** ssh key was parsed correctly but is encrypted and requires a password */ - PasswordRequired = 1, - /** ssh key was parsed correctly, and a password was provided when calling the import, but it was incorrect */ - WrongPassword = 2, - /** ssh key could not be parsed, either due to an incorrect / unsupported format (pkcs#8) or key type (ecdsa), or because the input is not an ssh key */ - ParsingError = 3, - /** ssh key type is not supported (e.g. ecdsa) */ - UnsupportedKeyType = 4 - } - export interface SshKeyImportResult { - status: SshKeyImportStatus - sshKey?: SshKey - } export interface SshUiRequest { cipherId?: string isList: boolean @@ -79,7 +63,6 @@ export declare namespace sshagent { export function isRunning(agentState: SshAgentState): boolean export function setKeys(agentState: SshAgentState, newKeys: Array): void export function lock(agentState: SshAgentState): void - export function importKey(encodedKey: string, password: string): SshKeyImportResult export function clearKeys(agentState: SshAgentState): void export class SshAgentState { } } diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 7d20bd50699..d0c859d427c 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -182,67 +182,6 @@ pub mod sshagent { pub key_fingerprint: String, } - impl From for SshKey { - fn from(key: desktop_core::ssh_agent::importer::SshKey) -> Self { - SshKey { - private_key: key.private_key, - public_key: key.public_key, - key_fingerprint: key.key_fingerprint, - } - } - } - - #[napi] - pub enum SshKeyImportStatus { - /// ssh key was parsed correctly and will be returned in the result - Success, - /// ssh key was parsed correctly but is encrypted and requires a password - PasswordRequired, - /// ssh key was parsed correctly, and a password was provided when calling the import, but it was incorrect - WrongPassword, - /// ssh key could not be parsed, either due to an incorrect / unsupported format (pkcs#8) or key type (ecdsa), or because the input is not an ssh key - ParsingError, - /// ssh key type is not supported (e.g. ecdsa) - UnsupportedKeyType, - } - - impl From for SshKeyImportStatus { - fn from(status: desktop_core::ssh_agent::importer::SshKeyImportStatus) -> Self { - match status { - desktop_core::ssh_agent::importer::SshKeyImportStatus::Success => { - SshKeyImportStatus::Success - } - desktop_core::ssh_agent::importer::SshKeyImportStatus::PasswordRequired => { - SshKeyImportStatus::PasswordRequired - } - desktop_core::ssh_agent::importer::SshKeyImportStatus::WrongPassword => { - SshKeyImportStatus::WrongPassword - } - desktop_core::ssh_agent::importer::SshKeyImportStatus::ParsingError => { - SshKeyImportStatus::ParsingError - } - desktop_core::ssh_agent::importer::SshKeyImportStatus::UnsupportedKeyType => { - SshKeyImportStatus::UnsupportedKeyType - } - } - } - } - - #[napi(object)] - pub struct SshKeyImportResult { - pub status: SshKeyImportStatus, - pub ssh_key: Option, - } - - impl From for SshKeyImportResult { - fn from(result: desktop_core::ssh_agent::importer::SshKeyImportResult) -> Self { - SshKeyImportResult { - status: result.status.into(), - ssh_key: result.ssh_key.map(|k| k.into()), - } - } - } - #[napi(object)] pub struct SshUIRequest { pub cipher_id: Option, @@ -359,13 +298,6 @@ pub mod sshagent { .map_err(|e| napi::Error::from_reason(e.to_string())) } - #[napi] - pub fn import_key(encoded_key: String, password: String) -> napi::Result { - let result = desktop_core::ssh_agent::importer::import_key(encoded_key, password) - .map_err(|e| napi::Error::from_reason(e.to_string()))?; - Ok(result.into()) - } - #[napi] pub fn clear_keys(agent_state: &mut SshAgentState) -> napi::Result<()> { let bitwarden_agent_state = &mut agent_state.state; diff --git a/apps/desktop/desktop_native/proxy/Cargo.toml b/apps/desktop/desktop_native/proxy/Cargo.toml index 10ff1ed8eae..a9a1a5aca28 100644 --- a/apps/desktop/desktop_native/proxy/Cargo.toml +++ b/apps/desktop/desktop_native/proxy/Cargo.toml @@ -8,11 +8,11 @@ publish = { workspace = true } [dependencies] anyhow = { workspace = true } desktop_core = { path = "../core" } -futures = "=0.3.31" +futures = { workspace = true } log = { workspace = true } -simplelog = "=0.12.2" +simplelog = { workspace = true } tokio = { workspace = true, features = ["io-std", "io-util", "macros", "rt"] } tokio-util = { workspace = true, features = ["codec"] } [target.'cfg(target_os = "macos")'.dependencies] -embed_plist = "=1.2.2" +embed_plist = { workspace = true } diff --git a/apps/desktop/desktop_native/windows-plugin-authenticator/Cargo.toml b/apps/desktop/desktop_native/windows-plugin-authenticator/Cargo.toml index 3443fed4fd6..d58a6ecd748 100644 --- a/apps/desktop/desktop_native/windows-plugin-authenticator/Cargo.toml +++ b/apps/desktop/desktop_native/windows-plugin-authenticator/Cargo.toml @@ -6,4 +6,5 @@ version = { workspace = true } publish = { workspace = true } [target.'cfg(target_os = "windows")'.build-dependencies] -bindgen = "0.71.1" +bindgen = { workspace = true } + diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index 2922035a913..30d87c5c662 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -249,7 +249,8 @@ "polkit": { "action-prefix": "com.bitwarden.Bitwarden" } - } + }, + "u2f-devices" ], "stagePackages": ["default"] }, diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 992f218f6c6..d4fe93d05b9 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2025.2.2", + "version": "2025.3.0", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/postcss.config.js b/apps/desktop/postcss.config.js index 05e2b04124f..5657df3afcf 100644 --- a/apps/desktop/postcss.config.js +++ b/apps/desktop/postcss.config.js @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/no-require-imports, no-undef */ +/* eslint-disable @typescript-eslint/no-require-imports */ module.exports = { plugins: [ require("postcss-import"), diff --git a/apps/desktop/resources/com.bitwarden.desktop.devel.yaml b/apps/desktop/resources/com.bitwarden.desktop.devel.yaml index fea28052f8d..3aeebfd809d 100644 --- a/apps/desktop/resources/com.bitwarden.desktop.devel.yaml +++ b/apps/desktop/resources/com.bitwarden.desktop.devel.yaml @@ -22,6 +22,7 @@ finish-args: - --talk-name=org.freedesktop.ScreenSaver - --system-talk-name=org.freedesktop.login1 - --filesystem=xdg-download + - --device=all modules: - name: bitwarden-desktop buildsystem: simple diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html index e76526a6618..bcbd9969f96 100644 --- a/apps/desktop/src/app/accounts/settings.component.html +++ b/apps/desktop/src/app/accounts/settings.component.html @@ -423,7 +423,7 @@ "enableHardwareAccelerationDesc" | i18n }}
-
+
diff --git a/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options-v1.component.ts b/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options-v1.component.ts deleted file mode 100644 index d9cc07adb7e..00000000000 --- a/apps/desktop/src/auth/login/login-decryption-options/login-decryption-options-v1.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component } from "@angular/core"; - -import { BaseLoginDecryptionOptionsComponentV1 } from "@bitwarden/angular/auth/components/base-login-decryption-options-v1.component"; - -@Component({ - selector: "desktop-login-decryption-options", - templateUrl: "login-decryption-options-v1.component.html", -}) -export class LoginDecryptionOptionsComponentV1 extends BaseLoginDecryptionOptionsComponentV1 { - override async createUser(): Promise { - try { - await super.createUser(); - this.messagingService.send("redrawMenu"); - await this.router.navigate(["/vault"]); - } catch (error) { - this.validationService.showError(error); - } - } -} diff --git a/apps/desktop/src/auth/login/login-v1.component.html b/apps/desktop/src/auth/login/login-v1.component.html deleted file mode 100644 index aae4cec239d..00000000000 --- a/apps/desktop/src/auth/login/login-v1.component.html +++ /dev/null @@ -1,157 +0,0 @@ -
-
-
- - Bitwarden - -

{{ "loginOrCreateNewAccount" | i18n }}

- - -
-
-
- - -
-
- - -
-
- -
-
-
- -
-
-
-

{{ "newAroundHere" | i18n }}

- -
-
- - -
-
-
-
- - -
-
- -
-
-
-
-
-
- -
- -
-
-
-
-
- -
-
- -
-
- -
-
-
- -
-

{{ "loggingInAs" | i18n }} {{ loggedEmail }}

- {{ "notYou" | i18n }} -
-
-
-
-
-
- diff --git a/apps/desktop/src/auth/login/login-v1.component.ts b/apps/desktop/src/auth/login/login-v1.component.ts deleted file mode 100644 index ff8688353be..00000000000 --- a/apps/desktop/src/auth/login/login-v1.component.ts +++ /dev/null @@ -1,266 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, NgZone, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { Subject, firstValueFrom, takeUntil, tap } from "rxjs"; - -import { LoginComponentV1 as BaseLoginComponent } from "@bitwarden/angular/auth/components/login-v1.component"; -import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { EnvironmentComponent } from "../environment.component"; - -const BroadcasterSubscriptionId = "LoginComponent"; - -@Component({ - selector: "app-login", - templateUrl: "login-v1.component.html", -}) -export class LoginComponentV1 extends BaseLoginComponent implements OnInit, OnDestroy { - @ViewChild("environment", { read: ViewContainerRef, static: true }) - environmentModal: ViewContainerRef; - - protected componentDestroyed$: Subject = new Subject(); - webVaultHostname = ""; - - showingModal = false; - - private deferFocus: boolean = null; - - get loggedEmail() { - return this.formGroup.value.email; - } - - constructor( - devicesApiService: DevicesApiServiceAbstraction, - appIdService: AppIdService, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - syncService: SyncService, - private modalService: ModalService, - platformUtilsService: PlatformUtilsService, - stateService: StateService, - environmentService: EnvironmentService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - cryptoFunctionService: CryptoFunctionService, - private broadcasterService: BroadcasterService, - ngZone: NgZone, - private messagingService: MessagingService, - logService: LogService, - formBuilder: FormBuilder, - formValidationErrorService: FormValidationErrorsService, - route: ActivatedRoute, - loginEmailService: LoginEmailServiceAbstraction, - ssoLoginService: SsoLoginServiceAbstraction, - toastService: ToastService, - private configService: ConfigService, - ) { - super( - devicesApiService, - appIdService, - loginStrategyService, - router, - platformUtilsService, - i18nService, - stateService, - environmentService, - passwordGenerationService, - cryptoFunctionService, - logService, - ngZone, - formBuilder, - formValidationErrorService, - route, - loginEmailService, - ssoLoginService, - toastService, - ); - this.onSuccessfulLogin = () => { - return syncService.fullSync(true); - }; - } - - async ngOnInit() { - this.listenForUnauthUiRefreshFlagChanges(); - - await super.ngOnInit(); - await this.getLoginWithDevice(this.loggedEmail); - this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { - this.ngZone.run(() => { - switch (message.command) { - case "windowHidden": - this.onWindowHidden(); - break; - case "windowIsFocused": - if (this.deferFocus === null) { - this.deferFocus = !message.windowIsFocused; - if (!this.deferFocus) { - this.focusInput(); - } - } else if (this.deferFocus && message.windowIsFocused) { - this.focusInput(); - this.deferFocus = false; - } - break; - default: - } - }); - }); - this.messagingService.send("getWindowIsFocused"); - } - - ngOnDestroy() { - this.broadcasterService.unsubscribe(BroadcasterSubscriptionId); - this.componentDestroyed$.next(); - this.componentDestroyed$.complete(); - } - - private listenForUnauthUiRefreshFlagChanges() { - this.configService - .getFeatureFlag$(FeatureFlag.UnauthenticatedExtensionUIRefresh) - .pipe( - tap(async (flag) => { - if (flag) { - const qParams = await firstValueFrom(this.route.queryParams); - - const uniqueQueryParams = { - ...qParams, - // adding a unique timestamp to the query params to force a reload - t: new Date().getTime().toString(), - }; - - await this.router.navigate(["/"], { - queryParams: uniqueQueryParams, - }); - } - }), - takeUntil(this.componentDestroyed$), - ) - .subscribe(); - } - - async settings() { - const [modal, childComponent] = await this.modalService.openViewRef( - EnvironmentComponent, - this.environmentModal, - ); - - modal.onShown.pipe(takeUntil(this.componentDestroyed$)).subscribe(() => { - this.showingModal = true; - }); - - modal.onClosed.pipe(takeUntil(this.componentDestroyed$)).subscribe(() => { - this.showingModal = false; - }); - - // eslint-disable-next-line rxjs/no-async-subscribe - childComponent.onSaved.pipe(takeUntil(this.componentDestroyed$)).subscribe(async () => { - modal.close(); - await this.getLoginWithDevice(this.loggedEmail); - }); - } - - onWindowHidden() { - this.showPassword = false; - } - - async continue() { - await super.validateEmail(); - if (!this.formGroup.controls.email.valid) { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccured"), - message: this.i18nService.t("invalidEmail"), - }); - return; - } - this.focusInput(); - } - - async submit() { - if (!this.validatedEmail) { - return; - } - - await super.submit(); - if (this.captchaSiteKey) { - const content = document.getElementById("content") as HTMLDivElement; - content.setAttribute("style", "width:335px"); - } - } - - private focusInput() { - const email = this.loggedEmail; - document.getElementById(email == null || email === "" ? "email" : "masterPassword")?.focus(); - } - - async launchSsoBrowser(clientId: string, ssoRedirectUri: string) { - if (!ipc.platform.isAppImage && !ipc.platform.isSnapStore && !ipc.platform.isDev) { - return super.launchSsoBrowser(clientId, ssoRedirectUri); - } - const email = this.formGroup.controls.email.value; - - // Save off email for SSO - await this.ssoLoginService.setSsoEmail(email); - - // Generate necessary sso params - const passwordOptions: any = { - type: "password", - length: 64, - uppercase: true, - lowercase: true, - numbers: true, - special: false, - }; - const state = await this.passwordGenerationService.generatePassword(passwordOptions); - const ssoCodeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); - const codeVerifierHash = await this.cryptoFunctionService.hash(ssoCodeVerifier, "sha256"); - const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); - - // Save sso params - await this.ssoLoginService.setSsoState(state); - await this.ssoLoginService.setCodeVerifier(ssoCodeVerifier); - - try { - await ipc.platform.localhostCallbackService.openSsoPrompt(codeChallenge, state, email); - // FIXME: Remove when updating file. Eslint update - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (err) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccured"), - this.i18nService.t("ssoError"), - ); - } - } - - /** - * Force the validatedEmail flag to false, which will show the login page. - */ - invalidateEmail() { - this.validatedEmail = false; - } -} diff --git a/apps/desktop/src/auth/login/login-via-auth-request-v1.component.html b/apps/desktop/src/auth/login/login-via-auth-request-v1.component.html deleted file mode 100644 index 9825949f7ec..00000000000 --- a/apps/desktop/src/auth/login/login-via-auth-request-v1.component.html +++ /dev/null @@ -1,80 +0,0 @@ -
-
- Bitwarden - - -

{{ "logInRequestSent" | i18n }}

- -
-
-
-
-

- {{ "notificationSentDevicePart1" | i18n }} - {{ "notificationSentDeviceAnchor" | i18n }}. {{ "notificationSentDevicePart2" | i18n }} -

-
- -
-

{{ "fingerprintPhraseHeader" | i18n }}

- {{ fingerprintPhrase }} -
- - - -
-

- {{ "needAnotherOption" | i18n }} - - {{ "viewAllLoginOptions" | i18n }} - -

-
-
-
-
-
- - -

{{ "adminApprovalRequested" | i18n }}

- -
-
-
-
-

{{ "adminApprovalRequestSentToAdmins" | i18n }}

-

{{ "youWillBeNotifiedOnceApproved" | i18n }}

-
- -
-

{{ "fingerprintPhraseHeader" | i18n }}

- {{ fingerprintPhrase }} -
- -
-

- {{ "troubleLoggingIn" | i18n }} - - {{ "viewAllLoginOptions" | i18n }} - -

-
-
-
-
-
-
-
- diff --git a/apps/desktop/src/auth/login/login-via-auth-request-v1.component.ts b/apps/desktop/src/auth/login/login-via-auth-request-v1.component.ts deleted file mode 100644 index 30e693b9ac6..00000000000 --- a/apps/desktop/src/auth/login/login-via-auth-request-v1.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Location } from "@angular/common"; -import { Component, ViewChild, ViewContainerRef } from "@angular/core"; -import { Router } from "@angular/router"; - -import { LoginViaAuthRequestComponentV1 as BaseLoginViaAuthRequestComponentV1 } from "@bitwarden/angular/auth/components/login-via-auth-request-v1.component"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; -import { - AuthRequestServiceAbstraction, - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AnonymousHubService } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { KeyService } from "@bitwarden/key-management"; - -import { EnvironmentComponent } from "../environment.component"; - -@Component({ - selector: "app-login-via-auth-request", - templateUrl: "login-via-auth-request-v1.component.html", -}) -export class LoginViaAuthRequestComponentV1 extends BaseLoginViaAuthRequestComponentV1 { - @ViewChild("environment", { read: ViewContainerRef, static: true }) - environmentModal: ViewContainerRef; - showingModal = false; - - constructor( - protected router: Router, - keyService: KeyService, - cryptoFunctionService: CryptoFunctionService, - appIdService: AppIdService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - apiService: ApiService, - authService: AuthService, - logService: LogService, - environmentService: EnvironmentService, - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - anonymousHubService: AnonymousHubService, - validationService: ValidationService, - private modalService: ModalService, - syncService: SyncService, - loginEmailService: LoginEmailServiceAbstraction, - deviceTrustService: DeviceTrustServiceAbstraction, - authRequestService: AuthRequestServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - accountService: AccountService, - private location: Location, - toastService: ToastService, - ) { - super( - router, - keyService, - cryptoFunctionService, - appIdService, - passwordGenerationService, - apiService, - authService, - logService, - environmentService, - i18nService, - platformUtilsService, - anonymousHubService, - validationService, - accountService, - loginEmailService, - deviceTrustService, - authRequestService, - loginStrategyService, - toastService, - ); - - this.onSuccessfulLogin = () => { - return syncService.fullSync(true); - }; - } - - async settings() { - const [modal, childComponent] = await this.modalService.openViewRef( - EnvironmentComponent, - this.environmentModal, - ); - - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - modal.onShown.subscribe(() => { - this.showingModal = true; - }); - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - modal.onClosed.subscribe(() => { - this.showingModal = false; - }); - - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - childComponent.onSaved.subscribe(() => { - modal.close(); - }); - } - - back() { - this.location.back(); - } -} diff --git a/apps/desktop/src/auth/login/login.module.ts b/apps/desktop/src/auth/login/login.module.ts index 427cbcb2069..601c71e00b1 100644 --- a/apps/desktop/src/auth/login/login.module.ts +++ b/apps/desktop/src/auth/login/login.module.ts @@ -5,18 +5,9 @@ import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components import { SharedModule } from "../../app/shared/shared.module"; -import { LoginDecryptionOptionsComponentV1 } from "./login-decryption-options/login-decryption-options-v1.component"; -import { LoginComponentV1 } from "./login-v1.component"; -import { LoginViaAuthRequestComponentV1 } from "./login-via-auth-request-v1.component"; - @NgModule({ imports: [SharedModule, RouterModule], - declarations: [ - LoginComponentV1, - LoginViaAuthRequestComponentV1, - EnvironmentSelectorComponent, - LoginDecryptionOptionsComponentV1, - ], - exports: [LoginComponentV1, LoginViaAuthRequestComponentV1], + declarations: [EnvironmentSelectorComponent], + exports: [], }) export class LoginModule {} diff --git a/apps/desktop/src/auth/set-password.component.ts b/apps/desktop/src/auth/set-password.component.ts index ed4e8de5b3d..5a78fb08c47 100644 --- a/apps/desktop/src/auth/set-password.component.ts +++ b/apps/desktop/src/auth/set-password.component.ts @@ -9,9 +9,10 @@ import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-conso import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -40,6 +41,7 @@ export class SetPasswordComponent extends BaseSetPasswordComponent implements On policyApiService: PolicyApiServiceAbstraction, policyService: PolicyService, router: Router, + masterPasswordApiService: MasterPasswordApiService, syncService: SyncService, route: ActivatedRoute, private broadcasterService: BroadcasterService, @@ -63,6 +65,7 @@ export class SetPasswordComponent extends BaseSetPasswordComponent implements On policyApiService, policyService, router, + masterPasswordApiService, apiService, syncService, route, diff --git a/apps/desktop/src/auth/sso-v1.component.ts b/apps/desktop/src/auth/sso-v1.component.ts index da3139e31f7..1bb6d8362a1 100644 --- a/apps/desktop/src/auth/sso-v1.component.ts +++ b/apps/desktop/src/auth/sso-v1.component.ts @@ -8,8 +8,8 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/apps/desktop/src/auth/two-factor-v1.component.ts b/apps/desktop/src/auth/two-factor-v1.component.ts index 26a6f81b88c..13c7d0a452b 100644 --- a/apps/desktop/src/auth/two-factor-v1.component.ts +++ b/apps/desktop/src/auth/two-factor-v1.component.ts @@ -14,10 +14,10 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -37,7 +37,6 @@ const BroadcasterSubscriptionId = "TwoFactorComponent"; selector: "app-two-factor", templateUrl: "two-factor-v1.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class TwoFactorComponentV1 extends BaseTwoFactorComponent implements OnDestroy { @ViewChild("twoFactorOptions", { read: ViewContainerRef, static: true }) twoFactorOptionsModal: ViewContainerRef; diff --git a/apps/desktop/src/autofill/main/main-ssh-agent.service.ts b/apps/desktop/src/autofill/main/main-ssh-agent.service.ts index af79d9d7316..595ef778bcf 100644 --- a/apps/desktop/src/autofill/main/main-ssh-agent.service.ts +++ b/apps/desktop/src/autofill/main/main-ssh-agent.service.ts @@ -25,16 +25,6 @@ export class MainSshAgentService { private logService: LogService, private messagingService: MessagingService, ) { - ipcMain.handle( - "sshagent.importkey", - async ( - event: any, - { privateKey, password }: { privateKey: string; password?: string }, - ): Promise => { - return sshagent.importKey(privateKey, password); - }, - ); - ipcMain.handle("sshagent.init", async (event: any, message: any) => { this.init(); }); diff --git a/apps/desktop/src/autofill/services/ssh-agent.service.ts b/apps/desktop/src/autofill/services/ssh-agent.service.ts index 87c6de75a95..bf7167c0240 100644 --- a/apps/desktop/src/autofill/services/ssh-agent.service.ts +++ b/apps/desktop/src/autofill/services/ssh-agent.service.ts @@ -24,8 +24,6 @@ import { import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { CommandDefinition, MessageListener } from "@bitwarden/common/platform/messaging"; @@ -58,23 +56,13 @@ export class SshAgentService implements OnDestroy { private toastService: ToastService, private i18nService: I18nService, private desktopSettingsService: DesktopSettingsService, - private configService: ConfigService, private accountService: AccountService, ) {} async init() { - this.configService - .getFeatureFlag$(FeatureFlag.SSHAgent) - .pipe( - concatMap(async (enabled) => { - this.isFeatureFlagEnabled = enabled; - if (!(await ipc.platform.sshAgent.isLoaded()) && enabled) { - await ipc.platform.sshAgent.init(); - } - }), - takeUntil(this.destroy$), - ) - .subscribe(); + if (!(await ipc.platform.sshAgent.isLoaded())) { + await ipc.platform.sshAgent.init(); + } await this.initListeners(); } diff --git a/apps/desktop/src/locales/af/messages.json b/apps/desktop/src/locales/af/messages.json index fce872cb0ab..ae324eda6bc 100644 --- a/apps/desktop/src/locales/af/messages.json +++ b/apps/desktop/src/locales/af/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Aantal Woorde" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Wagwoordwenk" - }, - "enterEmailToGetHint": { - "message": "Voer u e-posadres in om u hoofwagwoordwenk te ontvang." - }, "getMasterPasswordHint": { "message": "Kry hoofwagwoordwenk" }, @@ -916,7 +906,7 @@ "message": "Bevestig met Duo Security vir u organisasie d.m.v. die Duo Mobile-toep, SMS, spraakoproep of ’n U2F-beveiligingsleutel.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Selfgehuisveste omgewing" }, - "selfHostedEnvironmentFooter": { - "message": "Spesifiseer die basisbronadres van u selfgehuisveste Bitwarden-installasie." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Pasgemaakte omgewing" }, - "customEnvironmentFooter": { - "message": "Vir gevorderde gebruikers. U kan die basisbronadres van elke diens onafhanklik instel." - }, "baseUrl": { "message": "Bedienerbronadres" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nee" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Skryf oor wagwoord" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Meld aan met meesterwagwoord" }, - "loggingInAs": { - "message": "Meld aan as" - }, "rememberEmail": { "message": "Onthou e-pos" }, - "notYou": { - "message": "Nie jy nie?" - }, "newAroundHere": { "message": "Nuut hier rond?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Keur goed met hoofwagwoord" - }, "region": { "message": "Streek" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ar/messages.json b/apps/desktop/src/locales/ar/messages.json index efef6558df9..9f5b1f3501c 100644 --- a/apps/desktop/src/locales/ar/messages.json +++ b/apps/desktop/src/locales/ar/messages.json @@ -543,10 +543,6 @@ "message": "تضمين أحرف خاصة", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "عدد الكلمات" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "أدخل عنوان البريد الإلكتروني لحسابك وسيُرسل تلميح كلمة المرور الخاصة بك إليك" }, - "passwordHint": { - "message": "تلميح كلمة المرور" - }, - "enterEmailToGetHint": { - "message": "أدخل عنوان البريد الإلكتروني لحسابك لتلقي تلميحات كلمة المرور الرئيسية." - }, "getMasterPasswordHint": { "message": "احصل على تلميح لكلمة المرور الرئيسية" }, @@ -916,7 +906,7 @@ "message": "تحقق من خلال نظام الحماية الثنائي لمؤسستك باستخدام تطبيق Duo Mobile أو الرسائل القصيرة أو المكالمة الهاتفية أو مفتاح الأمان U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "البيئة المستضافة ذاتيا" }, - "selfHostedEnvironmentFooter": { - "message": "حدد عنوان URL الأساسي لتثبيت Bitwarden المستضاف محليًا." - }, "selfHostedBaseUrlHint": { "message": "حدد عنوان URL الأساسي لمحالّك التي استضافت تثبيت Bitwarden على سبيل المثال: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "بيئة مخصصة" }, - "customEnvironmentFooter": { - "message": "للمستخدمين المتقدمين. يمكنك تحديد عنوان URL الأساسي لكل خدمة بشكل مستقل." - }, "baseUrl": { "message": "رابط الخادم" }, @@ -1013,6 +997,9 @@ "no": { "message": "لا" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "الكتابة فوق كلمة المرور" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "تسجيل الدخول باستخدام كلمة المرور الرئيسية" }, - "loggingInAs": { - "message": "تسجيل الدخول كـ" - }, "rememberEmail": { "message": "تذكر البريد الإلكتروني" }, - "notYou": { - "message": "ليس أنت؟" - }, "newAroundHere": { "message": "جديد هنا؟" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "طلب موافقة المشرف" }, - "approveWithMasterPassword": { - "message": "الموافقة بواسطة كلمة المرور الرئيسية" - }, "region": { "message": "المنطقة" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "تم إرسال طلبك إلى المشرف الخاص بك." }, - "youWillBeNotifiedOnceApproved": { - "message": "سيتم إعلامك بمجرد الموافقة." - }, "troubleLoggingIn": { "message": "مشكلة في تسجيل الدخول؟" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "تطبيق" }, - "sshKeyPasswordUnsupported": { - "message": "استيراد مفاتيح SSH المحمية بكلمة المرور غير معتمد حتى الآن" - }, "invalidSshKey": { "message": "مفتاح SSH غير صالح" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "استيراد المفتاح من الحافظة" }, - "sshKeyPasted": { - "message": "تم استيراد مفتاح SSH بنجاح" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "تم حفظ الملف على الجهاز. إدارة من تنزيلات جهازك." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/az/messages.json b/apps/desktop/src/locales/az/messages.json index e7006cdd004..b7c7cb3cd67 100644 --- a/apps/desktop/src/locales/az/messages.json +++ b/apps/desktop/src/locales/az/messages.json @@ -543,10 +543,6 @@ "message": "Xüsusi xarakterləri daxil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Söz sayı" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" }, - "passwordHint": { - "message": "Parol məsləhəti" - }, - "enterEmailToGetHint": { - "message": "Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin." - }, "getMasterPasswordHint": { "message": "Ana parol üçün məsləhət alın" }, @@ -916,7 +906,7 @@ "message": "Təşkilatınızını Duo Security ilə doğrulamaq üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F güvənlik açarını istifadə edin.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Kimliyinizi doğrulayın" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted mühit" }, - "selfHostedEnvironmentFooter": { - "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının təməl URL-sini müəyyənləşdirin." - }, "selfHostedBaseUrlHint": { "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının təməl URL-sini müəyyənləşdirin. Nümunə: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Özəl mühit" }, - "customEnvironmentFooter": { - "message": "Qabaqcıl istifadəçilər üçündür. Hər xidmətin baza URL-sini müstəqil olaraq müəyyənləşdirə bilərsiniz." - }, "baseUrl": { "message": "Server URL-si" }, @@ -1013,6 +997,9 @@ "no": { "message": "Xeyr" }, + "location": { + "message": "Yerləşmə" + }, "overwritePassword": { "message": "Parolun üzərinə yaz" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Ana parolla giriş et" }, - "loggingInAs": { - "message": "Giriş et" - }, "rememberEmail": { "message": "E-poçtu xatırla" }, - "notYou": { - "message": "Siz deyilsiniz?" - }, "newAroundHere": { "message": "Burada yenisiniz?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Admin təsdiqini tələb et" }, - "approveWithMasterPassword": { - "message": "Ana parolla təsdiqlə" - }, "region": { "message": "Bölgə" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tələbiniz admininizə göndərildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Təsdiqləndikdən sonra məlumatlandırılacaqsınız." - }, "troubleLoggingIn": { "message": "Girişdə problem var?" }, @@ -3519,23 +3494,20 @@ "message": "bura müraciət tələb edir:" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "məqsəd" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "serverdə kimlik doğrulaması et" }, "sshActionSign": { - "message": "sign a message" + "message": "bir mesajı imzala" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "git commit-ini imzala" }, "unknownApplication": { "message": "Bir tətbiq" }, - "sshKeyPasswordUnsupported": { - "message": "Parolla qorunan SSH açarlarının daxilə köçürülməsi hələ dəstəklənmir" - }, "invalidSshKey": { "message": "SSH açarı yararsızdır" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Açarı lövhədən daxilə köçür" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH açarı uğurla daxilə köçürüldü" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "İstifadə etdiyiniz brauzer uzantısı köhnəlib. Lütfən onu güncəlləyin, ya da masaüstü tətbiq ayarlarında brauzer inteqrasiyası üzrə barmaq izi ilə doğrulamanı sıradan çıxardın." + }, + "changeAtRiskPassword": { + "message": "Riskli parolları dəyişdir" } } diff --git a/apps/desktop/src/locales/be/messages.json b/apps/desktop/src/locales/be/messages.json index 1e92720969e..4c90222be42 100644 --- a/apps/desktop/src/locales/be/messages.json +++ b/apps/desktop/src/locales/be/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Колькасць слоў" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Падказка да пароля" - }, - "enterEmailToGetHint": { - "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі да асноўнага пароля." - }, "getMasterPasswordHint": { "message": "Атрымаць падказку да асноўнага пароля" }, @@ -916,7 +906,7 @@ "message": "Праверка з дапамогай Duo Security для вашай арганізацыі, выкарыстоўваючы праграму Duo Mobile, SMS, тэлефонны выклік або ключ бяспекі U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Асяроддзе ўласнага хостынгу" }, - "selfHostedEnvironmentFooter": { - "message": "Увядзіце асноўны URL-адрас вашага лакальнага размяшчэння ўсталяванага Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Карыстальніцкае асяроддзе" }, - "customEnvironmentFooter": { - "message": "Для дасведчаных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кожнай службы." - }, "baseUrl": { "message": "URL-адрас сервера" }, @@ -1013,6 +997,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Перазапісаць пароль" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Увайсці з асноўным паролем" }, - "loggingInAs": { - "message": "Увайсці як" - }, "rememberEmail": { "message": "Запомніць электронную пошту" }, - "notYou": { - "message": "Не вы?" - }, "newAroundHere": { "message": "Упершыню тут?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Запытаць ухваленне адміністратара" }, - "approveWithMasterPassword": { - "message": "Ухваліць з дапамогай асноўнага пароля" - }, "region": { "message": "Рэгіён" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запыт адпраўлены адміністратару." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вы атрымаеце апавяшчэння пасля яго ўхвалення." - }, "troubleLoggingIn": { "message": "Праблемы з уваходам?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/bg/messages.json b/apps/desktop/src/locales/bg/messages.json index 6686254fcbf..6a1c0983278 100644 --- a/apps/desktop/src/locales/bg/messages.json +++ b/apps/desktop/src/locales/bg/messages.json @@ -543,10 +543,6 @@ "message": "Включване на специални знаци", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Брой думи" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" }, - "passwordHint": { - "message": "Подсказка за паролата" - }, - "enterEmailToGetHint": { - "message": "Въведете адреса на е-пощата си, за да получите подсказка за главната парола." - }, "getMasterPasswordHint": { "message": "Получете подсказване за главната парола" }, @@ -916,7 +906,7 @@ "message": "Удостоверяване чрез Duo Security за организацията ви, с ползване на приложението Duo Mobile, SMS, телефонен разговор или устройство U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Потвърдете самоличността си" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Собствена среда" }, - "selfHostedEnvironmentFooter": { - "message": "Укажете базовия адрес за собствената ви инсталирана среда на Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Посочете базовия адрес на Вашата собствена инсталация на Битуорден. Пример: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Специална среда" }, - "customEnvironmentFooter": { - "message": "За специални случаи. Може да укажете основните адреси на всяка ползвана услуга поотделно." - }, "baseUrl": { "message": "Адрес на сървъра" }, @@ -1013,6 +997,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Местоположение" + }, "overwritePassword": { "message": "Обновяване на паролата" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Вписване с главната парола" }, - "loggingInAs": { - "message": "Вписване като" - }, "rememberEmail": { "message": "Запомняне на е-пощата" }, - "notYou": { - "message": "Това не сте Вие?" - }, "newAroundHere": { "message": "За пръв път ли сте тук?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Подаване на заявка за одобрение от администратор" }, - "approveWithMasterPassword": { - "message": "Одобряване с главната парола" - }, "region": { "message": "Регион" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Вашата заявка беше изпратена до администратора Ви." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ще получите известие, когато тя бъде одобрена." - }, "troubleLoggingIn": { "message": "Имате проблем с вписването?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Приложение" }, - "sshKeyPasswordUnsupported": { - "message": "Внасянето на SSH ключ, които са защитени с парола, все още не се поддържа" - }, "invalidSshKey": { "message": "SSH ключът е неправилен" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Внасяне на ключ от буфера за обмен" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH ключът е внесен успешно" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Добавката за браузъра, която използвате, е остаряла. Моля, обновете я или изключете интеграцията за проверка на пръстов отпечатък в браузъра от настройките на самостоятелното приложение." + }, + "changeAtRiskPassword": { + "message": "Промяна на парола в риск" } } diff --git a/apps/desktop/src/locales/bn/messages.json b/apps/desktop/src/locales/bn/messages.json index 256ecb3b660..68848c9ef2a 100644 --- a/apps/desktop/src/locales/bn/messages.json +++ b/apps/desktop/src/locales/bn/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "শব্দের সংখ্যা" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "পাসওয়ার্ড ইঙ্গিত" - }, - "enterEmailToGetHint": { - "message": "আপনার মূল পাসওয়ার্ডের ইঙ্গিতটি পেতে আপনার অ্যাকাউন্টের ইমেল ঠিকানা প্রবেশ করুন।" - }, "getMasterPasswordHint": { "message": "মূল পাসওয়ার্ডের ইঙ্গিত পান" }, @@ -916,7 +906,7 @@ "message": "Duo Mobile app, এসএমএস, ফোন কল, বা U2F সুরক্ষা কী ব্যবহার করে আপনার সংস্থার জন্য Duo Security এর মাধ্যমে যাচাই করুন।", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "স্ব-হোস্টকৃত পরিবেশ" }, - "selfHostedEnvironmentFooter": { - "message": "আপনার অন-প্রাঙ্গনে হোস্টকৃত Bitwarden ইনস্টলেশনটির বেস URL উল্লেখ করুন।" - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "পছন্দসই পরিবেশ" }, - "customEnvironmentFooter": { - "message": "উন্নত ব্যবহারকারীদের জন্য। আপনি স্বতন্ত্রভাবে প্রতিটি পরিষেবার মূল URL নির্দিষ্ট করতে পারেন।" - }, "baseUrl": { "message": "সার্ভার URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "না" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "ওভাররাইট পাসওয়ার্ড" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/bs/messages.json b/apps/desktop/src/locales/bs/messages.json index 4600638ec00..885af404f95 100644 --- a/apps/desktop/src/locales/bs/messages.json +++ b/apps/desktop/src/locales/bs/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Broj riječi" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Nagovještaj lozinke" - }, - "enterEmailToGetHint": { - "message": "Unesite E-Mail adresu Vašeg računa da biste dobili nagovještaj o mogućoj glavnoj lozinki." - }, "getMasterPasswordHint": { "message": "Dobijte nagovještaj glavne lozinke" }, @@ -916,7 +906,7 @@ "message": "Potvrdi sa Duo Security za svoju organizaciju pomoću aplikacije Duo Mobile, SMS-om, telefonskim pozivom ili U2F sigurnosnim ključem.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Vlastito hosting okruženje" }, - "selfHostedEnvironmentFooter": { - "message": "Navedite osnovni URL vaše lokalne Bitwarden instalacije." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Prilagođeno okruženje" }, - "customEnvironmentFooter": { - "message": "Za napredne korisnike. Samostalno možeš odrediti osnovni URL svake usluge." - }, "baseUrl": { "message": "URL servera" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Prebriši lozinku" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ca/messages.json b/apps/desktop/src/locales/ca/messages.json index c9f2b6a6bdc..5707fd0c0ff 100644 --- a/apps/desktop/src/locales/ca/messages.json +++ b/apps/desktop/src/locales/ca/messages.json @@ -543,10 +543,6 @@ "message": "Inclou caràcters especials", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Nombre de paraules" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduïu l'adreça de correu electrònic del compte i se us enviarà la pista de contrasenya" }, - "passwordHint": { - "message": "Pista per a la contrasenya" - }, - "enterEmailToGetHint": { - "message": "Introduïu l'adreça electrònica del vostre compte per rebre la contrasenya mestra." - }, "getMasterPasswordHint": { "message": "Obteniu la pista de contrasenya mestra" }, @@ -916,8 +906,8 @@ "message": "Verifiqueu amb Duo Security per a la vostra organització mitjançant l'aplicació Duo Mobile, SMS, trucada telefònica o clau de seguretat U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Verifiqueu la vostra identitat" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat." @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Entorn d'allotjament propi" }, - "selfHostedEnvironmentFooter": { - "message": "Especifiqueu l'URL base de la vostra instal·lació Bitwarden allotjada en un entorn propi." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Entorn personalitzat" }, - "customEnvironmentFooter": { - "message": "Per a usuaris avançats. Podeu especificar l'URL base de cada servei independentment." - }, "baseUrl": { "message": "URL del servidor" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Sobreescriu la contrasenya" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Inici de sessió amb contrasenya mestra" }, - "loggingInAs": { - "message": "Has iniciat sessió com" - }, "rememberEmail": { "message": "Recorda el correu electronic" }, - "notYou": { - "message": "No sou vosaltres?" - }, "newAroundHere": { "message": "Nou per ací?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Sol·liciteu l'aprovació de l'administrador" }, - "approveWithMasterPassword": { - "message": "Aprova amb contrasenya mestra" - }, "region": { "message": "Regió" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La vostra sol·licitud s'ha enviat a l'administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se us notificarà una vegada aprovat." - }, "troubleLoggingIn": { "message": "Teniu problemes per iniciar la sessió?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Una aplicació" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/cs/messages.json b/apps/desktop/src/locales/cs/messages.json index 46363e26f70..336ea2a795c 100644 --- a/apps/desktop/src/locales/cs/messages.json +++ b/apps/desktop/src/locales/cs/messages.json @@ -543,10 +543,6 @@ "message": "Zahrnout speciální znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Počet slov" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" }, - "passwordHint": { - "message": "Nápověda pro heslo" - }, - "enterEmailToGetHint": { - "message": "Zadejte e-mailovou adresu pro zaslání nápovědy k hlavnímu heslu." - }, "getMasterPasswordHint": { "message": "Získat nápovědu pro hlavní heslo" }, @@ -916,7 +906,7 @@ "message": "Ověření pomocí Duo Security pro Vaši organizaci prostřednictvím aplikace Duo Mobile, SMS, telefonního hovoru nebo bezpečnostního klíče U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Ověřte svou totožnost" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Vlastní hostované prostředí" }, - "selfHostedEnvironmentFooter": { - "message": "Zadejte základní URL adresu vlastní hostované aplikace Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Zadejte základní URL adresu Vaší vlastní hostované aplikace Bitwarden. Příklad: https://bitwarden.spolecnost.cz" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Vlastní prostředí" }, - "customEnvironmentFooter": { - "message": "Pro pokročilé uživatele. Můžete zadat základní URL adresu každé služby zvlášť." - }, "baseUrl": { "message": "URL serveru" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Umístění" + }, "overwritePassword": { "message": "Přepsat heslo" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Přihlásit se pomocí hlavního hesla" }, - "loggingInAs": { - "message": "Přihlášení jako" - }, "rememberEmail": { "message": "Zapamatovat si e-mail" }, - "notYou": { - "message": "Nejste to Vy?" - }, "newAroundHere": { "message": "Jste tu noví?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Žádost o schválení správcem" }, - "approveWithMasterPassword": { - "message": "Schválit hlavním heslem" - }, "region": { "message": "Oblast" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Váš požadavek byl odeslán Vašemu správci." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete upozorněni." - }, "troubleLoggingIn": { "message": "Potíže s přihlášením?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Aplikace" }, - "sshKeyPasswordUnsupported": { - "message": "Import šifrovaných SSH klíčů není zatím podporován" - }, "invalidSshKey": { "message": "SSH klíč je neplatný" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Importovat klíč ze schránky" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH klíč byl úspěšně importován" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Použité rozšíření prohlížeče je zastaralé. Aktualizujte jej nebo zakažte ověření otisků prstů při integraci prohlížeče v nastavení aplikace." + }, + "changeAtRiskPassword": { + "message": "Změnit ohrožené heslo" } } diff --git a/apps/desktop/src/locales/cy/messages.json b/apps/desktop/src/locales/cy/messages.json index f904deefe8f..1c6d824c22e 100644 --- a/apps/desktop/src/locales/cy/messages.json +++ b/apps/desktop/src/locales/cy/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/da/messages.json b/apps/desktop/src/locales/da/messages.json index 87ff2169d22..ef5b22e33f4 100644 --- a/apps/desktop/src/locales/da/messages.json +++ b/apps/desktop/src/locales/da/messages.json @@ -543,10 +543,6 @@ "message": "Inkludér specialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antal ord" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" }, - "passwordHint": { - "message": "Adgangskodetip" - }, - "enterEmailToGetHint": { - "message": "Indtast din kontos e-mailadresse for at modtage dit hovedadgangskodetip." - }, "getMasterPasswordHint": { "message": "Få hovedadgangskodetip" }, @@ -916,8 +906,8 @@ "message": "Bekræft med Duo Security for din organisation vha. Duo Mobile-app, SMS, telefonopkald eller U2F-sikkerhedsnøgle.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Bekræft identiteten" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Denne enhed er ikke genkendt. Angiv koden i den tilsendte e-mail for at bekræfte identiteten." @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Selv-hostet miljø" }, - "selfHostedEnvironmentFooter": { - "message": "Angiv grund-URL'en til den lokal-hostede Bitwarden-installation." - }, "selfHostedBaseUrlHint": { "message": "Angiv basis-URL'en for den lokalt-hosted Bitwarden-installation. Eks.: https://bitwarden.firma.dk" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Tilpasset miljø" }, - "customEnvironmentFooter": { - "message": "Til avancerede brugere. Hver tjenestes basis-URL kan angives uafhængigt." - }, "baseUrl": { "message": "Server-URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overskriv adgangskode" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log ind med hovedadgangskoden" }, - "loggingInAs": { - "message": "Logger ind som" - }, "rememberEmail": { "message": "Husk e-mail" }, - "notYou": { - "message": "Ikke dig?" - }, "newAroundHere": { "message": "Ny her?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Anmod om admin-godkendelse" }, - "approveWithMasterPassword": { - "message": "Godkend med hovedadgangskode" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Anmodningen er sendt til din admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du underrettes, når godkendelse foreligger." - }, "troubleLoggingIn": { "message": "Problemer med at logge ind?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "En applikation" }, - "sshKeyPasswordUnsupported": { - "message": "Import af adgangskodebeskyttede SSH-nøgler understøttes endnu ikke" - }, "invalidSshKey": { "message": "SSH-nøglen er ugyldig" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Importér nøgle fra udklipsholder" }, - "sshKeyPasted": { - "message": "SSH-nøgle er importeret" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Fil gemt på enheden. Håndtér fra enhedens downloads." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Den anvendte webbrowserudvidelse er forældet. Opdatér den venligst eller deaktivér webbrowserintegreret fingeraftryksbekræftelse i computer-app indstillingerne." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/de/messages.json b/apps/desktop/src/locales/de/messages.json index 0faf41ed21f..79f61475ab0 100644 --- a/apps/desktop/src/locales/de/messages.json +++ b/apps/desktop/src/locales/de/messages.json @@ -543,10 +543,6 @@ "message": "Sonderzeichen einschließen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Anzahl der Wörter" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" }, - "passwordHint": { - "message": "Passwort-Hinweis" - }, - "enterEmailToGetHint": { - "message": "Gib die E-Mail-Adresse deines Kontos ein, um den Hinweis für dein Master-Passwort zu erhalten." - }, "getMasterPasswordHint": { "message": "Hinweis zum Master-Passwort zusenden" }, @@ -916,7 +906,7 @@ "message": "Nutze Duo Security, um dich mit der Duo-Mobile-App, SMS, per Anruf oder U2F-Sicherheitsschlüssel bei deiner Organisation zu verifizieren.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifiziere deine Identität" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Selbst gehostete Umgebung" }, - "selfHostedEnvironmentFooter": { - "message": "Bitte gib die Basis-URL deiner selbst gehosteten Bitwarden-Installation an." - }, "selfHostedBaseUrlHint": { "message": "Gib die Basis-URL deiner vor Ort gehosteten Bitwarden-Installation an. Beispiel: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Benutzerdefinierte Umgebung" }, - "customEnvironmentFooter": { - "message": "Für fortgeschrittene Benutzer. Du kannst die Basis-URL der jeweiligen Dienste unabhängig voneinander festlegen." - }, "baseUrl": { "message": "Server-URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nein" }, + "location": { + "message": "Standort" + }, "overwritePassword": { "message": "Passwort ersetzen" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Mit Master-Passwort anmelden" }, - "loggingInAs": { - "message": "Anmelden als" - }, "rememberEmail": { "message": "E-Mail-Adresse merken" }, - "notYou": { - "message": "Nicht du?" - }, "newAroundHere": { "message": "Neu hier?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Admin-Genehmigung anfragen" }, - "approveWithMasterPassword": { - "message": "Mit Master-Passwort genehmigen" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Deine Anfrage wurde an deinen Administrator gesendet." }, - "youWillBeNotifiedOnceApproved": { - "message": "Nach einer Genehmigung wirst du benachrichtigt." - }, "troubleLoggingIn": { "message": "Probleme beim Anmelden?" }, @@ -3510,32 +3485,29 @@ "message": "Verwendung des SSH-Schlüssels bestätigen" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "Warnung: Agent-Weiterleitung" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "Diese Anfrage kommt von einem entfernten Gerät, bei dem du angemeldet bist" }, "sshkeyApprovalMessageInfix": { "message": "fragt den Zugriff an für" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "um" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "sich bei einem Server zu authentifizieren" }, "sshActionSign": { - "message": "sign a message" + "message": "eine Nachricht zu signieren" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "einen Git-Commit zu signieren" }, "unknownApplication": { "message": "Eine Anwendung" }, - "sshKeyPasswordUnsupported": { - "message": "Das Importieren passwortgeschützter SSH-Schlüssel wird noch nicht unterstützt" - }, "invalidSshKey": { "message": "Der SSH-Schlüssel ist ungültig" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Schlüssel aus Zwischenablage importieren" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH-Schlüssel erfolgreich importiert" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Die von dir verwendete Browser-Erweiterung ist veraltet. Bitte aktualisiere sie oder deaktiviere die Fingerabdrucküberprüfung der Browser-Integration in den Einstellungen der Desktop-App." + }, + "changeAtRiskPassword": { + "message": "Gefährdetes Passwort ändern" } } diff --git a/apps/desktop/src/locales/el/messages.json b/apps/desktop/src/locales/el/messages.json index d643aabd46f..ecee8bd9894 100644 --- a/apps/desktop/src/locales/el/messages.json +++ b/apps/desktop/src/locales/el/messages.json @@ -543,10 +543,6 @@ "message": "Συμπερίληψη ειδικών χαρακτήρων", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Αριθμός λέξεων" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Εισάγετε τη διεύθυνση ηλ. ταχυδρομείου του λογαριασμού σας και θα σας αποσταλεί η υπόδειξη κωδικού πρόσβασης" }, - "passwordHint": { - "message": "Υπόδειξη κωδικού πρόσβασης" - }, - "enterEmailToGetHint": { - "message": "Εισάγετε τη διεύθυνση ηλ. ταχυδρομείου του λογαριασμού σας για να λάβετε την υπόδειξη του κύριου κωδικού πρόσβασης." - }, "getMasterPasswordHint": { "message": "Λήψη υπόδειξης κύριου κωδικού" }, @@ -916,8 +906,8 @@ "message": "Επαληθεύστε με το Duo Security για τον οργανισμό σας χρησιμοποιώντας την εφαρμογή Duo Mobile, μήνυμα SMS, τηλεφωνική κλήση ή κλειδί ασφαλείας U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Επαληθεύστε την ταυτότητά σας" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Δεν αναγνωρίζουμε αυτή τη συσκευή. Εισάγετε τον κωδικό που στάλθηκε στο email σας για να επαληθεύσετε την ταυτότητά σας." @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Αυτο-φιλοξενούμενο περιβάλλον" }, - "selfHostedEnvironmentFooter": { - "message": "Καθορίστε τη βασική διεύθυνση URL, της εγκατάστασης του Bitwarden που φιλοξενείται στο χώρο σας." - }, "selfHostedBaseUrlHint": { "message": "Καθορίστε το βασικό URL της εγκατάστασης Bitwarden που φιλοξενείται στο χώρο σας. Παράδειγμα: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Προσαρμοσμένο περιβάλλον" }, - "customEnvironmentFooter": { - "message": "Για προχωρημένους χρήστες. Μπορείτε να ορίσετε ανεξάρτητα τη βασική διεύθυνση URL κάθε υπηρεσίας." - }, "baseUrl": { "message": "URL Διακομιστή" }, @@ -1013,6 +997,9 @@ "no": { "message": "Όχι" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Αντικατάσταση κωδικού πρόσβασης" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Συνδεθείτε με τον κύριο κωδικό πρόσβασης" }, - "loggingInAs": { - "message": "Σύνδεση ως" - }, "rememberEmail": { "message": "Απομνημόνευση διεύθυνσης ηλ. ταχυδρομείου" }, - "notYou": { - "message": "Δεν είστε εσείς;" - }, "newAroundHere": { "message": "Είστε νέος/α εδώ;" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Αίτηση έγκρισης διαχειριστή" }, - "approveWithMasterPassword": { - "message": "Έγκριση με τον κύριο κωδικό πρόσβασης" - }, "region": { "message": "Περιοχή" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Το αίτημά σας εστάλη στον διαχειριστή σας." }, - "youWillBeNotifiedOnceApproved": { - "message": "Θα ειδοποιηθείτε μόλις εγκριθεί." - }, "troubleLoggingIn": { "message": "Πρόβλημα σύνδεσης;" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Μια εφαρμογή" }, - "sshKeyPasswordUnsupported": { - "message": "Η εισαγωγή κλειδιών SSH που προστατεύονται με κωδικό πρόσβασης δεν υποστηρίζεται ακόμη" - }, "invalidSshKey": { "message": "Το SSH κλειδί δεν είναι έγκυρο" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Εισαγωγή κλειδιού από το πρόχειρο" }, - "sshKeyPasted": { - "message": "Το SSH κλειδί εισήχθη με επιτυχία" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Το αρχείο αποθηκεύτηκε στη συσκευή. Διαχείριση από τις λήψεις της συσκευής σας." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Η επέκταση περιηγητή που χρησιμοποιείτε είναι ξεπερασμένη. Παρακαλούμε ενημερώστε την ή απενεργοποιήστε την επικύρωση δακτυλικών αποτυπωμάτων του προγράμματος περιήγησης στις ρυθμίσεις της εφαρμογής για την επιφάνεια εργασίας." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json index de7bc973f25..f93db44aa69 100644 --- a/apps/desktop/src/locales/en/messages.json +++ b/apps/desktop/src/locales/en/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -882,7 +872,7 @@ }, "useYourRecoveryCode": { "message": "Use your recovery code" - }, + }, "insertYubiKey": { "message": "Insert your YubiKey into your computer's USB port, then touch its button." }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { diff --git a/apps/desktop/src/locales/en_GB/messages.json b/apps/desktop/src/locales/en_GB/messages.json index 6546edc5411..f70a70e975a 100644 --- a/apps/desktop/src/locales/en_GB/messages.json +++ b/apps/desktop/src/locales/en_GB/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organisation using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/en_IN/messages.json b/apps/desktop/src/locales/en_IN/messages.json index e8945cd520f..f91a7b21876 100644 --- a/apps/desktop/src/locales/en_IN/messages.json +++ b/apps/desktop/src/locales/en_IN/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organisation using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/eo/messages.json b/apps/desktop/src/locales/eo/messages.json index 1ce0e698967..200c3f4a1de 100644 --- a/apps/desktop/src/locales/eo/messages.json +++ b/apps/desktop/src/locales/eo/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Ĉu ne vi?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Regiono" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/es/messages.json b/apps/desktop/src/locales/es/messages.json index 9f232b521dc..665721beb3a 100644 --- a/apps/desktop/src/locales/es/messages.json +++ b/apps/desktop/src/locales/es/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palabras" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduce la dirección de correo electrónico de tu cuenta y se te enviará la pista de tu contraseña" }, - "passwordHint": { - "message": "Pista de contraseña" - }, - "enterEmailToGetHint": { - "message": "Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra." - }, "getMasterPasswordHint": { "message": "Obtener pista de la contraseña maestra" }, @@ -916,7 +906,7 @@ "message": "Verificar con Duo Security para tu organización usando la aplicación Duo Mobile, SMS, llamada telefónica o llave de seguridad U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Entorno de alojamiento propio" }, - "selfHostedEnvironmentFooter": { - "message": "Especifica la URL base de tu instalación de Bitwarden de alojamiento propio." - }, "selfHostedBaseUrlHint": { "message": "Especifica la dirección URL base de tu instalación alojada localmente de Bitwarden. Por ejemplo: https://bitwarden.empresa.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Entorno personalizado" }, - "customEnvironmentFooter": { - "message": "Para usuarios avanzados. Puedes especificar la URL base de cada servicio de forma independiente." - }, "baseUrl": { "message": "URL del servidor" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Sobreescribir contraseña" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Iniciar sesión con contraseña maestra" }, - "loggingInAs": { - "message": "Iniciando sesión como" - }, "rememberEmail": { "message": "Recordar email" }, - "notYou": { - "message": "¿No eres tú?" - }, "newAroundHere": { "message": "¿Nuevo por aquí?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Solicitar aprobación del administrador" }, - "approveWithMasterPassword": { - "message": "Aprobar con contraseña maestra" - }, "region": { "message": "Región" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tu solicitud ha sido enviada a tu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se te notificará una vez aprobado." - }, "troubleLoggingIn": { "message": "¿Tienes problemas para iniciar sesión?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/et/messages.json b/apps/desktop/src/locales/et/messages.json index 76be013c4ef..c4ca9bef886 100644 --- a/apps/desktop/src/locales/et/messages.json +++ b/apps/desktop/src/locales/et/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Sõnade arv" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Sisesta oma e-maili aadress ja sulle saadetakse sinna parooli vihje" }, - "passwordHint": { - "message": "Parooli vihje" - }, - "enterEmailToGetHint": { - "message": "Ülemparooli vihje saamiseks sisesta oma konto e-posti aadress." - }, "getMasterPasswordHint": { "message": "Tuleta ülemparooli vihjega meelde" }, @@ -916,7 +906,7 @@ "message": "Kinnita organisatsiooni jaoks Duo Security abil, kasutades selleks Duo Mobile rakendust, SMS-i, telefonikõnet või U2F turvavõtit.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted Environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Sisesta enda ise-majutatud Bitwardeni serveri nimi (base URL). Näiteks: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Kohandatud keskkond" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Serveri URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ei" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Kirjuta parool üle" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Logi sisse ülemparooliga" }, - "loggingInAs": { - "message": "Sisselogimas kui" - }, "rememberEmail": { "message": "Mäleta e-posti aadressi" }, - "notYou": { - "message": "Pole sina?" - }, "newAroundHere": { "message": "Oled siin uus?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Küsi administraatori nõusolekut" }, - "approveWithMasterPassword": { - "message": "Kinnita ülemparooliga" - }, "region": { "message": "Piirkond" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Sinu taotlus saadeti administraatorile." }, - "youWillBeNotifiedOnceApproved": { - "message": "Kinnitamise järel saad selle kohta teavituse." - }, "troubleLoggingIn": { "message": "Ei õnnestu sisse logida?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/eu/messages.json b/apps/desktop/src/locales/eu/messages.json index 3261db98090..1abc24612ca 100644 --- a/apps/desktop/src/locales/eu/messages.json +++ b/apps/desktop/src/locales/eu/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Hitz kopurua" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Pasahitza gogoratzeko pista" - }, - "enterEmailToGetHint": { - "message": "Sartu zure kontuko emaila pasahitz nagusiaren pista jasotzeko." - }, "getMasterPasswordHint": { "message": "Jaso pasahitz nagusiaren pista" }, @@ -916,7 +906,7 @@ "message": "Egiaztatu zure erakunderako Duo Securityrekin Duo Mobile aplikazioa, SMS, telefono deia edo U2F segurtasun-gakoa erabiliz.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Ostatze ingurune propioa" }, - "selfHostedEnvironmentFooter": { - "message": "Bitwarden instalatzeko, zehaztu ostatatze propioaren oinarrizko URL-a." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Ingurune pertsonalizatua" }, - "customEnvironmentFooter": { - "message": "Erabiltzaile aurreratuentzat. Zerbitzu bakoitzarentzako oinarrizko URL-a zehaztu dezakezu independienteki." - }, "baseUrl": { "message": "Zerbitzariaren URL-a" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ez" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Berridatzi pasahitza" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Hasi saioa pasahitz nagusiarekin" }, - "loggingInAs": { - "message": "gisa saioa hasi" - }, "rememberEmail": { "message": "Emaila gogoratu" }, - "notYou": { - "message": "Zu ez?" - }, "newAroundHere": { "message": "Berria hemendik?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/fa/messages.json b/apps/desktop/src/locales/fa/messages.json index fe6e5ba3337..2d13b86c4a8 100644 --- a/apps/desktop/src/locales/fa/messages.json +++ b/apps/desktop/src/locales/fa/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "تعداد کلمات" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "یادآور کلمه عبور" - }, - "enterEmailToGetHint": { - "message": "برای دریافت یادآور کلمه عبور اصلی خود نشانی ایمیل‌تان را وارد کنید." - }, "getMasterPasswordHint": { "message": "دریافت یادآور کلمه عبور اصلی" }, @@ -916,7 +906,7 @@ "message": "از Duo Security با استفاده از برنامه تلفن همراه، پیامک، تماس تلفنی یا کلید امنیتی U2F برای تأیید سازمان خود استفاده کنید.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "محیط خود میزبان" }, - "selfHostedEnvironmentFooter": { - "message": "نشانی اینترنتی پایه فرضی نصب Bitwarden میزبانی شده را مشخص کنید." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "محیط سفارشی" }, - "customEnvironmentFooter": { - "message": "برای کاربران پیشرفته. شما می‌توانید نشانی پایه هر سرویس را مستقلاً تعیین کنید." - }, "baseUrl": { "message": "نشانی اینترنتی سرور" }, @@ -1013,6 +997,9 @@ "no": { "message": "خیر" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "بازنویسی کلمه عبور" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "با کلمه عبور اصلی وارد شوید" }, - "loggingInAs": { - "message": "در حال ورود به عنوان" - }, "rememberEmail": { "message": "ایمیل را به خاطر بسپار" }, - "notYou": { - "message": "شما نیستید؟" - }, "newAroundHere": { "message": "اینجا تازه واردی؟" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "درخواست تأیید مدیر" }, - "approveWithMasterPassword": { - "message": "تأیید با کلمه عبور اصلی" - }, "region": { "message": "منطقه" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "درخواست شما به مدیرتان فرستاده شد." }, - "youWillBeNotifiedOnceApproved": { - "message": "به محض تأیید مطلع خواهید شد." - }, "troubleLoggingIn": { "message": "در ورود مشکلی دارید؟" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/fi/messages.json b/apps/desktop/src/locales/fi/messages.json index 2e77d0fbc1b..2da2b7dcf7a 100644 --- a/apps/desktop/src/locales/fi/messages.json +++ b/apps/desktop/src/locales/fi/messages.json @@ -101,7 +101,7 @@ "message": "Salasana" }, "passphrase": { - "message": "Salauslauseke" + "message": "Salauslause" }, "editItem": { "message": "Muokkaa kohdetta" @@ -190,19 +190,19 @@ "message": "Sormenjälki" }, "sshKeyAlgorithm": { - "message": "Avaintyyppi" + "message": "Avaimen tyyppi" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA 2048-bit" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA 3072-bit" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA 4096-bit" }, "sshKeyGenerated": { "message": "Uusi SSH-avain luotiin" @@ -223,7 +223,7 @@ "message": "Syötä salasana" }, "sshAgentUnlockRequired": { - "message": "Ole hyvä ja avaa holvisi hyväksyäksesi SSH-avainpyynnön." + "message": "Hyväksy SSH-avainpyyntö avaamalla holvisi." }, "sshAgentUnlockTimeout": { "message": "SSH-avainpyyntö aikakatkaistiin." @@ -250,10 +250,10 @@ "message": "Virhe" }, "decryptionError": { - "message": "Salauksen purkuvirhe" + "message": "Virhe salauksen purussa" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden ei voinut purkaa alla olevia holvin kohteita." + "message": "Bitwarden ei voinut purkaa alla olevien holvin kohteiden salausta." }, "contactCSToAvoidDataLossPart1": { "message": "Contact customer success", @@ -543,10 +543,6 @@ "message": "Sisällytä erikoismerkkejä", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Sanojen määrä" }, @@ -659,7 +655,7 @@ "message": "Syötä todennussovelluksesi näyttämä koodi" }, "pressYourYubiKeyToAuthenticate": { - "message": "Tunnistaudu painamalla YubiKeytäsi" + "message": "Tunnistaudu koskettamalla YubiKeytäsi" }, "logInWithPasskey": { "message": "Kirjaudu pääsyavaimella" @@ -714,7 +710,7 @@ "message": "Pääsalasanan vihje" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Salasanan vahvuusarvio $SCORE$", "placeholders": { "score": { "content": "$1", @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" }, - "passwordHint": { - "message": "Salasanavihje" - }, - "enterEmailToGetHint": { - "message": "Syötä tilisi sähköpostiosoite saadaksesi pääsalasanan vihjeen." - }, "getMasterPasswordHint": { "message": "Pyydä pääsalasanan vihjettä" }, @@ -868,7 +858,7 @@ "message": "Muista minut" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Älä kysy uudelleen tällä laitteella 30 päivään" }, "sendVerificationCodeEmailAgain": { "message": "Lähetä todennuskoodi sähköpostitse uudelleen" @@ -877,14 +867,14 @@ "message": "Käytä vaihtoehtoista todennustapaa" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Valitse vaihtoehtoinen tapa", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Käytä palautuskoodiasi" }, "insertYubiKey": { - "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." + "message": "Kytke YubiKey-suojausavaimesi tietokoneen USB-porttiin ja kosketa sen painiketta." }, "insertU2f": { "message": "Kytke suojausavaimesi tietokoneen USB-porttiin ja jos laitteessa on painike, paina sitä." @@ -906,7 +896,7 @@ "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { - "message": "Käytä YubiKey-todennuslaitetta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C sekä NEO -laitteiden kanssa." + "message": "Käytä YubiKey-suojausavainta tilisi avaukseen. Toimii YubiKey 4, 4 Nano, 4C ja NEO -laitteiden kanssa." }, "duoDescV2": { "message": "Syötä Duo Securityn luoma koodi.", @@ -916,14 +906,14 @@ "message": "Vahvista organisaatiollesi Duo Securityn avulla käyttäen Duo Mobile ‑sovellusta, tekstiviestiä, puhelua tai U2F-suojausavainta.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Verify your Identity" + "verifyYourIdentity": { + "message": "Vahvista henkilöllisyytesi" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Laitetta ei tunnistettu. Vahvista henkilöllisyytesi syöttämällä sähköpostitse saamasi koodi." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Jatka kirjautumista" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -950,14 +940,11 @@ "message": "Kaksivaiheisen kirjautumisen asetukset" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Valitse todennustapa" }, "selfHostedEnvironment": { "message": "Itse ylläpidetty palvelinympäristö" }, - "selfHostedEnvironmentFooter": { - "message": "Määritä omassa palvelinympäristössäsi suoritettavan Bitwarden-asennuksen pääverkkotunnus." - }, "selfHostedBaseUrlHint": { "message": "Määritä itse ylläpitämäsi Bitwarden-asennuksen perusosoite. Esimerkki: https://bitwarden.yritys.fi." }, @@ -970,17 +957,14 @@ "customEnvironment": { "message": "Mukautettu palvelinympäristö" }, - "customEnvironmentFooter": { - "message": "Edistyneille käyttäjille. Voit määrittää jokaiselle palvelulle oman pääverkkotunnuksen." - }, "baseUrl": { "message": "Palvelimen URL" }, "authenticationTimeout": { - "message": "Todennuksen aikakatkaisu" + "message": "Todennus aikakatkaistiin" }, "authenticationSessionTimedOut": { - "message": "Todennusistunto aikakatkaistiin. Ole hyvä ja aloita kirjautumisprosessi uudelleen." + "message": "Todennusistunto aikakatkaistiin. Aloita kirjautumisprosessi alusta." }, "selfHostBaseUrl": { "message": "Itse ylläpidetyn palvelimen URL-osoite", @@ -1013,6 +997,9 @@ "no": { "message": "En" }, + "location": { + "message": "Sijainti" + }, "overwritePassword": { "message": "Korvaa salasana" }, @@ -1104,11 +1091,11 @@ "message": "Voit vaihtaa pääsalasanasi Bitwardenin verkkosovelluksessa." }, "fingerprintPhrase": { - "message": "Tunnistelauseke", + "message": "Tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "Tilisi tunnistelauseke", + "message": "Tilisi tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "goToWebVault": { @@ -1755,7 +1742,7 @@ "message": "Heikko pääsalasana" }, "weakMasterPasswordDesc": { - "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslauseketta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?" + "message": "Valitsemasi pääsalasana on heikko. Sinun tulisi käyttää vahvaa pääsalasanaa (tai salauslausetta) suojataksesi Bitwarden-tilisi kunnolla. Haluatko varmasti käyttää tätä pääsalasanaa?" }, "pin": { "message": "PIN", @@ -1810,7 +1797,7 @@ "message": "Pyydä salasana tai PIN-koodi sovelluksen käynnistyessä" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Vaadi salasana sovelluksen käynnistyessä" }, "recommendedForSecurity": { "message": "Suositeltavaa parempaa suojausta varten." @@ -2062,7 +2049,7 @@ "message": "Vaadi selainintegraation vahvistus" }, "enableBrowserIntegrationFingerprintDesc": { - "message": "Paranna tietoturvaa vaatimalla työpöytäsovelluksen ja selainlaajennuksen kytköksen todennus tunnistelausekkeella. Tämä vaatii aina yhteyden muodostuessa vahvistuksen käyttäjältä." + "message": "Paranna tietoturvaa vaatimalla työpöytäsovelluksen ja selainlaajennuksen kytköksen todennus tunnistelauseella. Tämä vaatii aina yhteyden muodostuessa vahvistuksen käyttäjältä." }, "enableHardwareAcceleration": { "message": "Käytä laitteistokiihdytystä" @@ -2282,10 +2269,10 @@ "message": "WebAuthn-todennus" }, "readSecurityKey": { - "message": "Read security key" + "message": "Lue suojausavain" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Odotetaan suojausavaimen aktivointia..." }, "hideEmail": { "message": "Piilota sähköpostiosoitteeni vastaanottajilta." @@ -2568,7 +2555,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Käytä $RECOMMENDED$ tai useampaa sanaa vahvan salalauseen luomiseksi.", + "message": " Käytä vahvaan salalauseeseen ainakin $RECOMMENDED$ sanaa.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -2594,7 +2581,7 @@ "message": "Käytä verkkotunnuksesi catch-all-postilaatikkoa." }, "useThisEmail": { - "message": "Use this email" + "message": "Käytä tätä sähköpostia" }, "random": { "message": "Satunnainen" @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Kirjaudu pääsalasanalla" }, - "loggingInAs": { - "message": "Kirjaudutaan tunnuksella" - }, "rememberEmail": { "message": "Muista sähköpostiosoite" }, - "notYou": { - "message": "Etkö se ollut sinä?" - }, "newAroundHere": { "message": "Oletko uusi täällä?" }, @@ -2813,7 +2794,7 @@ "message": "Kirjautuminen aloitettu" }, "logInRequestSent": { - "message": "Request sent" + "message": "Pyyntö lähetetty" }, "notificationSentDevice": { "message": "Laitteellesi on lähetetty ilmoitus." @@ -2828,16 +2809,16 @@ "message": "web app" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Ennen hyväksyntää varmista, että tunnistelause vastaa alla olevaa lausetta." }, "needAnotherOptionV1": { "message": "Tarvitsetko toisen vaihtoehdon?" }, "fingerprintMatchInfo": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen." + "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelauseen." }, "fingerprintPhraseHeader": { - "message": "Tunnistelauseke" + "message": "Tunnistelause" }, "youWillBeNotifiedOnceTheRequestIsApproved": { "message": "Ilmoitamme sinulle, kun pyyntösi on hyväksytty" @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Pyydä hyväksyntää ylläpidolta" }, - "approveWithMasterPassword": { - "message": "Hyväksy pääsalasanalla" - }, "region": { "message": "Alue" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pyyntösi on välitetty ylläpidollesi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Saat ilmoituksen kun se on hyväksytty." - }, "troubleLoggingIn": { "message": "Ongelmia kirjautumisessa?" }, @@ -3247,7 +3222,7 @@ "message": "Tilillesi kirjautuminen vaatii Duo-vahvistuksen." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Duo edellyttää tililtäsi kaksivaiheista tunnistautumista. Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Follow the steps below to finish logging in." @@ -3477,7 +3452,7 @@ "message": "Kertakirjautumiselle ei löytynyt vapaita portteja." }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrinen avaus ei ole käytettävissä, koska PIN-koodi tai salasanan lukituksen avaus vaaditaan ensin." }, "biometricsStatusHelptextHardwareUnavailable": { "message": "Biometrinen lukituksen avaus ei ole tällä hetkellä käytettävissä." @@ -3489,7 +3464,7 @@ "message": "Biometric unlock is unavailable due to misconfigured system files." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrinen avaus ei ole käytettävissä, koska sitä ei ole otettu käyttöön osoitteelle $EMAIL$ Bitwardenin työpöytäsovelluksessa.", "placeholders": { "email": { "content": "$1", @@ -3498,7 +3473,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrinen avaus ei ole tällä hetkellä käytettävissä tuntemattomasta syystä." }, "authorize": { "message": "Valtuuta" @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Sovellus" }, - "sshKeyPasswordUnsupported": { - "message": "Salasanasuojattujen SSH-avainten tuontia ei vielä tueta" - }, "invalidSshKey": { "message": "SSH-avain on virheellinen" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Tuo avain leikepöydältä" }, - "sshKeyPasted": { - "message": "SSH-avain on tuotu" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Tiedosto tallennettiin laitteelle. Hallitse sitä laitteesi latauksista." @@ -3561,7 +3533,7 @@ "message": "Bitwarden lähettää tilisi sähköpostiosoitteeseen koodin, jolla voit vahvistaa kirjautumiset uusista laitteista helmikuusta 2025 alkaen." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "Voit määrittää kaksivaiheisen kirjautumisen tilisi vaihtoehtoiseksi suojaustavaksi tai vaihtaa sähköpostiosoitteesi sellaiseen, johon sinulla on pääsy." }, "remindMeLater": { "message": "Muistuta myöhemmin" @@ -3588,21 +3560,24 @@ "message": "Muuta tilin sähköpostiosoitetta" }, "allowScreenshots": { - "message": "Allow screen capture" + "message": "Salli kuvankaappaus" }, "allowScreenshotsDesc": { "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." }, "confirmWindowStillVisibleTitle": { - "message": "Confirm window still visible" + "message": "Vahvista, että ikkuna on vielä näkyvissä" }, "confirmWindowStillVisibleContent": { - "message": "Please confirm that the window is still visible." + "message": "Vahvista, että ikkuna on vielä näkyvissä." }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "Laajennus on päivitettävä" }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Vaihda vaarantunut salasana" } } diff --git a/apps/desktop/src/locales/fil/messages.json b/apps/desktop/src/locales/fil/messages.json index 81d4566966e..d54c5a21a87 100644 --- a/apps/desktop/src/locales/fil/messages.json +++ b/apps/desktop/src/locales/fil/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Ang bilang ng mga salitaNumero ng mga salita" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Mungkahi sa Password" - }, - "enterEmailToGetHint": { - "message": "Ipasok ang iyong email address ng account para makatanggap ng hint ng iyong master password." - }, "getMasterPasswordHint": { "message": "Makuha ang Punong Password na Hint" }, @@ -916,7 +906,7 @@ "message": "Patunayan sa Duo Security para sa iyong samahan gamit ang Duo Mobile app, SMS, tawag sa telepono, o U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Kapaligirang self-hosted" }, - "selfHostedEnvironmentFooter": { - "message": "Tukuyin ang base URL ng iyong on premises na naka host sa pag install ng Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Kapaligirang Custom" }, - "customEnvironmentFooter": { - "message": "Para sa mga advanced na gumagamit. Maaari mong tukuyin ang base URL ng bawat serbisyo nang independiyente." - }, "baseUrl": { "message": "URL ng Server" }, @@ -1013,6 +997,9 @@ "no": { "message": "Hindi" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "I-overwrite ang password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Mag-login gamit ang pangunahing password" }, - "loggingInAs": { - "message": "Pag log in bilang" - }, "rememberEmail": { "message": "Tandaan ang email" }, - "notYou": { - "message": "Hindi ikaw?" - }, "newAroundHere": { "message": "Mag-login gamit ang pangunahing password?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/fr/messages.json b/apps/desktop/src/locales/fr/messages.json index 2c7a6623279..431a70ef373 100644 --- a/apps/desktop/src/locales/fr/messages.json +++ b/apps/desktop/src/locales/fr/messages.json @@ -169,7 +169,7 @@ "message": "Numéro de passeport" }, "licenseNumber": { - "message": "Numéro de permis" + "message": "Numéro de licence" }, "email": { "message": "Courriel" @@ -217,25 +217,25 @@ "message": "Confirmez le mot de passe" }, "enterSshKeyPasswordDesc": { - "message": "Entrez le mot de passe de la clé SSH." + "message": "Saisissez le mot de passe de la clé SSH." }, "enterSshKeyPassword": { - "message": "Entrez le mot de passe" + "message": "Saisissez le mot de passe" }, "sshAgentUnlockRequired": { "message": "Veuillez déverrouiller votre coffre pour approuver la demande de clé SSH." }, "sshAgentUnlockTimeout": { - "message": "La requête de clé SSH a expiré." + "message": "La demande de clé SSH a expiré." }, "enableSshAgent": { - "message": "Activer l'agent SSH" + "message": "Activez l'agent SSH" }, "enableSshAgentDesc": { - "message": "Activez l'agent SSH pour signer les requêtes SSH directement depuis votre coffre Bitwarden." + "message": "Activez l'agent SSH pour signer les demandes SSH directement depuis votre coffre Bitwarden." }, "enableSshAgentHelp": { - "message": "L'agent SSH est un service destiné aux développeurs qui vous permet de signer des requêtes SSH directement depuis votre coffre Bitwarden." + "message": "L'agent SSH est un service - destiné aux développeurs - qui vous permet de signer des demandes SSH directement depuis votre coffre Bitwarden." }, "premiumRequired": { "message": "Premium requis" @@ -253,14 +253,14 @@ "message": "Erreur de déchiffrement" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden n'a pas pu déchiffrer le(s) élément(s) du coffre listé(s) ci-dessous." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Contacter le service clientèle", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "afin d'éviter toute perte de données supplémentaire.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -543,10 +543,6 @@ "message": "Inclure des caractères spéciaux", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Nombre de mots" }, @@ -653,13 +649,13 @@ "message": "Se connecter à Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Saisissez le code envoyé à votre adresse courriel" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Saisissez le code de votre application d'authentification" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Touchez votre YubiKey pour vous authentifier" }, "logInWithPasskey": { "message": "Se connecter avec une clé d'accès" @@ -714,7 +710,7 @@ "message": "Indice du mot de passe principal" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Score de force du mot de passe $SCORE$", "placeholders": { "score": { "content": "$1", @@ -747,17 +743,11 @@ "message": "Demander l'indice" }, "requestPasswordHint": { - "message": "Obtenir l'indice du mot de passe" + "message": "Demande d'indice de mot de passe" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Saisissez l'adresse courriel de votre compte et votre indice de mot de passe vous sera envoyé" }, - "passwordHint": { - "message": "Indice pour le mot de passe" - }, - "enterEmailToGetHint": { - "message": "Saisissez l'adresse électronique de votre compte pour recevoir l'indice de votre mot de passe principal." - }, "getMasterPasswordHint": { "message": "Obtenir l'indice du mot de passe principal" }, @@ -835,7 +825,7 @@ "message": "L'authentification a été annulée ou a pris trop de temps. Veuillez réessayer." }, "openInNewTab": { - "message": "Open in new tab" + "message": "Ouvrir dans un nouvel onglet" }, "invalidVerificationCode": { "message": "Code de vérification invalide" @@ -868,7 +858,7 @@ "message": "Rester connecté" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Ne plus demander sur cet appareil pendant 30 jours" }, "sendVerificationCodeEmailAgain": { "message": "Envoyer à nouveau le courriel de code de vérification" @@ -877,11 +867,11 @@ "message": "Utiliser une autre méthode de connexion en deux étapes" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Sélectionner une autre méthode", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Utilisez votre code de récupération" }, "insertYubiKey": { "message": "Insérez votre YubiKey dans le port USB de votre ordinateur puis appuyez sur son bouton." @@ -916,14 +906,14 @@ "message": "Sécurisez votre organisation avec Duo Security à l'aide de l'application Duo Mobile, l'envoi d'un SMS, un appel vocal ou une clé de sécurité U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Verify your Identity" + "verifyYourIdentity": { + "message": "Vérifiez votre identité" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Nous ne reconnaissons pas cet appareil. Saisissez le code envoyé à votre adresse courriel pour vérifier votre identité." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Continuer à se connecter" }, "webAuthnTitle": { "message": "WebAuthn FIDO2" @@ -950,14 +940,11 @@ "message": "Options d'authentification à deux facteurs" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Sélectionnez la méthode d'authentification à deux facteurs" }, "selfHostedEnvironment": { "message": "Environnement auto-hébergé" }, - "selfHostedEnvironmentFooter": { - "message": "Spécifiez l'URL de base de votre installation Bitwarden auto-hébergée." - }, "selfHostedBaseUrlHint": { "message": "Spécifiez l'URL de base de votre installation Bitwarden hébergée sur site. Exemple : https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Environnement personnalisé" }, - "customEnvironmentFooter": { - "message": "Pour utilisateurs avancés. Vous pouvez spécifier une URL de base indépendante pour chaque service." - }, "baseUrl": { "message": "URL du serveur" }, @@ -1013,6 +997,9 @@ "no": { "message": "Non" }, + "location": { + "message": "Emplacement" + }, "overwritePassword": { "message": "Écraser le mot de passe" }, @@ -1377,7 +1364,7 @@ "description": "Copy credit card number" }, "copyEmail": { - "message": "Copy email" + "message": "Copier le courriel" }, "copySecurityCode": { "message": "Copier le code de sécurité", @@ -1660,13 +1647,13 @@ "message": "Ce mot de passe sera utilisé pour exporter et importer ce fichier" }, "accountRestrictedOptionDescription": { - "message": "Utilisez la clé de chiffrement de votre compte, dérivée du nom d'utilisateur et du mot de passe principal de votre compte, pour chiffrer l'export et restreindre l'import au seul compte Bitwarden actuel." + "message": "Utilisez la clé de chiffrement de votre compte, dérivée du nom d'utilisateur et du mot de passe principal de votre compte, pour chiffrer l'exportation et restreindre l'importation au seul compte Bitwarden actuel." }, "passwordProtected": { "message": "Protégé par mot de passe" }, "passwordProtectedOptionDescription": { - "message": "Définissez un mot de passe de fichier pour chiffrer l'export et déchiffrer son import sur n'importe quel compte Bitwarden." + "message": "Définissez un mot de passe de fichier pour chiffrer l'exportation et déchiffrer son importation sur n'importe quel compte Bitwarden." }, "exportTypeHeading": { "message": "Type d'exportation" @@ -1810,7 +1797,7 @@ "message": "Exiger un mot de passe ou un code PIN au démarrage de Bitwarden" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Exiger un mot de passe au démarrage de l'application" }, "recommendedForSecurity": { "message": "Recommandé pour la sécurité." @@ -2101,10 +2088,10 @@ "message": "Les options de biométrie dans le navigateur nécessitent au préalable l'activation des options de biométrie dans l'application de bureau." }, "biometricsManualSetupTitle": { - "message": "Automatic setup not available" + "message": "Configuration automatique non disponible" }, "biometricsManualSetupDesc": { - "message": "Due to the installation method, biometrics support could not be automatically enabled. Would you like to open the documentation on how to do this manually?" + "message": "En raison de la méthode d'installation, la prise en charge de la biométrie n'a pas pu être activée automatiquement. Souhaitez-vous ouvrir la documentation sur la manière de procéder manuellement ?" }, "personalOwnershipSubmitError": { "message": "En raison d'une politique d'entreprise, il vous est interdit d'enregistrer des éléments dans votre coffre personnel. Sélectionnez une organisation dans l'option Propriété et choisissez parmi les collections disponibles." @@ -2282,10 +2269,10 @@ "message": "Authentifier WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Lire la clé de sécurité" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "En attente de l'interaction de la clé de sécurité..." }, "hideEmail": { "message": "Masquer mon adresse électronique aux destinataires." @@ -2324,7 +2311,7 @@ "message": "Votre mot de passe principal ne répond pas aux exigences de politique de sécurité de cette organisation. Pour pouvoir accéder au coffre, vous devez mettre à jour votre mot de passe principal dès maintenant. En poursuivant, vous serez déconnecté de votre session actuelle et vous devrez vous reconnecter. Les sessions actives sur d'autres appareils peuver rester actives pendant encore une heure." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Votre organisation a désactivé le chiffrement des appareils de confiance. Veuillez définir un mot de passe principal pour accéder à votre coffre." }, "tryAgain": { "message": "Essayez de nouveau" @@ -2507,7 +2494,7 @@ "message": "Export du coffre-fort de l'organisation" }, "exportingOrganizationVaultDesc": { - "message": "Seul le coffre-fort de l'organisation associé à $ORGANIZATION$ sera exporté. Les coffres individuels ou d'autres organisations ne seront pas inclus.", + "message": "Seul le coffre de l'organisation associé à $ORGANIZATION$ sera exporté. Les coffres individuels ou d'autres organisations ne seront pas inclus.", "placeholders": { "organization": { "content": "$1", @@ -2624,11 +2611,11 @@ "message": "Générer un alias de courriel avec un service de transfert externe." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Domaine du courriel", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Choisissez un domaine qui est pris en charge par le service sélectionné", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -2684,7 +2671,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ a refusé votre demande. Veuillez contacter votre fournisseur de service pour assistance.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -2694,7 +2681,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ a refusé votre demande : $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2738,7 +2725,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Une erreur inconnue $SERVICENAME$ s'est produite.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -2748,7 +2735,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "Émetteur inconnu : '$SERVICENAME$'.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Se connecter avec le mot de passe principal" }, - "loggingInAs": { - "message": "Connexion en tant que" - }, "rememberEmail": { "message": "Se souvenir du courriel" }, - "notYou": { - "message": "Ce n'est pas vous ?" - }, "newAroundHere": { "message": "Vous êtes nouveau ici ?" }, @@ -2822,13 +2803,13 @@ "message": "Une notification a été envoyée à votre appareil" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "Déverrouillez Bitwarden sur votre appareil ou sur le " }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "application web" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Assurez-vous que la phrase d'empreinte correspond à celle ci-dessous avant d'approuver." }, "needAnotherOptionV1": { "message": "Besoin d'une autre option ?" @@ -2862,7 +2843,7 @@ "message": "Essayez-vous d'accéder à votre compte ?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Tentative d'accès par $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2880,10 +2861,10 @@ "message": "Heure" }, "confirmAccess": { - "message": "Confirm access" + "message": "Confirmer l'accès" }, "denyAccess": { - "message": "Deny access" + "message": "Refuser l'accès" }, "logInConfirmedForEmailOnDevice": { "message": "Connexion confirmée pour $EMAIL$ sur $DEVICE$", @@ -2920,7 +2901,7 @@ "message": "Cette demande n'est plus valide." }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "Confirmer la tentative d’accès pour $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -2932,7 +2913,7 @@ "message": "Connexion demandée" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "Accès au compte demandé" }, "creatingAccountOn": { "message": "Création du compte sur" @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Demander l'approbation de l'administrateur" }, - "approveWithMasterPassword": { - "message": "Approuver avec le mot de passe principal" - }, "region": { "message": "Région" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Votre demande a été envoyée à votre administrateur." }, - "youWillBeNotifiedOnceApproved": { - "message": "Vous serez notifié une fois approuvé." - }, "troubleLoggingIn": { "message": "Problème pour vous connecter ?" }, @@ -3180,7 +3155,7 @@ "message": "Sous-menu" }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Basculer la navigation latérale" }, "skipToContent": { "message": "Accéder au contenu" @@ -3238,7 +3213,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "Erreur de connexion avec le service Duo. Utilisez une autre méthode d'authentification à deux facteurs ou contactez Duo pour obtenir de l'aide." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "Lancez Duo et suivez les étapes pour terminer la connexion." @@ -3247,10 +3222,10 @@ "message": "L'authentification à double facteur Duo est requise pour votre compte." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "L'authentification à deux facteurs Duo est requise pour votre compte. Suivez les étapes ci-dessous afin de réussir à vous connecter." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Suivez les étapes ci-dessous afin de réussir à vous connecter." }, "launchDuo": { "message": "Lancer Duo dans le navigateur" @@ -3431,7 +3406,7 @@ "message": "Erreur lors de l'assignation du dossier cible." }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "Afficher les éléments dans $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -3441,7 +3416,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "Revenir à $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -3468,28 +3443,28 @@ "message": "Données" }, "fileSends": { - "message": "File Sends" + "message": "Envois de fichiers" }, "textSends": { - "message": "Text Sends" + "message": "Envois de texte" }, "ssoError": { - "message": "No free ports could be found for the sso login." + "message": "Aucun port libre n’a pu être trouvé pour la connexion SSO." }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Le déverrouillage par biométrie n’est pas disponible parce qu'il faut au préalable déverrouiller avec le code PIN ou le mot de passe." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Le déverrouillage par biométrie n'est pas disponible actuellement." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Le déverrouillage par biométrie n'est pas disponible en raison de fichiers système mal configurés." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Le déverrouillage par biométrie n'est pas disponible en raison de fichiers système mal configurés." }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Le déverrouillage par biométrie n'est pas disponible car elle n'est pas activée pour $EMAIL$ dans l'application de bureau Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -3498,7 +3473,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Le déverrouillage par biométrie n'est pas disponible actuellement pour une raison inconnue." }, "authorize": { "message": "Autoriser" @@ -3510,32 +3485,29 @@ "message": "Confirmer l'utilisation de la clé SSH" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "Avertissement : agent émetteur" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "Cette demande provient d’un appareil distant auquel vous êtes connecté" }, "sshkeyApprovalMessageInfix": { "message": "demande l'accès à" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "afin de" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "s’authentifier sur un serveur" }, "sshActionSign": { - "message": "sign a message" + "message": "signer un message" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "signer un engagement Git" }, "unknownApplication": { "message": "Une application" }, - "sshKeyPasswordUnsupported": { - "message": "L'importation de clés SSH protégées par mot de passe n'est pas encore prise en charge" - }, "invalidSshKey": { "message": "La clé SSH est invalide" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Importer une clé depuis le presse-papiers" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Clé SSH importée avec succès" }, "fileSavedToDevice": { @@ -3588,21 +3560,24 @@ "message": "Changer le courriel du compte" }, "allowScreenshots": { - "message": "Allow screen capture" + "message": "Autoriser les captures d'écran" }, "allowScreenshotsDesc": { - "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." + "message": "Permettre à l'application de bureau Bitwarden d'être enregistrée dans des captures d'écran et affichée dans des sessions de bureau à distance. La désactivation de cette fonction empêchera l'accès à certains écrans externes." }, "confirmWindowStillVisibleTitle": { - "message": "Confirm window still visible" + "message": "Fenêtre de confirmation toujours visible" }, "confirmWindowStillVisibleContent": { "message": "Veuillez confirmer que la fenêtre est toujours visible." }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "Mise à jour de l'extension requise" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "L’extension de navigateur que vous utilisez est obsolète. Veuillez la mettre à jour ou désactiver la validation de l'empreinte digitale par l'intégration du navigateur dans les paramètres de l'application de bureau." + }, + "changeAtRiskPassword": { + "message": "Changer le mot de passe à risque" } } diff --git a/apps/desktop/src/locales/gl/messages.json b/apps/desktop/src/locales/gl/messages.json index b7693c0d0b5..f93db44aa69 100644 --- a/apps/desktop/src/locales/gl/messages.json +++ b/apps/desktop/src/locales/gl/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/he/messages.json b/apps/desktop/src/locales/he/messages.json index 05706fd424a..7f98ab977ae 100644 --- a/apps/desktop/src/locales/he/messages.json +++ b/apps/desktop/src/locales/he/messages.json @@ -532,7 +532,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "העתק מספרים", + "message": "כלול מספרים", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -543,10 +543,6 @@ "message": "כלול תווים מיוחדים", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "*&^%$#@!", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "כמות מילים" }, @@ -575,7 +571,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "הימנע מתווים דו-משמעיים", + "message": "הימנע מתווים דו־משמעיים", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "הזן את כתובת דוא\"ל החשבון שלך והרמז לסיסמה שלך יישלח אליך" }, - "passwordHint": { - "message": "רמז לסיסמה" - }, - "enterEmailToGetHint": { - "message": "הכנס את כתובת האימייל שלך לקבלת רמז עבור הסיסמה הראשית." - }, "getMasterPasswordHint": { "message": "הצג את הרמז לסיסמה הראשית" }, @@ -835,7 +825,7 @@ "message": "האימות בוטל או לקח זמן רב מדי. נא לנסות שוב." }, "openInNewTab": { - "message": "פתח בכרטיסייה חדשה" + "message": "פתח בכרטיסיה חדשה" }, "invalidVerificationCode": { "message": "קוד אימות שגוי" @@ -903,7 +893,7 @@ "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "מפתח אבטחה OTP של YubiKey" + "message": "מפתח אבטחה OTP של Yubico" }, "yubiKeyDesc": { "message": "השתמש בYubiKey עבור גישה לחשבון שלך. עובד עם YubiKey בגירסאות 4, 4C, 4Nano, ומכשירי NEO." @@ -916,7 +906,7 @@ "message": "בצע אימות מול Duo Security עבור הארגון שלך באמצעות אפליקצית Duo לפלאפון, SMS, שיחת טלפון, או מפתח אבטחה U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "אמת את זהותך" }, "weDontRecognizeThisDevice": { @@ -950,14 +940,11 @@ "message": "אפשרויות כניסה דו שלבית" }, "selectTwoStepLoginMethod": { - "message": "בחר שיטת כניסה דו-שלבית" + "message": "בחר שיטת כניסה דו־שלבית" }, "selfHostedEnvironment": { "message": "סביבה על שרתים מקומיים" }, - "selfHostedEnvironmentFooter": { - "message": "הזן את כתובת השרת המקומי של Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "ציין את בסיס ה־URL של התקנת Bitwarden באירוח מקומי שלך. דוגמה: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "סביבה מותאמת אישית" }, - "customEnvironmentFooter": { - "message": "למשתמשים מתקדמים. באפשרותך לציין את כתובת השרת עבור כל שירות בנפרד." - }, "baseUrl": { "message": "כתובת שרת" }, @@ -1013,6 +997,9 @@ "no": { "message": "לא" }, + "location": { + "message": "מיקום" + }, "overwritePassword": { "message": "דרוס סיסמה" }, @@ -1292,7 +1279,7 @@ "message": "הצג תמיד ב-Dock" }, "alwaysShowDockDesc": { - "message": "הצג את הסמל של Bitwarden ב-Dock גם כשהיישום ממוזער לשורת התפריטים." + "message": "הצג את הסמל של Bitwarden ב־Dock גם כשהיישום ממוזער לשורת התפריטים." }, "confirmTrayTitle": { "message": "אשר הסתרת מגש" @@ -1405,7 +1392,7 @@ "message": "1 ג'יגה של מקום אחסון מוצפן עבור קבצים מצורפים." }, "premiumSignUpTwoStepOptions": { - "message": "אפשרויות כניסה דו-שלבית קנייניות כגון YubiKey ו־Duo." + "message": "אפשרויות כניסה דו־שלבית קנייניות כגון YubiKey ו־Duo." }, "premiumSignUpReports": { "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה." @@ -1642,7 +1629,7 @@ "description": "ex. Date this password was updated" }, "exportFrom": { - "message": "ייצוא מ-" + "message": "ייצוא מ־" }, "exportVault": { "message": "יצוא כספת" @@ -1660,7 +1647,7 @@ "message": "סיסמה זו תשמש כדי לייצא ולייבא קובץ זה" }, "accountRestrictedOptionDescription": { - "message": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש שלך והסיסמה הראשית, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." + "message": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש והסיסמה הראשית של חשבונך, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." }, "passwordProtected": { "message": "מוגן סיסמה" @@ -1675,7 +1662,7 @@ "message": "מוגבל חשבון" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "\"סיסמת קובץ\" ו-\"אשר סיסמת קובץ\" אינם תואמים." + "message": "\"סיסמת קובץ\" ו\"אשר סיסמת קובץ\" אינם תואמים." }, "hCaptchaUrl": { "message": "כתובת אתר hCaptcha", @@ -2005,7 +1992,7 @@ } }, "masterPasswordPolicyRequirementsNotMet": { - "message": "הסיסמה הראשית החדשה השלך לא עומדת בדרישות המדיניות." + "message": "הסיסמה הראשית החדשה שלך לא עומדת בדרישות המדיניות." }, "receiveMarketingEmailsV2": { "message": "קבל עצות, הכרזות, והזדמנויות מחקר מאת Bitwarden בדואר הנכנס שלך." @@ -2053,7 +2040,7 @@ "message": "למרבה הצער שילוב דפדפן נתמך רק בגרסת Mac App Store לעת עתה." }, "browserIntegrationWindowsStoreDesc": { - "message": "למרבה הצער שילוב דפדפן אינו נתמך כרגע בגרסת ה-Microsoft Store." + "message": "למרבה הצער שילוב דפדפן אינו נתמך כרגע בגרסת ה־Microsoft Store." }, "browserIntegrationLinuxDesc": { "message": "למרבה הצער שילוב דפדפן אינו נתמך כרגע בגרסת הלינוקס." @@ -2244,7 +2231,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copySendLinkOnSave": { - "message": "העתק את הקישור לשיתוף סֵנְד זה ללוח ההעתקה שלי עם השמירה." + "message": "העתק את הקישור לשיתוף סֵנְד זה אל לוח ההעתקה שלי עם השמירה." }, "sendDisabled": { "message": "סֵנְד הוסר", @@ -2318,7 +2305,7 @@ "message": "עדכון סיסמה ראשית" }, "updateMasterPasswordWarning": { - "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." + "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל הארגון שלך. כדי לגשת לכספת, עליך לעדכן אותה כעת. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "updateWeakMasterPasswordWarning": { "message": "הסיסמה הראשית שלך אינה עומדת באחת או יותר מפוליסות הארגון שלך. כדי לגשת לכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. בהמשך תנותק מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." @@ -2369,7 +2356,7 @@ "message": "דקות" }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ שעות ו-$MINUTES$ דקות לכל היותר.", + "message": "$HOURS$ שעות ו־$MINUTES$ דקות לכל היותר.", "placeholders": { "hours": { "content": "$1", @@ -2382,7 +2369,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "פוליסות הארגון שלך משפיעות על פסק הזמן לכספת שלך. פסק זמן מרבי המותר הוא $HOURS$ שעות ו-$MINUTES$ דקות. פעולת פסק הזמן לכספת שלך מוגדרת ל$ACTION$.", + "message": "פוליסות הארגון שלך משפיעות על פסק הזמן לכספת שלך. פסק זמן מרבי המותר הוא $HOURS$ שעות ו־$MINUTES$ דקות. פעולת פסק הזמן לכספת שלך מוגדרת ל$ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2435,7 +2422,7 @@ "message": "הסיסמה הראשית הוסרה" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית לא דרושה יותר כדי להיכנס עבור חברים של ארגון זה.", + "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית כבר לא נדרשת כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -2453,7 +2440,7 @@ "message": "עזבת את הארגון." }, "ssoKeyConnectorError": { - "message": "שגיאת מחבר מפתח: וודא שמחבר המפתח זמין ופועל כראוי." + "message": "שגיאת Key Connector: וודא שה־Key Connector זמין ופועל כראוי." }, "lockAllVaults": { "message": "נעל את כל הכספות" @@ -2495,7 +2482,7 @@ "message": "מייצא כספת אישית" }, "exportingIndividualVaultDescription": { - "message": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. פריטי כספת ארגון לא יכללו. רק פרטי פריט כספת ייוצאו ולא יכללו קבצים מצורפים משויכים.", + "message": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. פריטי כספת ארגון לא יכללו. רק פרטי פריט כספת ייוצאו ולא יכללו צרופות משויכות.", "placeholders": { "email": { "content": "$1", @@ -2507,7 +2494,7 @@ "message": "מייצא כספת ארגון" }, "exportingOrganizationVaultDesc": { - "message": "רק כספת הארגון המשויכת עם $ORGANIZATION$ ייוצאו. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", + "message": "רק כספת הארגון המשויכת עם $ORGANIZATION$ תיוצא. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", "placeholders": { "organization": { "content": "$1", @@ -2588,10 +2575,10 @@ "message": "השתמש ביכולות מיעון משנה של ספק הדוא\"ל שלך." }, "catchallEmail": { - "message": "דוא\"ל תופס-כל" + "message": "דוא\"ל תופס־כל" }, "catchallEmailDesc": { - "message": "השתמש בתיבת דואר תפוס-כל המוגדרת בדומיין שלך." + "message": "השתמש בתיבת דואר תפוס־כל המוגדרת בדומיין שלך." }, "useThisEmail": { "message": "השתמש בדוא\"ל זה" @@ -2771,10 +2758,10 @@ "message": "נדרש מנוי פרימיום" }, "organizationIsDisabled": { - "message": "ארגון מושהה" + "message": "ארגון מושעה" }, "disabledOrganizationFilterError": { - "message": "לא ניתן לגשת לפריטים בארגון מושהה. פנה אל בעל הארגון שלך עבור סיוע." + "message": "לא ניתן לגשת לפריטים בארגון מושעה. פנה אל בעל הארגון שלך עבור סיוע." }, "neverLockWarning": { "message": "האם אתה בטוח שברצונך להשתמש באפשרות \"לעולם לא\"? הגדרת אפשרויות הנעילה שלך ל\"לעולם לא\" מאחסנת את מפתח ההצפנה של הכספת שלך במכשיר שלך. אם אתה משתמש באפשרות זו עליך לוודא שאתה שומר על המכשיר שלך מוגן כראוי." @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "כניסה עם סיסמה ראשית" }, - "loggingInAs": { - "message": "נכנס כ-" - }, "rememberEmail": { "message": "זכור דוא\"ל" }, - "notYou": { - "message": "לא אתה?" - }, "newAroundHere": { "message": "חדש כאן?" }, @@ -2825,7 +2806,7 @@ "message": "בטל נעילת Bitwarden במכשיר שלך או ב" }, "notificationSentDeviceAnchor": { - "message": "יישום הרשת" + "message": "יישום רשת" }, "notificationSentDevicePart2": { "message": "וודא שביטוי טביעת האצבע תואם את זה שלמטה לפני שתאשר." @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "בקש אישור מנהל" }, - "approveWithMasterPassword": { - "message": "אשר עם סיסמה ראשית" - }, "region": { "message": "אזור" }, @@ -3050,7 +3028,7 @@ "message": "אירוח עצמי" }, "accessDenied": { - "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בדף זה." + "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בעמוד זה." }, "accountSuccessfullyCreated": { "message": "החשבון נוצר בהצלחה!" @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "הבקשה שלך נשלחה למנהל שלך." }, - "youWillBeNotifiedOnceApproved": { - "message": "תקבל התראה כשתאושר." - }, "troubleLoggingIn": { "message": "בעיות בכניסה?" }, @@ -3134,7 +3109,7 @@ } }, "multipleInputEmails": { - "message": "1 או יותר דוא\"לים אינם חוקיים" + "message": "כתובת דוא\"ל 1 או יותר אינה חוקית" }, "inputTrimValidator": { "message": "אסור שקלט יכיל רק רווח לבן.", @@ -3144,7 +3119,7 @@ "message": "קלט הוא לא כתובת דוא\"ל." }, "fieldsNeedAttention": { - "message": "$COUNT$ שדות למעלה צריכות את תשומת לבך.", + "message": "$COUNT$ שדות למעלה צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -3180,7 +3155,7 @@ "message": "תפריט משנה" }, "toggleSideNavigation": { - "message": "פתח או סגור ניווט צדדי" + "message": "החלף מצב ניווט צדדי" }, "skipToContent": { "message": "דלג לתוכן" @@ -3198,7 +3173,7 @@ "message": "דומיין כינוי" }, "importData": { - "message": "ייבוא נתונים", + "message": "ייבא נתונים", "description": "Used for the desktop menu item and the header of the import dialog" }, "importError": { @@ -3247,7 +3222,7 @@ "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "נדרשת כניסה דו-שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." + "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." }, "followTheStepsBelowToFinishLoggingIn": { "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." @@ -3274,7 +3249,7 @@ "message": "למד על אפשרויות הייבוא שלך" }, "selectImportFolder": { - "message": "בחר תיקיה" + "message": "בחר תיקייה" }, "selectImportCollection": { "message": "בחר אוסף" @@ -3327,10 +3302,10 @@ "message": "אשר סיסמת קובץ" }, "exportSuccess": { - "message": "נתוני כספת יוצאו" + "message": "נתוני הכספת יוצאו" }, "multifactorAuthenticationCancelled": { - "message": "אימות רב-גורמי בוטל" + "message": "אימות רב־גורמי בוטל" }, "noLastPassDataFound": { "message": "לא נמצאו נתוני LastPass" @@ -3348,7 +3323,7 @@ "message": "PIN שגוי" }, "multifactorAuthenticationFailed": { - "message": "אימות רב-גורמי נכשל" + "message": "אימות רב־גורמי נכשל" }, "includeSharedFolders": { "message": "כלול תיקיות משותפות" @@ -3360,7 +3335,7 @@ "message": "מייבא את החשבון שלך..." }, "lastPassMFARequired": { - "message": "נדרש אימות רב-גורמי של LastPass" + "message": "נדרש אימות רב־גורמי של LastPass" }, "lastPassMFADesc": { "message": "הזן את קוד הגישה החד פעמי שלך מיישום האימות שלך" @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "יישום" }, - "sshKeyPasswordUnsupported": { - "message": "ייבוא מפתחות SSH מוגנים בסיסמה עדיין לא נתמך" - }, "invalidSshKey": { "message": "מפתח ה־SSH אינו תקין" }, @@ -3545,23 +3517,23 @@ "importSshKeyFromClipboard": { "message": "ייבא מפתח מלוח ההעתקה" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "מפתח SSH יובא בהצלחה" }, "fileSavedToDevice": { - "message": "קובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." + "message": "הקובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." }, "importantNotice": { "message": "הודעה חשובה" }, "setupTwoStepLogin": { - "message": "הגדר כניסה דו-שלבית" + "message": "הגדר כניסה דו־שלבית" }, "newDeviceVerificationNoticeContentPage1": { "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "אתה יכול להגדיר כניסה דו-שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." + "message": "אתה יכול להגדיר כניסה דו־שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." }, "remindMeLater": { "message": "הזכר לי מאוחר יותר" @@ -3582,7 +3554,7 @@ "message": "כן, אני יכול לגשת לדוא\"ל שלי באופן מהימן" }, "turnOnTwoStepLogin": { - "message": "הפעל כניסה דו-שלבית" + "message": "הפעל כניסה דו־שלבית" }, "changeAcctEmail": { "message": "שנה את דוא\"ל החשבון" @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "הרחבת הדפדפן בה אתה משתמש היא מיושנת. נא לעדכן אותה או להשבית אימות טביעת אצבע של שילוב דפדפן בהגדרות יישום שולחן העבודה." + }, + "changeAtRiskPassword": { + "message": "שנה סיסמה בסיכון" } } diff --git a/apps/desktop/src/locales/hi/messages.json b/apps/desktop/src/locales/hi/messages.json index 1f5405f8405..90fed49de76 100644 --- a/apps/desktop/src/locales/hi/messages.json +++ b/apps/desktop/src/locales/hi/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/hr/messages.json b/apps/desktop/src/locales/hr/messages.json index ed82423d813..e586b2e062e 100644 --- a/apps/desktop/src/locales/hr/messages.json +++ b/apps/desktop/src/locales/hr/messages.json @@ -543,10 +543,6 @@ "message": "Uključi posebne znakove", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "! @ # $ % ^ & *", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Broj riječi" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" }, - "passwordHint": { - "message": "Podsjetnik za lozinku" - }, - "enterEmailToGetHint": { - "message": "Unesi adresu e-pošte svog računa za primitak podsjetnika glavne lozinke." - }, "getMasterPasswordHint": { "message": "Slanje podsjetnika glavne lozinke" }, @@ -916,8 +906,8 @@ "message": "Potvrdi s Duo Security za svoju organizaciju pomoću aplikacije Duo Mobile, SMS-om, telefonskim pozivom ili U2F sigurnosnim ključem.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Potvrdi svoj identitet" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Vlastito hosting okruženje" }, - "selfHostedEnvironmentFooter": { - "message": "Navedi osnovni URL svoje lokalno smještene Bitwarden instalacije." - }, "selfHostedBaseUrlHint": { "message": "Navedi osnovni URL svoje lokalne Bitwarden instalacije, npr.: https://bitwarden.tvrtka.hr" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Prilagođeno okruženje" }, - "customEnvironmentFooter": { - "message": "Za napredne korisnike. Samostalno možeš odrediti osnovni URL svake usluge." - }, "baseUrl": { "message": "URL poslužitelja" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Prebriši lozinku" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Prijava glavnom lozinkom" }, - "loggingInAs": { - "message": "Prijava kao" - }, "rememberEmail": { "message": "Zapamti adresu e-pošte" }, - "notYou": { - "message": "Nisi ti?" - }, "newAroundHere": { "message": "Novi korisnik?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Zatraži odobrenje administratora" }, - "approveWithMasterPassword": { - "message": "Odobri glavnom lozinkom" - }, "region": { "message": "Regija" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tvoj zahtjev je poslan administratoru." }, - "youWillBeNotifiedOnceApproved": { - "message": "Dobiti ćeš obavijest kada bude odobreno." - }, "troubleLoggingIn": { "message": "Problem s prijavom?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Aplikacija" }, - "sshKeyPasswordUnsupported": { - "message": "Uvoz SSH ključeva zaštićenih lozinkom još nije podržan" - }, "invalidSshKey": { "message": "SSH ključ nije valjan" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Uvezi ključ iz međuspremnika" }, - "sshKeyPasted": { - "message": "SSH ključ uspješno uvezen" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Datoteka spremljena na uređaj. Upravljaj u preuzimanjima svog uređaja." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Proširenje preglednika koje koristitš zastarjelo. Ažuriraj ga ili onemogući provjeru otiska prsta u pregledniku u postavkama aplikacije za stolno računalo." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/hu/messages.json b/apps/desktop/src/locales/hu/messages.json index a974b10ee49..b9573428136 100644 --- a/apps/desktop/src/locales/hu/messages.json +++ b/apps/desktop/src/locales/hu/messages.json @@ -543,10 +543,6 @@ "message": "Speciális karakterek bevonása", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Szavak száma" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." }, - "passwordHint": { - "message": "Jelszó emlékeztető" - }, - "enterEmailToGetHint": { - "message": "A fiók email címének megadása a mesterjelszó emlékeztető fogadásához." - }, "getMasterPasswordHint": { "message": "Mesterjelszó emlékeztető kérése" }, @@ -916,7 +906,7 @@ "message": "Ellenőrzés szervezeti Duo Security segítségével a Duo Mobile alkalmazás, SMS, telefonhívás vagy U2F biztonsági kulcs használatával.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Személyazonosság ellenőrzése" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Saját üzemeltetésű környezet" }, - "selfHostedEnvironmentFooter": { - "message": "A helyileg üzemeltetett Bitwarden telepítés webcímének megadása." - }, "selfHostedBaseUrlHint": { "message": "Adjuk meg a helyileg tárolt Bitwarden telepítés alap webcímét. Példa: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Egyedi környezet" }, - "customEnvironmentFooter": { - "message": "Haladó felhasználóknak. Minden egyes szolgáltatásnak külön megadható az alap webcím." - }, "baseUrl": { "message": "Szerver webcím" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nem" }, + "location": { + "message": "Hely" + }, "overwritePassword": { "message": "Jelszó felülírása" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Bejelentkezés mesterjelszóval" }, - "loggingInAs": { - "message": "Bejelentkezve mint" - }, "rememberEmail": { "message": "Email megjegyzése" }, - "notYou": { - "message": "Ez tévedés?" - }, "newAroundHere": { "message": "Új felhasználó vagyunk?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Adminisztrátori jóváhagyás kérés" }, - "approveWithMasterPassword": { - "message": "Jóváhagyás mesterjelszóval" - }, "region": { "message": "Régió" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "A kérés elküldésre került az adminisztrátornak." }, - "youWillBeNotifiedOnceApproved": { - "message": "A jóváhagyás után értesítés érkezik." - }, "troubleLoggingIn": { "message": "Probléma van a bejelentkezéssel?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Egy alkalmazás" }, - "sshKeyPasswordUnsupported": { - "message": "A jelszóval védett SSH kulcsok importálása még nem támogatott." - }, "invalidSshKey": { "message": "Az SSH kulcs érvénytelen." }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Kulcs importálása vágólapból" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Az SSH kulcs sikeresen importálásra került." }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Al használt böngésző bővítmény elavult. Frissítsük vagy tiltsuk le a böngésző integráció ujjlenyomat ellenőrzését az asztali alkalmazás beállításainál." + }, + "changeAtRiskPassword": { + "message": "Kockázatos jelszó megváltoztatása" } } diff --git a/apps/desktop/src/locales/id/messages.json b/apps/desktop/src/locales/id/messages.json index 017d3357ccd..df9b6484778 100644 --- a/apps/desktop/src/locales/id/messages.json +++ b/apps/desktop/src/locales/id/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Jumlah kata" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Petunjuk Sandi" - }, - "enterEmailToGetHint": { - "message": "Masukkan email akun Anda untuk menerima pentunjuk sandi utama Anda." - }, "getMasterPasswordHint": { "message": "Dapatkan petunjuk sandi utama" }, @@ -916,7 +906,7 @@ "message": "Verifikasi dengan Duo Security untuk organisasi anda dengan menggunakan Aplikasi Duo Mobile, SMS, panggilan telepon atau kunci keamanan U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Lingkungan Hos-mandiri" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Lingkungan Kustom" }, - "customEnvironmentFooter": { - "message": "Untuk pengguna lanjutan. Anda dapat menentukan basis dari URL untuk setiap layanan mandiri." - }, "baseUrl": { "message": "URL Server" }, @@ -1013,6 +997,9 @@ "no": { "message": "Tidak" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Timpa Sandi" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Bukan Anda?" - }, "newAroundHere": { "message": "Pengguna baru?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/it/messages.json b/apps/desktop/src/locales/it/messages.json index 3cecef39f7a..ef5fa5ce381 100644 --- a/apps/desktop/src/locales/it/messages.json +++ b/apps/desktop/src/locales/it/messages.json @@ -543,10 +543,6 @@ "message": "Includi caratteri speciali", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Numero di parole" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Inserisci l'indirizzo email dell'account e ti invieremo il tuo suggerimento per la password" }, - "passwordHint": { - "message": "Suggerimento per la password" - }, - "enterEmailToGetHint": { - "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale." - }, "getMasterPasswordHint": { "message": "Ottieni suggerimento della password principale" }, @@ -916,7 +906,7 @@ "message": "Verifica con Duo Security per la tua organizzazione usando l'app Duo Mobile, SMS, chiamata telefonica, o chiave di sicurezza U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifica la tua identità" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Ambiente self-hosted" }, - "selfHostedEnvironmentFooter": { - "message": "Specifica l'URL principale della tua installazione self-hosted di Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Specifica lo URL principale della tua installazione self-hosted di Bitwarden. Esempio: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Ambiente personalizzato" }, - "customEnvironmentFooter": { - "message": "Per utenti avanzati. Puoi specificare l'URL principale di ogni servizio indipendentemente." - }, "baseUrl": { "message": "URL del server" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Luogo" + }, "overwritePassword": { "message": "Sovrascrivi password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Accedi con password principale" }, - "loggingInAs": { - "message": "Accedendo come" - }, "rememberEmail": { "message": "Ricorda email" }, - "notYou": { - "message": "Non sei tu?" - }, "newAroundHere": { "message": "Nuovo da queste parti?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Richiedi approvazione dell'amministratore" }, - "approveWithMasterPassword": { - "message": "Approva con password principale" - }, "region": { "message": "Regione" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La tua richiesta è stata inviata al tuo amministratore." }, - "youWillBeNotifiedOnceApproved": { - "message": "Riceverai una notifica una volta approvato." - }, "troubleLoggingIn": { "message": "Problemi ad accedere?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Un'applicazione" }, - "sshKeyPasswordUnsupported": { - "message": "L'importazione di chiavi SSH protette da password non è ancora supportata" - }, "invalidSshKey": { "message": "La chiave SSH non è valida" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Importa chiave dagli Appunti" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Chiave SSH importata correttamente" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "L'estensione del browser che stai usando non è aggiornata. Aggiornala o disabilita la convalida dell'impronta digitale per l'integrazione del browser nelle impostazioni dell'app desktop." + }, + "changeAtRiskPassword": { + "message": "Modifica la password non sicura o esposta" } } diff --git a/apps/desktop/src/locales/ja/messages.json b/apps/desktop/src/locales/ja/messages.json index 098c683faae..e8ba0e8509b 100644 --- a/apps/desktop/src/locales/ja/messages.json +++ b/apps/desktop/src/locales/ja/messages.json @@ -250,17 +250,17 @@ "message": "エラー" }, "decryptionError": { - "message": "Decryption error" + "message": "復号エラー" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden は以下の保管庫のアイテムを復号できませんでした。" }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "カスタマーサクセスに問い合わせて、", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "さらなるデータ損失を回避してください。", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "january": { @@ -543,10 +543,6 @@ "message": "特殊記号を含める", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "単語数" }, @@ -653,13 +649,13 @@ "message": "Bitwarden にログイン" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "メールアドレスに送信されたコードを入力してください" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "認証アプリに表示されているコードを入力してください" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "YubiKey を押して認証してください" }, "logInWithPasskey": { "message": "パスキーでログイン" @@ -714,7 +710,7 @@ "message": "マスターパスワードのヒント" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "パスワードの強度スコア $SCORE$", "placeholders": { "score": { "content": "$1", @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" }, - "passwordHint": { - "message": "パスワードのヒント" - }, - "enterEmailToGetHint": { - "message": "マスターパスワードのヒントを受信するアカウントのメールアドレスを入力してください。" - }, "getMasterPasswordHint": { "message": "マスターパスワードのヒントを取得する" }, @@ -835,7 +825,7 @@ "message": "認証がキャンセルされたか、時間がかかりすぎました。もう一度やり直してください。" }, "openInNewTab": { - "message": "Open in new tab" + "message": "新しいタブで開く" }, "invalidVerificationCode": { "message": "認証コードが間違っています" @@ -868,7 +858,7 @@ "message": "情報を保存する" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "このデバイスで30日間再表示しない" }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" @@ -877,11 +867,11 @@ "message": "他の2段階認証方法を使用" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "別の方法を選択", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "リカバリーコードを使用する" }, "insertYubiKey": { "message": "YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" @@ -916,14 +906,14 @@ "message": "組織の Duo Security を Duo Mobile アプリや SMS、電話、U2F セキュリティーキーを使用して認証します。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Verify your Identity" + "verifyYourIdentity": { + "message": "本人確認" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "このデバイスは未確認です。本人確認のため、メールアドレスに送信されたコードを入力してください。" }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "ログインを続ける" }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" @@ -950,14 +940,11 @@ "message": "2段階認証オプション" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "2段階認証の方法を選択" }, "selfHostedEnvironment": { "message": "セルフホスティング環境" }, - "selfHostedEnvironmentFooter": { - "message": "セルフホスティングしている Bitwarden のベース URL を指定してください。" - }, "selfHostedBaseUrlHint": { "message": "オンプレミスホストした Bitwarden のベース URL を指定してください。例: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "カスタム環境" }, - "customEnvironmentFooter": { - "message": "上級者向けです。各サービスのベース URL を個別に指定できます。" - }, "baseUrl": { "message": "サーバー URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "いいえ" }, + "location": { + "message": "場所" + }, "overwritePassword": { "message": "パスワードを上書き" }, @@ -1810,7 +1797,7 @@ "message": "アプリ起動時にパスワードまたは PIN を要求" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "アプリ起動時にパスワードを要求" }, "recommendedForSecurity": { "message": "セキュリティ向上のためおすすめします。" @@ -2282,10 +2269,10 @@ "message": "WebAuthn の認証" }, "readSecurityKey": { - "message": "Read security key" + "message": "セキュリティキーの読み取り" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "セキュリティキーとの通信を待ち受け中…" }, "hideEmail": { "message": "メールアドレスを受信者に表示しない" @@ -2594,7 +2581,7 @@ "message": "ドメインに設定されたキャッチオール受信トレイを使用します。" }, "useThisEmail": { - "message": "Use this email" + "message": "このメールアドレスを使う" }, "random": { "message": "ランダム" @@ -2684,7 +2671,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ はリクエストを拒否しました。サービスプロバイダーにお問い合わせください。", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -2694,7 +2681,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ があなたのリクエストを拒否しました: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "マスターパスワードでログイン" }, - "loggingInAs": { - "message": "ログイン中:" - }, "rememberEmail": { "message": "メールアドレスを保存" }, - "notYou": { - "message": "あなたではないですか?" - }, "newAroundHere": { "message": "初めてですか?" }, @@ -2813,7 +2794,7 @@ "message": "ログイン開始" }, "logInRequestSent": { - "message": "Request sent" + "message": "リクエストが送信されました" }, "notificationSentDevice": { "message": "デバイスに通知を送信しました。" @@ -2822,13 +2803,13 @@ "message": "お使いのデバイスに通知が送信されました" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "デバイスまたは" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "ウェブアプリ" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "上で、Bitwarden をロック解除してください。承認する前に、フィンガープリントフレーズが以下と一致していることを確認してください。" }, "needAnotherOptionV1": { "message": "別の選択肢が必要ですか?" @@ -2859,10 +2840,10 @@ "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "アカウントにアクセスしようとしていますか?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "$EMAIL$ によるログインの試行", "placeholders": { "email": { "content": "$1", @@ -2880,10 +2861,10 @@ "message": "時間" }, "confirmAccess": { - "message": "Confirm access" + "message": "アクセスの確認" }, "denyAccess": { - "message": "Deny access" + "message": "アクセスを拒否" }, "logInConfirmedForEmailOnDevice": { "message": "$EMAIL$ に $DEVICE$ でのログインを承認しました", @@ -2920,7 +2901,7 @@ "message": "このリクエストは無効になりました。" }, "confirmAccessAttempt": { - "message": "Confirm access attempt for $EMAIL$", + "message": "$EMAIL$ のログイン試行を確認", "placeholders": { "email": { "content": "$1", @@ -2932,7 +2913,7 @@ "message": "ログインリクエスト済み" }, "accountAccessRequested": { - "message": "Account access requested" + "message": "アカウントへのアクセスが要求されました" }, "creatingAccountOn": { "message": "アカウント作成:" @@ -2968,10 +2949,10 @@ "message": "入力されたパスワードは脆弱かつすでに流出済みです。アカウントを守るためより強力で一意なパスワードを使用してください。本当にこの脆弱なパスワードを使用しますか?" }, "useThisPassword": { - "message": "Use this password" + "message": "このパスワードを使用する" }, "useThisUsername": { - "message": "Use this username" + "message": "このユーザー名を使用する" }, "checkForBreaches": { "message": "このパスワードの既知のデータ流出を確認" @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "管理者の承認を要求する" }, - "approveWithMasterPassword": { - "message": "マスターパスワードで承認する" - }, "region": { "message": "リージョン" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "要求を管理者に送信しました。" }, - "youWillBeNotifiedOnceApproved": { - "message": "承認されると通知されます。 " - }, "troubleLoggingIn": { "message": "ログインできない場合" }, @@ -3247,10 +3222,10 @@ "message": "アカウントには Duo 二段階認証が必要です。" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "このアカウントでは Duo 二段階認証を行う必要があります。以下の手順に従ってログインを完了してください。" }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "以下の手順に従ってログインを完了してください。" }, "launchDuo": { "message": "ブラウザで Duo を起動" @@ -3477,19 +3452,19 @@ "message": "SSO ログインのための空きポートが見つかりませんでした。" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "PINまたはパスワードによるロック解除が最初に必要なため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "生体認証によるロック解除は現在利用できません。" }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "システムファイルの設定が誤っているため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "システムファイルの設定が誤っているため、生体認証によるロック解除は利用できません。" }, "biometricsStatusHelptextNotEnabledLocally": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "生体認証による $EMAIL$ のロック解除は、 Bitwarden デスクトップアプリ上で有効になっていないため、利用できません。", "placeholders": { "email": { "content": "$1", @@ -3498,7 +3473,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "生体認証によるロック解除は、不明な理由により現在利用できません。" }, "authorize": { "message": "認可" @@ -3510,32 +3485,29 @@ "message": "SSH 鍵の使用を確認します" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "警告: エージェント転送" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "このリクエストは、あなたがログインしているリモートデバイスから送信されています" }, "sshkeyApprovalMessageInfix": { - "message": "がアクセスを要求しています: " + "message": "が" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "へのアクセスを要求しています。目的:" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "サーバーへの認証" }, "sshActionSign": { - "message": "sign a message" + "message": "メッセージへの署名" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "git コミットへの署名" }, "unknownApplication": { "message": "アプリ" }, - "sshKeyPasswordUnsupported": { - "message": "パスワードで保護された SSH キーのインポートはまだサポートされていません" - }, "invalidSshKey": { "message": "SSH キーが無効です" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "クリップボードからキーをインポート" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH キーのインポートに成功しました" }, "fileSavedToDevice": { @@ -3588,21 +3560,24 @@ "message": "アカウントのメールアドレスを変更する" }, "allowScreenshots": { - "message": "Allow screen capture" + "message": "スクリーンショットを許可" }, "allowScreenshotsDesc": { - "message": "Allow the Bitwarden desktop application to be captured in screenshots and viewed in remote desktop sessions. Disabling this will prevent access on some external displays." + "message": "Bitwarden デスクトップアプリをスクリーンショットでキャプチャしたり、リモートデスクトップセッションで表示したりすることを許可します。これを無効にすると、一部の外部ディスプレイ上でアクセスできなくなります。" }, "confirmWindowStillVisibleTitle": { - "message": "Confirm window still visible" + "message": "ウィンドウが表示されていることを確認" }, "confirmWindowStillVisibleContent": { - "message": "Please confirm that the window is still visible." + "message": "ウィンドウが現在も表示されていることを確認してください。" }, "updateBrowserOrDisableFingerprintDialogTitle": { - "message": "Extension update required" + "message": "拡張機能のアップデートが必要" }, "updateBrowserOrDisableFingerprintDialogMessage": { - "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + "message": "お使いのブラウザ拡張機能が古くなっています。拡張機能を更新するか、デスクトップアプリの設定からブラウザ統合の指紋認証を無化してください。" + }, + "changeAtRiskPassword": { + "message": "危険なパスワードの変更" } } diff --git a/apps/desktop/src/locales/ka/messages.json b/apps/desktop/src/locales/ka/messages.json index 101679fb6e5..96962e14ff5 100644 --- a/apps/desktop/src/locales/ka/messages.json +++ b/apps/desktop/src/locales/ka/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "სერვერის URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "რეგიონი" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/km/messages.json b/apps/desktop/src/locales/km/messages.json index b7693c0d0b5..f93db44aa69 100644 --- a/apps/desktop/src/locales/km/messages.json +++ b/apps/desktop/src/locales/km/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/kn/messages.json b/apps/desktop/src/locales/kn/messages.json index 5c1ac058bdc..f9bb154b66e 100644 --- a/apps/desktop/src/locales/kn/messages.json +++ b/apps/desktop/src/locales/kn/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "ಪದಗಳ ಸಂಖ್ಯೆ" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" - }, - "enterEmailToGetHint": { - "message": "ವಿಸ್ತರಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಮೆನುವಿನಲ್ಲಿರುವ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಐಕಾನ್ ಟ್ಯಾಪ್ ಮಾಡಿ." - }, "getMasterPasswordHint": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವನ್ನು ಪಡೆಯಿರಿ" }, @@ -916,7 +906,7 @@ "message": "ಡ್ಯುಯೊ ಮೊಬೈಲ್ ಅಪ್ಲಿಕೇಶನ್, ಎಸ್‌ಎಂಎಸ್, ಫೋನ್ ಕರೆ ಅಥವಾ ಯು 2 ಎಫ್ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಸಂಸ್ಥೆಗಾಗಿ ಡ್ಯುಯೊ ಸೆಕ್ಯುರಿಟಿಯೊಂದಿಗೆ ಪರಿಶೀಲಿಸಿ.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "ಸ್ವಯಂ ಆತಿಥೇಯ ಪರಿಸರ" }, - "selfHostedEnvironmentFooter": { - "message": "ನಿಮ್ಮ ಆನ್-ಪ್ರಮೇಯ ಹೋಸ್ಟ್ ಮಾಡಿದ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಸ್ಥಾಪನೆಯ ಮೂಲ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "ಕಸ್ಟಮ್ ಪರಿಸರ" }, - "customEnvironmentFooter": { - "message": "ಸುಧಾರಿತ ಬಳಕೆದಾರರಿಗಾಗಿ. ನೀವು ಪ್ರತಿ ಸೇವೆಯ ಮೂಲ URL ಅನ್ನು ಸ್ವತಂತ್ರವಾಗಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು." - }, "baseUrl": { "message": "ಸರ್ವರ್ URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "ಇಲ್ಲ" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬದಲಿಸಿ" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ko/messages.json b/apps/desktop/src/locales/ko/messages.json index 3a574ed1cde..44bc681f205 100644 --- a/apps/desktop/src/locales/ko/messages.json +++ b/apps/desktop/src/locales/ko/messages.json @@ -543,10 +543,6 @@ "message": "특수 문자 포함", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "단어 수" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "비밀번호 힌트" - }, - "enterEmailToGetHint": { - "message": "마스터 비밀번호 힌트를 받으려면 계정의 이메일 주소를 입력하세요." - }, "getMasterPasswordHint": { "message": "마스터 비밀번호 힌트 얻기" }, @@ -916,7 +906,7 @@ "message": "Duo Mobile 앱, SMS, 전화 통화를 사용한 조직용 Duo Security 또는 U2F 보안 키를 사용하여 인증하세요.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "자체 호스팅 환경" }, - "selfHostedEnvironmentFooter": { - "message": "온-프레미스 Bitwarden이 호스팅되고 있는 서버의 기본 URL을 지정하세요." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "사용자 지정 환경" }, - "customEnvironmentFooter": { - "message": "고급 사용자 전용 설정입니다. 각 서비스의 기본 URL을 개별적으로 지정할 수 있습니다." - }, "baseUrl": { "message": "서버 URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "아니오" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "비밀번호 덮어쓰기" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "마스터 비밀번호로 로그인" }, - "loggingInAs": { - "message": "다음으로 로그인 중" - }, "rememberEmail": { "message": "이메일 기억하기" }, - "notYou": { - "message": "본인이 아닌가요?" - }, "newAroundHere": { "message": "새로 찾아오셨나요?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/lt/messages.json b/apps/desktop/src/locales/lt/messages.json index 3f1fcbcb514..40436c7ccda 100644 --- a/apps/desktop/src/locales/lt/messages.json +++ b/apps/desktop/src/locales/lt/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Žodžių skaičius" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Slaptažodžio užuomina" - }, - "enterEmailToGetHint": { - "message": "Įveskite savo paskyros el. pašto adresą, kad gautumėte pagrindinio slaptažodžio užuominą." - }, "getMasterPasswordHint": { "message": "Gauti pagrindinio slaptažodžio užuominą" }, @@ -916,7 +906,7 @@ "message": "Patikrinkite su Duo Security savo organizacijai naudodami Duo Mobile programą, SMS žinutę, telefono skambutį arba U2F saugumo raktą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Savarankiškai sukurta aplinka" }, - "selfHostedEnvironmentFooter": { - "message": "Nurodykite pagrindinį URL adresą savo patalpose esančio Bitwarden įdiegimo." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Individualizuota aplinka" }, - "customEnvironmentFooter": { - "message": "Pažengusiems naudotojams. Galite nurodyti kiekvienos paslaugos pagrindinį URL adresą atskirai." - }, "baseUrl": { "message": "Serverio nuoroda" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Perrašyti slaptažodį" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Prisijungti su pagrindiniu slaptažodžiu" }, - "loggingInAs": { - "message": "Prisijungimas kaip" - }, "rememberEmail": { "message": "Prisiminti el. paštą" }, - "notYou": { - "message": "Ne jūs?" - }, "newAroundHere": { "message": "Ar jūs naujas čia?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Prašyti administratoriaus patvirtinimo" }, - "approveWithMasterPassword": { - "message": "Patvirtinti su pagrindiniu slaptažodžiu" - }, "region": { "message": "Regionas" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Jūsų prašymas išsiųstas administratoriui." }, - "youWillBeNotifiedOnceApproved": { - "message": "Jums bus pranešta, kai bus patvirtinta." - }, "troubleLoggingIn": { "message": "Nepavyksta prisijungti?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/lv/messages.json b/apps/desktop/src/locales/lv/messages.json index 839c1e49024..c519987fc72 100644 --- a/apps/desktop/src/locales/lv/messages.json +++ b/apps/desktop/src/locales/lv/messages.json @@ -543,10 +543,6 @@ "message": "Iekļaut īpašās rakstzīmes", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Vārdu skaits" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" }, - "passwordHint": { - "message": "Paroles norāde" - }, - "enterEmailToGetHint": { - "message": "Ievadiet sava konta e-pasta adresi, lai saņemtu galvenās paroles norādi!" - }, "getMasterPasswordHint": { "message": "Saņemt galvenās paroles norādi" }, @@ -916,7 +906,7 @@ "message": "Apliecināšana ar savas apvienības Duo Security, izmantojot Duo Mobile lietotni, īsziņu, tālruņa zvanu vai U2F drošības atslēgu.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Apliecināt savu identitāti" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Pašuzturēta vide" }, - "selfHostedEnvironmentFooter": { - "message": "Norādīt pašuzstādīta Bitwarden pamata URL." - }, "selfHostedBaseUrlHint": { "message": "Jānorāda sava pašizvietotā Bitward servera pamata URL. Piemērs: https://bitwarden.uznemums.lv" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Pielāgota vide" }, - "customEnvironmentFooter": { - "message": "Pieredzējušiem lietotājiem. Ir iespējams norādīt URL katram pakalpojumam atsevišķi." - }, "baseUrl": { "message": "Servera URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nē" }, + "location": { + "message": "Atrašanās vieta" + }, "overwritePassword": { "message": "Pārrakstīt paroli" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Pieteikties ar galveno paroli" }, - "loggingInAs": { - "message": "Piesakās kā" - }, "rememberEmail": { "message": "Atcerēties e-pasta adresi" }, - "notYou": { - "message": "Tas neesi Tu?" - }, "newAroundHere": { "message": "Jauns šeit?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Pieprasīt pārvaldītāja apstiprinājumu" }, - "approveWithMasterPassword": { - "message": "Apstiprināt ar galveno paroli" - }, "region": { "message": "Apgabals" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pieprasījums tika nosūtīts pārvaldītājam." }, - "youWillBeNotifiedOnceApproved": { - "message": "Tiks saņemts paziņojums, tiklīdz būs apstiprināts." - }, "troubleLoggingIn": { "message": "Neizdodas pieteikties?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Lietotne" }, - "sshKeyPasswordUnsupported": { - "message": "Ar paroli aizsargātu SSH atslēgu ievietošana pagaidām netiek nodrošināta" - }, "invalidSshKey": { "message": "SSH atslēga ir nederīga" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Ievietot atslēgu no starpliktuves" }, - "sshKeyPasted": { - "message": "SSH atslēga tika veiksmīgi ievietota" + "sshKeyImported": { + "message": "SSH atslēga tika sekmīgi ievietota" }, "fileSavedToDevice": { "message": "Datne saglabāta ierīcē. Tā ir atrodama ierīces lejupielāžu mapē." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Izmantotais pārlūka paplašinājums ir novecojis. Lūgums atjaunināt to vai atspējot pārlūka sasaistīšanas pirkstu nospieduma pārbaudi darbvirsmas lietotnes iestatījumos." + }, + "changeAtRiskPassword": { + "message": "Mainīt riskam pakļautu paroli" } } diff --git a/apps/desktop/src/locales/me/messages.json b/apps/desktop/src/locales/me/messages.json index e88915f4054..ea8defdc07c 100644 --- a/apps/desktop/src/locales/me/messages.json +++ b/apps/desktop/src/locales/me/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Broj riječi" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Podsjetnik na lozinku" - }, - "enterEmailToGetHint": { - "message": "Unesi email svog naloga kako bi ste primili podsjetnik na glavnu lozinku." - }, "getMasterPasswordHint": { "message": "Podsjetnik na glavnu lozinku" }, @@ -916,7 +906,7 @@ "message": "Potvrdite sa Duo Security za svoju organizaciju pomoću aplikacije Duo Mobile, SMS-a, telefonskog poziva ili U2F sigurnosnog ključa.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Okruženje lokalne instalacije (SELF HOST)" }, - "selfHostedEnvironmentFooter": { - "message": "Navedite osnovni URL vaše lokalne instalacije (HOST) Bitwardena." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Prilagođeno okruženje" }, - "customEnvironmentFooter": { - "message": "Za napredne korisnike. Možete odrediti osnovni URL svake usluge nezavisno." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Zamijeni lozinku" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ml/messages.json b/apps/desktop/src/locales/ml/messages.json index 654a8dcb1e2..a4af9251191 100644 --- a/apps/desktop/src/locales/ml/messages.json +++ b/apps/desktop/src/locales/ml/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "വാക്കുകളുടെ എണ്ണം" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "പാസ്സ്‌വേഡ് സൂചനാ" - }, - "enterEmailToGetHint": { - "message": "നിങ്ങളുടെ പ്രാഥമിക പാസ്‌വേഡ് സൂചന ലഭിക്കുന്നതിന് നിങ്ങളുടെ അക്കൗണ്ട് ഇമെയിൽ വിലാസം നൽകുക." - }, "getMasterPasswordHint": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സൂചന നേടുക" }, @@ -916,7 +906,7 @@ "message": "Duo Mobile, SMS, ഫോൺ കോൾ അല്ലെങ്കിൽ U2F സുരക്ഷാ കീ ഉപയോഗിച്ച് നിങ്ങളുടെ ഓർഗനൈസേഷനെ Duo Security ഉപയോഗിച്ച് പരിശോധിക്കുക.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "സ്വയം ഹോസ്റ്റുചെയ്‌ത എൻവിയോണ്മെന്റ്" }, - "selfHostedEnvironmentFooter": { - "message": "നിങ്ങളുടെ പരിസരത്ത് ചെയ്യുന്ന Bitwarden ഇൻസ്റ്റാളേഷന്റെ അടിസ്ഥാന URL വ്യക്തമാക്കുക." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "ഇഷ്‌ടാനുസൃത എൻവിയോണ്മെന്റ്" }, - "customEnvironmentFooter": { - "message": "വിപുലമായ ഉപയോക്താക്കൾക്കായി. ഓരോ സേവനത്തിന്റെയും അടിസ്ഥാന URL നിങ്ങൾക്ക് സ്വതന്ത്രമായി വ്യക്തമാക്കാൻ കഴിയും." - }, "baseUrl": { "message": "സെർവർ യു ർ ൽ" }, @@ -1013,6 +997,9 @@ "no": { "message": "അല്ല" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "പാസ്‌വേഡ് പുനരാലേഖനം ചെയ്യുക" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/mr/messages.json b/apps/desktop/src/locales/mr/messages.json index b7693c0d0b5..f93db44aa69 100644 --- a/apps/desktop/src/locales/mr/messages.json +++ b/apps/desktop/src/locales/mr/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/my/messages.json b/apps/desktop/src/locales/my/messages.json index 26bd06f68bb..493d6fdb5b9 100644 --- a/apps/desktop/src/locales/my/messages.json +++ b/apps/desktop/src/locales/my/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/nb/messages.json b/apps/desktop/src/locales/nb/messages.json index e85c4699d9d..caf4d3da64b 100644 --- a/apps/desktop/src/locales/nb/messages.json +++ b/apps/desktop/src/locales/nb/messages.json @@ -543,10 +543,6 @@ "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antall ord" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Passordhint" - }, - "enterEmailToGetHint": { - "message": "Skriv inn din kontos E-postadresse for å motta hintet til ditt superpassord." - }, "getMasterPasswordHint": { "message": "Få et hint om superpassordet" }, @@ -916,7 +906,7 @@ "message": "Verifiser med Duo Security for din organisasjon gjennom Duo Mobile-appen, SMS, telefonsamtale, eller en U2F-sikkerhetsnøkkel.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Selvbetjent miljø" }, - "selfHostedEnvironmentFooter": { - "message": "Spesifiser grunn-nettadressen til din selvbetjente Bitwarden-installasjon." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Tilpasset miljø" }, - "customEnvironmentFooter": { - "message": "For avanserte brukere. Du kan bestemme grunn-nettadressen til hver tjeneste separat." - }, "baseUrl": { "message": "Tjener-nettadresse" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nei" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overskriv passordet" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Logg inn med hovedpassord" }, - "loggingInAs": { - "message": "Logger inn som" - }, "rememberEmail": { "message": "Husk på E-postadressen" }, - "notYou": { - "message": "Ikke du?" - }, "newAroundHere": { "message": "Ny rundt her?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Be om administratorgodkjennelse" }, - "approveWithMasterPassword": { - "message": "Godkjenn med hovedpassord" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Forespørselen din har blitt sendt til administratoren din." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du vil bli varslet når det er godkjent." - }, "troubleLoggingIn": { "message": "Problemer med å logge inn?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Et program" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "SSH-nøkkelen er ugyldig" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ne/messages.json b/apps/desktop/src/locales/ne/messages.json index 88614d22267..297708953df 100644 --- a/apps/desktop/src/locales/ne/messages.json +++ b/apps/desktop/src/locales/ne/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "शब्द संख्या" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/nl/messages.json b/apps/desktop/src/locales/nl/messages.json index a3c208d24b3..1cfd5ff5523 100644 --- a/apps/desktop/src/locales/nl/messages.json +++ b/apps/desktop/src/locales/nl/messages.json @@ -543,10 +543,6 @@ "message": "Speciale tekens toevoegen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Aantal woorden" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" }, - "passwordHint": { - "message": "Wachtwoordhint" - }, - "enterEmailToGetHint": { - "message": "Voer het e-mailadres van je account in om je hoofdwachtwoordhint te ontvangen." - }, "getMasterPasswordHint": { "message": "Hoofdwachtwoordhint opvragen" }, @@ -916,7 +906,7 @@ "message": "Verificatie met Duo Security middels de Duo Mobile-app, sms, spraakoproep of een U2F-beveiligingssleutel.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifieer je identiteit" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Zelfgehoste omgeving" }, - "selfHostedEnvironmentFooter": { - "message": "Geef de basis-URL van jouw zelfgehoste Bitwarden-installatie." - }, "selfHostedBaseUrlHint": { "message": "Specificeer de basis-URL van je zelfgehoste Bitwarden-installatie. Bijvoorbeeld: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Aangepaste omgeving" }, - "customEnvironmentFooter": { - "message": "Voor gevorderde gebruikers. Je kunt de basis-URL van elke dienst afzonderlijk instellen." - }, "baseUrl": { "message": "Server-URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nee" }, + "location": { + "message": "Locatie" + }, "overwritePassword": { "message": "Wachtwoord overschrijven" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Inloggen met je hoofdwachtwoord" }, - "loggingInAs": { - "message": "Inloggen als" - }, "rememberEmail": { "message": "E-mailadres onthouden" }, - "notYou": { - "message": "Ben jij dit niet?" - }, "newAroundHere": { "message": "Nieuw hier?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Goedkeuring van beheerder vragen" }, - "approveWithMasterPassword": { - "message": "Goedkeuren met hoofdwachtwoord" - }, "region": { "message": "Regio" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Je verzoek is naar je beheerder verstuurd." }, - "youWillBeNotifiedOnceApproved": { - "message": "Je krijgt een melding zodra je bent goedgekeurd." - }, "troubleLoggingIn": { "message": "Problemen met inloggen?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Een applicatie" }, - "sshKeyPasswordUnsupported": { - "message": "Importeren van met wachtwoord beveiligde SSH-sleutels wordt nog niet ondersteund" - }, "invalidSshKey": { "message": "De SSH-sleutel is ongeldig" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Sleutel van klembord importeren" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH-sleutel succesvol geïmporteerd" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "De browserextensie die je gebruikt is verouderd. Werk deze bij of schakel de browserintegratie vingerafdrukvalidatie uit in de desktop-app-instellingen." + }, + "changeAtRiskPassword": { + "message": "Risicovol wachtwoord wijzigen" } } diff --git a/apps/desktop/src/locales/nn/messages.json b/apps/desktop/src/locales/nn/messages.json index a961d2c8364..9195311cc67 100644 --- a/apps/desktop/src/locales/nn/messages.json +++ b/apps/desktop/src/locales/nn/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antall ord" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Passordhint" - }, - "enterEmailToGetHint": { - "message": "Skriv inn e-postadressa til kontoen din, for å få tilsendt hovudpassordhintet ditt på e-post." - }, "getMasterPasswordHint": { "message": "Få hovudpassordhint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Nettadresse for tenar" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nei" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overskriv passord" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/or/messages.json b/apps/desktop/src/locales/or/messages.json index a175531b182..6f15ed21991 100644 --- a/apps/desktop/src/locales/or/messages.json +++ b/apps/desktop/src/locales/or/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/pl/messages.json b/apps/desktop/src/locales/pl/messages.json index 257f9e7fc1a..f78313c7fd6 100644 --- a/apps/desktop/src/locales/pl/messages.json +++ b/apps/desktop/src/locales/pl/messages.json @@ -543,10 +543,6 @@ "message": "Uwzględnij znaki specjalne", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Liczba słów" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Wprowadź adres e-mail swojego konta, a podpowiedź hasła zostanie wysłana do Ciebie" }, - "passwordHint": { - "message": "Podpowiedź do hasła" - }, - "enterEmailToGetHint": { - "message": "Wpisz adres e-mail powiązany z kontem, aby otrzymać podpowiedź do hasła głównego." - }, "getMasterPasswordHint": { "message": "Uzyskaj podpowiedź do hasła głównego" }, @@ -916,8 +906,8 @@ "message": "Weryfikacja dostępu do Twojej organizacji z użyciem Duo Security poprzez aplikację Duo Mobile, SMS, połączenie telefoniczne lub klucz bezpieczeństwa U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { - "message": "Zweryfikuj swoją tożsamość" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Samodzielnie hostowane środowisko" }, - "selfHostedEnvironmentFooter": { - "message": "Wpisz podstawowy adres URL hostowanej instalacji Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Określ bazowy adres URL swojej instalacji Bitwarden. Przykład: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Niestandardowe środowisko" }, - "customEnvironmentFooter": { - "message": "Dla zaawansowanych użytkowników. Możesz wpisać podstawowy adres URL niezależnie dla każdej usługi." - }, "baseUrl": { "message": "Adres URL serwera" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Zastąp hasło" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Logowanie hasłem głównym" }, - "loggingInAs": { - "message": "Logowanie jako" - }, "rememberEmail": { "message": "Zapamiętaj adres e-mail" }, - "notYou": { - "message": "To nie Ty?" - }, "newAroundHere": { "message": "Nowy użytkownik?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Poproś administratora o zatwierdzenie" }, - "approveWithMasterPassword": { - "message": "Zatwierdź przy użyciu hasła głównego" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Twoja prośba została wysłana do Twojego administratora." }, - "youWillBeNotifiedOnceApproved": { - "message": "Zostaniesz powiadomiony po zatwierdzeniu." - }, "troubleLoggingIn": { "message": "Problem z zalogowaniem?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Aplikacja" }, - "sshKeyPasswordUnsupported": { - "message": "Importowanie kluczy SSH chronionych hasłem nie jest jeszcze obsługiwane" - }, "invalidSshKey": { "message": "Klucz SSH jest nieprawidłowy" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Importuj klucz ze schowka" }, - "sshKeyPasted": { - "message": "Pomyślnie zaimportowano klucz SSH" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Plik zapisany na urządzeniu. Zarządzaj plikiem na swoim urządzeniu." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Rozszerzenie przeglądarki, którego używasz, jest nieaktualne. Zaktualizuj je lub wyłącz weryfikację odcisku palca integracji przeglądarki w ustawieniach aplikacji desktopowej." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/pt_BR/messages.json b/apps/desktop/src/locales/pt_BR/messages.json index 88ef71fb92f..e09ee6e16d2 100644 --- a/apps/desktop/src/locales/pt_BR/messages.json +++ b/apps/desktop/src/locales/pt_BR/messages.json @@ -543,10 +543,6 @@ "message": "Incluir caracteres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palavras" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" }, - "passwordHint": { - "message": "Dica da Senha" - }, - "enterEmailToGetHint": { - "message": "Insira o seu endereço de e-mail para receber a dica da sua senha mestra." - }, "getMasterPasswordHint": { "message": "Obter dica da senha mestra" }, @@ -916,7 +906,7 @@ "message": "Verifique com o Duo Security utilizando o aplicativo Duo Mobile, SMS, chamada telefônica, ou chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, - "selfHostedEnvironmentFooter": { - "message": "Especifique a URL de base da sua instalação local do Bitwarden." - }, "selfHostedBaseUrlHint": { "message": "Especifique a URL de base da sua instalação local do Bitwarden. Exemplo: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Ambiente Personalizado" }, - "customEnvironmentFooter": { - "message": "Para usuários avançados. Você pode especificar a URL de base de cada serviço independentemente." - }, "baseUrl": { "message": "URL do Servidor" }, @@ -1013,6 +997,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Substituir Senha" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "‘Login’ com senha ‘master’" }, - "loggingInAs": { - "message": "Logar como" - }, "rememberEmail": { "message": "Lembrar e-mail" }, - "notYou": { - "message": "Não é você?" - }, "newAroundHere": { "message": "Novo por aqui?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Solicitar aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com senha mestra" - }, "region": { "message": "Região" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Seu pedido foi enviado para seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado assim que for aprovado." - }, "troubleLoggingIn": { "message": "Problemas em efetuar login?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Uma aplicação" }, - "sshKeyPasswordUnsupported": { - "message": "Importar chaves SSH protegidas por senha ainda não é suportado" - }, "invalidSshKey": { "message": "A chave SSH é inválida" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Importar chave da área de transferência" }, - "sshKeyPasted": { - "message": "Chave SSH importada com sucesso" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "Arquivo salvo no dispositivo. Gerencie a partir das transferências do seu dispositivo." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/pt_PT/messages.json b/apps/desktop/src/locales/pt_PT/messages.json index eef942718ae..2261357ba08 100644 --- a/apps/desktop/src/locales/pt_PT/messages.json +++ b/apps/desktop/src/locales/pt_PT/messages.json @@ -543,10 +543,6 @@ "message": "Incluir carateres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Número de palavras" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" }, - "passwordHint": { - "message": "Dica da palavra-passe" - }, - "enterEmailToGetHint": { - "message": "Introduza o endereço de e-mail da sua conta para receber a dica da sua palavra-passe mestra." - }, "getMasterPasswordHint": { "message": "Obter a dica da palavra-passe mestra" }, @@ -916,7 +906,7 @@ "message": "Proteja a sua organização com a Duo Security utilizando a aplicação Duo Mobile, SMS, chamada telefónica ou uma chave de segurança U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifique a sua identidade" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Ambiente auto-hospedado" }, - "selfHostedEnvironmentFooter": { - "message": "Especifique o URL de base da sua instalação Bitwarden hospedada no local." - }, "selfHostedBaseUrlHint": { "message": "Especifique o URL de base da sua instalação Bitwarden hospedada no local. Exemplo: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Ambiente personalizado" }, - "customEnvironmentFooter": { - "message": "Para utilizadores avançados. Pode especificar o URL de base de cada serviço de forma independente." - }, "baseUrl": { "message": "URL do servidor" }, @@ -1013,6 +997,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Localização" + }, "overwritePassword": { "message": "Substituir palavra-passe" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Iniciar sessão com a palavra-passe mestra" }, - "loggingInAs": { - "message": "A iniciar sessão como" - }, "rememberEmail": { "message": "Memorizar e-mail" }, - "notYou": { - "message": "Utilizador incorreto?" - }, "newAroundHere": { "message": "É novo por cá?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Pedir aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com a palavra-passe mestra" - }, "region": { "message": "Região" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "O seu pedido foi enviado ao seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado quando for aprovado." - }, "troubleLoggingIn": { "message": "Problemas a iniciar sessão?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Uma aplicação" }, - "sshKeyPasswordUnsupported": { - "message": "A importação de chaves SSH protegidas por palavra-passe ainda não é suportada" - }, "invalidSshKey": { "message": "A chave SSH é inválida" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Importar chave da área de transferência" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Chave SSH importada com sucesso" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "A extensão do navegador que está a utilizar está desatualizada. Atualize-a ou desative a validação de impressões digitais da integração do navegador nas definições da aplicação para computador." + }, + "changeAtRiskPassword": { + "message": "Alterar palavra-passe em risco" } } diff --git a/apps/desktop/src/locales/ro/messages.json b/apps/desktop/src/locales/ro/messages.json index 051ef71c8d3..d148d90a4fd 100644 --- a/apps/desktop/src/locales/ro/messages.json +++ b/apps/desktop/src/locales/ro/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Număr de cuvinte" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Indiciu parolă" - }, - "enterEmailToGetHint": { - "message": "Adresa de e-mail a contului pentru primirea indiciului parolei principale." - }, "getMasterPasswordHint": { "message": "Obținere indiciu parolă principală" }, @@ -916,7 +906,7 @@ "message": "Verificați cu Duo Security pentru organizația dvs. utilizând aplicația Duo Mobile, SMS, apel telefonic sau cheia de securitate U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Mediul găzduit local" }, - "selfHostedEnvironmentFooter": { - "message": "Specificați URL-ul de bază al implementări Bitwarden găzduită local." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Mediu personalizat" }, - "customEnvironmentFooter": { - "message": "Pentru utilizatorii avansați. Puteți specifica URL-ul de bază al fiecărui serviciu în mod independent." - }, "baseUrl": { "message": "URL server" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nu" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Suprascriere parolă" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Autentificați-vă cu parola principală" }, - "loggingInAs": { - "message": "Autentificare ca" - }, "rememberEmail": { "message": "Memorare e-mail" }, - "notYou": { - "message": "Nu sunteți dvs.?" - }, "newAroundHere": { "message": "Sunteți nou pe aici?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/ru/messages.json b/apps/desktop/src/locales/ru/messages.json index 6e89d4b530b..ea5b8c6d526 100644 --- a/apps/desktop/src/locales/ru/messages.json +++ b/apps/desktop/src/locales/ru/messages.json @@ -543,10 +543,6 @@ "message": "Включить специальные символы", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Количество слов" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" }, - "passwordHint": { - "message": "Подсказка к паролю" - }, - "enterEmailToGetHint": { - "message": "Введите email аккаунта для получения подсказки к мастер-паролю." - }, "getMasterPasswordHint": { "message": "Получить подсказку к мастер-паролю" }, @@ -916,7 +906,7 @@ "message": "Подтвердите с помощью Duo Security для вашей организации, используя приложение Duo Mobile, SMS, телефонный звонок или ключ безопасности U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Подтвердите вашу личность" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Окружение пользовательского хостинга" }, - "selfHostedEnvironmentFooter": { - "message": "Укажите URL Bitwarden на вашем сервере." - }, "selfHostedBaseUrlHint": { "message": "Укажите базовый URL вашего локального хостинга Bitwarden. Пример: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Пользовательское окружение" }, - "customEnvironmentFooter": { - "message": "Для опытных пользователей. Можно указать URL отдельно для каждой службы." - }, "baseUrl": { "message": "URL сервера" }, @@ -1013,6 +997,9 @@ "no": { "message": "Нет" }, + "location": { + "message": "Местоположение" + }, "overwritePassword": { "message": "Перезаписать пароль" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Войти с мастер-паролем" }, - "loggingInAs": { - "message": "Войти как" - }, "rememberEmail": { "message": "Запомнить email" }, - "notYou": { - "message": "Не вы?" - }, "newAroundHere": { "message": "Вы здесь впервые?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Запросить одобрение администратора" }, - "approveWithMasterPassword": { - "message": "Одобрить с мастер-паролем" - }, "region": { "message": "Регион" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запрос был отправлен администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вас уведомят об одобрении." - }, "troubleLoggingIn": { "message": "Не удалось войти?" }, @@ -3247,7 +3222,7 @@ "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo. Выполните следующие действия, чтобы завершить авторизацию." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." @@ -3513,7 +3488,7 @@ "message": "Предупреждение: Переадресация агента" }, "agentForwardingWarningText": { - "message": "Этот запрос поступает с удаленного устройства, на которое вы вошли" + "message": "Этот запрос поступает с удаленного устройства, на котором вы авторизовались" }, "sshkeyApprovalMessageInfix": { "message": "запрашивает доступ к" @@ -3525,17 +3500,14 @@ "message": "авторизоваться на сервере" }, "sshActionSign": { - "message": "sign a message" + "message": "подписать сообщение" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "подписать git коммит" }, "unknownApplication": { "message": "Приложение" }, - "sshKeyPasswordUnsupported": { - "message": "Импорт защищенных паролем ключей SSH пока не поддерживается" - }, "invalidSshKey": { "message": "Ключ SSH недействителен" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Импорт ключа из буфера обмена" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Ключ SSH успешно импортирован" }, "fileSavedToDevice": { @@ -3597,12 +3569,15 @@ "message": "Окно подтверждения остается видимым" }, "confirmWindowStillVisibleContent": { - "message": "Убедитесь, что окно по-прежнему видно." + "message": "Пожалуйста, подтвердите, что окно все еще видно." }, "updateBrowserOrDisableFingerprintDialogTitle": { "message": "Необходимо обновить расширение" }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Используемое вами расширение браузера устарело. Пожалуйста, обновите его или отключите проверку интеграции браузера с помощью отпечатка пальца в настройках приложения для компьютера." + }, + "changeAtRiskPassword": { + "message": "Изменить пароль, подверженный риску" } } diff --git a/apps/desktop/src/locales/si/messages.json b/apps/desktop/src/locales/si/messages.json index cfddc088795..cb837ea4f76 100644 --- a/apps/desktop/src/locales/si/messages.json +++ b/apps/desktop/src/locales/si/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "නැහැ" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/sk/messages.json b/apps/desktop/src/locales/sk/messages.json index 2ec3f3cb0cb..7eaa1026c00 100644 --- a/apps/desktop/src/locales/sk/messages.json +++ b/apps/desktop/src/locales/sk/messages.json @@ -543,10 +543,6 @@ "message": "Zahrnúť špeciálne znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Počet slov" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" }, - "passwordHint": { - "message": "Nápoveď k heslu" - }, - "enterEmailToGetHint": { - "message": "Zadajte e-mailovú adresu na zaslanie nápovede k vášmu hlavnému heslu." - }, "getMasterPasswordHint": { "message": "Získať nápoveď k hlavnému heslu" }, @@ -916,7 +906,7 @@ "message": "Overiť sa prostredníctvom Duo Security vašej organizácie použitím Duo Mobile aplikácie, SMS, telefonátu alebo U2F bezpečnostným kľúčom.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Overte svoju totožnosť" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Prevádzkované vo vlastnom prostredí" }, - "selfHostedEnvironmentFooter": { - "message": "Zadajte URL Bitwarden inštalácie, ktorú prevádzkujete vo vlastnom prostredí." - }, "selfHostedBaseUrlHint": { "message": "Zadajte základnú URL adresu lokálne hosťovanej inštalácie Bitwarden. Napríklad: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Vlastné prostredie" }, - "customEnvironmentFooter": { - "message": "Pre pokročilých používateľov. Môžete špecifikovať základnú URL pre každú službu nezávisle." - }, "baseUrl": { "message": "URL servera" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Poloha" + }, "overwritePassword": { "message": "Prepísať heslo" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Prihlásenie pomocou hlavného hesla" }, - "loggingInAs": { - "message": "Prihlasujete sa ako" - }, "rememberEmail": { "message": "Zapamätať si e-mail" }, - "notYou": { - "message": "Nie ste to vy?" - }, "newAroundHere": { "message": "Ste tu nový?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Žiadosť o schválenie správcom" }, - "approveWithMasterPassword": { - "message": "Schváliť pomocou hlavného hesla" - }, "region": { "message": "Región" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Vaša žiadosť bola odoslaná správcovi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete informovaný." - }, "troubleLoggingIn": { "message": "Máte problémy s prihlásením?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "Aplikácia" }, - "sshKeyPasswordUnsupported": { - "message": "Importovanie kľúčov SSH chránených heslom zatiaľ nie je podporované" - }, "invalidSshKey": { "message": "Kľúč SSH je neplatný" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Importovať kľúč zo schránky" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Kľúč SSH bol úspešne importovaný" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Rozšírenie prehliadača, ktoré používate, je zastarané. Aktualizujte ho alebo zakážte overenie odtlačkov integrácie prehliadača v nastaveniach desktopovej aplikácie." + }, + "changeAtRiskPassword": { + "message": "Zmeniť rizikové heslá" } } diff --git a/apps/desktop/src/locales/sl/messages.json b/apps/desktop/src/locales/sl/messages.json index 6207b0bca0c..3987587828a 100644 --- a/apps/desktop/src/locales/sl/messages.json +++ b/apps/desktop/src/locales/sl/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Število besed" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Namig za geslo" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Okolje z lastnim gostovanjem" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Okolje po meri" }, - "customEnvironmentFooter": { - "message": "Za napredne uporabnike. Lahko specificirate osnovni URL, ločeno za vsako storitev." - }, "baseUrl": { "message": "URL naslov strežnika" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Prepiši geslo" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/sr/messages.json b/apps/desktop/src/locales/sr/messages.json index 82347a322b7..69b45469dc8 100644 --- a/apps/desktop/src/locales/sr/messages.json +++ b/apps/desktop/src/locales/sr/messages.json @@ -543,10 +543,6 @@ "message": "Укључити специјална слова", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Број речи" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Унесите имејл свог налога и биће вам послат савет за лозинку" }, - "passwordHint": { - "message": "Савет главне лозинке" - }, - "enterEmailToGetHint": { - "message": "Унесите Ваш имејл да би добили савет за Вашу Главну Лозинку." - }, "getMasterPasswordHint": { "message": "Добити савет за Главну Лозинку" }, @@ -916,7 +906,7 @@ "message": "Провери са Duo Security за вашу организацију користећи Duo Mobile апликацију, СМС, телефонски позив, или U2F кључ.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Потврдите идентитет" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Самостално окружење" }, - "selfHostedEnvironmentFooter": { - "message": "Наведите основни УРЛ ваше локалне Bitwarden инсталације." - }, "selfHostedBaseUrlHint": { "message": "Наведите основну УРЛ адресу вашег локалног хостовања Bitwarden-а. Пример: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Прилагођено окружење" }, - "customEnvironmentFooter": { - "message": "За напредне кориснике. Можете да одредите независно основни УРЛ сваког сервиса." - }, "baseUrl": { "message": "УРЛ Сервера" }, @@ -1013,6 +997,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Локација" + }, "overwritePassword": { "message": "Промени лозинку" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Пријавите се са главном лозинком" }, - "loggingInAs": { - "message": "Пријављивање као" - }, "rememberEmail": { "message": "Запамти имејл" }, - "notYou": { - "message": "Не ти?" - }, "newAroundHere": { "message": "Нов овде?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Затражити одобрење администратора" }, - "approveWithMasterPassword": { - "message": "Одобрити са главном лозинком" - }, "region": { "message": "Регион" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш захтев је послат вашем администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Бићете обавештени када буде одобрено." - }, "troubleLoggingIn": { "message": "Имате проблема са пријављивањем?" }, @@ -3510,32 +3485,29 @@ "message": "Потврдите употребу SSH кључа" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "Упозорење: Прослеђивање агента" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "Овај захтев долази са удаљеног уређаја на којим сте пријављени" }, "sshkeyApprovalMessageInfix": { "message": "тражи приступ" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "да бисте" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "се аутентификали на серверу" }, "sshActionSign": { - "message": "sign a message" + "message": "потписати поруку" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "потписати „git commit“" }, "unknownApplication": { "message": "Апликација" }, - "sshKeyPasswordUnsupported": { - "message": "Увоз лозинке заштићене SSH кључом још увек није подржано" - }, "invalidSshKey": { "message": "SSH кључ је неважећи" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Увезите кључ из оставе" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH кључ је успешно увезен" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Додатак који користите је застарело. Молимо ажурирајте га или онемогућите валидацију отисача претраживача Интеграција на поставки апликација за компјутер." + }, + "changeAtRiskPassword": { + "message": "Променити ризичну лозинку" } } diff --git a/apps/desktop/src/locales/sv/messages.json b/apps/desktop/src/locales/sv/messages.json index 69906b4b945..1303243a8cc 100644 --- a/apps/desktop/src/locales/sv/messages.json +++ b/apps/desktop/src/locales/sv/messages.json @@ -543,10 +543,6 @@ "message": "Inkludera specialtecken", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Antal ord" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Lösenordsledtråd" - }, - "enterEmailToGetHint": { - "message": "Ange din e-postadress för att få din huvudlösenordsledtråd skickad till dig." - }, "getMasterPasswordHint": { "message": "Hämta huvudlösenordsledtråd" }, @@ -916,7 +906,7 @@ "message": "Verifiera med Duo Security för din organisation genom att använda Duo Mobile-appen, SMS, telefonsamtal eller en U2F-säkerhetsnyckel.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Egen-hostad miljö" }, - "selfHostedEnvironmentFooter": { - "message": "Ange bas-URL:en för din \"on-premises\"-hostade Bitwarden-installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Anpassad miljö" }, - "customEnvironmentFooter": { - "message": "För avancerade användare. Du kan ange bas-URL:en för varje tjänst oberoende av varandra." - }, "baseUrl": { "message": "Server-URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Skriv över lösenord" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Logga in med huvudlösenord" }, - "loggingInAs": { - "message": "Loggar in som" - }, "rememberEmail": { "message": "Kom ihåg e-postadress" }, - "notYou": { - "message": "Är det inte du?" - }, "newAroundHere": { "message": "Är du ny här?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Be om godkännande från administratör" }, - "approveWithMasterPassword": { - "message": "Godkänn med huvudlösenord" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Din begäran har skickats till din administratör." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du kommer att meddelas vid godkännande." - }, "troubleLoggingIn": { "message": "Problem med att logga in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "En applikation" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "SSH-nyckeln är ogiltig" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "Importera nyckel från urklipp" }, - "sshKeyPasted": { - "message": "SSH-nyckel har importerats" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/te/messages.json b/apps/desktop/src/locales/te/messages.json index b7693c0d0b5..f93db44aa69 100644 --- a/apps/desktop/src/locales/te/messages.json +++ b/apps/desktop/src/locales/te/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom environment" }, - "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." - }, "baseUrl": { "message": "Server URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Overwrite password" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/th/messages.json b/apps/desktop/src/locales/th/messages.json index a3d94412a04..cb9df027ad7 100644 --- a/apps/desktop/src/locales/th/messages.json +++ b/apps/desktop/src/locales/th/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Number of Words" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "คำใบ้รหัสผ่าน" - }, - "enterEmailToGetHint": { - "message": "ป้อนที่อยู่อีเมลบัญชีของคุณเพื่อรับคำใบ้รหัสผ่านหลักของคุณ" - }, "getMasterPasswordHint": { "message": "รับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" }, @@ -916,7 +906,7 @@ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Self-hosted Environment" }, - "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premise hosted bitwarden installation." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Custom Environment" }, - "customEnvironmentFooter": { - "message": "สำหรับผู้ใช้ขั้นสูง คุณสามารถระบุ URL พื้นฐานของแต่ละบริการแยกกันได้" - }, "baseUrl": { "message": "URL ของเซิร์ฟเวอร์" }, @@ -1013,6 +997,9 @@ "no": { "message": "ไม่ใช่" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "เขียนทับรหัสผ่าน" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Log in with master password" }, - "loggingInAs": { - "message": "Logging in as" - }, "rememberEmail": { "message": "Remember email" }, - "notYou": { - "message": "Not you?" - }, "newAroundHere": { "message": "New around here?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "region": { "message": "Region" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/tr/messages.json b/apps/desktop/src/locales/tr/messages.json index ec166bd1281..55b3b6059b7 100644 --- a/apps/desktop/src/locales/tr/messages.json +++ b/apps/desktop/src/locales/tr/messages.json @@ -543,10 +543,6 @@ "message": "Özel karakterleri dahil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Kelime sayısı" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" }, - "passwordHint": { - "message": "Parola ipucu" - }, - "enterEmailToGetHint": { - "message": "Ana parola ipucunu almak için hesabınızın e-posta adresini girin." - }, "getMasterPasswordHint": { "message": "Ana parola ipucunu al" }, @@ -916,7 +906,7 @@ "message": "Kuruluşunuzun Duo Security doğrulaması için Duo Mobile uygulaması, SMS, telefon görüşmesi veya U2F güvenlik anahtarını kullanın.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Kimliğinizi doğrulayın" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Şirket içinde barındırılan ortam" }, - "selfHostedEnvironmentFooter": { - "message": "Kurum içi barındırılan Bitwarden kurulumunuzun taban URL'sini belirtin." - }, "selfHostedBaseUrlHint": { "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Özel ortam" }, - "customEnvironmentFooter": { - "message": "Üst düzey kullanıcılar için. Her servisin taban URL'sini bağımsız olarak belirleyebilirsiniz." - }, "baseUrl": { "message": "Sunucu URL'si" }, @@ -1013,6 +997,9 @@ "no": { "message": "Hayır" }, + "location": { + "message": "Konum" + }, "overwritePassword": { "message": "Parolanın üzerine yaz" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Ana parola ile giriş yap" }, - "loggingInAs": { - "message": "Giriş yapılan kullanıcı:" - }, "rememberEmail": { "message": "E-postayı hatırla" }, - "notYou": { - "message": "Siz değil misiniz?" - }, "newAroundHere": { "message": "Buralarda yeni misiniz?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Yönetici onayı iste" }, - "approveWithMasterPassword": { - "message": "Ana parola ile onayla" - }, "region": { "message": "Bölge" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "İsteğiniz yöneticinize gönderildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Onaylandıktan sonra bilgilendirileceksiniz." - }, "troubleLoggingIn": { "message": "Giriş yaparken sorun mu yaşıyorsunuz?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Kullandığınız tarayı uzantısı eskimiş. Lütfen uzantıyı güncelleyin veya masaüstü uygulamasının ayarlarından parmak izi doğrulaması için tarayıcı entegrasyonunu kapatın." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/uk/messages.json b/apps/desktop/src/locales/uk/messages.json index f1872e4a8ee..d5f908e011c 100644 --- a/apps/desktop/src/locales/uk/messages.json +++ b/apps/desktop/src/locales/uk/messages.json @@ -543,10 +543,6 @@ "message": "Спеціальні символи", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Кількість слів" }, @@ -653,13 +649,13 @@ "message": "Увійти в Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Введіть код, надісланий вам електронною поштою" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Введіть код з програми автентифікації" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Натисніть свій YubiKey для автентифікації" }, "logInWithPasskey": { "message": "Увійти з ключем доступу" @@ -714,7 +710,7 @@ "message": "Підказка для головного пароля" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Рейтинг надійності пароля $SCORE$", "placeholders": { "score": { "content": "$1", @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" }, - "passwordHint": { - "message": "Підказка для пароля" - }, - "enterEmailToGetHint": { - "message": "Введіть свою адресу е-пошти, щоб отримати підказку для головного пароля." - }, "getMasterPasswordHint": { "message": "Отримати підказку для головного пароля" }, @@ -835,7 +825,7 @@ "message": "Автентифікацію було скасовано або вона тривала надто довго. Повторіть спробу." }, "openInNewTab": { - "message": "Open in new tab" + "message": "Відкрити в новій вкладці" }, "invalidVerificationCode": { "message": "Недійсний код підтвердження" @@ -868,7 +858,7 @@ "message": "Запам'ятати мене" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Більше не запитувати на цьому пристрої протягом 30 днів" }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" @@ -877,11 +867,11 @@ "message": "Інший спосіб двоетапної перевірки" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Обрати інший спосіб", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Скористайтеся своїм кодом відновлення" }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." @@ -916,7 +906,7 @@ "message": "Авторизуйтесь за допомогою Duo Security для вашої організації з використанням програми Duo Mobile, SMS, телефонного виклику, або ключа безпеки U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Підтвердьте свою особу" }, "weDontRecognizeThisDevice": { @@ -950,14 +940,11 @@ "message": "Налаштування двоетапної перевірки" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Виберіть спосіб двоетапної перевірки" }, "selfHostedEnvironment": { "message": "Середовище власного хостингу" }, - "selfHostedEnvironmentFooter": { - "message": "Вкажіть основну URL-адресу вашого встановлення Bitwarden на власному хостингу." - }, "selfHostedBaseUrlHint": { "message": "Вкажіть основну URL-адресу вашого встановлення Bitwarden на власному хостингу. Зразок: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Власне середовище" }, - "customEnvironmentFooter": { - "message": "Для досвідчених користувачів. Ви можете вказати основну URL-адресу окремо для кожної служби." - }, "baseUrl": { "message": "URL-адреса сервера" }, @@ -1013,6 +997,9 @@ "no": { "message": "Ні" }, + "location": { + "message": "Розташування" + }, "overwritePassword": { "message": "Перезаписати пароль" }, @@ -1271,7 +1258,7 @@ "message": "Завжди показувати піктограму в системному лотку." }, "startToTray": { - "message": "Запускати в згорнутому вигляді" + "message": "Запускати в системному лотку" }, "startToTrayDesc": { "message": "Під час першого запуску програми показувати лише піктограму в системному лотку." @@ -1810,7 +1797,7 @@ "message": "Вимагати пароль чи PIN під час запуску" }, "requirePasswordWithoutPinOnStart": { - "message": "Require password on app start" + "message": "Вимагати пароль під час запуску" }, "recommendedForSecurity": { "message": "Рекомендовано для безпеки." @@ -2282,10 +2269,10 @@ "message": "Автентифікація WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Зчитати ключ безпеки" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Очікується взаємодія з ключем безпеки..." }, "hideEmail": { "message": "Приховувати мою адресу електронної пошти від отримувачів." @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Увійти з головним паролем" }, - "loggingInAs": { - "message": "Вхід у систему як" - }, "rememberEmail": { "message": "Запам'ятати е-пошту" }, - "notYou": { - "message": "Не ви?" - }, "newAroundHere": { "message": "Виконуєте вхід вперше?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Запит підтвердження адміністратора" }, - "approveWithMasterPassword": { - "message": "Затвердити з головним паролем" - }, "region": { "message": "Регіон" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запит відправлено адміністратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ви отримаєте сповіщення після затвердження." - }, "troubleLoggingIn": { "message": "Проблема під час входу?" }, @@ -3247,10 +3222,10 @@ "message": "Для вашого облікового запису необхідна двоетапна перевірка з Duo." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Для вашого облікового запису необхідно пройти двоетапну перевірку з Duo. Виконайте наведені нижче кроки, щоб завершити вхід." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Виконайте наведені нижче кроки, щоб завершити вхід." }, "launchDuo": { "message": "Запустити Duo в браузері" @@ -3510,32 +3485,29 @@ "message": "Підтвердження використання ключа SSH" }, "agentForwardingWarningTitle": { - "message": "Warning: Agent Forwarding" + "message": "Попередження: переспрямування агента" }, "agentForwardingWarningText": { - "message": "This request comes from a remote device that you are logged into" + "message": "Цей запит здійснюється з віддаленого пристрою, до якого ви ввійшли" }, "sshkeyApprovalMessageInfix": { "message": "запитує доступ до" }, "sshkeyApprovalMessageSuffix": { - "message": "in order to" + "message": "щоб" }, "sshActionLogin": { - "message": "authenticate to a server" + "message": "пройти автентифікацію на сервері" }, "sshActionSign": { - "message": "sign a message" + "message": "підписати повідомлення" }, "sshActionGitSign": { - "message": "sign a git commit" + "message": "підписати git коміт" }, "unknownApplication": { "message": "Програма" }, - "sshKeyPasswordUnsupported": { - "message": "Імпортування захищених паролем ключів SSH ще не підтримується" - }, "invalidSshKey": { "message": "Ключ SSH недійсний" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Імпортувати ключ із буфера обміну" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "Ключ SSH успішно імпортовано" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "Ви використовуєте застарілу версію розширення браузера. Оновіть його або вимкніть перевірку цифрового відбитка інтеграції з браузером у налаштуваннях комп'ютерної програми." + }, + "changeAtRiskPassword": { + "message": "Змінити ризикований пароль" } } diff --git a/apps/desktop/src/locales/vi/messages.json b/apps/desktop/src/locales/vi/messages.json index 6d34d65726a..f6495e4f915 100644 --- a/apps/desktop/src/locales/vi/messages.json +++ b/apps/desktop/src/locales/vi/messages.json @@ -543,10 +543,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "Số lượng chữ" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Gợi ý mật khẩu" - }, - "enterEmailToGetHint": { - "message": "Nhập địa chỉ email tài khoản của bạn để nhận gợi ý mật khẩu chính." - }, "getMasterPasswordHint": { "message": "Nhận gợi ý mật khẩu chính" }, @@ -916,7 +906,7 @@ "message": "Xác minh với Duo Security cho tổ chức của bạn sử dụng ứng dụng Duo Mobile, SMS, cuộc gọi điện thoại, hoặc khoá bảo mật U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "Môi trường tự lưu trữ" }, - "selfHostedEnvironmentFooter": { - "message": "Chỉ định địa chỉ cơ sở của bản cài đặt Bitwarden được lưu trữ tại máy chủ của bạn." - }, "selfHostedBaseUrlHint": { "message": "Nhập địa chỉ cơ sở của bản cài đặt Bitwarden được lưu trữ tại máy chủ của bạn. Ví dụ: https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "Môi trường tùy chỉnh" }, - "customEnvironmentFooter": { - "message": "Đối với người dùng nâng cao. Bạn có thể chỉ định địa chỉ cơ sở của mỗi dịch vụ một cách độc lập." - }, "baseUrl": { "message": "Địa chỉ máy chủ" }, @@ -1013,6 +997,9 @@ "no": { "message": "Không" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "Ghi đè lên mật khẩu" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "Đăng nhập bằng mật khẩu chính" }, - "loggingInAs": { - "message": "Đang đăng nhập như" - }, "rememberEmail": { "message": "Ghi nhớ email" }, - "notYou": { - "message": "Không phải bạn?" - }, "newAroundHere": { "message": "Bạn mới tới đây sao?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "Yêu cầu quản trị viên phê duyệt" }, - "approveWithMasterPassword": { - "message": "Phê duyệt bằng mật khẩu chính" - }, "region": { "message": "Khu vực" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Yêu cầu của bạn đã được gửi đến quản trị viên." }, - "youWillBeNotifiedOnceApproved": { - "message": "Bạn sẽ có thông báo nếu được phê duyệt." - }, "troubleLoggingIn": { "message": "Không thể đăng nhập?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "An application" }, - "sshKeyPasswordUnsupported": { - "message": "Importing password protected SSH keys is not yet supported" - }, "invalidSshKey": { "message": "The SSH key is invalid" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "Import key from clipboard" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH key imported successfully" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/locales/zh_CN/messages.json b/apps/desktop/src/locales/zh_CN/messages.json index 76a7dae11d3..8bf4d16c474 100644 --- a/apps/desktop/src/locales/zh_CN/messages.json +++ b/apps/desktop/src/locales/zh_CN/messages.json @@ -459,7 +459,7 @@ "message": "确定要覆盖当前用户名吗?" }, "noneFolder": { - "message": "无文件夹", + "message": "默认文件夹", "description": "This is the folder for uncategorized items" }, "addFolder": { @@ -543,10 +543,6 @@ "message": "包含特殊字符", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "单词数" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "输入您的账户电子邮箱地址,您的密码提示将发送给您" }, - "passwordHint": { - "message": "密码提示" - }, - "enterEmailToGetHint": { - "message": "请输入您的账户电子邮箱地址来接收主密码提示。" - }, "getMasterPasswordHint": { "message": "获取主密码提示" }, @@ -916,7 +906,7 @@ "message": "为您的组织使用 Duo Security 的 Duo 移动 App、短信、电话或 U2F 安全密钥来进行验证。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "验证您的身份" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "自托管环境" }, - "selfHostedEnvironmentFooter": { - "message": "指定您本地托管的 Bitwarden 安装的基础 URL。" - }, "selfHostedBaseUrlHint": { "message": "指定您的本地托管 Bitwarden 安装的基础 URL。例如:https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "自定义环境" }, - "customEnvironmentFooter": { - "message": "适用于高级用户。您可以分别指定各个服务的基础 URL。" - }, "baseUrl": { "message": "服务器 URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "否" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "覆盖密码" }, @@ -1432,7 +1419,7 @@ "message": "感谢您支持 Bitwarden。" }, "premiumPrice": { - "message": "全部仅需 $PRICE$ /年!", + "message": "所有功能仅需 $PRICE$ /年!", "placeholders": { "price": { "content": "$1", @@ -1619,7 +1606,7 @@ "message": "退出" }, "showHide": { - "message": "显示/隐藏", + "message": "显示 / 隐藏", "description": "Text for a button that toggles the visibility of the window. Shows the window when it is hidden or hides the window if it is currently open." }, "hideToTray": { @@ -1798,19 +1785,19 @@ "message": "解锁您的密码库" }, "autoPromptWindowsHello": { - "message": "应用程序启动时要求使用 Windows Hello" + "message": "应用程序启动时提示 Windows Hello" }, "autoPromptPolkit": { - "message": "启动时请求系统身份验证" + "message": "启动时提示系统身份验证" }, "autoPromptTouchId": { - "message": "应用程序启动时要求使用触控 ID" + "message": "应用程序启动时提示触控 ID" }, "requirePasswordOnStart": { - "message": "应用程序启动时要求输入密码或 PIN 码" + "message": "应用程序启动时要求密码或 PIN 码" }, "requirePasswordWithoutPinOnStart": { - "message": "应用程序启动时需要密码" + "message": "应用程序启动时要求密码" }, "recommendedForSecurity": { "message": "安全起见,推荐设置。" @@ -2098,7 +2085,7 @@ "message": "生物识别未设置" }, "biometricsNotEnabledDesc": { - "message": "需要先在桌面应用程序的设置中设置生物识别,才能使用浏览器中的生物识别。" + "message": "需要首先在桌面端的设置中设置生物识别,才能使用浏览器的生物识别。" }, "biometricsManualSetupTitle": { "message": "自动设置不可用" @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "使用主密码登录" }, - "loggingInAs": { - "message": "正登录为" - }, "rememberEmail": { "message": "记住电子邮箱" }, - "notYou": { - "message": "不是您吗?" - }, "newAroundHere": { "message": "初来乍到吗?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "请求管理员批准" }, - "approveWithMasterPassword": { - "message": "使用主密码批准" - }, "region": { "message": "区域" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的请求已发送给您的管理员。" }, - "youWillBeNotifiedOnceApproved": { - "message": "批准后,您将收到通知。" - }, "troubleLoggingIn": { "message": "登录遇到问题吗?" }, @@ -3089,7 +3064,7 @@ "message": "搜索" }, "inputMinLength": { - "message": "至少输入 $COUNT$ 个字符。", + "message": "输入长度不能低于 $COUNT$ 个字符。", "placeholders": { "count": { "content": "$1", @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "某个应用程序" }, - "sshKeyPasswordUnsupported": { - "message": "尚不支持导入受密码保护的 SSH 密钥" - }, "invalidSshKey": { "message": "此 SSH 密钥无效" }, @@ -3545,7 +3517,7 @@ "importSshKeyFromClipboard": { "message": "从剪贴板导入密钥" }, - "sshKeyPasted": { + "sshKeyImported": { "message": "SSH 密钥导入成功" }, "fileSavedToDevice": { @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "您正在使用的浏览器扩展已过时。请更新它或在桌面 App 的设置中禁用浏览器集成指纹验证。" + }, + "changeAtRiskPassword": { + "message": "更改有风险的密码" } } diff --git a/apps/desktop/src/locales/zh_TW/messages.json b/apps/desktop/src/locales/zh_TW/messages.json index 9cf606563b8..5da6c4a0b6e 100644 --- a/apps/desktop/src/locales/zh_TW/messages.json +++ b/apps/desktop/src/locales/zh_TW/messages.json @@ -543,10 +543,6 @@ "message": "包含特殊字元", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "numWords": { "message": "單字數" }, @@ -752,12 +748,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "輸入您帳號的電子郵件,您的密碼提示會傳送給您" }, - "passwordHint": { - "message": "密碼提示" - }, - "enterEmailToGetHint": { - "message": "請輸入您的帳户電子郵件地址以接收主密碼提示。" - }, "getMasterPasswordHint": { "message": "取得主密碼提示" }, @@ -916,7 +906,7 @@ "message": "爲您的組織使用 Duo Security 的 Duo Mobile 程式、SMS、致電或 U2F 安全鑰匙進行驗證。", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -955,9 +945,6 @@ "selfHostedEnvironment": { "message": "自我裝載環境" }, - "selfHostedEnvironmentFooter": { - "message": "指定您本地托管的 Bitwarden 安裝之基礎 URL。" - }, "selfHostedBaseUrlHint": { "message": "指定您自建的 Bitwarden 伺服器的網域 URL。例如:https://bitwarden.company.com" }, @@ -970,9 +957,6 @@ "customEnvironment": { "message": "自訂環境" }, - "customEnvironmentFooter": { - "message": "適用於進階使用者。您可以單獨指定各個服務的基礎 URL。" - }, "baseUrl": { "message": "伺服器 URL" }, @@ -1013,6 +997,9 @@ "no": { "message": "否" }, + "location": { + "message": "Location" + }, "overwritePassword": { "message": "覆寫密碼" }, @@ -2785,15 +2772,9 @@ "loginWithMasterPassword": { "message": "使用主密碼登入" }, - "loggingInAs": { - "message": "正登入為" - }, "rememberEmail": { "message": "記住電子郵件地址" }, - "notYou": { - "message": "不是您嗎?" - }, "newAroundHere": { "message": "第一次使用?" }, @@ -3033,9 +3014,6 @@ "requestAdminApproval": { "message": "要求管理員核准" }, - "approveWithMasterPassword": { - "message": "使用主密碼核准" - }, "region": { "message": "區域" }, @@ -3061,9 +3039,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的要求已傳送給您的管理員。" }, - "youWillBeNotifiedOnceApproved": { - "message": "核准後將通知您。" - }, "troubleLoggingIn": { "message": "登入時遇到困難?" }, @@ -3533,9 +3508,6 @@ "unknownApplication": { "message": "應用程式" }, - "sshKeyPasswordUnsupported": { - "message": "匯入密碼保護的 SSH 密鑰暫時還未支援" - }, "invalidSshKey": { "message": "SSH 密鑰不正確" }, @@ -3545,8 +3517,8 @@ "importSshKeyFromClipboard": { "message": "從剪貼簿中匯入密鑰" }, - "sshKeyPasted": { - "message": "SSH 密鑰成功匯入" + "sshKeyImported": { + "message": "SSH key imported successfully" }, "fileSavedToDevice": { "message": "檔案已儲存到裝置。在您的裝置上管理下載檔案。" @@ -3604,5 +3576,8 @@ }, "updateBrowserOrDisableFingerprintDialogMessage": { "message": "The browser extension you are using is out of date. Please update it or disable browser integration fingerprint validation in the desktop app settings." + }, + "changeAtRiskPassword": { + "message": "Change at-risk password" } } diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 4e167f30ec8..e4894b159fe 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -284,6 +284,8 @@ export class Main { this.migrationRunner.run().then( async () => { await this.toggleHardwareAcceleration(); + // Reset modal mode to make sure main window is displayed correctly + await this.desktopSettingsService.resetInModalMode(); await this.windowMain.init(); await this.i18nService.init(); await this.messagingMain.init(); diff --git a/apps/desktop/src/main/tray.main.ts b/apps/desktop/src/main/tray.main.ts index 9fa7fe6143f..e63e2a00c85 100644 --- a/apps/desktop/src/main/tray.main.ts +++ b/apps/desktop/src/main/tray.main.ts @@ -1,6 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import * as path from "path"; +import * as url from "url"; import { app, BrowserWindow, Menu, MenuItemConstructorOptions, nativeImage, Tray } from "electron"; import { firstValueFrom } from "rxjs"; @@ -9,6 +10,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { BiometricStateService, BiometricsService } from "@bitwarden/key-management"; import { DesktopSettingsService } from "../platform/services/desktop-settings.service"; +import { cleanUserAgent, isDev } from "../utils"; import { WindowMain } from "./window.main"; @@ -49,6 +51,11 @@ export class TrayMain { label: this.i18nService.t("showHide"), click: () => this.toggleWindow(), }, + { + visible: isDev(), + label: "Fake Popup", + click: () => this.fakePopup(), + }, { type: "separator" }, { label: this.i18nService.t("exit"), @@ -190,7 +197,7 @@ export class TrayMain { this.hideDock(); } } else { - this.windowMain.win.show(); + this.windowMain.show(); if (this.isDarwin()) { this.showDock(); } @@ -203,4 +210,38 @@ export class TrayMain { this.windowMain.win.close(); } } + + /** + * This method is used to test modal behavior during development and could be removed in the future. + * @returns + */ + private async fakePopup() { + if (this.windowMain.win == null || this.windowMain.win.isDestroyed()) { + await this.windowMain.createWindow("modal-app"); + return; + } + + // Restyle existing + const existingWin = this.windowMain.win; + + await this.desktopSettingsService.setInModalMode(true); + await existingWin.loadURL( + url.format({ + protocol: "file:", + //pathname: `${__dirname}/index.html`, + pathname: path.join(__dirname, "/index.html"), + slashes: true, + hash: "/passkeys", + query: { + redirectUrl: "/passkeys", + }, + }), + { + userAgent: cleanUserAgent(existingWin.webContents.userAgent), + }, + ); + existingWin.once("ready-to-show", () => { + existingWin.show(); + }); + } } diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index e05ce100675..ca154400ff5 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -5,14 +5,16 @@ import * as path from "path"; import * as url from "url"; import { app, BrowserWindow, ipcMain, nativeTheme, screen, session } from "electron"; -import { firstValueFrom } from "rxjs"; +import { concatMap, firstValueFrom, pairwise } from "rxjs"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; +import { ThemeTypes, Theme } from "@bitwarden/common/platform/enums"; import { processisolations } from "@bitwarden/desktop-napi"; import { BiometricStateService } from "@bitwarden/key-management"; import { WindowState } from "../platform/models/domain/window-state"; +import { applyMainWindowStyles, applyPopupModalStyles } from "../platform/popup-modal-styles"; import { DesktopSettingsService } from "../platform/services/desktop-settings.service"; import { cleanUserAgent, isDev, isLinux, isMac, isMacAppStore, isWindows } from "../utils"; @@ -76,6 +78,24 @@ export class WindowMain { } }); + this.desktopSettingsService.inModalMode$ + .pipe( + pairwise(), + concatMap(async ([lastValue, newValue]) => { + if (lastValue && !newValue) { + // Reset the window state to the main window state + applyMainWindowStyles(this.win, this.windowStates[mainWindowSizeKey]); + // Because modal is used in front of another app, UX wise it makes sense to hide the main window when leaving modal mode. + this.win.hide(); + } else if (!lastValue && newValue) { + // Apply the popup modal styles + applyPopupModalStyles(this.win); + this.win.show(); + } + }), + ) + .subscribe(); + this.desktopSettingsService.preventScreenshots$.subscribe((prevent) => { if (this.win == null) { return; @@ -91,7 +111,6 @@ export class WindowMain { app.quit(); return; } else { - // eslint-disable-next-line app.on("second-instance", (event, argv, workingDirectory) => { // Someone tried to run a second instance, we should focus our window. if (this.win != null) { @@ -182,7 +201,20 @@ export class WindowMain { }); } - async createWindow(): Promise { + /// Show the window with main window styles + show() { + if (this.win != null) { + applyMainWindowStyles(this.win, this.windowStates[mainWindowSizeKey]); + this.win.show(); + } + } + + /** + * Creates the main window. The template argument is used to determine the styling of the window and what url will be loaded. + * When the template is "modal-app", the window will be styled as a modal and the passkeys page will be loaded. + * TODO: We might want to refactor the template argument to accomodate more target pages, e.g. ssh-agent. + */ + async createWindow(template: "full-app" | "modal-app" = "full-app"): Promise { this.windowStates[mainWindowSizeKey] = await this.getWindowState( this.defaultWidth, this.defaultHeight, @@ -216,6 +248,12 @@ export class WindowMain { }, }); + if (template === "modal-app") { + applyPopupModalStyles(this.win); + } else { + applyMainWindowStyles(this.win, this.windowStates[mainWindowSizeKey]); + } + this.win.webContents.on("dom-ready", () => { this.win.webContents.zoomFactor = this.windowStates[mainWindowSizeKey].zoomFactor ?? 1.0; }); @@ -225,21 +263,41 @@ export class WindowMain { } // Show it later since it might need to be maximized. - this.win.show(); + // use once event to avoid flash on unstyled content. + this.win.once("ready-to-show", () => { + this.win.show(); + }); - // and load the index.html of the app. - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.win.loadURL( - url.format({ - protocol: "file:", - pathname: path.join(__dirname, "/index.html"), - slashes: true, - }), - { - userAgent: cleanUserAgent(this.win.webContents.userAgent), - }, - ); + if (template === "full-app") { + // and load the index.html of the app. + // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. + void this.win.loadURL( + url.format({ + protocol: "file:", + pathname: path.join(__dirname, "/index.html"), + slashes: true, + }), + { + userAgent: cleanUserAgent(this.win.webContents.userAgent), + }, + ); + } else { + // we're in modal mode - load the passkeys page + await this.win.loadURL( + url.format({ + protocol: "file:", + pathname: path.join(__dirname, "/index.html"), + slashes: true, + hash: "/passkeys", + query: { + redirectUrl: "/passkeys", + }, + }), + { + userAgent: cleanUserAgent(this.win.webContents.userAgent), + }, + ); + } // Open the DevTools. if (isDev()) { @@ -298,11 +356,15 @@ export class WindowMain { } // Retrieve the background color - // Resolves background color missmatch when starting the application. + // Resolves background color mismatch when starting the application. async getBackgroundColor(): Promise { let theme = await this.storageService.get("global_theming_selection"); - if (theme == null || theme === "system") { + if ( + theme == null || + !Object.values(ThemeTypes).includes(theme as Theme) || + theme === "system" + ) { theme = nativeTheme.shouldUseDarkColors ? "dark" : "light"; } @@ -311,8 +373,6 @@ export class WindowMain { return "#ededed"; case "dark": return "#15181e"; - case "nord": - return "#3b4252"; } } @@ -334,6 +394,12 @@ export class WindowMain { return; } + const inModalMode = await firstValueFrom(this.desktopSettingsService.inModalMode$); + + if (inModalMode) { + return; + } + try { const bounds = win.getBounds(); @@ -344,9 +410,14 @@ export class WindowMain { } } - this.windowStates[configKey].isMaximized = win.isMaximized(); + // We treat fullscreen as maximized (would be even better to store isFullscreen as its own flag). + this.windowStates[configKey].isMaximized = win.isMaximized() || win.isFullScreen(); this.windowStates[configKey].displayBounds = screen.getDisplayMatching(bounds).bounds; + // Maybe store these as well? + // win.isFocused(); + // win.isVisible(); + if (!win.isMaximized() && !win.isMinimized() && !win.isFullScreen()) { this.windowStates[configKey].x = bounds.x; this.windowStates[configKey].y = bounds.y; diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json index bd54446f4e4..effbb27ad23 100644 --- a/apps/desktop/src/package-lock.json +++ b/apps/desktop/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitwarden/desktop", - "version": "2025.2.2", + "version": "2025.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "2025.2.2", + "version": "2025.2.1", "license": "GPL-3.0", "dependencies": { "@bitwarden/desktop-napi": "file:../desktop_native/napi" diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index 3c504913522..713d9074f8c 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -2,7 +2,7 @@ "name": "@bitwarden/desktop", "productName": "Bitwarden", "description": "A secure and free password manager for all of your devices.", - "version": "2025.2.2", + "version": "2025.3.0", "author": "Bitwarden Inc. (https://bitwarden.com)", "homepage": "https://bitwarden.com", "license": "GPL-3.0", diff --git a/apps/desktop/src/platform/popup-modal-styles.ts b/apps/desktop/src/platform/popup-modal-styles.ts new file mode 100644 index 00000000000..9c3f06b34bf --- /dev/null +++ b/apps/desktop/src/platform/popup-modal-styles.ts @@ -0,0 +1,52 @@ +import { BrowserWindow } from "electron"; + +import { WindowState } from "./models/domain/window-state"; + +// change as needed, however limited by mainwindow minimum size +const popupWidth = 680; +const popupHeight = 500; + +export function applyPopupModalStyles(window: BrowserWindow) { + window.unmaximize(); + window.setSize(popupWidth, popupHeight); + window.center(); + window.setWindowButtonVisibility?.(false); + window.setMenuBarVisibility?.(false); + window.setResizable(false); + window.setAlwaysOnTop(true); + + // Adjusting from full screen is a bit more hassle + if (window.isFullScreen()) { + window.setFullScreen(false); + window.once("leave-full-screen", () => { + window.setSize(popupWidth, popupHeight); + window.center(); + }); + } +} + +export function applyMainWindowStyles(window: BrowserWindow, existingWindowState: WindowState) { + window.setMinimumSize(680, 500); + + // need to guard against null/undefined values + + if (existingWindowState?.width && existingWindowState?.height) { + window.setSize(existingWindowState.width, existingWindowState.height); + } + + if (existingWindowState?.x && existingWindowState?.y) { + window.setPosition(existingWindowState.x, existingWindowState.y); + } + + window.setWindowButtonVisibility?.(true); + window.setMenuBarVisibility?.(true); + window.setResizable(true); + window.setAlwaysOnTop(false); + + // We're currently not recovering the maximized state, mostly due to conflicts with hiding the window. + // window.setFullScreen(existingWindowState.isMaximized); + + // if (existingWindowState.isMaximized) { + // window.maximize(); + // } +} diff --git a/apps/desktop/src/platform/preload.ts b/apps/desktop/src/platform/preload.ts index 05dcd484def..bf81021922f 100644 --- a/apps/desktop/src/platform/preload.ts +++ b/apps/desktop/src/platform/preload.ts @@ -1,4 +1,3 @@ -import { sshagent as ssh } from "desktop_native/napi"; import { ipcRenderer } from "electron"; import { DeviceType } from "@bitwarden/common/enums"; @@ -64,13 +63,6 @@ const sshAgent = { clearKeys: async () => { return await ipcRenderer.invoke("sshagent.clearkeys"); }, - importKey: async (key: string, password: string): Promise => { - const res = await ipcRenderer.invoke("sshagent.importkey", { - privateKey: key, - password: password, - }); - return res; - }, isLoaded(): Promise { return ipcRenderer.invoke("sshagent.isloaded"); }, diff --git a/apps/desktop/src/platform/services/desktop-settings.service.ts b/apps/desktop/src/platform/services/desktop-settings.service.ts index f0d5d124de2..efac0cda252 100644 --- a/apps/desktop/src/platform/services/desktop-settings.service.ts +++ b/apps/desktop/src/platform/services/desktop-settings.service.ts @@ -75,6 +75,10 @@ const MINIMIZE_ON_COPY = new UserKeyDefinition(DESKTOP_SETTINGS_DISK, " clearOn: [], // User setting, no need to clear }); +const IN_MODAL_MODE = new KeyDefinition(DESKTOP_SETTINGS_DISK, "inModalMode", { + deserializer: (b) => b, +}); + const PREVENT_SCREENSHOTS = new KeyDefinition( DESKTOP_SETTINGS_DISK, "preventScreenshots", @@ -170,6 +174,10 @@ export class DesktopSettingsService { */ minimizeOnCopy$ = this.minimizeOnCopyState.state$.pipe(map(Boolean)); + private readonly inModalModeState = this.stateProvider.getGlobal(IN_MODAL_MODE); + + inModalMode$ = this.inModalModeState.state$.pipe(map(Boolean)); + constructor(private stateProvider: StateProvider) { this.window$ = this.windowState.state$.pipe( map((window) => @@ -178,6 +186,14 @@ export class DesktopSettingsService { ); } + /** + * This is used to clear the setting on application start to make sure we don't end up + * stuck in modal mode if the application is force-closed in modal mode. + */ + async resetInModalMode() { + await this.inModalModeState.update(() => false); + } + async setHardwareAcceleration(enabled: boolean) { await this.hwState.update(() => enabled); } @@ -286,6 +302,14 @@ export class DesktopSettingsService { await this.stateProvider.getUser(userId, MINIMIZE_ON_COPY).update(() => value); } + /** + * Sets the modal mode of the application. Setting this changes the windows-size and other properties. + * @param value `true` if the application is in modal mode, `false` if it is not. + */ + async setInModalMode(value: boolean) { + await this.inModalModeState.update(() => value); + } + /** * Sets the setting for whether or not the screenshot protection is enabled. * @param value `true` if the screenshot protection is enabled, `false` if it is not. diff --git a/apps/desktop/src/platform/services/electron-key.service.ts b/apps/desktop/src/platform/services/electron-key.service.ts index dceb1dea08f..e378f3cf374 100644 --- a/apps/desktop/src/platform/services/electron-key.service.ts +++ b/apps/desktop/src/platform/services/electron-key.service.ts @@ -1,7 +1,7 @@ import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -57,8 +57,6 @@ export class ElectronKeyService extends DefaultKeyService { } override async clearStoredUserKey(keySuffix: KeySuffixOptions, userId?: UserId): Promise { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises await super.clearStoredUserKey(keySuffix, userId); } diff --git a/apps/desktop/src/platform/services/electron-platform-utils.service.ts b/apps/desktop/src/platform/services/electron-platform-utils.service.ts index e86d44f71f2..b7c82f4e5db 100644 --- a/apps/desktop/src/platform/services/electron-platform-utils.service.ts +++ b/apps/desktop/src/platform/services/electron-platform-utils.service.ts @@ -77,11 +77,9 @@ export class ElectronPlatformUtilsService implements PlatformUtilsService { return (await this.getApplicationVersion()).split(/[+|-]/)[0].trim(); } - // Restricted to Windows and Mac. Mac is missing support for pin entry, and Linux is missing support entirely and has to be implemented in another way. + // Linux and Mac are missing a ui to enter a pin, so this works for two-factor security keys, when always-uv is not active supportsWebAuthn(win: Window): boolean { - return ( - this.getDevice() === DeviceType.WindowsDesktop || this.getDevice() === DeviceType.MacOsDesktop - ); + return true; } supportsDuo(): boolean { diff --git a/apps/desktop/src/scss/pages.scss b/apps/desktop/src/scss/pages.scss index fda75e834f3..b9559e13a26 100644 --- a/apps/desktop/src/scss/pages.scss +++ b/apps/desktop/src/scss/pages.scss @@ -1,12 +1,9 @@ @import "variables.scss"; -#login-page, -#login-with-device-page, #lock-page, #sso-page, #set-password-page, -#remove-password-page, -#login-decryption-options-page { +#remove-password-page { display: flex; justify-content: center; align-items: center; @@ -49,13 +46,11 @@ } #accessibility-cookie-page, -#login-page, #register-page, #hint-page, #two-factor-page, #lock-page, -#update-temp-password-page, -#login-decryption-options-page { +#update-temp-password-page { .content { width: 325px; transition: width 0.25s linear; @@ -190,73 +185,6 @@ } } -#login-page, -#login-with-device-page, -#login-decryption-options-page { - flex-direction: column; - justify-content: unset; - padding-top: 20px; - - .login-header { - align-self: flex-start; - padding: 1em; - font-size: 1.2em; - .environment-urls-settings-icon { - @include themify($themes) { - color: themed("mutedColor"); - } - - span { - visibility: hidden; - } - - &:hover, - &:focus { - text-decoration: none; - - @include themify($themes) { - color: themed("primaryColor"); - } - } - } - } -} - -#login-with-device-page { - .content { - display: block; - padding-top: 70px; - width: 350px !important; - - .fingerprint { - margin: auto; - width: 315px; - - .fingerpint-header { - padding-left: 15px; - } - } - - .section { - margin-bottom: 30px; - } - - .another-method { - display: flex; - margin: auto; - .description-text { - padding-right: 5px; - } - } - - code { - @include themify($themes) { - color: themed("codeColor"); - } - } - } -} - #login-approval-page { .section-title { padding: 20px; @@ -276,14 +204,3 @@ } } } - -#login-decryption-options-page { - .standard-bottom-margin { - margin-bottom: 20px; - } - - #rememberThisDeviceHintText { - font-size: $font-size-small; - color: $text-muted; - } -} diff --git a/apps/desktop/src/scss/variables.scss b/apps/desktop/src/scss/variables.scss index 23a4644d3da..b8978e284e5 100644 --- a/apps/desktop/src/scss/variables.scss +++ b/apps/desktop/src/scss/variables.scss @@ -1,6 +1,4 @@ -@import "~nord/src/sass/nord.scss"; - -$dark-icon-themes: "theme_dark", "theme_nord"; +$dark-icon-themes: "theme_dark"; $font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; @@ -166,65 +164,6 @@ $themes: ( hrColor: #bac0ce, codeColor: $code-color-dark, ), - nord: ( - textColor: $nord5, - borderColor: $nord0, - backgroundColor: $nord2, - borderColorAlt: $nord5, - backgroundColorAlt: $nord1, - // Ensure the `window.main.ts` is updated with this value - backgroundColorAlt2: $nord1, - scrollbarColor: $nord4, - scrollbarHoverColor: $nord6, - boxBackgroundColor: $nord2, - boxBackgroundHoverColor: $nord3, - boxBorderColor: $nord1, - headerBackgroundColor: $nord2, - headerBorderColor: $nord0, - headerInputBackgroundColor: $nord6, - headerInputBackgroundFocusColor: $nord5, - headerInputColor: $nord2, - headerInputPlaceholderColor: $nord3, - listItemBackgroundColor: $nord2, - listItemBackgroundHoverColor: $nord3, - listItemBorderColor: $nord1, - disabledIconColor: $nord5, - headingColor: $nord4, - headingButtonColor: $nord5, - headingButtonHoverColor: $nord6, - labelColor: $nord4, - mutedColor: $nord4, - totpStrokeColor: $nord4, - boxRowButtonColor: $nord4, - boxRowButtonHoverColor: $nord6, - inputBorderColor: $nord0, - inputBackgroundColor: $nord2, - inputPlaceholderColor: lighten($nord3, 20%), - buttonBackgroundColor: $nord3, - buttonBorderColor: $nord0, - buttonColor: $nord5, - buttonPrimaryColor: $nord8, - buttonDangerColor: $nord11, - primaryColor: $nord9, - primaryAccentColor: $nord8, - dangerColor: $nord11, - successColor: $nord14, - infoColor: $nord9, - warningColor: $nord12, - logoSuffix: "white", - mfaLogoSuffix: "-w.png", - passwordNumberColor: $nord8, - passwordSpecialColor: $nord12, - passwordCountText: $nord5, - calloutBorderColor: $nord1, - calloutBackgroundColor: $nord2, - toastTextColor: #000000, - accountSwitcherBackgroundColor: $nord0, - accountSwitcherTextColor: $nord5, - svgSuffix: "-dark.svg", - hrColor: $nord4, - codeColor: $code-color-nord, - ), ); @mixin themify($themes: $themes) { diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.html b/apps/desktop/src/vault/app/vault/add-edit.component.html index 6244f585bae..d79e15ebe6a 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.html +++ b/apps/desktop/src/vault/app/vault/add-edit.component.html @@ -512,6 +512,15 @@ [ngClass]="{ 'bwi-eye': !showPrivateKey, 'bwi-eye-slash': showPrivateKey }" > +
@@ -559,16 +568,6 @@
-
- -
diff --git a/apps/desktop/src/vault/app/vault/add-edit.component.ts b/apps/desktop/src/vault/app/vault/add-edit.component.ts index ae332c9723b..2c8b5a8321a 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit.component.ts @@ -3,8 +3,6 @@ import { DatePipe } from "@angular/common"; import { Component, NgZone, OnChanges, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { NgForm } from "@angular/forms"; -import { sshagent as sshAgent } from "desktop_native/napi"; -import { lastValueFrom } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { AddEditComponent as BaseAddEditComponent } from "@bitwarden/angular/vault/components/add-edit.component"; @@ -25,8 +23,7 @@ import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folde import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { DialogService, ToastService } from "@bitwarden/components"; -import { SshKeyPasswordPromptComponent } from "@bitwarden/importer-ui"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { PasswordRepromptService, SshImportPromptService } from "@bitwarden/vault"; const BroadcasterSubscriptionId = "AddEditComponent"; @@ -60,6 +57,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On toastService: ToastService, cipherAuthorizationService: CipherAuthorizationService, sdkService: SdkService, + sshImportPromptService: SshImportPromptService, ) { super( cipherService, @@ -82,6 +80,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On cipherAuthorizationService, toastService, sdkService, + sshImportPromptService, ); } @@ -159,69 +158,6 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On this.cipher.revisionDate = cipher.revisionDate; } - async importSshKeyFromClipboard(password: string = "") { - const key = await this.platformUtilsService.readFromClipboard(); - const parsedKey = await ipc.platform.sshAgent.importKey(key, password); - if (parsedKey == null) { - this.toastService.showToast({ - variant: "error", - title: "", - message: this.i18nService.t("invalidSshKey"), - }); - return; - } - - switch (parsedKey.status) { - case sshAgent.SshKeyImportStatus.ParsingError: - this.toastService.showToast({ - variant: "error", - title: "", - message: this.i18nService.t("invalidSshKey"), - }); - return; - case sshAgent.SshKeyImportStatus.UnsupportedKeyType: - this.toastService.showToast({ - variant: "error", - title: "", - message: this.i18nService.t("sshKeyTypeUnsupported"), - }); - return; - case sshAgent.SshKeyImportStatus.PasswordRequired: - case sshAgent.SshKeyImportStatus.WrongPassword: - if (password !== "") { - this.toastService.showToast({ - variant: "error", - title: "", - message: this.i18nService.t("sshKeyWrongPassword"), - }); - } else { - password = await this.getSshKeyPassword(); - if (password === "") { - return; - } - await this.importSshKeyFromClipboard(password); - } - return; - default: - this.cipher.sshKey.privateKey = parsedKey.sshKey.privateKey; - this.cipher.sshKey.publicKey = parsedKey.sshKey.publicKey; - this.cipher.sshKey.keyFingerprint = parsedKey.sshKey.keyFingerprint; - this.toastService.showToast({ - variant: "success", - title: "", - message: this.i18nService.t("sshKeyPasted"), - }); - } - } - - async getSshKeyPassword(): Promise { - const dialog = this.dialogService.open(SshKeyPasswordPromptComponent, { - ariaModal: true, - }); - - return await lastValueFrom(dialog.closed); - } - truncateString(value: string, length: number) { return value.length > length ? value.substring(0, length) + "..." : value; } diff --git a/apps/desktop/src/vault/app/vault/vault-filter/filters/type-filter.component.html b/apps/desktop/src/vault/app/vault/vault-filter/filters/type-filter.component.html index 55e10980ad1..c3dcd191dfc 100644 --- a/apps/desktop/src/vault/app/vault/vault-filter/filters/type-filter.component.html +++ b/apps/desktop/src/vault/app/vault/vault-filter/filters/type-filter.component.html @@ -82,7 +82,6 @@
  • + {{ totpInfo.totpCodeFormatted }} + + +
    + +
    - + +
    {{ "verificationCodeTotp" | i18n }} diff --git a/apps/desktop/tailwind.config.js b/apps/desktop/tailwind.config.js index 50e5799bc61..5b4cab027ba 100644 --- a/apps/desktop/tailwind.config.js +++ b/apps/desktop/tailwind.config.js @@ -1,4 +1,4 @@ -/* eslint-disable no-undef, @typescript-eslint/no-require-imports */ +/* eslint-disable @typescript-eslint/no-require-imports */ const config = require("../../libs/components/tailwind.config.base"); config.content = [ diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 41be86e584e..09dac7f4c48 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -1,4 +1,4 @@ -FROM bitwarden/server +FROM ghcr.io/bitwarden/server LABEL com.bitwarden.product="bitwarden" diff --git a/apps/web/package.json b/apps/web/package.json index 3c5e243b47e..25890cf4b6e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/web-vault", - "version": "2025.2.2", + "version": "2025.3.0", "scripts": { "build:oss": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", "build:bit": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" webpack -c ../../bitwarden_license/bit-web/webpack.config.js", diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js index 05e2b04124f..5657df3afcf 100644 --- a/apps/web/postcss.config.js +++ b/apps/web/postcss.config.js @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/no-require-imports, no-undef */ +/* eslint-disable @typescript-eslint/no-require-imports */ module.exports = { plugins: [ require("postcss-import"), diff --git a/apps/web/src/app/admin-console/common/base.people.component.ts b/apps/web/src/app/admin-console/common/base.people.component.ts deleted file mode 100644 index 07ae67ac33b..00000000000 --- a/apps/web/src/app/admin-console/common/base.people.component.ts +++ /dev/null @@ -1,425 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, ViewChild, ViewContainerRef } from "@angular/core"; -import { FormControl } from "@angular/forms"; -import { firstValueFrom, concatMap, map, lastValueFrom, startWith, debounceTime } from "rxjs"; - -import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; -import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { SearchService } from "@bitwarden/common/abstractions/search.service"; -import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service"; -import { - OrganizationUserStatusType, - OrganizationUserType, - ProviderUserStatusType, - ProviderUserType, -} from "@bitwarden/common/admin-console/enums"; -import { ProviderUserUserDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-user.response"; -import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { DialogService, ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -import { OrganizationUserView } from "../organizations/core/views/organization-user.view"; -import { UserConfirmComponent } from "../organizations/manage/user-confirm.component"; - -type StatusType = OrganizationUserStatusType | ProviderUserStatusType; - -const MaxCheckedCount = 500; - -@Directive() -export abstract class BasePeopleComponent< - UserType extends ProviderUserUserDetailsResponse | OrganizationUserView, -> { - @ViewChild("confirmTemplate", { read: ViewContainerRef, static: true }) - confirmModalRef: ViewContainerRef; - - get allCount() { - return this.activeUsers != null ? this.activeUsers.length : 0; - } - - get invitedCount() { - return this.statusMap.has(this.userStatusType.Invited) - ? this.statusMap.get(this.userStatusType.Invited).length - : 0; - } - - get acceptedCount() { - return this.statusMap.has(this.userStatusType.Accepted) - ? this.statusMap.get(this.userStatusType.Accepted).length - : 0; - } - - get confirmedCount() { - return this.statusMap.has(this.userStatusType.Confirmed) - ? this.statusMap.get(this.userStatusType.Confirmed).length - : 0; - } - - get revokedCount() { - return this.statusMap.has(this.userStatusType.Revoked) - ? this.statusMap.get(this.userStatusType.Revoked).length - : 0; - } - - get showConfirmUsers(): boolean { - return ( - this.activeUsers != null && - this.statusMap != null && - this.activeUsers.length > 1 && - this.confirmedCount > 0 && - this.confirmedCount < 3 && - this.acceptedCount > 0 - ); - } - - get showBulkConfirmUsers(): boolean { - return this.acceptedCount > 0; - } - - abstract userType: typeof OrganizationUserType | typeof ProviderUserType; - abstract userStatusType: typeof OrganizationUserStatusType | typeof ProviderUserStatusType; - - loading = true; - statusMap = new Map(); - status: StatusType; - users: UserType[] = []; - pagedUsers: UserType[] = []; - actionPromise: Promise; - - protected allUsers: UserType[] = []; - protected activeUsers: UserType[] = []; - - protected didScroll = false; - protected pageSize = 100; - - protected searchControl = new FormControl("", { nonNullable: true }); - protected isSearching$ = this.searchControl.valueChanges.pipe( - debounceTime(500), - concatMap((searchText) => this.searchService.isSearchable(searchText)), - startWith(false), - ); - protected isPaging$ = this.isSearching$.pipe( - map((isSearching) => { - if (isSearching && this.didScroll) { - this.resetPaging(); - } - return !isSearching && this.users && this.users.length > this.pageSize; - }), - ); - - private pagedUsersCount = 0; - - constructor( - protected apiService: ApiService, - private searchService: SearchService, - protected i18nService: I18nService, - protected platformUtilsService: PlatformUtilsService, - protected keyService: KeyService, - protected validationService: ValidationService, - private logService: LogService, - private searchPipe: SearchPipe, - protected userNamePipe: UserNamePipe, - protected dialogService: DialogService, - protected organizationManagementPreferencesService: OrganizationManagementPreferencesService, - protected toastService: ToastService, - ) {} - - abstract edit(user: UserType): void; - abstract getUsers(): Promise | UserType[]>; - abstract deleteUser(id: string): Promise; - abstract revokeUser(id: string): Promise; - abstract restoreUser(id: string): Promise; - abstract reinviteUser(id: string): Promise; - abstract confirmUser(user: UserType, publicKey: Uint8Array): Promise; - - async load() { - const response = await this.getUsers(); - this.statusMap.clear(); - this.activeUsers = []; - for (const status of Utils.iterateEnum(this.userStatusType)) { - this.statusMap.set(status, []); - } - - if (response instanceof ListResponse) { - this.allUsers = response.data != null && response.data.length > 0 ? response.data : []; - } else if (Array.isArray(response)) { - this.allUsers = response; - } - - this.allUsers.sort( - Utils.getSortFunction( - this.i18nService, - "email", - ), - ); - this.allUsers.forEach((u) => { - if (!this.statusMap.has(u.status)) { - this.statusMap.set(u.status, [u]); - } else { - this.statusMap.get(u.status).push(u); - } - if (u.status !== this.userStatusType.Revoked) { - this.activeUsers.push(u); - } - }); - this.filter(this.status); - this.loading = false; - } - - filter(status: StatusType) { - this.status = status; - if (this.status != null) { - this.users = this.statusMap.get(this.status); - } else { - this.users = this.activeUsers; - } - // Reset checkbox selecton - this.selectAll(false); - this.resetPaging(); - } - - loadMore() { - if (!this.users || this.users.length <= this.pageSize) { - return; - } - const pagedLength = this.pagedUsers.length; - let pagedSize = this.pageSize; - if (pagedLength === 0 && this.pagedUsersCount > this.pageSize) { - pagedSize = this.pagedUsersCount; - } - if (this.users.length > pagedLength) { - this.pagedUsers = this.pagedUsers.concat( - this.users.slice(pagedLength, pagedLength + pagedSize), - ); - } - this.pagedUsersCount = this.pagedUsers.length; - this.didScroll = this.pagedUsers.length > this.pageSize; - } - - checkUser(user: UserType, select?: boolean) { - (user as any).checked = select == null ? !(user as any).checked : select; - } - - selectAll(select: boolean) { - if (select) { - this.selectAll(false); - } - - const filteredUsers = this.searchPipe.transform( - this.users, - this.searchControl.value, - "name", - "email", - "id", - ); - - const selectCount = - select && filteredUsers.length > MaxCheckedCount ? MaxCheckedCount : filteredUsers.length; - for (let i = 0; i < selectCount; i++) { - this.checkUser(filteredUsers[i], select); - } - } - - resetPaging() { - this.pagedUsers = []; - this.loadMore(); - } - - invite() { - this.edit(null); - } - - protected async removeUserConfirmationDialog(user: UserType) { - return this.dialogService.openSimpleDialog({ - title: this.userNamePipe.transform(user), - content: { key: "removeUserConfirmation" }, - type: "warning", - }); - } - - async remove(user: UserType) { - const confirmed = await this.removeUserConfirmationDialog(user); - if (!confirmed) { - return false; - } - - this.actionPromise = this.deleteUser(user.id); - try { - await this.actionPromise; - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("removedUserId", this.userNamePipe.transform(user)), - }); - this.removeUser(user); - } catch (e) { - this.validationService.showError(e); - } - this.actionPromise = null; - } - - protected async revokeUserConfirmationDialog(user: UserType) { - return this.dialogService.openSimpleDialog({ - title: { key: "revokeAccess", placeholders: [this.userNamePipe.transform(user)] }, - content: this.revokeWarningMessage(), - acceptButtonText: { key: "revokeAccess" }, - type: "warning", - }); - } - - async revoke(user: UserType) { - const confirmed = await this.revokeUserConfirmationDialog(user); - - if (!confirmed) { - return false; - } - - this.actionPromise = this.revokeUser(user.id); - try { - await this.actionPromise; - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("revokedUserId", this.userNamePipe.transform(user)), - }); - await this.load(); - } catch (e) { - this.validationService.showError(e); - } - this.actionPromise = null; - } - - async restore(user: UserType) { - this.actionPromise = this.restoreUser(user.id); - try { - await this.actionPromise; - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("restoredUserId", this.userNamePipe.transform(user)), - }); - await this.load(); - } catch (e) { - this.validationService.showError(e); - } - this.actionPromise = null; - } - - async reinvite(user: UserType) { - if (this.actionPromise != null) { - return; - } - - this.actionPromise = this.reinviteUser(user.id); - try { - await this.actionPromise; - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("hasBeenReinvited", this.userNamePipe.transform(user)), - }); - } catch (e) { - this.validationService.showError(e); - } - this.actionPromise = null; - } - - async confirm(user: UserType) { - function updateUser(self: BasePeopleComponent) { - user.status = self.userStatusType.Confirmed; - const mapIndex = self.statusMap.get(self.userStatusType.Accepted).indexOf(user); - if (mapIndex > -1) { - self.statusMap.get(self.userStatusType.Accepted).splice(mapIndex, 1); - self.statusMap.get(self.userStatusType.Confirmed).push(user); - } - } - - const confirmUser = async (publicKey: Uint8Array) => { - try { - this.actionPromise = this.confirmUser(user, publicKey); - await this.actionPromise; - updateUser(this); - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("hasBeenConfirmed", this.userNamePipe.transform(user)), - }); - } catch (e) { - this.validationService.showError(e); - throw e; - } finally { - this.actionPromise = null; - } - }; - - if (this.actionPromise != null) { - return; - } - - try { - const publicKeyResponse = await this.apiService.getUserPublicKey(user.userId); - const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey); - - const autoConfirm = await firstValueFrom( - this.organizationManagementPreferencesService.autoConfirmFingerPrints.state$, - ); - if (autoConfirm == null || !autoConfirm) { - const dialogRef = UserConfirmComponent.open(this.dialogService, { - data: { - name: this.userNamePipe.transform(user), - userId: user != null ? user.userId : null, - publicKey: publicKey, - confirmUser: () => confirmUser(publicKey), - }, - }); - await lastValueFrom(dialogRef.closed); - - return; - } - - try { - const fingerprint = await this.keyService.getFingerprint(user.userId, publicKey); - this.logService.info(`User's fingerprint: ${fingerprint.join("-")}`); - } catch (e) { - this.logService.error(e); - } - await confirmUser(publicKey); - } catch (e) { - this.logService.error(`Handled exception: ${e}`); - } - } - - protected revokeWarningMessage(): string { - return this.i18nService.t("revokeUserConfirmation"); - } - - protected getCheckedUsers() { - return this.users.filter((u) => (u as any).checked); - } - - protected removeUser(user: UserType) { - let index = this.users.indexOf(user); - if (index > -1) { - this.users.splice(index, 1); - this.resetPaging(); - } - - index = this.allUsers.indexOf(user); - if (index > -1) { - this.allUsers.splice(index, 1); - } - - if (this.statusMap.has(user.status)) { - index = this.statusMap.get(user.status).indexOf(user); - if (index > -1) { - this.statusMap.get(user.status).splice(index, 1); - } - } - } -} diff --git a/apps/web/src/app/admin-console/organizations/collections/collection-access-restricted.component.ts b/apps/web/src/app/admin-console/organizations/collections/collection-access-restricted.component.ts index e5d10d19db0..15ba10a0d59 100644 --- a/apps/web/src/app/admin-console/organizations/collections/collection-access-restricted.component.ts +++ b/apps/web/src/app/admin-console/organizations/collections/collection-access-restricted.component.ts @@ -3,7 +3,7 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; import { ButtonModule, NoItemsModule, svgIcon } from "@bitwarden/components"; import { SharedModule } from "../../../shared"; -import { CollectionDialogTabType } from "../../../vault/components/collection-dialog"; +import { CollectionDialogTabType } from "../shared/components/collection-dialog"; const icon = svgIcon` diff --git a/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-badge.module.ts b/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-badge.module.ts deleted file mode 100644 index 56919ef79fb..00000000000 --- a/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-badge.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from "@angular/core"; - -import { SharedModule } from "../../../../shared/shared.module"; -import { PipesModule } from "../../../../vault/individual-vault/pipes/pipes.module"; - -import { CollectionNameBadgeComponent } from "./collection-name.badge.component"; - -@NgModule({ - imports: [SharedModule, PipesModule], - declarations: [CollectionNameBadgeComponent], - exports: [CollectionNameBadgeComponent], -}) -export class CollectionBadgeModule {} diff --git a/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-name.badge.component.ts b/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-name.badge.component.ts index 3235797b882..d8ace8acc56 100644 --- a/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-name.badge.component.ts +++ b/apps/web/src/app/admin-console/organizations/collections/collection-badge/collection-name.badge.component.ts @@ -4,9 +4,14 @@ import { Component, Input } from "@angular/core"; import { CollectionView } from "@bitwarden/admin-console/common"; +import { SharedModule } from "../../../../shared/shared.module"; +import { GetCollectionNameFromIdPipe } from "../pipes"; + @Component({ selector: "app-collection-badge", templateUrl: "collection-name-badge.component.html", + standalone: true, + imports: [SharedModule, GetCollectionNameFromIdPipe], }) export class CollectionNameBadgeComponent { @Input() collectionIds: string[]; diff --git a/apps/web/src/app/admin-console/organizations/collections/collection-badge/index.ts b/apps/web/src/app/admin-console/organizations/collections/collection-badge/index.ts new file mode 100644 index 00000000000..2cc8f8eb9b6 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/collections/collection-badge/index.ts @@ -0,0 +1 @@ +export * from "./collection-name.badge.component"; diff --git a/apps/web/src/app/admin-console/organizations/collections/index.ts b/apps/web/src/app/admin-console/organizations/collections/index.ts new file mode 100644 index 00000000000..57f936ab590 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/collections/index.ts @@ -0,0 +1,2 @@ +export * from "./utils"; +export * from "./collection-badge"; diff --git a/apps/web/src/app/vault/individual-vault/pipes/get-collection-name.pipe.ts b/apps/web/src/app/admin-console/organizations/collections/pipes/get-collection-name.pipe.ts similarity index 94% rename from apps/web/src/app/vault/individual-vault/pipes/get-collection-name.pipe.ts rename to apps/web/src/app/admin-console/organizations/collections/pipes/get-collection-name.pipe.ts index b52719304b8..8833ddfa382 100644 --- a/apps/web/src/app/vault/individual-vault/pipes/get-collection-name.pipe.ts +++ b/apps/web/src/app/admin-console/organizations/collections/pipes/get-collection-name.pipe.ts @@ -5,6 +5,7 @@ import { CollectionView } from "@bitwarden/admin-console/common"; @Pipe({ name: "collectionNameFromId", pure: true, + standalone: true, }) export class GetCollectionNameFromIdPipe implements PipeTransform { transform(value: string, collections: CollectionView[]) { diff --git a/apps/web/src/app/admin-console/organizations/collections/pipes/index.ts b/apps/web/src/app/admin-console/organizations/collections/pipes/index.ts new file mode 100644 index 00000000000..63b1a86cae5 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/collections/pipes/index.ts @@ -0,0 +1 @@ +export * from "./get-collection-name.pipe"; diff --git a/apps/web/src/app/vault/utils/collection-utils.spec.ts b/apps/web/src/app/admin-console/organizations/collections/utils/collection-utils.spec.ts similarity index 100% rename from apps/web/src/app/vault/utils/collection-utils.spec.ts rename to apps/web/src/app/admin-console/organizations/collections/utils/collection-utils.spec.ts diff --git a/apps/web/src/app/vault/utils/collection-utils.ts b/apps/web/src/app/admin-console/organizations/collections/utils/collection-utils.ts similarity index 100% rename from apps/web/src/app/vault/utils/collection-utils.ts rename to apps/web/src/app/admin-console/organizations/collections/utils/collection-utils.ts diff --git a/apps/web/src/app/admin-console/organizations/collections/utils/index.ts b/apps/web/src/app/admin-console/organizations/collections/utils/index.ts new file mode 100644 index 00000000000..67ff730806d --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/collections/utils/index.ts @@ -0,0 +1 @@ +export * from "./collection-utils"; diff --git a/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.html b/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.html index 2c1e0077ac3..c2e80b7524f 100644 --- a/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.html +++ b/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.html @@ -84,7 +84,7 @@ diff --git a/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.ts b/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.ts index 22a7e4b432b..7efb79ebdb6 100644 --- a/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.ts +++ b/apps/web/src/app/admin-console/organizations/collections/vault-header/vault-header.component.ts @@ -28,11 +28,11 @@ import { import { HeaderModule } from "../../../../layouts/header/header.module"; import { SharedModule } from "../../../../shared"; -import { CollectionDialogTabType } from "../../../../vault/components/collection-dialog"; import { All, RoutedVaultFilterModel, } from "../../../../vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model"; +import { CollectionDialogTabType } from "../../shared/components/collection-dialog"; @Component({ standalone: true, diff --git a/apps/web/src/app/admin-console/organizations/collections/vault.component.html b/apps/web/src/app/admin-console/organizations/collections/vault.component.html index 512f97144de..65cd26bafee 100644 --- a/apps/web/src/app/admin-console/organizations/collections/vault.component.html +++ b/apps/web/src/app/admin-console/organizations/collections/vault.component.html @@ -45,22 +45,16 @@ (searchTextChanged)="filterSearchText($event)" > -
    -
    -
    -
    -
    - -
    -
    -
    +
    +
    +
    -
    +
    diff --git a/apps/web/src/app/admin-console/organizations/collections/vault.component.ts b/apps/web/src/app/admin-console/organizations/collections/vault.component.ts index a02cc599a18..ec92597dc7b 100644 --- a/apps/web/src/app/admin-console/organizations/collections/vault.component.ts +++ b/apps/web/src/app/admin-console/organizations/collections/vault.component.ts @@ -24,6 +24,7 @@ import { switchMap, takeUntil, tap, + catchError, } from "rxjs/operators"; import { @@ -76,6 +77,7 @@ import { PasswordRepromptService, } from "@bitwarden/vault"; +import { BillingNotificationService } from "../../../billing/services/billing-notification.service"; import { ResellerWarning, ResellerWarningService, @@ -84,11 +86,6 @@ import { TrialFlowService } from "../../../billing/services/trial-flow.service"; import { FreeTrial } from "../../../billing/types/free-trial"; import { SharedModule } from "../../../shared"; import { AssignCollectionsWebComponent } from "../../../vault/components/assign-collections"; -import { - CollectionDialogAction, - CollectionDialogTabType, - openCollectionDialog, -} from "../../../vault/components/collection-dialog"; import { VaultItemDialogComponent, VaultItemDialogMode, @@ -114,15 +111,20 @@ import { } from "../../../vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model"; import { VaultFilter } from "../../../vault/individual-vault/vault-filter/shared/models/vault-filter.model"; import { AdminConsoleCipherFormConfigService } from "../../../vault/org-vault/services/admin-console-cipher-form-config.service"; -import { getNestedCollectionTree } from "../../../vault/utils/collection-utils"; import { GroupApiService, GroupView } from "../core"; import { openEntityEventsDialog } from "../manage/entity-events.component"; +import { + CollectionDialogAction, + CollectionDialogTabType, + openCollectionDialog, +} from "../shared/components/collection-dialog"; import { BulkCollectionsDialogComponent, BulkCollectionsDialogResult, } from "./bulk-collections-dialog"; import { CollectionAccessRestrictedComponent } from "./collection-access-restricted.component"; +import { getNestedCollectionTree } from "./utils"; import { VaultFilterModule } from "./vault-filter/vault-filter.module"; import { VaultHeaderComponent } from "./vault-header/vault-header.component"; @@ -178,6 +180,7 @@ export class VaultComponent implements OnInit, OnDestroy { protected freeTrial$: Observable; protected resellerWarning$: Observable; protected prevCipherId: string | null = null; + protected userId: UserId; /** * A list of collections that the user can assign items to and edit those items within. * @protected @@ -255,9 +258,12 @@ export class VaultComponent implements OnInit, OnDestroy { private organizationBillingService: OrganizationBillingServiceAbstraction, private resellerWarningService: ResellerWarningService, private accountService: AccountService, + private billingNotificationService: BillingNotificationService, ) {} async ngOnInit() { + this.userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.resellerManagedOrgAlert = await this.configService.getFeatureFlag( FeatureFlag.ResellerManagedOrgAlert, ); @@ -401,7 +407,7 @@ export class VaultComponent implements OnInit, OnDestroy { ciphers = await this.cipherService.getManyFromApiForOrganization(organization.id); } - await this.searchService.indexCiphers(ciphers, organization.id); + await this.searchService.indexCiphers(this.userId, ciphers, organization.id); return ciphers; }), shareReplay({ refCount: true, bufferSize: 1 }), @@ -445,7 +451,7 @@ export class VaultComponent implements OnInit, OnDestroy { collectionsToReturn = selectedCollection?.children.map((c) => c.node) ?? []; } - if (await this.searchService.isSearchable(searchText)) { + if (await this.searchService.isSearchable(this.userId, searchText)) { collectionsToReturn = this.searchPipe.transform( collectionsToReturn, searchText, @@ -519,8 +525,13 @@ export class VaultComponent implements OnInit, OnDestroy { const filterFunction = createFilterFunction(filter); - if (await this.searchService.isSearchable(searchText)) { - return await this.searchService.searchCiphers(searchText, [filterFunction], ciphers); + if (await this.searchService.isSearchable(this.userId, searchText)) { + return await this.searchService.searchCiphers( + this.userId, + searchText, + [filterFunction], + ciphers, + ); } return ciphers.filter(filterFunction); @@ -628,12 +639,18 @@ export class VaultComponent implements OnInit, OnDestroy { combineLatest([ of(org), this.organizationApiService.getSubscription(org.id), - this.organizationBillingService.getPaymentSource(org.id), + from(this.organizationBillingService.getPaymentSource(org.id)).pipe( + catchError((error: unknown) => { + this.billingNotificationService.handleError(error); + return of(null); + }), + ), ]), ), - map(([org, sub, paymentSource]) => { - return this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues(org, sub, paymentSource); - }), + map(([org, sub, paymentSource]) => + this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues(org, sub, paymentSource), + ), + filter((result) => result !== null), ); this.resellerWarning$ = organization$.pipe( @@ -1169,7 +1186,8 @@ export class VaultComponent implements OnInit, OnDestroy { typeI18nKey = "password"; } else if (field === "totp") { aType = "TOTP"; - value = await this.totpService.getCode(cipher.login.totp); + const totpResponse = await firstValueFrom(this.totpService.getCode$(cipher.login.totp)); + value = totpResponse?.code; typeI18nKey = "verificationCodeTotp"; } else { this.toastService.showToast({ diff --git a/apps/web/src/app/admin-console/organizations/collections/vault.module.ts b/apps/web/src/app/admin-console/organizations/collections/vault.module.ts index 8a2f3fbc2f0..037a27cd781 100644 --- a/apps/web/src/app/admin-console/organizations/collections/vault.module.ts +++ b/apps/web/src/app/admin-console/organizations/collections/vault.module.ts @@ -2,11 +2,11 @@ import { NgModule } from "@angular/core"; import { LooseComponentsModule } from "../../../shared/loose-components.module"; import { SharedModule } from "../../../shared/shared.module"; -import { CollectionDialogModule } from "../../../vault/components/collection-dialog"; import { OrganizationBadgeModule } from "../../../vault/individual-vault/organization-badge/organization-badge.module"; import { ViewComponent } from "../../../vault/individual-vault/view.component"; +import { CollectionDialogComponent } from "../shared/components/collection-dialog"; -import { CollectionBadgeModule } from "./collection-badge/collection-badge.module"; +import { CollectionNameBadgeComponent } from "./collection-badge"; import { GroupBadgeModule } from "./group-badge/group-badge.module"; import { VaultRoutingModule } from "./vault-routing.module"; import { VaultComponent } from "./vault.component"; @@ -17,9 +17,9 @@ import { VaultComponent } from "./vault.component"; SharedModule, LooseComponentsModule, GroupBadgeModule, - CollectionBadgeModule, + CollectionNameBadgeComponent, OrganizationBadgeModule, - CollectionDialogModule, + CollectionDialogComponent, VaultComponent, ViewComponent, ], diff --git a/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.html b/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.html index 3151c303ec9..9fb8b245f72 100644 --- a/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.html +++ b/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.html @@ -9,7 +9,7 @@
    diff --git a/apps/web/src/app/admin-console/organizations/manage/groups.component.html b/apps/web/src/app/admin-console/organizations/manage/groups.component.html index 1254d48cc76..82ad2c36b8c 100644 --- a/apps/web/src/app/admin-console/organizations/manage/groups.component.html +++ b/apps/web/src/app/admin-console/organizations/manage/groups.component.html @@ -12,7 +12,7 @@ diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.html b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.html index 684c7971c1b..0b238c17d2f 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-status.component.html @@ -18,7 +18,9 @@ {{ item.user.email }} - {{ item.user.name }} + {{ + item.user.name + }} {{ item.message }} diff --git a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html index 44c9d8319cb..db7422bd34b 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/member-dialog/member-dialog.component.html @@ -12,7 +12,7 @@
    diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.html b/apps/web/src/app/admin-console/organizations/members/members.component.html index 52315d30177..f2995e31f12 100644 --- a/apps/web/src/app/admin-console/organizations/members/members.component.html +++ b/apps/web/src/app/admin-console/organizations/members/members.component.html @@ -48,7 +48,7 @@
    diff --git a/apps/web/src/app/admin-console/organizations/members/members.component.ts b/apps/web/src/app/admin-console/organizations/members/members.component.ts index df4517942f7..0bfdde8fc97 100644 --- a/apps/web/src/app/admin-console/organizations/members/members.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/members.component.ts @@ -663,9 +663,6 @@ export class MembersComponent extends BaseMembersComponent this.organization.id, filteredUsers.map((user) => user.id), ); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - // Bulk Status component open const dialogRef = BulkStatusComponent.open(this.dialogService, { data: { diff --git a/apps/web/src/app/admin-console/organizations/policies/password-generator.component.html b/apps/web/src/app/admin-console/organizations/policies/password-generator.component.html index fcf03d27acc..1300acee471 100644 --- a/apps/web/src/app/admin-console/organizations/policies/password-generator.component.html +++ b/apps/web/src/app/admin-console/organizations/policies/password-generator.component.html @@ -68,7 +68,11 @@ - {{ "specialCharactersLabel" | i18n }} + + {{ "!@#$%^&*" }}
    diff --git a/apps/web/src/app/admin-console/organizations/policies/policies.component.ts b/apps/web/src/app/admin-console/organizations/policies/policies.component.ts index 3354c7c5e11..52cb4da107a 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policies.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policies.component.ts @@ -25,7 +25,6 @@ import { PolicyEditComponent, PolicyEditDialogResult } from "./policy-edit.compo selector: "app-org-policies", templateUrl: "policies.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class PoliciesComponent implements OnInit { @ViewChild("editTemplate", { read: ViewContainerRef, static: true }) editModalRef: ViewContainerRef; diff --git a/apps/web/src/app/admin-console/organizations/settings/two-factor-setup.component.ts b/apps/web/src/app/admin-console/organizations/settings/two-factor-setup.component.ts index 323e5326a1c..7099b90baa8 100644 --- a/apps/web/src/app/admin-console/organizations/settings/two-factor-setup.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/two-factor-setup.component.ts @@ -31,7 +31,6 @@ import { TwoFactorVerifyComponent } from "../../../auth/settings/two-factor/two- selector: "app-two-factor-setup", templateUrl: "../../../auth/settings/two-factor/two-factor-setup.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent implements OnInit { tabbedHeader = false; constructor( diff --git a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html similarity index 99% rename from apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html rename to apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html index 61fc290f6fe..9188ba5ab96 100644 --- a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.html +++ b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html @@ -124,7 +124,7 @@ buttonType="primary" [disabled]="loading || dialogReadonly" > - {{ "save" | i18n }} + {{ buttonDisplayName | i18n }} diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 078884d9413..55e2595e0f7 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -2,11 +2,13 @@ // @ts-strict-ignore import { DOCUMENT } from "@angular/common"; import { Component, Inject, NgZone, OnDestroy, OnInit } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { NavigationEnd, Router } from "@angular/router"; import * as jq from "jquery"; import { Subject, filter, firstValueFrom, map, takeUntil, timeout } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; +import { DeviceTrustToastService } from "@bitwarden/angular/auth/services/device-trust-toast.service.abstraction"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; @@ -14,10 +16,10 @@ import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin- import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { VaultTimeoutService } from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; @@ -95,7 +97,10 @@ export class AppComponent implements OnDestroy, OnInit { private apiService: ApiService, private appIdService: AppIdService, private processReloadService: ProcessReloadServiceAbstraction, - ) {} + private deviceTrustToastService: DeviceTrustToastService, + ) { + this.deviceTrustToastService.setupListeners$.pipe(takeUntilDestroyed()).subscribe(); + } ngOnInit() { this.i18nService.locale$.pipe(takeUntil(this.destroy$)).subscribe((locale) => { @@ -173,8 +178,6 @@ export class AppComponent implements OnDestroy, OnInit { type: "success", }); if (premiumConfirmed) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises await this.router.navigate(["settings/subscription/premium"]); } break; @@ -309,7 +312,7 @@ export class AppComponent implements OnDestroy, OnInit { await this.stateEventRunnerService.handleEvent("logout", userId); - await this.searchService.clearIndex(); + await this.searchService.clearIndex(userId); this.authService.logOut(async () => { await this.stateService.clean({ userId: userId }); await this.accountService.clean(userId); @@ -359,12 +362,8 @@ export class AppComponent implements OnDestroy, OnInit { private idleStateChanged() { if (this.isIdle) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.disconnectFromInactivity(); } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.notificationsService.reconnectFromActivity(); } } diff --git a/apps/web/src/app/auth/hint.component.html b/apps/web/src/app/auth/hint.component.html deleted file mode 100644 index 9f4d76d8405..00000000000 --- a/apps/web/src/app/auth/hint.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
    - - {{ "emailAddress" | i18n }} - - {{ "enterEmailToGetHint" | i18n }} - -
    -
    - - - {{ "cancel" | i18n }} - -
    -
    diff --git a/apps/web/src/app/auth/hint.component.ts b/apps/web/src/app/auth/hint.component.ts deleted file mode 100644 index 5c180063084..00000000000 --- a/apps/web/src/app/auth/hint.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, OnInit } from "@angular/core"; -import { FormBuilder, Validators } from "@angular/forms"; -import { Router } from "@angular/router"; - -import { HintComponent as BaseHintComponent } from "@bitwarden/angular/auth/components/hint.component"; -import { LoginEmailServiceAbstraction } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -@Component({ - selector: "app-hint", - templateUrl: "hint.component.html", -}) -export class HintComponent extends BaseHintComponent implements OnInit { - formGroup = this.formBuilder.group({ - email: ["", [Validators.email, Validators.required]], - }); - - get emailFormControl() { - return this.formGroup.controls.email; - } - - constructor( - router: Router, - i18nService: I18nService, - apiService: ApiService, - platformUtilsService: PlatformUtilsService, - logService: LogService, - loginEmailService: LoginEmailServiceAbstraction, - private formBuilder: FormBuilder, - protected toastService: ToastService, - ) { - super( - router, - i18nService, - apiService, - platformUtilsService, - logService, - loginEmailService, - toastService, - ); - } - - async ngOnInit(): Promise { - await super.ngOnInit(); - this.emailFormControl.setValue(this.email); - } - - // Wrapper method to call super.submit() since properties (e.g., submit) cannot use super directly - // This is because properties are assigned per type and generally don't have access to the prototype - async superSubmit() { - await super.submit(); - } - - submit = async () => { - this.email = this.emailFormControl.value; - await this.superSubmit(); - }; -} diff --git a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.html b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.html deleted file mode 100644 index 615edb82d0c..00000000000 --- a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.html +++ /dev/null @@ -1,105 +0,0 @@ -
    -
    -
    - -
    - - -

    - - {{ "loading" | i18n }} -

    -
    - -
    - -

    {{ "loginInitiated" | i18n }}

    - -

    - {{ "deviceApprovalRequired" | i18n }} -

    - -
    - - - {{ "rememberThisDevice" | i18n }} - {{ "uncheckIfPublicDevice" | i18n }} - -
    - -
    - - - - - -
    -
    - - -

    {{ "loggedInExclamation" | i18n }}

    - -
    - - - {{ "rememberThisDevice" | i18n }} - {{ "uncheckIfPublicDevice" | i18n }} - -
    - - -
    - -
    - -
    -

    {{ "loggingInAs" | i18n }} {{ data.userEmail }}

    - {{ "notYou" | i18n }} -
    -
    -
    -
    diff --git a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.ts b/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.ts deleted file mode 100644 index 5eb72503b90..00000000000 --- a/apps/web/src/app/auth/login/login-decryption-options/login-decryption-options-v1.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, inject } from "@angular/core"; - -import { BaseLoginDecryptionOptionsComponentV1 } from "@bitwarden/angular/auth/components/base-login-decryption-options-v1.component"; - -import { RouterService } from "../../../core"; -import { AcceptOrganizationInviteService } from "../../organization-invite/accept-organization.service"; -@Component({ - selector: "web-login-decryption-options", - templateUrl: "login-decryption-options-v1.component.html", -}) -export class LoginDecryptionOptionsComponentV1 extends BaseLoginDecryptionOptionsComponentV1 { - protected routerService = inject(RouterService); - protected acceptOrganizationInviteService = inject(AcceptOrganizationInviteService); - - override async createUser(): Promise { - try { - await super.createUser(); - - // Invites from TDE orgs go through here, but the invite is - // accepted while being enrolled in admin recovery. So we need to clear - // the redirect and stored org invite. - await this.routerService.getAndClearLoginRedirectUrl(); - await this.acceptOrganizationInviteService.clearOrganizationInvitation(); - - await this.router.navigate(["/vault"]); - } catch (error) { - this.validationService.showError(error); - } - } - - createUserAction = async (): Promise => { - return this.createUser(); - }; -} diff --git a/apps/web/src/app/auth/login/login-v1.component.html b/apps/web/src/app/auth/login/login-v1.component.html deleted file mode 100644 index b41e55a03b0..00000000000 --- a/apps/web/src/app/auth/login/login-v1.component.html +++ /dev/null @@ -1,129 +0,0 @@ -
    - -
    - - {{ "emailAddress" | i18n }} - - -
    - -
    - - - {{ "rememberEmail" | i18n }} - -
    - -
    - -
    - -
    -

    {{ "or" | i18n }}

    - - - {{ "logInWithPasskey" | i18n }} - -
    - -
    - -

    - {{ "newAroundHere" | i18n }} - - - {{ "createAccount" | i18n }} - -

    -
    - -
    -
    - - {{ "masterPass" | i18n }} - - - - {{ "getMasterPasswordHint" | i18n }} -
    - -
    - -
    - -
    - -
    - -
    - -
    - - - -
    - -
    -

    {{ "loggingInAs" | i18n }} {{ loggedEmail }}

    - {{ "notYou" | i18n }} -
    -
    -
    diff --git a/apps/web/src/app/auth/login/login-v1.component.ts b/apps/web/src/app/auth/login/login-v1.component.ts deleted file mode 100644 index a3099d991d9..00000000000 --- a/apps/web/src/app/auth/login/login-v1.component.ts +++ /dev/null @@ -1,225 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, NgZone, OnInit } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { takeUntil } from "rxjs"; -import { first } from "rxjs/operators"; - -import { LoginComponentV1 as BaseLoginComponent } from "@bitwarden/angular/auth/components/login-v1.component"; -import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service"; -import { - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; -import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { PolicyData } from "@bitwarden/common/admin-console/models/data/policy.data"; -import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; -import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; -import { UserId } from "@bitwarden/common/types/guid"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { RouterService } from "../../core"; -import { AcceptOrganizationInviteService } from "../organization-invite/accept-organization.service"; -import { OrganizationInvite } from "../organization-invite/organization-invite"; - -@Component({ - selector: "app-login", - templateUrl: "login-v1.component.html", -}) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil -export class LoginComponentV1 extends BaseLoginComponent implements OnInit { - showResetPasswordAutoEnrollWarning = false; - enforcedPasswordPolicyOptions: MasterPasswordPolicyOptions; - policies: Policy[]; - - constructor( - private acceptOrganizationInviteService: AcceptOrganizationInviteService, - devicesApiService: DevicesApiServiceAbstraction, - appIdService: AppIdService, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - route: ActivatedRoute, - platformUtilsService: PlatformUtilsService, - environmentService: EnvironmentService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - private passwordStrengthService: PasswordStrengthServiceAbstraction, - cryptoFunctionService: CryptoFunctionService, - private policyApiService: PolicyApiServiceAbstraction, - private policyService: InternalPolicyService, - logService: LogService, - ngZone: NgZone, - protected stateService: StateService, - private routerService: RouterService, - formBuilder: FormBuilder, - formValidationErrorService: FormValidationErrorsService, - loginEmailService: LoginEmailServiceAbstraction, - ssoLoginService: SsoLoginServiceAbstraction, - toastService: ToastService, - ) { - super( - devicesApiService, - appIdService, - loginStrategyService, - router, - platformUtilsService, - i18nService, - stateService, - environmentService, - passwordGenerationService, - cryptoFunctionService, - logService, - ngZone, - formBuilder, - formValidationErrorService, - route, - loginEmailService, - ssoLoginService, - toastService, - ); - this.onSuccessfulLoginNavigate = this.goAfterLogIn; - } - - submitForm = async (showToast = true) => { - return await this.submitFormHelper(showToast); - }; - - private async submitFormHelper(showToast: boolean) { - await super.submit(showToast); - } - - async ngOnInit() { - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe - this.route.queryParams.pipe(first()).subscribe(async (qParams) => { - // If there is a query parameter called 'org', set previousUrl to `/create-organization?org=paramValue` - if (qParams.org != null) { - const route = this.router.createUrlTree(["create-organization"], { - queryParams: { plan: qParams.org }, - }); - this.routerService.setPreviousUrl(route.toString()); - } - - /** - * If there is a query parameter called 'sponsorshipToken', that means they are coming - * from an email for sponsoring a families organization. If so, then set the prevousUrl - * to `/setup/families-for-enterprise?token=paramValue` - */ - if (qParams.sponsorshipToken != null) { - const route = this.router.createUrlTree(["setup/families-for-enterprise"], { - queryParams: { token: qParams.sponsorshipToken }, - }); - this.routerService.setPreviousUrl(route.toString()); - } - - await super.ngOnInit(); - }); - - // If there's an existing org invite, use it to get the password policies - const orgInvite = await this.acceptOrganizationInviteService.getOrganizationInvite(); - if (orgInvite != null) { - await this.initPasswordPolicies(orgInvite); - } - } - - async goAfterLogIn(userId: UserId) { - const masterPassword = this.formGroup.value.masterPassword; - - // Check master password against policy - if (this.enforcedPasswordPolicyOptions != null) { - const strengthResult = this.passwordStrengthService.getPasswordStrength( - masterPassword, - this.formGroup.value.email, - ); - const masterPasswordScore = strengthResult == null ? null : strengthResult.score; - - // If invalid, save policies and require update - if ( - !this.policyService.evaluateMasterPassword( - masterPasswordScore, - masterPassword, - this.enforcedPasswordPolicyOptions, - ) - ) { - const policiesData: { [id: string]: PolicyData } = {}; - this.policies.map((p) => (policiesData[p.id] = PolicyData.fromPolicy(p))); - await this.policyService.replace(policiesData, userId); - await this.router.navigate(["update-password"]); - return; - } - } - - this.loginEmailService.clearValues(); - await this.router.navigate([this.successRoute]); - } - - async goToHint() { - await this.saveEmailSettings(); - await this.router.navigateByUrl("/hint"); - } - - async goToRegister() { - if (this.emailFormControl.valid) { - await this.router.navigate(["/signup"], { - queryParams: { email: this.emailFormControl.value }, - }); - return; - } - - await this.router.navigate(["/signup"]); - } - - protected override async handleMigrateEncryptionKey(result: AuthResult): Promise { - if (!result.requiresEncryptionKeyMigration) { - return false; - } - await this.router.navigate(["migrate-legacy-encryption"]); - return true; - } - - private async initPasswordPolicies(invite: OrganizationInvite): Promise { - try { - this.policies = await this.policyApiService.getPoliciesByToken( - invite.organizationId, - invite.token, - invite.email, - invite.organizationUserId, - ); - } catch (e) { - this.logService.error(e); - } - - if (this.policies == null) { - return; - } - - const resetPasswordPolicy = this.policyService.getResetPasswordPolicyOptions( - this.policies, - invite.organizationId, - ); - - // Set to true if policy enabled and auto-enroll enabled - this.showResetPasswordAutoEnrollWarning = - resetPasswordPolicy[1] && resetPasswordPolicy[0].autoEnrollEnabled; - - this.policyService - .masterPasswordPolicyOptions$(this.policies) - .pipe(takeUntil(this.destroy$)) - .subscribe((enforcedPasswordPolicyOptions) => { - this.enforcedPasswordPolicyOptions = enforcedPasswordPolicyOptions; - }); - } -} diff --git a/apps/web/src/app/auth/login/login-via-auth-request-v1.component.html b/apps/web/src/app/auth/login/login-via-auth-request-v1.component.html deleted file mode 100644 index ed157eb9cf4..00000000000 --- a/apps/web/src/app/auth/login/login-via-auth-request-v1.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
    -
    - - - -

    - {{ "loginOrCreateNewAccount" | i18n }} -

    - -
    -

    {{ "logInRequestSent" | i18n }}

    - -

    - {{ "notificationSentDeviceComplete" | i18n }} -

    - -
    -

    {{ "fingerprintPhraseHeader" | i18n }}

    -

    - {{ fingerprintPhrase }} -

    -
    - - - -
    - -
    - {{ "loginWithDeviceEnabledNote" | i18n }} - {{ "viewAllLoginOptions" | i18n }} -
    -
    -
    - - -
    -

    {{ "adminApprovalRequested" | i18n }}

    - -
    -

    {{ "adminApprovalRequestSentToAdmins" | i18n }}

    -

    {{ "youWillBeNotifiedOnceApproved" | i18n }}

    -
    - -
    -

    {{ "fingerprintPhraseHeader" | i18n }}

    -

    - {{ fingerprintPhrase }} -

    -
    - -
    - -
    - {{ "troubleLoggingIn" | i18n }} - {{ "viewAllLoginOptions" | i18n }} -
    -
    -
    -
    -
    diff --git a/apps/web/src/app/auth/login/login-via-auth-request-v1.component.ts b/apps/web/src/app/auth/login/login-via-auth-request-v1.component.ts deleted file mode 100644 index 8a8883e035b..00000000000 --- a/apps/web/src/app/auth/login/login-via-auth-request-v1.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from "@angular/core"; - -import { LoginViaAuthRequestComponentV1 as BaseLoginViaAuthRequestComponentV1 } from "@bitwarden/angular/auth/components/login-via-auth-request-v1.component"; - -@Component({ - selector: "app-login-via-auth-request", - templateUrl: "login-via-auth-request-v1.component.html", -}) -export class LoginViaAuthRequestComponentV1 extends BaseLoginViaAuthRequestComponentV1 {} diff --git a/apps/web/src/app/auth/login/login.module.ts b/apps/web/src/app/auth/login/login.module.ts index a33a6b8a5a8..9a99c84f727 100644 --- a/apps/web/src/app/auth/login/login.module.ts +++ b/apps/web/src/app/auth/login/login.module.ts @@ -4,24 +4,11 @@ import { CheckboxModule } from "@bitwarden/components"; import { SharedModule } from "../../../app/shared"; -import { LoginDecryptionOptionsComponentV1 } from "./login-decryption-options/login-decryption-options-v1.component"; -import { LoginComponentV1 } from "./login-v1.component"; -import { LoginViaAuthRequestComponentV1 } from "./login-via-auth-request-v1.component"; import { LoginViaWebAuthnComponent } from "./login-via-webauthn/login-via-webauthn.component"; @NgModule({ imports: [SharedModule, CheckboxModule], - declarations: [ - LoginComponentV1, - LoginViaAuthRequestComponentV1, - LoginDecryptionOptionsComponentV1, - LoginViaWebAuthnComponent, - ], - exports: [ - LoginComponentV1, - LoginViaAuthRequestComponentV1, - LoginDecryptionOptionsComponentV1, - LoginViaWebAuthnComponent, - ], + declarations: [LoginViaWebAuthnComponent], + exports: [LoginViaWebAuthnComponent], }) export class LoginModule {} diff --git a/apps/web/src/app/auth/recover-two-factor.component.spec.ts b/apps/web/src/app/auth/recover-two-factor.component.spec.ts index 40182dee017..bf6d47e09e5 100644 --- a/apps/web/src/app/auth/recover-two-factor.component.spec.ts +++ b/apps/web/src/app/auth/recover-two-factor.component.spec.ts @@ -9,7 +9,6 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; -import { TwoFactorRecoveryRequest } from "@bitwarden/common/auth/models/request/two-factor-recovery.request"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -85,15 +84,14 @@ describe("RecoverTwoFactorComponent", () => { describe("handleRecoveryLogin", () => { it("should log in successfully and navigate to the two-factor settings page", async () => { // Arrange - const request = new TwoFactorRecoveryRequest(); - request.recoveryCode = "testRecoveryCode"; - request.email = "test@example.com"; + const email = "test@example.com"; + const recoveryCode = "testRecoveryCode"; const authResult = new AuthResult(); mockLoginStrategyService.logIn.mockResolvedValue(authResult); // Act - await component["handleRecoveryLogin"](request); + await component["loginWithRecoveryCode"](email, recoveryCode); // Assert expect(mockLoginStrategyService.logIn).toHaveBeenCalledWith( @@ -112,15 +110,14 @@ describe("RecoverTwoFactorComponent", () => { it("should handle login errors and redirect to login page", async () => { // Arrange - const request = new TwoFactorRecoveryRequest(); - request.recoveryCode = "testRecoveryCode"; - request.email = "test@example.com"; + const email = "test@example.com"; + const recoveryCode = "testRecoveryCode"; const error = new Error("Login failed"); mockLoginStrategyService.logIn.mockRejectedValue(error); // Act - await component["handleRecoveryLogin"](request); + await component["loginWithRecoveryCode"](email, recoveryCode); // Assert expect(mockLogService.error).toHaveBeenCalledWith( @@ -128,7 +125,7 @@ describe("RecoverTwoFactorComponent", () => { error.message, ); expect(mockRouter.navigate).toHaveBeenCalledWith(["/login"], { - queryParams: { email: request.email }, + queryParams: { email: email }, }); }); }); diff --git a/apps/web/src/app/auth/recover-two-factor.component.ts b/apps/web/src/app/auth/recover-two-factor.component.ts index 996b324ce56..35aa1aab7c1 100644 --- a/apps/web/src/app/auth/recover-two-factor.component.ts +++ b/apps/web/src/app/auth/recover-two-factor.component.ts @@ -7,17 +7,11 @@ import { PasswordLoginCredentials, LoginSuccessHandlerService, } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; -import { TwoFactorRecoveryRequest } from "@bitwarden/common/auth/models/request/two-factor-recovery.request"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; import { NewDeviceVerificationNoticeService } from "@bitwarden/vault"; @Component({ @@ -36,32 +30,18 @@ export class RecoverTwoFactorComponent implements OnInit { */ recoveryCodeMessage = ""; - /** - * Whether the recovery code login feature flag is enabled - */ - private recoveryCodeLoginFeatureFlagEnabled = false; - constructor( private router: Router, - private apiService: ApiService, - private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, - private keyService: KeyService, private loginStrategyService: LoginStrategyServiceAbstraction, private toastService: ToastService, - private configService: ConfigService, private loginSuccessHandlerService: LoginSuccessHandlerService, private logService: LogService, private newDeviceVerificationNoticeService: NewDeviceVerificationNoticeService, ) {} async ngOnInit() { - this.recoveryCodeLoginFeatureFlagEnabled = await this.configService.getFeatureFlag( - FeatureFlag.RecoveryCodeLogin, - ); - this.recoveryCodeMessage = this.recoveryCodeLoginFeatureFlagEnabled - ? this.i18nService.t("logInBelowUsingYourSingleUseRecoveryCode") - : this.i18nService.t("recoverAccountTwoStepDesc"); + this.recoveryCodeMessage = this.i18nService.t("logInBelowUsingYourSingleUseRecoveryCode"); } get email(): string { @@ -85,38 +65,25 @@ export class RecoverTwoFactorComponent implements OnInit { return; } - const request = new TwoFactorRecoveryRequest(); - request.recoveryCode = this.recoveryCode.replace(/\s/g, "").toLowerCase(); - request.email = this.email.trim().toLowerCase(); - const key = await this.loginStrategyService.makePreloginKey(this.masterPassword, request.email); - request.masterPasswordHash = await this.keyService.hashMasterKey(this.masterPassword, key); + const email = this.email.trim().toLowerCase(); + const recoveryCode = this.recoveryCode.replace(/\s/g, "").toLowerCase(); - if (this.recoveryCodeLoginFeatureFlagEnabled) { - await this.handleRecoveryLogin(request); - } else { - await this.apiService.postTwoFactorRecover(request); - this.toastService.showToast({ - variant: "success", - title: "", - message: this.i18nService.t("twoStepRecoverDisabled"), - }); - await this.router.navigate(["/"]); - } + await this.loginWithRecoveryCode(email, recoveryCode); }; /** * Handles the login process after a successful account recovery. */ - private async handleRecoveryLogin(request: TwoFactorRecoveryRequest) { + private async loginWithRecoveryCode(email: string, recoveryCode: string) { // Build two-factor request to pass into PasswordLoginCredentials request using the 2FA recovery code and RecoveryCode type const twoFactorRequest: TokenTwoFactorRequest = { provider: TwoFactorProviderType.RecoveryCode, - token: request.recoveryCode, + token: recoveryCode, remember: false, }; const credentials = new PasswordLoginCredentials( - request.email, + email, this.masterPassword, "", twoFactorRequest, @@ -148,7 +115,7 @@ export class RecoverTwoFactorComponent implements OnInit { } catch (error) { // If login errors, redirect to login page per product. Don't show error this.logService.error("Error logging in automatically: ", (error as Error).message); - await this.router.navigate(["/login"], { queryParams: { email: request.email } }); + await this.router.navigate(["/login"], { queryParams: { email: email } }); } } } diff --git a/apps/web/src/app/auth/settings/change-password.component.ts b/apps/web/src/app/auth/settings/change-password.component.ts index eb98f7fde07..5f061dd1e2a 100644 --- a/apps/web/src/app/auth/settings/change-password.component.ts +++ b/apps/web/src/app/auth/settings/change-password.component.ts @@ -5,14 +5,14 @@ import { Router } from "@angular/router"; import { firstValueFrom, map } from "rxjs"; import { ChangePasswordComponent as BaseChangePasswordComponent } from "@bitwarden/angular/auth/components/change-password.component"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { PasswordRequest } from "@bitwarden/common/auth/models/request/password.request"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -50,7 +50,7 @@ export class ChangePasswordComponent private auditService: AuditService, private cipherService: CipherService, private syncService: SyncService, - private apiService: ApiService, + private masterPasswordApiService: MasterPasswordApiService, private router: Router, dialogService: DialogService, private userVerificationService: UserVerificationService, @@ -213,14 +213,14 @@ export class ChangePasswordComponent try { if (this.rotateUserKey) { - this.formPromise = this.apiService.postPassword(request).then(async () => { + this.formPromise = this.masterPasswordApiService.postPassword(request).then(async () => { // we need to save this for local masterkey verification during rotation await this.masterPasswordService.setMasterKeyHash(newLocalKeyHash, userId as UserId); await this.masterPasswordService.setMasterKey(newMasterKey, userId as UserId); return this.updateKey(); }); } else { - this.formPromise = this.apiService.postPassword(request); + this.formPromise = this.masterPasswordApiService.postPassword(request); } await this.formPromise; diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts index 83bdfffbe4f..dc464c18059 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.ts @@ -43,7 +43,6 @@ import { selector: "emergency-access", templateUrl: "emergency-access.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class EmergencyAccessComponent implements OnInit { @ViewChild("addEdit", { read: ViewContainerRef, static: true }) addEditModalRef: ViewContainerRef; @ViewChild("takeoverTemplate", { read: ViewContainerRef, static: true }) diff --git a/apps/web/src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.ts b/apps/web/src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.ts index 5747386cf84..68f439d34a4 100644 --- a/apps/web/src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/takeover/emergency-access-takeover.component.ts @@ -8,7 +8,7 @@ import { takeUntil } from "rxjs"; import { ChangePasswordComponent } from "@bitwarden/angular/auth/components/change-password.component"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -33,7 +33,6 @@ type EmergencyAccessTakeoverDialogData = { selector: "emergency-access-takeover", templateUrl: "emergency-access-takeover.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class EmergencyAccessTakeoverComponent extends ChangePasswordComponent implements OnInit, OnDestroy @@ -86,7 +85,6 @@ export class EmergencyAccessTakeoverComponent .subscribe((enforcedPolicyOptions) => (this.enforcedPolicyOptions = enforcedPolicyOptions)); } - // eslint-disable-next-line rxjs-angular/prefer-takeuntil ngOnDestroy(): void { super.ngOnDestroy(); } diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts index dc283c99315..1e3d0cf705f 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts @@ -18,7 +18,6 @@ import { EmergencyViewDialogComponent } from "./emergency-view-dialog.component" templateUrl: "emergency-access-view.component.html", providers: [{ provide: CipherFormConfigService, useClass: DefaultCipherFormConfigService }], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class EmergencyAccessViewComponent implements OnInit { @ViewChild("attachments", { read: ViewContainerRef, static: true }) attachmentsModalRef: ViewContainerRef; diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.ts b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.ts index 0ca892b40bf..d2a6389806d 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.ts @@ -9,7 +9,13 @@ import { ViewPasswordHistoryService } from "@bitwarden/common/vault/abstractions import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { ButtonModule, DialogModule, DialogService } from "@bitwarden/components"; -import { CipherViewComponent, DefaultTaskService, TaskService } from "@bitwarden/vault"; +import { + ChangeLoginPasswordService, + CipherViewComponent, + DefaultChangeLoginPasswordService, + DefaultTaskService, + TaskService, +} from "@bitwarden/vault"; import { WebViewPasswordHistoryService } from "../../../../vault/services/web-view-password-history.service"; @@ -34,6 +40,7 @@ class PremiumUpgradePromptNoop implements PremiumUpgradePromptService { { provide: ViewPasswordHistoryService, useClass: WebViewPasswordHistoryService }, { provide: PremiumUpgradePromptService, useClass: PremiumUpgradePromptNoop }, { provide: TaskService, useClass: DefaultTaskService }, + { provide: ChangeLoginPasswordService, useClass: DefaultChangeLoginPasswordService }, ], }) export class EmergencyViewDialogComponent { diff --git a/apps/web/src/app/auth/settings/security/device-management.component.ts b/apps/web/src/app/auth/settings/security/device-management.component.ts index 97107cc0c0b..0f31b8d4639 100644 --- a/apps/web/src/app/auth/settings/security/device-management.component.ts +++ b/apps/web/src/app/auth/settings/security/device-management.component.ts @@ -180,8 +180,20 @@ export class DeviceManagementComponent { private updateDeviceTable(devices: Array): void { this.dataSource.data = devices .map((device: DeviceView): DeviceTableData | null => { - if (!device.id || !device.type || !device.creationDate) { - this.validationService.showError(new Error("Invalid device data")); + if (device.id == undefined) { + this.validationService.showError(new Error(this.i18nService.t("deviceIdMissing"))); + return null; + } + + if (device.type == undefined) { + this.validationService.showError(new Error(this.i18nService.t("deviceTypeMissing"))); + return null; + } + + if (device.creationDate == undefined) { + this.validationService.showError( + new Error(this.i18nService.t("deviceCreationDateMissing")), + ); return null; } diff --git a/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts b/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts index a76505930d4..83c9ff23f3c 100644 --- a/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts +++ b/apps/web/src/app/auth/settings/two-factor/two-factor-setup.component.ts @@ -29,7 +29,6 @@ import { TwoFactorProviders } from "@bitwarden/common/auth/services/two-factor.s import { AuthResponse } from "@bitwarden/common/auth/types/auth-response"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ProductTierType } from "@bitwarden/common/billing/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -85,12 +84,7 @@ export class TwoFactorSetupComponent implements OnInit, OnDestroy { } async ngOnInit() { - const recoveryCodeLoginFeatureFlagEnabled = await this.configService.getFeatureFlag( - FeatureFlag.RecoveryCodeLogin, - ); - this.recoveryCodeWarningMessage = recoveryCodeLoginFeatureFlagEnabled - ? this.i18nService.t("yourSingleUseRecoveryCode") - : this.i18nService.t("twoStepLoginRecoveryWarning"); + this.recoveryCodeWarningMessage = this.i18nService.t("yourSingleUseRecoveryCode"); for (const key in TwoFactorProviders) { // eslint-disable-next-line diff --git a/apps/web/src/app/auth/sso-v1.component.ts b/apps/web/src/app/auth/sso-v1.component.ts index 8699ecf7b24..d664f5b890b 100644 --- a/apps/web/src/app/auth/sso-v1.component.ts +++ b/apps/web/src/app/auth/sso-v1.component.ts @@ -16,10 +16,10 @@ import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/admin-console/ import { OrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain-sso-details.response"; import { VerifiedOrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/verified-organization-domain-sso-details.response"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { HttpStatusCode } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -37,7 +37,6 @@ import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legac selector: "app-sso", templateUrl: "sso-v1.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class SsoComponentV1 extends BaseSsoComponent implements OnInit { protected formGroup = new FormGroup({ identifier: new FormControl(null, [Validators.required]), diff --git a/apps/web/src/app/auth/two-factor-v1.component.ts b/apps/web/src/app/auth/two-factor-v1.component.ts index adaa735eca7..9a9fab02de3 100644 --- a/apps/web/src/app/auth/two-factor-v1.component.ts +++ b/apps/web/src/app/auth/two-factor-v1.component.ts @@ -14,10 +14,10 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; @@ -37,7 +37,6 @@ import { selector: "app-two-factor", templateUrl: "two-factor-v1.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class TwoFactorComponentV1 extends BaseTwoFactorComponent implements OnInit, OnDestroy { @ViewChild("twoFactorOptions", { read: ViewContainerRef, static: true }) twoFactorOptionsModal: ViewContainerRef; diff --git a/apps/web/src/app/auth/verify-email-token.component.ts b/apps/web/src/app/auth/verify-email-token.component.ts index 4ed5369773a..55569f44c10 100644 --- a/apps/web/src/app/auth/verify-email-token.component.ts +++ b/apps/web/src/app/auth/verify-email-token.component.ts @@ -16,7 +16,6 @@ import { ToastService } from "@bitwarden/components"; selector: "app-verify-email-token", templateUrl: "verify-email-token.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class VerifyEmailTokenComponent implements OnInit { constructor( private router: Router, diff --git a/apps/web/src/app/auth/verify-recover-delete.component.ts b/apps/web/src/app/auth/verify-recover-delete.component.ts index 725f012bf5e..8d95dd01b77 100644 --- a/apps/web/src/app/auth/verify-recover-delete.component.ts +++ b/apps/web/src/app/auth/verify-recover-delete.component.ts @@ -15,7 +15,6 @@ import { ToastService } from "@bitwarden/components"; selector: "app-verify-recover-delete", templateUrl: "verify-recover-delete.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class VerifyRecoverDeleteComponent implements OnInit { email: string; diff --git a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts index d4ade25aa1d..536e7b7020e 100644 --- a/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts +++ b/apps/web/src/app/billing/organizations/change-plan-dialog.component.ts @@ -58,6 +58,7 @@ import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.serv import { DialogService, ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; +import { BillingNotificationService } from "../services/billing-notification.service"; import { BillingSharedModule } from "../shared/billing-shared.module"; import { PaymentComponent } from "../shared/payment/payment.component"; @@ -208,6 +209,7 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy { private taxService: TaxServiceAbstraction, private accountService: AccountService, private organizationBillingService: OrganizationBillingService, + private billingNotificationService: BillingNotificationService, ) {} async ngOnInit(): Promise { @@ -228,10 +230,14 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy { .organizations$(userId) .pipe(getOrganizationById(this.organizationId)), ); - const { accountCredit, paymentSource } = - await this.billingApiService.getOrganizationPaymentMethod(this.organizationId); - this.accountCredit = accountCredit; - this.paymentSource = paymentSource; + try { + const { accountCredit, paymentSource } = + await this.billingApiService.getOrganizationPaymentMethod(this.organizationId); + this.accountCredit = accountCredit; + this.paymentSource = paymentSource; + } catch (error) { + this.billingNotificationService.handleError(error); + } } if (!this.selfHosted) { diff --git a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html index 062b3c05eb8..385d9b8ae1a 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.html @@ -7,55 +7,7 @@ - - - {{ "subscriptionCanceled" | i18n }} - -

    {{ "subscriptionPendingCanceled" | i18n }}

    - -
    - -
    -
    {{ "billingPlan" | i18n }}
    -
    {{ sub.plan.name }}
    - -
    {{ "status" | i18n }}
    -
    - {{ - isSponsoredSubscription ? "sponsored" : subscription.status || "-" - }} - {{ - "pendingCancellation" | i18n - }} -
    -
    - {{ "subscriptionExpiration" | i18n }} -
    -
    - {{ nextInvoice ? (sub.subscription.periodEndDate | date: "mediumDate") : "-" }} -
    -
    -
    -
    diff --git a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts index 50c755af63b..f20d447b093 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts +++ b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Component, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { firstValueFrom, lastValueFrom, Observable, Subject } from "rxjs"; +import { firstValueFrom, lastValueFrom, Subject } from "rxjs"; import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; @@ -22,7 +22,6 @@ import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstract import { PlanType, ProductTierType } from "@bitwarden/common/billing/enums"; import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response"; import { BillingSubscriptionItemResponse } from "@bitwarden/common/billing/models/response/subscription.response"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -60,7 +59,6 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy showSecretsManagerSubscribe = false; loading = true; locale: string; - showUpdatedSubscriptionStatusSection$: Observable; preSelectedProductTier: ProductTierType = ProductTierType.Free; showSubscription = true; showSelfHost = false; @@ -72,8 +70,6 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy private destroy$ = new Subject(); - private seatsRemainingMessage: string; - constructor( private apiService: ApiService, private i18nService: I18nService, @@ -96,10 +92,6 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy ]; await this.load(); - this.showUpdatedSubscriptionStatusSection$ = this.configService.getFeatureFlag$( - FeatureFlag.AC1795_UpdatedSubscriptionStatusSection, - ); - if ( this.route.snapshot.queryParams[OrganizationSubscriptionCloudComponent.QUERY_PARAM_UPGRADE] ) { diff --git a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html index acbb8863c70..471912f83ab 100644 --- a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html +++ b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.html @@ -2,7 +2,7 @@ - + {{ "loading" | i18n }} @@ -66,7 +66,7 @@
    -

    +

    {{ "licenseAndBillingManagement" | i18n }}

    => { this.loading = true; - const { accountCredit, paymentSource, subscriptionStatus } = - await this.billingApiService.getOrganizationPaymentMethod(this.organizationId); - this.accountCredit = accountCredit; - this.paymentSource = paymentSource; - this.subscriptionStatus = subscriptionStatus; + try { + const { accountCredit, paymentSource, subscriptionStatus } = + await this.billingApiService.getOrganizationPaymentMethod(this.organizationId); + this.accountCredit = accountCredit; + this.paymentSource = paymentSource; + this.subscriptionStatus = subscriptionStatus; - if (this.organizationId) { - const organizationSubscriptionPromise = this.organizationApiService.getSubscription( - this.organizationId, - ); - const userId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - const organizationPromise = await firstValueFrom( - this.organizationService - .organizations$(userId) - .pipe(getOrganizationById(this.organizationId)), - ); + if (this.organizationId) { + const organizationSubscriptionPromise = this.organizationApiService.getSubscription( + this.organizationId, + ); + const userId = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.id)), + ); + const organizationPromise = await firstValueFrom( + this.organizationService + .organizations$(userId) + .pipe(getOrganizationById(this.organizationId)), + ); - [this.organizationSubscriptionResponse, this.organization] = await Promise.all([ - organizationSubscriptionPromise, - organizationPromise, - ]); - this.freeTrialData = this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues( - this.organization, - this.organizationSubscriptionResponse, - paymentSource, - ); + [this.organizationSubscriptionResponse, this.organization] = await Promise.all([ + organizationSubscriptionPromise, + organizationPromise, + ]); + this.freeTrialData = this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues( + this.organization, + this.organizationSubscriptionResponse, + paymentSource, + ); + } + this.isUnpaid = this.subscriptionStatus === "unpaid" ?? false; + // If the flag `launchPaymentModalAutomatically` is set to true, + // we schedule a timeout (delay of 800ms) to automatically launch the payment modal. + // This delay ensures that any prior UI/rendering operations complete before triggering the modal. + if (this.launchPaymentModalAutomatically) { + window.setTimeout(async () => { + await this.changePayment(); + this.launchPaymentModalAutomatically = false; + this.location.replaceState(this.location.path(), "", {}); + }, 800); + } + } catch (error) { + this.billingNotificationService.handleError(error); + } finally { + this.loading = false; } - this.isUnpaid = this.subscriptionStatus === "unpaid" ?? false; - // If the flag `launchPaymentModalAutomatically` is set to true, - // we schedule a timeout (delay of 800ms) to automatically launch the payment modal. - // This delay ensures that any prior UI/rendering operations complete before triggering the modal. - if (this.launchPaymentModalAutomatically) { - window.setTimeout(async () => { - await this.changePayment(); - this.launchPaymentModalAutomatically = false; - this.location.replaceState(this.location.path(), "", {}); - }, 800); - } - this.loading = false; }; protected updatePaymentMethod = async (): Promise => { diff --git a/apps/web/src/app/billing/services/billing-notification.service.spec.ts b/apps/web/src/app/billing/services/billing-notification.service.spec.ts new file mode 100644 index 00000000000..d3a4d461574 --- /dev/null +++ b/apps/web/src/app/billing/services/billing-notification.service.spec.ts @@ -0,0 +1,76 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ToastService } from "@bitwarden/components"; + +import { BillingNotificationService } from "./billing-notification.service"; + +describe("BillingNotificationService", () => { + let service: BillingNotificationService; + let logService: MockProxy; + let toastService: MockProxy; + + beforeEach(() => { + logService = mock(); + toastService = mock(); + service = new BillingNotificationService(logService, toastService); + }); + + describe("handleError", () => { + it("should log error and show toast for ErrorResponse", () => { + const error = new ErrorResponse(["test error"], 400); + + expect(() => service.handleError(error)).toThrow(); + expect(logService.error).toHaveBeenCalledWith(error); + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "error", + title: "", + message: error.getSingleMessage(), + }); + }); + + it("shows error toast with the provided error", () => { + const error = new ErrorResponse(["test error"], 400); + + expect(() => service.handleError(error, "Test Title")).toThrow(); + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "error", + title: "Test Title", + message: error.getSingleMessage(), + }); + }); + + it("should only log error for non-ErrorResponse", () => { + const error = new Error("test error"); + + expect(() => service.handleError(error)).toThrow(); + expect(logService.error).toHaveBeenCalledWith(error); + expect(toastService.showToast).not.toHaveBeenCalled(); + }); + }); + + describe("showSuccess", () => { + it("shows success toast with default title when provided title is empty", () => { + const message = "test message"; + service.showSuccess(message); + + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "success", + title: "", + message, + }); + }); + + it("should show success toast with custom title", () => { + const message = "test message"; + service.showSuccess(message, "Success Title"); + + expect(toastService.showToast).toHaveBeenCalledWith({ + variant: "success", + title: "Success Title", + message, + }); + }); + }); +}); diff --git a/apps/web/src/app/billing/services/billing-notification.service.ts b/apps/web/src/app/billing/services/billing-notification.service.ts new file mode 100644 index 00000000000..6695e516ca8 --- /dev/null +++ b/apps/web/src/app/billing/services/billing-notification.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from "@angular/core"; + +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { ToastService } from "@bitwarden/components"; + +@Injectable({ + providedIn: "root", +}) +export class BillingNotificationService { + constructor( + private logService: LogService, + private toastService: ToastService, + ) {} + + handleError(error: unknown, title: string = "") { + this.logService.error(error); + if (error instanceof ErrorResponse) { + this.toastService.showToast({ + variant: "error", + title: title, + message: error.getSingleMessage(), + }); + } + throw error; + } + + showSuccess(message: string, title: string = "") { + this.toastService.showToast({ + variant: "success", + title: title, + message: message, + }); + } +} diff --git a/apps/web/src/app/billing/services/billing-services.module.ts b/apps/web/src/app/billing/services/billing-services.module.ts index 7412d47c79c..56b906cdaae 100644 --- a/apps/web/src/app/billing/services/billing-services.module.ts +++ b/apps/web/src/app/billing/services/billing-services.module.ts @@ -1,4 +1,8 @@ import { NgModule } from "@angular/core"; -@NgModule({}) +import { BillingNotificationService } from "./billing-notification.service"; + +@NgModule({ + providers: [BillingNotificationService], +}) export class BillingServicesModule {} diff --git a/apps/web/src/app/billing/services/free-families-policy.service.ts b/apps/web/src/app/billing/services/free-families-policy.service.ts index 10d7a9c6590..da569ffc993 100644 --- a/apps/web/src/app/billing/services/free-families-policy.service.ts +++ b/apps/web/src/app/billing/services/free-families-policy.service.ts @@ -7,7 +7,6 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; interface EnterpriseOrgStatus { isFreeFamilyPolicyEnabled: boolean; @@ -27,19 +26,8 @@ export class FreeFamiliesPolicyService { private policyService: PolicyService, private organizationService: OrganizationService, private accountService: AccountService, - private configService: ConfigService, ) {} - canManageSponsorships$ = this.accountService.activeAccount$.pipe( - switchMap((account) => { - if (account?.id) { - return this.organizationService.canManageSponsorships$(account?.id); - } else { - return of(); - } - }), - ); - organizations$ = this.accountService.activeAccount$.pipe( switchMap((account) => { if (account?.id) { @@ -57,22 +45,21 @@ export class FreeFamiliesPolicyService { private getFreeFamiliesVisibility$(): Observable { return combineLatest([ this.checkEnterpriseOrganizationsAndFetchPolicy(), - this.canManageSponsorships$, + this.organizations$, ]).pipe( - map(([orgStatus, canManageSponsorships]) => - this.shouldShowFreeFamilyLink(orgStatus, canManageSponsorships), - ), + map(([orgStatus, organizations]) => this.shouldShowFreeFamilyLink(orgStatus, organizations)), ); } private shouldShowFreeFamilyLink( orgStatus: EnterpriseOrgStatus | null, - canManageSponsorships: boolean, + organizations: Organization[], ): boolean { if (!orgStatus) { return false; } const { belongToOneEnterpriseOrgs, isFreeFamilyPolicyEnabled } = orgStatus; + const canManageSponsorships = organizations.filter((org) => org.canManageSponsorships); return canManageSponsorships && !(belongToOneEnterpriseOrgs && isFreeFamilyPolicyEnabled); } diff --git a/apps/web/src/app/billing/settings/sponsored-families.component.html b/apps/web/src/app/billing/settings/sponsored-families.component.html index a712a8456d6..12e942aaf18 100644 --- a/apps/web/src/app/billing/settings/sponsored-families.component.html +++ b/apps/web/src/app/billing/settings/sponsored-families.component.html @@ -2,7 +2,7 @@ - + {{ "loading" | i18n }} diff --git a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog.component.html b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog.component.html index 4f7990f11a3..4409ab56d60 100644 --- a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog.component.html +++ b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog.component.html @@ -2,7 +2,7 @@ { this.taxInformation = new TaxInformation(); }); + } else if (this.providerId) { + this.billingApiService + .getProviderTaxInformation(this.providerId) + .then((response) => (this.taxInformation = TaxInformation.from(response))) + .catch(() => { + this.taxInformation = new TaxInformation(); + }); } else { this.apiService .getTaxInfo() @@ -104,10 +114,12 @@ export class AdjustPaymentDialogComponent implements OnInit { } try { - if (!this.organizationId) { - await this.updatePremiumUserPaymentMethod(); - } else { + if (this.organizationId) { await this.updateOrganizationPaymentMethod(); + } else if (this.providerId) { + await this.updateProviderPaymentMethod(); + } else { + await this.updatePremiumUserPaymentMethod(); } this.toastService.showToast({ @@ -137,20 +149,6 @@ export class AdjustPaymentDialogComponent implements OnInit { await this.billingApiService.updateOrganizationPaymentMethod(this.organizationId, request); }; - protected get showTaxIdField(): boolean { - if (!this.organizationId) { - return false; - } - - switch (this.productTier) { - case ProductTierType.Free: - case ProductTierType.Families: - return false; - default: - return true; - } - } - private updatePremiumUserPaymentMethod = async () => { const { type, token } = await this.paymentComponent.tokenize(); @@ -168,6 +166,30 @@ export class AdjustPaymentDialogComponent implements OnInit { await this.apiService.postAccountPayment(request); }; + private updateProviderPaymentMethod = async () => { + const paymentSource = await this.paymentComponent.tokenize(); + + const request = new UpdatePaymentMethodRequest(); + request.paymentSource = paymentSource; + request.taxInformation = ExpandedTaxInfoUpdateRequest.From(this.taxInformation); + + await this.billingApiService.updateProviderPaymentMethod(this.providerId, request); + }; + + protected get showTaxIdField(): boolean { + if (this.organizationId) { + switch (this.productTier) { + case ProductTierType.Free: + case ProductTierType.Families: + return false; + default: + return true; + } + } else { + return !!this.providerId; + } + } + static open = ( dialogService: DialogService, dialogConfig: DialogConfig, diff --git a/apps/web/src/app/billing/shared/payment-method.component.ts b/apps/web/src/app/billing/shared/payment-method.component.ts index dc031ade42f..113a0eab6ca 100644 --- a/apps/web/src/app/billing/shared/payment-method.component.ts +++ b/apps/web/src/app/billing/shared/payment-method.component.ts @@ -36,7 +36,6 @@ import { @Component({ templateUrl: "payment-method.component.html", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class PaymentMethodComponent implements OnInit, OnDestroy { loading = false; firstLoaded = false; diff --git a/apps/web/src/app/billing/shared/tax-info.component.ts b/apps/web/src/app/billing/shared/tax-info.component.ts index a987ed8d489..74e2ab35cb9 100644 --- a/apps/web/src/app/billing/shared/tax-info.component.ts +++ b/apps/web/src/app/billing/shared/tax-info.component.ts @@ -24,7 +24,6 @@ import { SharedModule } from "../../shared"; standalone: true, imports: [SharedModule], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class TaxInfoComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); @@ -91,7 +90,7 @@ export class TaxInfoComponent implements OnInit, OnDestroy { async ngOnInit() { // Provider setup - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe + // eslint-disable-next-line rxjs-angular/prefer-takeuntil this.route.queryParams.subscribe((params) => { this.providerId = params.providerId; }); diff --git a/apps/web/src/app/core/core.module.ts b/apps/web/src/app/core/core.module.ts index c835e504b5a..cc1e481d39b 100644 --- a/apps/web/src/app/core/core.module.ts +++ b/apps/web/src/app/core/core.module.ts @@ -50,17 +50,17 @@ import { import { AccountApiService as AccountApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/account-api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { ClientType } from "@bitwarden/common/enums"; import { ProcessReloadServiceAbstraction } from "@bitwarden/common/key-management/abstractions/process-reload.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeout, VaultTimeoutStringType, } from "@bitwarden/common/key-management/vault-timeout"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService, @@ -74,7 +74,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service"; -import { ThemeType } from "@bitwarden/common/platform/enums"; +import { ThemeTypes } from "@bitwarden/common/platform/enums"; // eslint-disable-next-line no-restricted-imports -- Needed for DI import { UnsupportedWebPushConnectionService, @@ -82,7 +82,6 @@ import { } from "@bitwarden/common/platform/notifications/internal"; import { AppIdService as DefaultAppIdService } from "@bitwarden/common/platform/services/app-id.service"; import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service"; -// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service"; import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner"; import { DefaultSdkClientFactory } from "@bitwarden/common/platform/services/sdk/default-sdk-client-factory"; @@ -98,6 +97,7 @@ import { DefaultThemeStateService, ThemeStateService, } from "@bitwarden/common/platform/theming/theme-state.service"; +import { DialogService, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { KdfConfigService, @@ -105,6 +105,7 @@ import { BiometricsService, } from "@bitwarden/key-management"; import { LockComponentService } from "@bitwarden/key-management-ui"; +import { DefaultSshImportPromptService, SshImportPromptService } from "@bitwarden/vault"; import { flagEnabled } from "../../utils/flags"; import { PolicyListService } from "../admin-console/core/policy-list.service"; @@ -236,10 +237,10 @@ const safeProviders: SafeProvider[] = [ }), safeProvider({ provide: ThemeStateService, - useFactory: (globalStateProvider: GlobalStateProvider, configService: ConfigService) => + useFactory: (globalStateProvider: GlobalStateProvider) => // Web chooses to have Light as the default theme - new DefaultThemeStateService(globalStateProvider, configService, ThemeType.Light), - deps: [GlobalStateProvider, ConfigService], + new DefaultThemeStateService(globalStateProvider, ThemeTypes.Light), + deps: [GlobalStateProvider], }), safeProvider({ provide: CLIENT_TYPE, @@ -279,6 +280,7 @@ const safeProviders: SafeProvider[] = [ useClass: WebSetPasswordJitService, deps: [ ApiService, + MasterPasswordApiService, KeyServiceAbstraction, EncryptService, I18nServiceAbstraction, @@ -351,6 +353,11 @@ const safeProviders: SafeProvider[] = [ useClass: WebLoginDecryptionOptionsService, deps: [MessagingService, RouterService, AcceptOrganizationInviteService], }), + safeProvider({ + provide: SshImportPromptService, + useClass: DefaultSshImportPromptService, + deps: [DialogService, ToastService, PlatformUtilsService, I18nServiceAbstraction], + }), ]; @NgModule({ diff --git a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts index 3a6ff1585b7..09d35d34da8 100644 --- a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts +++ b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts @@ -2,10 +2,10 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { OrganizationUserResetPasswordWithIdRequest } from "@bitwarden/admin-console/common"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { WebauthnRotateCredentialRequest } from "@bitwarden/common/auth/models/request/webauthn-rotate-credential.request"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncString } from "@bitwarden/common/platform/models/domain/enc-string"; diff --git a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts index dd257282cfa..d200fff256c 100644 --- a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts +++ b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts @@ -2,11 +2,11 @@ import { Injectable } from "@angular/core"; import { firstValueFrom } from "rxjs"; import { Account } from "@bitwarden/common/auth/abstractions/account.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; import { MasterPasswordVerification } from "@bitwarden/common/auth/types/verification"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { EncryptedString } from "@bitwarden/common/platform/models/domain/enc-string"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; diff --git a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts index 36db7aaa311..72ceb2afe7d 100644 --- a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts +++ b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts @@ -3,6 +3,7 @@ import { FormControl, FormGroup, Validators } from "@angular/forms"; import { firstValueFrom } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -75,7 +76,7 @@ export class MigrateFromLegacyEncryptionComponent { } catch (e) { // If the error is due to missing folders, we can delete all folders and try again if ( - e instanceof Error && + e instanceof ErrorResponse && e.message === "All existing folders must be included in the rotation." ) { const deleteFolders = await this.dialogService.openSimpleDialog({ diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts index 091c5440d70..c531f358b34 100644 --- a/apps/web/src/app/oss-routing.module.ts +++ b/apps/web/src/app/oss-routing.module.ts @@ -55,10 +55,6 @@ import { AcceptFamilySponsorshipComponent } from "./admin-console/organizations/ import { FamiliesForEnterpriseSetupComponent } from "./admin-console/organizations/sponsorships/families-for-enterprise-setup.component"; import { CreateOrganizationComponent } from "./admin-console/settings/create-organization.component"; import { deepLinkGuard } from "./auth/guards/deep-link.guard"; -import { HintComponent } from "./auth/hint.component"; -import { LoginDecryptionOptionsComponentV1 } from "./auth/login/login-decryption-options/login-decryption-options-v1.component"; -import { LoginComponentV1 } from "./auth/login/login-v1.component"; -import { LoginViaAuthRequestComponentV1 } from "./auth/login/login-via-auth-request-v1.component"; import { LoginViaWebAuthnComponent } from "./auth/login/login-via-webauthn/login-via-webauthn.component"; import { AcceptOrganizationComponent } from "./auth/organization-invite/accept-organization.component"; import { RecoverDeleteComponent } from "./auth/recover-delete.component"; @@ -69,7 +65,6 @@ import { AccountComponent } from "./auth/settings/account/account.component"; import { EmergencyAccessComponent } from "./auth/settings/emergency-access/emergency-access.component"; import { EmergencyAccessViewComponent } from "./auth/settings/emergency-access/view/emergency-access-view.component"; import { SecurityRoutingModule } from "./auth/settings/security/security-routing.module"; -import { SsoComponentV1 } from "./auth/sso-v1.component"; import { TwoFactorComponentV1 } from "./auth/two-factor-v1.component"; import { UpdatePasswordComponent } from "./auth/update-password.component"; import { UpdateTempPasswordComponent } from "./auth/update-temp-password.component"; @@ -172,172 +167,6 @@ const routes: Routes = [ }, ], }, - ...unauthUiRefreshSwap( - LoginViaAuthRequestComponentV1, - AnonLayoutWrapperComponent, - { - path: "login-with-device", - data: { titleId: "loginWithDevice" } satisfies RouteDataProperties, - }, - { - path: "login-with-device", - data: { - pageIcon: DevicesIcon, - pageTitle: { - key: "logInRequestSent", - }, - pageSubtitle: { - key: "aNotificationWasSentToYourDevice", - }, - titleId: "loginInitiated", - } satisfies RouteDataProperties & AnonLayoutWrapperData, - children: [ - { path: "", component: LoginViaAuthRequestComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - ), - ...unauthUiRefreshSwap( - LoginViaAuthRequestComponentV1, - AnonLayoutWrapperComponent, - { - path: "admin-approval-requested", - data: { titleId: "adminApprovalRequested" } satisfies RouteDataProperties, - }, - { - path: "admin-approval-requested", - data: { - pageIcon: DevicesIcon, - pageTitle: { - key: "adminApprovalRequested", - }, - pageSubtitle: { - key: "adminApprovalRequestSentToAdmins", - }, - titleId: "adminApprovalRequested", - } satisfies RouteDataProperties & AnonLayoutWrapperData, - children: [{ path: "", component: LoginViaAuthRequestComponent }], - }, - ), - ...unauthUiRefreshSwap( - AnonLayoutWrapperComponent, - AnonLayoutWrapperComponent, - { - path: "login", - canActivate: [unauthGuardFn()], - children: [ - { - path: "", - component: LoginComponentV1, - }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - data: { - pageTitle: { - key: "logIn", - }, - }, - }, - { - path: "login", - canActivate: [unauthGuardFn()], - data: { - pageTitle: { - key: "logInToBitwarden", - }, - pageIcon: VaultIcon, - } satisfies RouteDataProperties & AnonLayoutWrapperData, - children: [ - { - path: "", - component: LoginComponent, - }, - { - path: "", - component: LoginSecondaryContentComponent, - outlet: "secondary", - }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - ), - ...unauthUiRefreshSwap( - LoginDecryptionOptionsComponentV1, - AnonLayoutWrapperComponent, - { - path: "login-initiated", - canActivate: [tdeDecryptionRequiredGuard()], - }, - { - path: "login-initiated", - canActivate: [tdeDecryptionRequiredGuard()], - data: { - pageIcon: DevicesIcon, - }, - children: [{ path: "", component: LoginDecryptionOptionsComponent }], - }, - ), - ...unauthUiRefreshSwap( - AnonLayoutWrapperComponent, - AnonLayoutWrapperComponent, - { - path: "hint", - canActivate: [unauthGuardFn()], - data: { - pageTitle: { - key: "passwordHint", - }, - titleId: "passwordHint", - }, - children: [ - { path: "", component: HintComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - { - path: "", - children: [ - { - path: "hint", - canActivate: [unauthGuardFn()], - data: { - pageTitle: { - key: "requestPasswordHint", - }, - pageSubtitle: { - key: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", - }, - pageIcon: UserLockIcon, - state: "hint", - }, - children: [ - { path: "", component: PasswordHintComponent }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - ], - }, - ), { path: "", component: AnonLayoutWrapperComponent, @@ -381,6 +210,97 @@ const routes: Routes = [ }, ], }, + { + path: "login", + canActivate: [unauthGuardFn()], + data: { + pageTitle: { + key: "logInToBitwarden", + }, + pageIcon: VaultIcon, + } satisfies RouteDataProperties & AnonLayoutWrapperData, + children: [ + { + path: "", + component: LoginComponent, + }, + { + path: "", + component: LoginSecondaryContentComponent, + outlet: "secondary", + }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + }, + ], + }, + { + path: "login-with-device", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "logInRequestSent", + }, + pageSubtitle: { + key: "aNotificationWasSentToYourDevice", + }, + titleId: "loginInitiated", + } satisfies RouteDataProperties & AnonLayoutWrapperData, + children: [ + { path: "", component: LoginViaAuthRequestComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + }, + ], + }, + { + path: "admin-approval-requested", + data: { + pageIcon: DevicesIcon, + pageTitle: { + key: "adminApprovalRequested", + }, + pageSubtitle: { + key: "adminApprovalRequestSentToAdmins", + }, + titleId: "adminApprovalRequested", + } satisfies RouteDataProperties & AnonLayoutWrapperData, + children: [{ path: "", component: LoginViaAuthRequestComponent }], + }, + { + path: "hint", + canActivate: [unauthGuardFn()], + data: { + pageTitle: { + key: "requestPasswordHint", + }, + pageSubtitle: { + key: "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou", + }, + pageIcon: UserLockIcon, + state: "hint", + }, + children: [ + { path: "", component: PasswordHintComponent }, + { + path: "", + component: EnvironmentSelectorComponent, + outlet: "environment-selector", + }, + ], + }, + { + path: "login-initiated", + canActivate: [tdeDecryptionRequiredGuard()], + data: { + pageIcon: DevicesIcon, + }, + children: [{ path: "", component: LoginDecryptionOptionsComponent }], + }, { path: "send/:sendId/:key", data: { @@ -432,64 +352,24 @@ const routes: Routes = [ }, ], }, - ...unauthUiRefreshSwap( - SsoComponentV1, - SsoComponent, - { - path: "sso", - canActivate: [unauthGuardFn()], - data: { - pageTitle: { - key: "enterpriseSingleSignOn", - }, - titleId: "enterpriseSingleSignOn", - } satisfies RouteDataProperties & AnonLayoutWrapperData, - children: [ - { - path: "", - component: SsoComponentV1, - }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - { - path: "sso", - canActivate: [unauthGuardFn()], - data: { - pageTitle: { - key: "singleSignOn", - }, - titleId: "enterpriseSingleSignOn", - pageSubtitle: { - key: "singleSignOnEnterOrgIdentifierText", - }, - titleAreaMaxWidth: "md", - pageIcon: SsoKeyIcon, - } satisfies RouteDataProperties & AnonLayoutWrapperData, - children: [ - { - path: "", - component: SsoComponent, - }, - { - path: "", - component: EnvironmentSelectorComponent, - outlet: "environment-selector", - }, - ], - }, - ), { - path: "login", + path: "sso", canActivate: [unauthGuardFn()], + data: { + pageTitle: { + key: "singleSignOn", + }, + titleId: "enterpriseSingleSignOn", + pageSubtitle: { + key: "singleSignOnEnterOrgIdentifierText", + }, + titleAreaMaxWidth: "md", + pageIcon: SsoKeyIcon, + } satisfies RouteDataProperties & AnonLayoutWrapperData, children: [ { path: "", - component: LoginComponent, + component: SsoComponent, }, { path: "", @@ -497,11 +377,6 @@ const routes: Routes = [ outlet: "environment-selector", }, ], - data: { - pageTitle: { - key: "logIn", - }, - }, }, ...unauthUiRefreshSwap( TwoFactorComponentV1, @@ -522,7 +397,7 @@ const routes: Routes = [ ], data: { pageTitle: { - key: "verifyIdentity", + key: "verifyYourIdentity", }, } satisfies RouteDataProperties & AnonLayoutWrapperData, }, @@ -542,8 +417,9 @@ const routes: Routes = [ ], data: { pageTitle: { - key: "verifyIdentity", + key: "verifyYourIdentity", }, + titleAreaMaxWidth: "md", } satisfies RouteDataProperties & AnonLayoutWrapperData, }, ), @@ -619,7 +495,7 @@ const routes: Routes = [ data: { pageIcon: DeviceVerificationIcon, pageTitle: { - key: "verifyIdentity", + key: "verifyYourIdentity", }, pageSubtitle: { key: "weDontRecognizeThisDevice", diff --git a/apps/web/src/app/settings/preferences.component.ts b/apps/web/src/app/settings/preferences.component.ts index 2b3dba3f4bf..a90f1d18afd 100644 --- a/apps/web/src/app/settings/preferences.component.ts +++ b/apps/web/src/app/settings/preferences.component.ts @@ -17,7 +17,7 @@ import { } from "@bitwarden/common/key-management/vault-timeout"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ThemeType } from "@bitwarden/common/platform/enums"; +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { DialogService } from "@bitwarden/components"; @@ -47,7 +47,7 @@ export class PreferencesComponent implements OnInit, OnDestroy { vaultTimeout: [null as VaultTimeout | null], vaultTimeoutAction: [VaultTimeoutAction.Lock], enableFavicons: true, - theme: [ThemeType.Light], + theme: [ThemeTypes.Light as Theme], locale: [null as string | null], }); @@ -90,9 +90,9 @@ export class PreferencesComponent implements OnInit, OnDestroy { localeOptions.splice(0, 0, { name: i18nService.t("default"), value: null }); this.localeOptions = localeOptions; this.themeOptions = [ - { name: i18nService.t("themeLight"), value: ThemeType.Light }, - { name: i18nService.t("themeDark"), value: ThemeType.Dark }, - { name: i18nService.t("themeSystem"), value: ThemeType.System }, + { name: i18nService.t("themeLight"), value: ThemeTypes.Light }, + { name: i18nService.t("themeDark"), value: ThemeTypes.Dark }, + { name: i18nService.t("themeSystem"), value: ThemeTypes.System }, ]; } diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts index d57cc6bc1b4..f21a9338491 100644 --- a/apps/web/src/app/shared/loose-components.module.ts +++ b/apps/web/src/app/shared/loose-components.module.ts @@ -12,7 +12,6 @@ import { EventsComponent as OrgEventsComponent } from "../admin-console/organiza import { UserConfirmComponent as OrgUserConfirmComponent } from "../admin-console/organizations/manage/user-confirm.component"; import { VerifyRecoverDeleteOrgComponent } from "../admin-console/organizations/manage/verify-recover-delete-org.component"; import { AcceptFamilySponsorshipComponent } from "../admin-console/organizations/sponsorships/accept-family-sponsorship.component"; -import { HintComponent } from "../auth/hint.component"; import { RecoverDeleteComponent } from "../auth/recover-delete.component"; import { RecoverTwoFactorComponent } from "../auth/recover-two-factor.component"; import { RemovePasswordComponent } from "../auth/remove-password.component"; @@ -126,7 +125,6 @@ import { SharedModule } from "./shared.module"; EmergencyAccessViewComponent, FolderAddEditComponent, FrontendLayoutComponent, - HintComponent, OrgAddEditComponent, OrgAttachmentsComponent, OrgEventsComponent, @@ -188,7 +186,6 @@ import { SharedModule } from "./shared.module"; EmergencyAccessViewComponent, FolderAddEditComponent, FrontendLayoutComponent, - HintComponent, OrgAddEditComponent, OrganizationLayoutComponent, OrgAttachmentsComponent, diff --git a/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts index 0edde21061f..9af15749a91 100644 --- a/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts @@ -1,6 +1,5 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { ReactiveFormsModule } from "@angular/forms"; import { mock, MockProxy } from "jest-mock-extended"; diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html index b3f2ae581b3..589704a409a 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.html @@ -26,77 +26,73 @@ - + - - - {{ "name" | i18n }} - - {{ "owner" | i18n }} - - - {{ "timesExposed" | i18n }} - - + + {{ "name" | i18n }} + + {{ "owner" | i18n }} + + + {{ "timesExposed" | i18n }} + - - - - - - - - {{ r.name }} - - - {{ r.name }} - - - - {{ "shared" | i18n }} - - - - {{ "attachments" | i18n }} - -
    - {{ r.subTitle }} - - - + + + + + + {{ row.name }} - - - - - {{ "exposedXTimes" | i18n: (r.exposedXTimes | number) }} - - - +
    + + {{ row.name }} + + + + {{ "shared" | i18n }} + + + + {{ "attachments" | i18n }} + +
    + {{ row.subTitle }} + + + + + + + + {{ "exposedXTimes" | i18n: (row.exposedXTimes | number) }} + + - +
    diff --git a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts index cf7d8bcb052..052e3bc7cfe 100644 --- a/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/exposed-passwords-report.component.spec.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts index fb378b09845..acc34232571 100644 --- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.spec.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MockProxy, mock } from "jest-mock-extended"; import { of } from "rxjs"; diff --git a/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts index 2722e66f14f..4f0988082b4 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/exposed-passwords-report.component.ts @@ -19,7 +19,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { PasswordRepromptService, CipherFormConfigService } from "@bitwarden/vault"; -// eslint-disable-next-line no-restricted-imports import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @@ -38,7 +37,6 @@ import { ExposedPasswordsReportComponent as BaseExposedPasswordsReportComponent RoutedVaultFilterBridgeService, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class ExposedPasswordsReportComponent extends BaseExposedPasswordsReportComponent implements OnInit diff --git a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts index 9b53d583b99..6dc202de0b3 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/inactive-two-factor-report.component.ts @@ -18,7 +18,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; -// eslint-disable-next-line no-restricted-imports import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @@ -37,7 +36,6 @@ import { InactiveTwoFactorReportComponent as BaseInactiveTwoFactorReportComponen RoutedVaultFilterBridgeService, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class InactiveTwoFactorReportComponent extends BaseInactiveTwoFactorReportComponent implements OnInit diff --git a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts index bcd573fb09d..4e37f53ba61 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/reused-passwords-report.component.ts @@ -18,7 +18,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; -// eslint-disable-next-line no-restricted-imports import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @@ -37,7 +36,6 @@ import { ReusedPasswordsReportComponent as BaseReusedPasswordsReportComponent } RoutedVaultFilterBridgeService, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class ReusedPasswordsReportComponent extends BaseReusedPasswordsReportComponent implements OnInit diff --git a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts index e653a6b9a05..25e1314fceb 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/unsecured-websites-report.component.ts @@ -18,7 +18,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; -// eslint-disable-next-line no-restricted-imports import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @@ -37,7 +36,6 @@ import { UnsecuredWebsitesReportComponent as BaseUnsecuredWebsitesReportComponen RoutedVaultFilterBridgeService, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class UnsecuredWebsitesReportComponent extends BaseUnsecuredWebsitesReportComponent implements OnInit diff --git a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts index 41018d69c22..ef9bd97008e 100644 --- a/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts +++ b/apps/web/src/app/tools/reports/pages/organizations/weak-passwords-report.component.ts @@ -19,7 +19,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, PasswordRepromptService } from "@bitwarden/vault"; -// eslint-disable-next-line no-restricted-imports import { RoutedVaultFilterBridgeService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service"; import { RoutedVaultFilterService } from "../../../../vault/individual-vault/vault-filter/services/routed-vault-filter.service"; import { AdminConsoleCipherFormConfigService } from "../../../../vault/org-vault/services/admin-console-cipher-form-config.service"; @@ -38,7 +37,6 @@ import { WeakPasswordsReportComponent as BaseWeakPasswordsReportComponent } from RoutedVaultFilterBridgeService, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class WeakPasswordsReportComponent extends BaseWeakPasswordsReportComponent implements OnInit diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html index af336c94854..ded456ff963 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.html @@ -33,73 +33,69 @@
    - + - - - {{ "name" | i18n }} - {{ "owner" | i18n }} - {{ "timesReused" | i18n }} - + + {{ "name" | i18n }} + {{ "owner" | i18n }} + {{ "timesReused" | i18n }} - - - - - - - - {{ r.name }} - - - {{ r.name }} - - - - {{ "shared" | i18n }} - - - - {{ "attachments" | i18n }} - -
    - {{ r.subTitle }} - - - + + + + + + {{ row.name }} - - - - - {{ "reusedXTimes" | i18n: passwordUseMap.get(r.login.password) }} - - - + + + {{ row.name }} + + + + {{ "shared" | i18n }} + + + + {{ "attachments" | i18n }} + +
    + {{ row.subTitle }} + + + + + + + + {{ "reusedXTimes" | i18n: passwordUseMap.get(row.login.password) }} + +
    -
    +
    diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts index b0232225d68..5933d2ce293 100644 --- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.spec.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MockProxy, mock } from "jest-mock-extended"; import { of } from "rxjs"; diff --git a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts index c0ae8d53c94..040d73a0d66 100644 --- a/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/unsecured-websites-report.component.spec.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MockProxy, mock } from "jest-mock-extended"; import { of } from "rxjs"; diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.html b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.html index 9c5b587e60a..3ef1d11f9b2 100644 --- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.html +++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.html @@ -31,77 +31,73 @@ - + - - - {{ "name" | i18n }} - - {{ "owner" | i18n }} - - - {{ "weakness" | i18n }} - - + + {{ "name" | i18n }} + + {{ "owner" | i18n }} + + + {{ "weakness" | i18n }} + - - - - - - - - {{ r.name }} - - - {{ r.name }} - - - - {{ "shared" | i18n }} - - - - {{ "attachments" | i18n }} - -
    - {{ r.subTitle }} - - - + + + + + + {{ row.name }} - - - - - {{ r.reportValue.label | i18n }} - - - + + + {{ row.name }} + + + + {{ "shared" | i18n }} + + + + {{ "attachments" | i18n }} + +
    + {{ row.subTitle }} + + + + + + + + {{ row.reportValue.label | i18n }} + +
    -
    +
    diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts index ab202bffb59..d78dc7e3ceb 100644 --- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts +++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.spec.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { ComponentFixture, TestBed } from "@angular/core/testing"; import { mock, MockProxy } from "jest-mock-extended"; import { of } from "rxjs"; diff --git a/apps/web/src/app/tools/send/new-send/new-send-dropdown.component.ts b/apps/web/src/app/tools/send/new-send/new-send-dropdown.component.ts index 2fc83a5d03b..8cd052aa016 100644 --- a/apps/web/src/app/tools/send/new-send/new-send-dropdown.component.ts +++ b/apps/web/src/app/tools/send/new-send/new-send-dropdown.component.ts @@ -8,9 +8,7 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { BadgeModule, ButtonModule, DialogService, MenuModule } from "@bitwarden/components"; -import { DefaultSendFormConfigService } from "@bitwarden/send-ui"; - -import { SendAddEditComponent } from "../send-add-edit.component"; +import { DefaultSendFormConfigService, SendAddEditDialogComponent } from "@bitwarden/send-ui"; @Component({ selector: "tools-new-send-dropdown", @@ -60,6 +58,6 @@ export class NewSendDropdownComponent { const formConfig = await this.addEditFormConfigService.buildConfig("add", undefined, type); - await SendAddEditComponent.open(this.dialogService, { formConfig }); + await SendAddEditDialogComponent.open(this.dialogService, { formConfig }); } } diff --git a/apps/web/src/app/tools/send/send-access/access.component.ts b/apps/web/src/app/tools/send/send-access/access.component.ts index a2922914ba5..6bed32e97d5 100644 --- a/apps/web/src/app/tools/send/send-access/access.component.ts +++ b/apps/web/src/app/tools/send/send-access/access.component.ts @@ -39,7 +39,6 @@ import { SendAccessTextComponent } from "./send-access-text.component"; NoItemsModule, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class AccessComponent implements OnInit { protected send: SendAccessView; protected sendType = SendType; diff --git a/apps/web/src/app/tools/send/send.component.ts b/apps/web/src/app/tools/send/send.component.ts index 1d4e6305bdc..d88517f53e5 100644 --- a/apps/web/src/app/tools/send/send.component.ts +++ b/apps/web/src/app/tools/send/send.component.ts @@ -7,6 +7,7 @@ import { lastValueFrom } from "rxjs"; import { SendComponent as BaseSendComponent } from "@bitwarden/angular/tools/send/send.component"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -23,13 +24,18 @@ import { TableDataSource, ToastService, } from "@bitwarden/components"; -import { DefaultSendFormConfigService, NoSendsIcon, SendFormConfig } from "@bitwarden/send-ui"; +import { + DefaultSendFormConfigService, + NoSendsIcon, + SendFormConfig, + SendAddEditDialogComponent, + SendItemDialogResult, +} from "@bitwarden/send-ui"; import { HeaderModule } from "../../layouts/header/header.module"; import { SharedModule } from "../../shared"; import { NewSendDropdownComponent } from "./new-send/new-send-dropdown.component"; -import { SendAddEditComponent, SendItemDialogResult } from "./send-add-edit.component"; const BroadcasterSubscriptionId = "SendComponent"; @@ -69,6 +75,7 @@ export class SendComponent extends BaseSendComponent implements OnInit, OnDestro dialogService: DialogService, toastService: ToastService, private addEditFormConfigService: DefaultSendFormConfigService, + accountService: AccountService, ) { super( sendService, @@ -82,6 +89,7 @@ export class SendComponent extends BaseSendComponent implements OnInit, OnDestro sendApiService, dialogService, toastService, + accountService, ); } @@ -140,7 +148,7 @@ export class SendComponent extends BaseSendComponent implements OnInit, OnDestro return; } - this.sendItemDialogRef = SendAddEditComponent.open(this.dialogService, { + this.sendItemDialogRef = SendAddEditDialogComponent.open(this.dialogService, { formConfig, }); diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html index 709f4e8993e..eb8e3d16422 100644 --- a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt-install.component.html @@ -1,4 +1,6 @@ diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts index 40dbc0d442e..0bea6c186eb 100644 --- a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.spec.ts @@ -13,12 +13,27 @@ import { BrowserExtensionPromptComponent } from "./browser-extension-prompt.comp describe("BrowserExtensionPromptComponent", () => { let fixture: ComponentFixture; - + let component: BrowserExtensionPromptComponent; const start = jest.fn(); const pageState$ = new BehaviorSubject(BrowserPromptState.Loading); + const setAttribute = jest.fn(); + const getAttribute = jest.fn().mockReturnValue("width=1010"); beforeEach(async () => { start.mockClear(); + setAttribute.mockClear(); + getAttribute.mockClear(); + + // Store original querySelector + const originalQuerySelector = document.querySelector.bind(document); + + // Mock querySelector while preserving the document context + jest.spyOn(document, "querySelector").mockImplementation(function (selector) { + if (selector === 'meta[name="viewport"]') { + return { setAttribute, getAttribute } as unknown as HTMLMetaElement; + } + return originalQuerySelector.call(document, selector); + }); await TestBed.configureTestingModule({ providers: [ @@ -34,9 +49,14 @@ describe("BrowserExtensionPromptComponent", () => { }).compileComponents(); fixture = TestBed.createComponent(BrowserExtensionPromptComponent); + component = fixture.componentInstance; fixture.detectChanges(); }); + afterEach(() => { + jest.restoreAllMocks(); + }); + it("calls start on initialization", () => { expect(start).toHaveBeenCalledTimes(1); }); @@ -87,6 +107,33 @@ describe("BrowserExtensionPromptComponent", () => { const mobileText = fixture.debugElement.query(By.css("p")).nativeElement; expect(mobileText.textContent.trim()).toBe("reopenLinkOnDesktop"); }); + + it("sets min-width on the body", () => { + expect(document.body.style.minWidth).toBe("auto"); + }); + + it("stores viewport content", () => { + expect(getAttribute).toHaveBeenCalledWith("content"); + expect(component["viewportContent"]).toBe("width=1010"); + }); + + it("sets viewport meta tag to be mobile friendly", () => { + expect(setAttribute).toHaveBeenCalledWith("content", "width=device-width, initial-scale=1.0"); + }); + + describe("on destroy", () => { + beforeEach(() => { + fixture.destroy(); + }); + + it("resets body min-width", () => { + expect(document.body.style.minWidth).toBe(""); + }); + + it("resets viewport meta tag", () => { + expect(setAttribute).toHaveBeenCalledWith("content", "width=1010"); + }); + }); }); describe("manual error state", () => { diff --git a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts index 640a1b0d771..4d3a5fa07dd 100644 --- a/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts +++ b/apps/web/src/app/vault/components/browser-extension-prompt/browser-extension-prompt.component.ts @@ -1,5 +1,5 @@ -import { CommonModule } from "@angular/common"; -import { Component, OnInit } from "@angular/core"; +import { CommonModule, DOCUMENT } from "@angular/common"; +import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; import { ButtonComponent, IconModule } from "@bitwarden/components"; import { I18nPipe } from "@bitwarden/ui-common"; @@ -16,7 +16,7 @@ import { standalone: true, imports: [CommonModule, I18nPipe, ButtonComponent, IconModule], }) -export class BrowserExtensionPromptComponent implements OnInit { +export class BrowserExtensionPromptComponent implements OnInit, OnDestroy { /** Current state of the prompt page */ protected pageState$ = this.browserExtensionPromptService.pageState$; @@ -25,10 +25,39 @@ export class BrowserExtensionPromptComponent implements OnInit { protected BitwardenIcon = VaultIcons.BitwardenIcon; - constructor(private browserExtensionPromptService: BrowserExtensionPromptService) {} + /** Content of the meta[name="viewport"] element */ + private viewportContent: string | null = null; + + constructor( + private browserExtensionPromptService: BrowserExtensionPromptService, + @Inject(DOCUMENT) private document: Document, + ) {} ngOnInit(): void { this.browserExtensionPromptService.start(); + + // It is not be uncommon for users to hit this page from a mobile device. + // There are global styles and the viewport meta tag that set a min-width + // for the page which cause it to render poorly. Remove them here. + // https://github.com/bitwarden/clients/blob/main/apps/web/src/scss/base.scss#L6 + this.document.body.style.minWidth = "auto"; + + const viewportMeta = this.document.querySelector('meta[name="viewport"]'); + + // Save the current viewport content to reset it when the component is destroyed + this.viewportContent = viewportMeta?.getAttribute("content") ?? null; + viewportMeta?.setAttribute("content", "width=device-width, initial-scale=1.0"); + } + + ngOnDestroy(): void { + // Reset the body min-width when the component is destroyed + this.document.body.style.minWidth = ""; + + if (this.viewportContent !== null) { + this.document + .querySelector('meta[name="viewport"]') + ?.setAttribute("content", this.viewportContent); + } } openExtension(): void { diff --git a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.module.ts b/apps/web/src/app/vault/components/collection-dialog/collection-dialog.module.ts deleted file mode 100644 index a8f284fb485..00000000000 --- a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from "@angular/core"; - -import { SelectModule } from "@bitwarden/components"; - -import { AccessSelectorModule } from "../../../admin-console/organizations/shared/components/access-selector/access-selector.module"; -import { SharedModule } from "../../../shared"; - -import { CollectionDialogComponent } from "./collection-dialog.component"; -@NgModule({ - imports: [SharedModule, AccessSelectorModule, SelectModule], - declarations: [CollectionDialogComponent], - exports: [CollectionDialogComponent], -}) -export class CollectionDialogModule {} diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index 881903e79e5..b2adeecbf69 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -15,6 +15,8 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; import { EventType } from "@bitwarden/common/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -231,6 +233,9 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { * A user may restore items if they have delete permissions and the item is in the trash. */ protected async canUserRestore() { + if (await firstValueFrom(this.limitItemDeletion$)) { + return this.isTrashFilter && this.cipher?.isDeleted && this.cipher?.permissions.restore; + } return this.isTrashFilter && this.cipher?.isDeleted && this.canDelete; } @@ -277,6 +282,8 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { protected canDelete = false; + protected limitItemDeletion$ = this.configService.getFeatureFlag$(FeatureFlag.LimitItemDeletion); + constructor( @Inject(DIALOG_DATA) protected params: VaultItemDialogParams, private dialogRef: DialogRef, @@ -294,6 +301,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { private apiService: ApiService, private eventCollectionService: EventCollectionService, private routedVaultFilterService: RoutedVaultFilterService, + private configService: ConfigService, ) { this.updateTitle(); } diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index befeee43f69..ef6a347f7d3 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -86,7 +86,12 @@ appStopProp > - - - - - - -
    -
    -
    - {{ "noCollectionsInList" | i18n }} -
    - - - - - - - -
    - - - {{ c.name }} -
    - - - - - - diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts deleted file mode 100644 index 2deb5d35341..00000000000 --- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts +++ /dev/null @@ -1,160 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { DialogConfig, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; -import { Component, Inject, OnDestroy, OnInit } from "@angular/core"; -import { firstValueFrom, map } from "rxjs"; - -import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; -import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { Checkable, isChecked } from "@bitwarden/common/types/checkable"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { DialogService, ToastService } from "@bitwarden/components"; - -export interface BulkShareDialogParams { - ciphers: CipherView[]; - organizationId?: string; -} - -export enum BulkShareDialogResult { - Shared = "shared", - Canceled = "canceled", -} - -/** - * Strongly typed helper to open a BulkShareDialog - * @param dialogService Instance of the dialog service that will be used to open the dialog - * @param config Configuration for the dialog - */ -export const openBulkShareDialog = ( - dialogService: DialogService, - config: DialogConfig, -) => { - return dialogService.open( - BulkShareDialogComponent, - config, - ); -}; - -@Component({ - templateUrl: "bulk-share-dialog.component.html", -}) -export class BulkShareDialogComponent implements OnInit, OnDestroy { - ciphers: CipherView[] = []; - organizationId: string; - - nonShareableCount = 0; - collections: Checkable[] = []; - organizations: Organization[] = []; - shareableCiphers: CipherView[] = []; - - private writeableCollections: CollectionView[] = []; - - constructor( - @Inject(DIALOG_DATA) params: BulkShareDialogParams, - private dialogRef: DialogRef, - private cipherService: CipherService, - private i18nService: I18nService, - private collectionService: CollectionService, - private organizationService: OrganizationService, - private logService: LogService, - private accountService: AccountService, - private toastService: ToastService, - ) { - this.ciphers = params.ciphers ?? []; - this.organizationId = params.organizationId; - } - - async ngOnInit() { - this.shareableCiphers = this.ciphers.filter( - (c) => !c.hasOldAttachments && c.organizationId == null, - ); - this.nonShareableCount = this.ciphers.length - this.shareableCiphers.length; - const allCollections = await this.collectionService.getAllDecrypted(); - this.writeableCollections = allCollections.filter((c) => !c.readOnly); - const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - this.organizations = await firstValueFrom(this.organizationService.organizations$(userId)); - if (this.organizationId == null && this.organizations.length > 0) { - this.organizationId = this.organizations[0].id; - } - this.filterCollections(); - } - - ngOnDestroy() { - this.selectAll(false); - } - - filterCollections() { - this.selectAll(false); - if (this.organizationId == null || this.writeableCollections.length === 0) { - this.collections = []; - } else { - this.collections = this.writeableCollections.filter( - (c) => c.organizationId === this.organizationId, - ); - } - } - - submit = async () => { - const checkedCollectionIds = this.collections.filter(isChecked).map((c) => c.id); - try { - const activeUserId = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.id)), - ); - await this.cipherService.shareManyWithServer( - this.shareableCiphers, - this.organizationId, - checkedCollectionIds, - activeUserId, - ); - const orgName = - this.organizations.find((o) => o.id === this.organizationId)?.name ?? - this.i18nService.t("organization"); - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("movedItemsToOrg", orgName), - }); - this.close(BulkShareDialogResult.Shared); - } catch (e) { - this.logService.error(e); - } - }; - - check(c: Checkable, select?: boolean) { - c.checked = select == null ? !c.checked : select; - } - - selectAll(select: boolean) { - const collections = select ? this.collections : this.writeableCollections; - collections.forEach((c) => this.check(c, select)); - } - - get canSave() { - if ( - this.shareableCiphers != null && - this.shareableCiphers.length > 0 && - this.collections != null - ) { - for (let i = 0; i < this.collections.length; i++) { - if (this.collections[i].checked) { - return true; - } - } - } - return false; - } - - protected cancel() { - this.close(BulkShareDialogResult.Canceled); - } - - private close(result: BulkShareDialogResult) { - this.dialogRef.close(result); - } -} diff --git a/apps/web/src/app/vault/individual-vault/password-history.component.html b/apps/web/src/app/vault/individual-vault/password-history.component.html index 4eaca8f736e..ccbe20c5192 100644 --- a/apps/web/src/app/vault/individual-vault/password-history.component.html +++ b/apps/web/src/app/vault/individual-vault/password-history.component.html @@ -1,4 +1,4 @@ - + {{ "passwordHistory" | i18n }} diff --git a/apps/web/src/app/vault/individual-vault/pipes/pipes.module.ts b/apps/web/src/app/vault/individual-vault/pipes/pipes.module.ts index c33136b8262..16b95717718 100644 --- a/apps/web/src/app/vault/individual-vault/pipes/pipes.module.ts +++ b/apps/web/src/app/vault/individual-vault/pipes/pipes.module.ts @@ -1,11 +1,10 @@ import { NgModule } from "@angular/core"; -import { GetCollectionNameFromIdPipe } from "./get-collection-name.pipe"; import { GetGroupNameFromIdPipe } from "./get-group-name.pipe"; import { GetOrgNameFromIdPipe } from "./get-organization-name.pipe"; @NgModule({ - declarations: [GetOrgNameFromIdPipe, GetCollectionNameFromIdPipe, GetGroupNameFromIdPipe], - exports: [GetOrgNameFromIdPipe, GetCollectionNameFromIdPipe, GetGroupNameFromIdPipe], + declarations: [GetOrgNameFromIdPipe, GetGroupNameFromIdPipe], + exports: [GetOrgNameFromIdPipe, GetGroupNameFromIdPipe], }) export class PipesModule {} diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts index 9c002a4ed94..786c5de740e 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts @@ -7,7 +7,6 @@ import { firstValueFrom, merge, Subject, switchMap, takeUntil } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -243,20 +242,17 @@ export class VaultFilterComponent implements OnInit, OnDestroy { }, { id: "note", - name: this.i18nService.t("typeSecureNote"), + name: this.i18nService.t("note"), type: CipherType.SecureNote, icon: "bwi-sticky-note", }, - ]; - - if (await this.configService.getFeatureFlag(FeatureFlag.SSHKeyVaultItem)) { - allTypeFilters.push({ + { id: "sshKey", name: this.i18nService.t("typeSshKey"), type: CipherType.SshKey, icon: "bwi-key", - }); - } + }, + ]; const typeFilterSection: VaultFilterSection = { data$: this.vaultFilterService.buildTypeTree( @@ -281,7 +277,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy { }, action: this.applyFolderFilter, edit: { - text: "editFolder", + filterName: this.i18nService.t("folder"), action: this.editFolder, }, }; diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.html b/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.html index 6dd00375f44..1485c1f5343 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.html @@ -89,7 +89,7 @@ *ngIf="editInfo && f.node.id" class="edit-button" (click)="onEdit(f)" - appA11yTitle="{{ editInfo.text | i18n }}" + appA11yTitle="{{ 'editWithName' | i18n: editInfo.filterName : f.node.name }}" > diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts index f89a72b5d2b..0f949e17146 100644 --- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts +++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts @@ -31,7 +31,7 @@ export type VaultFilterSection = { }; action: (filterNode: TreeNode) => Promise; edit?: { - text: string; + filterName: string; action: (filter: VaultFilterType) => void; }; add?: { diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html index 8d576098a74..538d511571c 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.html @@ -59,7 +59,7 @@ diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts index 63af397e726..e9122864447 100644 --- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts @@ -9,18 +9,32 @@ import { OnInit, Output, } from "@angular/core"; +import { Router } from "@angular/router"; +import { firstValueFrom } from "rxjs"; -import { Unassigned, CollectionView } from "@bitwarden/admin-console/common"; +import { + Unassigned, + CollectionView, + CollectionAdminService, +} from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { ProductTierType } from "@bitwarden/common/billing/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherType } from "@bitwarden/common/vault/enums"; import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node"; -import { BreadcrumbsModule, MenuModule } from "@bitwarden/components"; +import { + BreadcrumbsModule, + DialogService, + MenuModule, + SimpleDialogOptions, +} from "@bitwarden/components"; +import { CollectionDialogTabType } from "../../../admin-console/organizations/shared/components/collection-dialog"; import { HeaderModule } from "../../../layouts/header/header.module"; import { SharedModule } from "../../../shared"; -import { CollectionDialogTabType } from "../../components/collection-dialog"; import { PipesModule } from "../pipes/pipes.module"; import { All, @@ -81,7 +95,13 @@ export class VaultHeaderComponent implements OnInit { /** Emits an event when the delete collection button is clicked in the header */ @Output() onDeleteCollection = new EventEmitter(); - constructor(private i18nService: I18nService) {} + constructor( + private i18nService: I18nService, + private collectionAdminService: CollectionAdminService, + private dialogService: DialogService, + private router: Router, + private configService: ConfigService, + ) {} async ngOnInit() {} @@ -199,6 +219,57 @@ export class VaultHeaderComponent implements OnInit { } async addCollection(): Promise { + const isBreadcrumbEventLogsEnabled = await firstValueFrom( + this.configService.getFeatureFlag$(FeatureFlag.PM12276_BreadcrumbEventLogs), + ); + + if (isBreadcrumbEventLogsEnabled) { + const organization = this.organizations?.find( + (org) => org.productTierType === ProductTierType.Free, + ); + + if (this.organizations?.length == 1 && !!organization) { + const collections = await this.collectionAdminService.getAll(organization.id); + if (collections.length === organization.maxCollections) { + await this.showFreeOrgUpgradeDialog(organization); + return; + } + } + } + this.onAddCollection.emit(); } + + private async showFreeOrgUpgradeDialog(organization: Organization): Promise { + const orgUpgradeSimpleDialogOpts: SimpleDialogOptions = { + title: this.i18nService.t("upgradeOrganization"), + content: this.i18nService.t( + organization.canEditSubscription + ? "freeOrgMaxCollectionReachedManageBilling" + : "freeOrgMaxCollectionReachedNoManageBilling", + organization.maxCollections, + ), + type: "primary", + }; + + if (organization.canEditSubscription) { + orgUpgradeSimpleDialogOpts.acceptButtonText = this.i18nService.t("upgrade"); + } else { + orgUpgradeSimpleDialogOpts.acceptButtonText = this.i18nService.t("ok"); + orgUpgradeSimpleDialogOpts.cancelButtonText = null; // hide secondary btn + } + + const simpleDialog = this.dialogService.openSimpleDialogRef(orgUpgradeSimpleDialogOpts); + const result: boolean | undefined = await firstValueFrom(simpleDialog.closed); + + if (!result) { + return; + } + + if (organization.canEditSubscription) { + await this.router.navigate(["/organizations", organization.id, "billing", "subscription"], { + queryParams: { upgrade: true }, + }); + } + } } diff --git a/apps/web/src/app/vault/individual-vault/vault.component.html b/apps/web/src/app/vault/individual-vault/vault.component.html index 75332dcf72a..1a2a1fdbca6 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.html +++ b/apps/web/src/app/vault/individual-vault/vault.component.html @@ -24,19 +24,13 @@
    -
    -
    -
    - -
    -
    -
    +
    @@ -65,7 +59,7 @@ class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start" > diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts index 51c00ca18b8..d4441c73719 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault.component.ts @@ -24,6 +24,7 @@ import { take, takeUntil, tap, + catchError, } from "rxjs/operators"; import { @@ -75,15 +76,17 @@ import { PasswordRepromptService, } from "@bitwarden/vault"; -import { TrialFlowService } from "../../billing/services/trial-flow.service"; -import { FreeTrial } from "../../billing/types/free-trial"; -import { SharedModule } from "../../shared/shared.module"; -import { AssignCollectionsWebComponent } from "../components/assign-collections"; +import { getNestedCollectionTree } from "../../admin-console/organizations/collections"; import { CollectionDialogAction, CollectionDialogTabType, openCollectionDialog, -} from "../components/collection-dialog"; +} from "../../admin-console/organizations/shared/components/collection-dialog"; +import { BillingNotificationService } from "../../billing/services/billing-notification.service"; +import { TrialFlowService } from "../../billing/services/trial-flow.service"; +import { FreeTrial } from "../../billing/types/free-trial"; +import { SharedModule } from "../../shared/shared.module"; +import { AssignCollectionsWebComponent } from "../components/assign-collections"; import { VaultItemDialogComponent, VaultItemDialogMode, @@ -92,7 +95,6 @@ import { import { VaultItem } from "../components/vault-items/vault-item"; import { VaultItemEvent } from "../components/vault-items/vault-item-event"; import { VaultItemsModule } from "../components/vault-items/vault-items.module"; -import { getNestedCollectionTree } from "../utils/collection-utils"; import { AttachmentDialogCloseResult, @@ -213,20 +215,25 @@ export class VaultComponent implements OnInit, OnDestroy { ownerOrgs.map((org) => combineLatest([ this.organizationApiService.getSubscription(org.id), - this.organizationBillingService.getPaymentSource(org.id), + from(this.organizationBillingService.getPaymentSource(org.id)).pipe( + catchError((error: unknown) => { + this.billingNotificationService.handleError(error); + return of(null); + }), + ), ]).pipe( - map(([subscription, paymentSource]) => { - return this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues( + map(([subscription, paymentSource]) => + this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues( org, subscription, paymentSource, - ); - }), + ), + ), ), ), ); }), - map((results) => results.filter((result) => result.shownBanner)), + map((results) => results.filter((result) => result !== null && result.shownBanner)), shareReplay({ refCount: false, bufferSize: 1 }), ); @@ -262,6 +269,7 @@ export class VaultComponent implements OnInit, OnDestroy { protected billingApiService: BillingApiServiceAbstraction, private trialFlowService: TrialFlowService, private organizationBillingService: OrganizationBillingServiceAbstraction, + private billingNotificationService: BillingNotificationService, ) {} async ngOnInit() { @@ -348,8 +356,13 @@ export class VaultComponent implements OnInit, OnDestroy { // Append any failed to decrypt ciphers to the top of the cipher list const allCiphers = [...failedCiphers, ...ciphers]; - if (await this.searchService.isSearchable(searchText)) { - return await this.searchService.searchCiphers(searchText, [filterFunction], allCiphers); + if (await this.searchService.isSearchable(activeUserId, searchText)) { + return await this.searchService.searchCiphers( + activeUserId, + searchText, + [filterFunction], + allCiphers, + ); } return allCiphers.filter(filterFunction); @@ -378,7 +391,7 @@ export class VaultComponent implements OnInit, OnDestroy { collectionsToReturn = selectedCollection?.children.map((c) => c.node) ?? []; } - if (await this.searchService.isSearchable(searchText)) { + if (await this.searchService.isSearchable(activeUserId, searchText)) { collectionsToReturn = this.searchPipe.transform( collectionsToReturn, searchText, @@ -1141,7 +1154,8 @@ export class VaultComponent implements OnInit, OnDestroy { typeI18nKey = "password"; } else if (field === "totp") { aType = "TOTP"; - value = await this.totpService.getCode(cipher.login.totp); + const totpResponse = await firstValueFrom(this.totpService.getCode$(cipher.login.totp)); + value = totpResponse.code; typeI18nKey = "verificationCodeTotp"; } else { this.toastService.showToast({ diff --git a/apps/web/src/app/vault/individual-vault/vault.module.ts b/apps/web/src/app/vault/individual-vault/vault.module.ts index d400d44bf0d..57d3df30df7 100644 --- a/apps/web/src/app/vault/individual-vault/vault.module.ts +++ b/apps/web/src/app/vault/individual-vault/vault.module.ts @@ -1,9 +1,9 @@ import { NgModule } from "@angular/core"; -import { CollectionBadgeModule } from "../../admin-console/organizations/collections/collection-badge/collection-badge.module"; +import { CollectionNameBadgeComponent } from "../../admin-console/organizations/collections"; import { GroupBadgeModule } from "../../admin-console/organizations/collections/group-badge/group-badge.module"; +import { CollectionDialogComponent } from "../../admin-console/organizations/shared/components/collection-dialog"; import { LooseComponentsModule, SharedModule } from "../../shared"; -import { CollectionDialogModule } from "../components/collection-dialog"; import { BulkDialogsModule } from "./bulk-action-dialogs/bulk-dialogs.module"; import { OrganizationBadgeModule } from "./organization-badge/organization-badge.module"; @@ -17,12 +17,12 @@ import { ViewComponent } from "./view.component"; VaultRoutingModule, OrganizationBadgeModule, GroupBadgeModule, - CollectionBadgeModule, + CollectionNameBadgeComponent, PipesModule, SharedModule, LooseComponentsModule, BulkDialogsModule, - CollectionDialogModule, + CollectionDialogComponent, VaultComponent, ViewComponent, ], diff --git a/apps/web/src/app/vault/org-vault/add-edit.component.ts b/apps/web/src/app/vault/org-vault/add-edit.component.ts index 8490ec6c9db..89f3b79f1fb 100644 --- a/apps/web/src/app/vault/org-vault/add-edit.component.ts +++ b/apps/web/src/app/vault/org-vault/add-edit.component.ts @@ -28,7 +28,7 @@ import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { DialogService, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { PasswordRepromptService, SshImportPromptService } from "@bitwarden/vault"; import { AddEditComponent as BaseAddEditComponent } from "../individual-vault/add-edit.component"; @@ -64,6 +64,7 @@ export class AddEditComponent extends BaseAddEditComponent { cipherAuthorizationService: CipherAuthorizationService, toastService: ToastService, sdkService: SdkService, + sshImportPromptService: SshImportPromptService, ) { super( cipherService, @@ -88,6 +89,7 @@ export class AddEditComponent extends BaseAddEditComponent { cipherAuthorizationService, toastService, sdkService, + sshImportPromptService, ); } diff --git a/apps/web/src/connectors/webauthn-fallback.ts b/apps/web/src/connectors/webauthn-fallback.ts index 5410b89dcfa..3561f922e03 100644 --- a/apps/web/src/connectors/webauthn-fallback.ts +++ b/apps/web/src/connectors/webauthn-fallback.ts @@ -82,8 +82,8 @@ document.addEventListener("DOMContentLoaded", async () => { const titleForSmallerScreens = document.getElementById("title-smaller-screens"); const titleForLargerScreens = document.getElementById("title-larger-screens"); - titleForSmallerScreens.innerText = localeService.t("verifyIdentity"); - titleForLargerScreens.innerText = localeService.t("verifyIdentity"); + titleForSmallerScreens.innerText = localeService.t("verifyYourIdentity"); + titleForLargerScreens.innerText = localeService.t("verifyYourIdentity"); const subtitle = document.getElementById("subtitle"); subtitle.innerText = localeService.t("followTheStepsBelowToFinishLoggingIn"); diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index 89bd6740eba..3b9168b29b2 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Sleep om te sorteer" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teks" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Wysig vouer" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Skuif seleksie na organisasie" - }, "deleteSelected": { "message": "Skrap seleksie" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Gekose items is na $ORGNAME$ geskuif", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nee" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Teken aan of skep ’n nuwe rekening vir toegang tot u beveiligde kluis." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Wagwoordwenk" - }, - "enterEmailToGetHint": { - "message": "Voer u rekening-e-posadres in om u hoofwagwoordwenk te kry." - }, "getMasterPasswordHint": { "message": "Kry hoofwagwoordwenk" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Kies ’n organisasie waarheen u hierdie item wil skuif. Deur te skuif kry die organisasie die einaarskap van die item. U is dan nie meer die direkte eienaar van die item wanneer dit geskuif is nie." }, - "moveManyToOrgDesc": { - "message": "Kies ’n organisasie waarheen u hierdie items wil skuif. Deur te skuif kry die organisasie die einaarskap van die items. U is dan nie meer die direkte eienaar van die items wanneer dit geskuif is nie." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "U het $COUNT$ item(s) gekies. $MOVEABLE_COUNT$ item(s) kan na ’n organisasie geskuif word, $NONMOVEABLE_COUNT$ kan nie.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Bevestigingskode (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Hierdie tweestapaantekenaanbieder is vir u rekening geaktiveer." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisasie-eienaars en -administrateurs is vrygestel van die afdwing van hierdie beleid." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Lêer" }, "sendTypeText": { "message": "Teks" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Skep nuwe Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Skrap Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Is u seker u wil hierdie Send skrap?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Welke tipe Send is dit?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Skrapdatum" }, - "deletionDateDesc": { - "message": "Die Send sal outomaties op die aangewese datum en tyd geskrap word.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimum toegangsaantal" }, - "maxAccessCountDesc": { - "message": "Indien ingestel het gebruikers ne meer toegang tot hierdie Send sodra die maksimum aantal toegang bereik is.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Huidige toegangsaantal" - }, - "sendPasswordDesc": { - "message": "Vereis opsioneel ’n wagwoord vir gebruikers om toegang tot hierdie Send te verkry.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privaat notas oor hierdie Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Gedeaktiveer" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Is u seker u wil die wagwoord verwyder?" }, - "hideEmail": { - "message": "Versteek my e-posadres vir ontvangers." - }, - "disableThisSend": { - "message": "Deaktiveer hierdie Send sodat niemand toegang daartoe het nie.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alle Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Word geskrap" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Verstreke" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Gewysigde beleid $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Deaktiveer persoonlike eienaarskap vir organisasiegebruikers" }, - "textHiddenByDefault": { - "message": "Versteek die teks be verstek wanneer die Send gebruik word", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "’n Vriendelike naam om hierdie Send te beskryf.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Die teks wat u wil verstuur." - }, - "sendFileDesc": { - "message": "Die lêer wat u wil verstuur." - }, - "copySendLinkOnSave": { - "message": "Kopieer die skakel om hierdie Send te deel tydens bewaar na my knipbord." - }, - "sendLinkLabel": { - "message": "Send-skakel", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Klik op onderstaande knop om u 2FA te verifieer." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Aantal gebruikers" }, - "loggingInAs": { - "message": "Teken tans aan as" - }, - "notYou": { - "message": "Nie u nie?" - }, "pickAnAvatarColor": { "message": "Kies 'n avatar kleur" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index aae3889400e..13777f942de 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "ملاحظات" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "ملاحظة" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "اسحب للفرز" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "نص" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "تعديل المجلد" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "مجلد جديد" }, @@ -860,9 +879,6 @@ "filter": { "message": "تصفية" }, - "moveSelectedToOrg": { - "message": "نقل العناصر المختارة إلى منظمة" - }, "deleteSelected": { "message": "حذف العناصر المختارة" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "تم نقل العناصر المحددة إلى $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "لا" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "قم بتسجيل الدخول أو أنشئ حساباً جديداً لتتمكن من الوصول إلى خزانتك السرية." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "قم بتأكيد هويتك" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "تلميح كلمة المرور" - }, - "enterEmailToGetHint": { - "message": "أدخل عنوان البريد الإلكتروني لحسابك للحصول على تلميح كلمة المرور الرئيسية." - }, "getMasterPasswordHint": { "message": "احصل على تلميح لكلمة المرور الرئيسية" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "رمز التحقق (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "إلغاء الوصول" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ملف" }, "sendTypeText": { "message": "نص" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "إرسال جديد", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "تسجيل الدخول كـ" - }, - "notYou": { - "message": "ليس حسابك؟" - }, "pickAnAvatarColor": { "message": "اختر لون الصورة الرمزية" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index b2a68c104a4..f092620b00a 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notlar" }, + "privateNote": { + "message": "Şəxsi not" + }, "note": { "message": "Not" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Sıralamaq üçün sürüklə" }, + "dragToReorder": { + "message": "Yenidən sıralamaq üçün sürüklə" + }, "cfTypeText": { "message": "Mətn" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Qovluğa düzəliş et" }, + "editWithName": { + "message": "$ITEM$ - düzəliş et: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Yeni qovluq" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtr" }, - "moveSelectedToOrg": { - "message": "Seçiləni təşkilata daşı" - }, "deleteSelected": { "message": "Seçiləni sil" }, @@ -918,15 +934,6 @@ } } }, - "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": { @@ -1029,6 +1036,9 @@ "no": { "message": "Xeyr" }, + "location": { + "message": "Yerləşmə" + }, "loginOrCreateNewAccount": { "message": "Güvənli seyfinizə müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Kimlik doğrulama seansının vaxtı bitdi. Lütfən giriş prosesini yenidən başladın." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Kimliyinizi doğrulayın" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-poçt ünvanını daxil edin və parolunuz üçün ipucu sizə göndəriləcək" }, - "passwordHint": { - "message": "Parol məsləhəti" - }, - "enterEmailToGetHint": { - "message": "Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin." - }, "getMasterPasswordHint": { "message": "Ana parol üçün məsləhət alın" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Bu elementi daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementə birbaşa sahibliyiniz olmayacaq." }, - "moveManyToOrgDesc": { - "message": "Bu elementləri daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementlərə birbaşa sahibliyiniz olmayacaq." - }, "collectionsDesc": { "message": "Bu elementin paylaşıldığı kolleksiyalara düzəliş edin. Yalnız bu kolleksiyalara müraciəti olan təşkilat istifadəçiləri bu elementi görə bilər." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ element seçdiniz. $MOVEABLE_COUNT$ element bir təşkilata daşınıla bilər, $NONMOVEABLE_COUNT$ ədədi isə daşınıla bilməz.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Doğrulama kodu (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Müraciəti ləğv et" }, + "revoke": { + "message": "Geri al" + }, "twoStepLoginProviderEnabled": { "message": "Bu iki addımlı giriş provayderi hesabınızda fəallaşdırılıb." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ yuxarı daşındı, mövqeyi $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ aşağı daşındı, mövqeyi $INDEX$/$LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Şifrələmə açarınızı güncəlləyərkən qovluqlarınızın şifrəsi açıla bilmədi. Güncəlləmənin davam etməsi üçün qovluqlarınız silinməlidir. Davam etsəniz, heç bir seyf elementi silinməyəcək." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Təşkilat sahibləri və administratorlar, bu siyasətin tətbiq edilməsindən azaddırlar." }, + "limitSendViews": { + "message": "Baxışları limitlə" + }, + "limitSendViewsHint": { + "message": "Limitə çatdıqdan sonra bu Send-ə heç kim baxa bilməz.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ baxış qaldı", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send detalları", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Paylaşılacaq mətn" + }, "sendTypeFile": { "message": "Fayl" }, "sendTypeText": { "message": "Mətn" }, + "sendPasswordDescV3": { + "message": "Alıcıların bu \"Send\"ə müraciət etməsi üçün ixtiyari bir parol əlavə edin.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Yeni \"Send\" yarat", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "\"Send\"i sil", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Bu \"Send\"i silmək istədiyinizə əminsiniz?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "\"Send\"in növü nədir?", + "deleteSendPermanentConfirmation": { + "message": "Bu Send-i həmişəlik silmək istədiyinizə əminsiniz?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Silinmə tarixi" }, - "deletionDateDesc": { - "message": "\"Send\" göstərilən tarix və saatda birdəfəlik silinəcək.", + "deletionDateDescV2": { + "message": "Send, bu tarixdə həmişəlik silinəcək.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimal müraciət sayı" }, - "maxAccessCountDesc": { - "message": "Əgər ayarlanıbsa, istifadəçilər maksimal müraciət sayına çatdıqdan sonra bu \"Send\"ə müraciət edə bilməyəcək.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Hazırkı müraciət sayı" - }, - "sendPasswordDesc": { - "message": "İstəyinizə görə istifadəçilərdən bu \"Send\"ə müraciət edərkən parol tələb edə bilərsiniz.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Bu \"Send\" ilə bağlı gizli qeydlər.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Sıradan çıxarıldı" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Parolu çıxartmaq istədiyinizə əminsiniz?" }, - "hideEmail": { - "message": "E-poçt ünvanımı alıcılardan gizlət." - }, - "disableThisSend": { - "message": "Heç kimin müraciət edə bilməməsi üçün bu \"Send\"i sıradan çıxart.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Bütün \"Send\"lər" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Silinməsi gözlənilir" }, + "hideTextByDefault": { + "message": "Mətni ilkin olaraq gizlət" + }, "expired": { "message": "Müddəti bitib" }, @@ -5415,13 +5441,6 @@ "message": "\"Send\" yaradarkən və ya ona düzəliş edərkən istifadəçilərin e-poçt ünvanlarını alıcılardan gizlətməsinə icazə verməyin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Aşağıdakı təşkilat siyasətləri hal-hazırda qüvvədədir:" - }, - "sendDisableHideEmailInEffect": { - "message": "\"Send\" yaradarkən və ya ona düzəliş edərkən istifadəçilərin e-poçt ünvanlarını alıcılardan gizlətməsinə icazə verilmir.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "$ID$ siyasətinə düzəliş edildi.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Təşkilat istifadəçiləri üçün fərdi sahibliyi sıradan çıxart" }, - "textHiddenByDefault": { - "message": "\"Send\"ə müraciət edəndə ilkin olaraq mətni gizlədin", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Bu \"Send\"i açıqlayan bir ad.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Göndərmək istədiyiniz mətn." - }, - "sendFileDesc": { - "message": "Göndərmək istədiyiniz fayl." - }, - "copySendLinkOnSave": { - "message": "Saxladıqdan sonra bu \"Send\"in paylaşma keçidini lövhəmə kopyala." - }, - "sendLinkLabel": { - "message": "\"Send\" keçidi", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Silinmə və son istifadə tarixlərini saxlayarkən xəta baş verdi." }, + "hideYourEmail": { + "message": "E-poçt ünvanınız baxanlardan gizlədilsin." + }, "webAuthnFallbackMsg": { "message": "2FA-nı doğrulamaq üçün lütfən aşağıdakı düyməyə klikləyin." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "İstifadəçi sayı" }, - "loggingInAs": { - "message": "Giriş et" - }, - "notYou": { - "message": "Siz deyilsiniz?" - }, "pickAnAvatarColor": { "message": "Bir avatar rəngi götürün" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Admin təsdiqini tələb et" }, - "approveWithMasterPassword": { - "message": "Ana parolla təsdiqlə" - }, "trustedDeviceEncryption": { "message": "Güvənli cihaz şifrələməsi" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tələbiniz admininizə göndərildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Təsdiqləndikdən sonra məlumatlandırılacaqsınız." - }, "troubleLoggingIn": { "message": "Girişdə problem var?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Platformanız üçün icra bələdçisini istifadə edərək Bitwarden üçün cihaz idarəetməsini konfiqurasiya edin." }, + "deviceIdMissing": { + "message": "Cihaz kimliyi əskikdir" + }, + "deviceTypeMissing": { + "message": "Cihaz növü əskikdir" + }, + "deviceCreationDateMissing": { + "message": "Cihaz yaradılma tarixi əskikdir" + }, "desktopRequired": { "message": "Masaüstü tələb olunur" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Bitwarden-nin API-si haqqında daha ətraflı" }, + "fileSend": { + "message": "Fayl \"Send\"i" + }, "fileSends": { "message": "Fayl \"Send\"ləri" }, + "textSend": { + "message": "Mətn \"Send\"i" + }, "textSends": { "message": "Mətn \"Send\"ləri" }, @@ -10084,10 +10088,6 @@ "message": "Xüsusi xarakterləri daxil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Qoşma əlavə et" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Təşkilat adı 50 xarakterdən çox ola bilməz." }, + "sshKeyWrongPassword": { + "message": "Daxil etdiyiniz parol yanlışdır." + }, + "importSshKey": { + "message": "Daxilə köçür" + }, + "confirmSshKeyPassword": { + "message": "Parolu təsdiqlə" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH açarı üçün parolu daxil edin." + }, + "enterSshKeyPassword": { + "message": "Parolu daxil edin" + }, + "invalidSshKey": { + "message": "SSH açarı yararsızdır" + }, + "sshKeyTypeUnsupported": { + "message": "SSH açar növü dəstəklənmir" + }, + "importSshKeyFromClipboard": { + "message": "Açarı lövhədən daxilə köçür" + }, + "sshKeyImported": { + "message": "SSH açarı uğurla daxilə köçürüldü" + }, + "copySSHPrivateKey": { + "message": "Private açarı kopyala" + }, "openingExtension": { "message": "Bitwarden brauzer uzantısı açılır" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Təyin edilmiş yer sayı, boş yer sayından çoxdur." }, + "changeAtRiskPassword": { + "message": "Riskli parolları dəyişdir" + }, "removeUnlockWithPinPolicyTitle": { "message": "Kilidi PIN ilə açmanı ləğv et" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Bu event-lər sadəcə nümunədir və Bitwarden təşkilatınızdakı real event-ləri əks etdirmir." + }, + "cannotCreateCollection": { + "message": "Ödənişsiz təşkilatların ən çox 2 kolleksiyası ola bilər. Daha çox kolleksiya əlavə etmək üçün ödənişli bir plana yüksəldin." } } diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index 4cffb7879ca..2e5aeabff32 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Нататкі" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Нататка" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Перацягніце для сартавання" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Тэкст" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Рэдагаваць папку" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Фільтр" }, - "moveSelectedToOrg": { - "message": "Перамясціць выбранае ў арганізацыю" - }, "deleteSelected": { "message": "Выдаліць выбраныя" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Выбраныя элементы перамешчаны ў $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Увайдзіце або стварыце новы ўліковы запіс для доступу да бяспечнага сховішча." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Падказка да пароля" - }, - "enterEmailToGetHint": { - "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі да асноўнага пароля." - }, "getMasterPasswordHint": { "message": "Атрымаць падказку да асноўнага пароля" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Выберыце арганізацыю, у якую вы хочаце перамясціць гэты элемент. Пры перамяшчэнні ў арганізацыю ўсе правы ўласнасці на дадзены элемент пяройдуць да гэтай арганізацыі. Вы больш не будзеце адзіным уласнікам гэтага элемента пасля яго перамяшчэння." }, - "moveManyToOrgDesc": { - "message": "Выберыце арганізацыю, у якую вы хочаце перамясціць гэтыя элементы. Пры перамяшчэнні ў арганізацыю ўсе правы ўласнасці на дадзеныя элементы пяройдуць да гэтай арганізацыі. Вы больш не будзеце адзіным уласнікам гэтых элементаў пасля іх перамяшчэння." - }, "collectionsDesc": { "message": "Рэдагуйце калекцыі, з якімі гэты элемент знаходзіцца ў агульным доступе. Толькі карыстальнікі арганізацыі з доступам да гэтых калекцый змогуць бачыць гэты элемент." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Вы выбралі наступную колькасць элементаў: $COUNT$ шт. З іх будуць перамешчаны ў арганізацыю: $MOVEABLE_COUNT$ шт. Не перамешчанымі застануцца: $NONMOVEABLE_COUNT$ шт.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Праверачны код (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Адклікаць доступ" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Гэты пастаўшчык двухэтапнага ўваходу ўключаны для вашага ўліковага запісу." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "На ўладальнікаў арганізацыі і адміністратараў гэта палітыка не аказвае ўплыву." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Файл" }, "sendTypeText": { "message": "Тэкст" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Стварыць новы Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Выдаліць Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Вы сапраўды хочаце выдаліць гэты Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Які гэта тып Send'a?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Дата выдалення" }, - "deletionDateDesc": { - "message": "Send будзе незваротна выдалены ў азначаныя дату і час.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Максімальная колькасць доступаў" }, - "maxAccessCountDesc": { - "message": "Калі прызначана, то карыстальнікі больш не змогуць атрымаць доступ да гэтага Send пасля таго, як будзе дасягнута максімальная колькасць зваротаў.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Бягучая колькасць доступаў" - }, - "sendPasswordDesc": { - "message": "Па магчымасці запытваць у карыстальнікаў пароль для доступу да гэтага Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Прыватныя нататкі пра гэты Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Адключана" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Вы сапраўды хочаце выдаліць пароль?" }, - "hideEmail": { - "message": "Схаваць мой адрас электроннай пошты ад атрымальнікаў." - }, - "disableThisSend": { - "message": "Адключыць гэты Send, каб ніхто не змог атрымаць да яго доступ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Усе Send'ы" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Чакаецца выдаленне" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Пратэрмінавана" }, @@ -5415,13 +5441,6 @@ "message": "Заўсёды паказваць атрымальнікам адрас электроннай пошты ўдзельніка пры стварэнні або рэдагаванні Send'a.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Зараз дзейнічаюць наступныя палітыкі арганізацыі:" - }, - "sendDisableHideEmailInEffect": { - "message": "Карыстальнікам не дазваляецца хаваць свой адрас электроннай пошты ад атрымальнікаў пры стварэнні або рэдагаванні Send'a.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Змяненне палітыкі $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Адключыць асабістую ўласнасць для карыстальнікаў арганізацыі" }, - "textHiddenByDefault": { - "message": "Пры доступе да Send прадвызначана хаваць тэкст", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Зразумелая назва для апісання гэтага Send'a.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Тэкст, які вы хочаце адправіць." - }, - "sendFileDesc": { - "message": "Файл, які вы хочаце адправіць." - }, - "copySendLinkOnSave": { - "message": "Скапіяваць спасылку ў буфер абмену пасля захавання, каб абагуліць гэты Send." - }, - "sendLinkLabel": { - "message": "Спасылка на Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Адбылася памылка пры захаванні дат выдалення і завяршэння тэрміну дзеяння." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Для праверкі вашага 2ФА, націсніце кнопку ніжэй." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Колькасць карыстальнікаў" }, - "loggingInAs": { - "message": "Увайсці як" - }, - "notYou": { - "message": "Не вы?" - }, "pickAnAvatarColor": { "message": "Выберыце колер аватара" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Запытаць ухваленне адміністратара" }, - "approveWithMasterPassword": { - "message": "Ухваліць з дапамогай асноўнага пароля" - }, "trustedDeviceEncryption": { "message": "Шыфраванне даверанай прылады" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запыт адпраўлены адміністратару." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вы атрымаеце апавяшчэння пасля яго ўхвалення." - }, "troubleLoggingIn": { "message": "Праблемы з уваходам?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index f51788bc724..04d4e25bb7c 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Бележки" }, + "privateNote": { + "message": "Лична бележка" + }, "note": { "message": "Бележка" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Подредба чрез влачене" }, + "dragToReorder": { + "message": "Плъзнете за пренареждане" + }, "cfTypeText": { "message": "Текст" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Редактиране на папка" }, + "editWithName": { + "message": "Редактиране на $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Нова папка" }, @@ -860,9 +879,6 @@ "filter": { "message": "Филтриране" }, - "moveSelectedToOrg": { - "message": "Преместване на избраните в организация" - }, "deleteSelected": { "message": "Изтриване на избраното" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Избраните записи бяха преместени в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Елементите са преместени в $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Местоположение" + }, "loginOrCreateNewAccount": { "message": "Впишете се или създайте нов абонамент, за да достъпите защитен трезор." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Сесията за удостоверяване е изтекла. Моля, започнете отначало процеса по вписване." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Потвърдете самоличността си" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Въведете е-пощата на регистрацията си и подсказката за паролата ще Ви бъде изпратена" }, - "passwordHint": { - "message": "Подсказка за паролата" - }, - "enterEmailToGetHint": { - "message": "Въведете адреса на електронната си поща, за да получите подсказка за главната парола." - }, "getMasterPasswordHint": { "message": "Подсказка за главната парола" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Изберете организацията, в която искате да преместите записа. Преместването прехвърля собствеността му към новата организация. След това няма вече директно да го притежавате." }, - "moveManyToOrgDesc": { - "message": "Изберете организацията, в която искате да преместите избраните записи. Преместването прехвърля собствеността им към новата организация. След това няма вече директно да ги притежавате." - }, "collectionsDesc": { "message": "Редактиране на колекциите, с които записът е споделен. Само потребителите на организациите, с които колекцията е споделена, ще виждат записа." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Избрали сте $COUNT$ запис(а). От тях могат да се преместят: $MOVEABLE_COUNT$, не могат да се преместят: $NONMOVEABLE_COUNT$.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Код за потвърждаване (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Отнемане на достъпа" }, + "revoke": { + "message": "Отнемане" + }, "twoStepLoginProviderEnabled": { "message": "Този доставчик на двустепенно удостоверяване е включен за абонамента ви." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "Преместено нагоре: $LABEL$. Позиция $INDEX$ от $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "Преместено надолу: $LABEL$. Позиция $INDEX$ от $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Ако актуализирате шифроващия ключ, папките Ви няма да могат да бъдат дешифрирани. За да продължите с промяната, папките трябва да бъдат изтрити. Елементите в трезора няма да бъдат изтрити, ако продължите." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Тази политика не се прилага към собствениците и администраторите на организацията." }, + "limitSendViews": { + "message": "Ограничаване на преглежданията" + }, + "limitSendViewsHint": { + "message": "Никой няма да може да преглежда това Изпращане след достигане на ограничението.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Остават $ACCESSCOUNT$ преглеждания", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Подробности за Изпращането", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Текст за споделяне" + }, "sendTypeFile": { "message": "Файл" }, "sendTypeText": { "message": "Текст" }, + "sendPasswordDescV3": { + "message": "Добавете незадължителна парола, с която получателите да имат достъп до това Изпращане.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Създаване на изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Изтриване на изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Сигурни ли сте, че искате да изтриете това изпращане?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Вид на изпратеното", + "deleteSendPermanentConfirmation": { + "message": "Наистина ли искате да изтриете завинаги това Изпращане?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Дата на изтриване" }, - "deletionDateDesc": { - "message": "Изпращането ще бъде окончателно изтрито на зададената дата и време.", + "deletionDateDescV2": { + "message": "Изпращането ще бъде окончателно изтрито на тази дата.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Максимален брой достъпвания" }, - "maxAccessCountDesc": { - "message": "При задаване — това изпращане ще се изключи след определен брой достъпвания.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Текущ брой на достъпванията" - }, - "sendPasswordDesc": { - "message": "Изискване на парола за достъп до това изпращане.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Скрити бележки за това изпращане.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Изключено" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Сигурни ли сте, че искате да премахнете паролата?" }, - "hideEmail": { - "message": "Скриване на е-пощата ми от получателите." - }, - "disableThisSend": { - "message": "Пълно спиране на това изпращане — никой няма да има достъп.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Всички изпращания" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Предстои изтриване" }, + "hideTextByDefault": { + "message": "Скриване на текста по подразбиране" + }, "expired": { "message": "Изтекъл" }, @@ -5415,13 +5441,6 @@ "message": "Потребителите да не могат да скриват адреса на е-пощата си от получателите, когато създават или редактират изпращания.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "В момента са в сила следните политики на организацията:" - }, - "sendDisableHideEmailInEffect": { - "message": "Потребителите не могат да скриват адреса на е-пощата си от получателите, когато създават или редактират изпращания.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Редактирана политика № $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Изключване на индивидуалното притежание за потребителите в организацията" }, - "textHiddenByDefault": { - "message": "При достъп до изпращането стандартно текстът да се скрива", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Описателно име за това изпращане.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Текст за изпращане." - }, - "sendFileDesc": { - "message": "Файл за изпращане." - }, - "copySendLinkOnSave": { - "message": "Копиране на връзката към изпращането при запазването му за лесно споделяне." - }, - "sendLinkLabel": { - "message": "Изпращане на връзката", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Изпращане", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Грешка при запазване на датата на валидност и изтриване." }, + "hideYourEmail": { + "message": "Скриване на Вашата е-поща от получателите." + }, "webAuthnFallbackMsg": { "message": "За да потвърдите двустепенното удостоверяване, натиснете бутона по-долу." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Брой потребители" }, - "loggingInAs": { - "message": "Вписване като" - }, - "notYou": { - "message": "Това не сте Вие?" - }, "pickAnAvatarColor": { "message": "Изберете цвят за аватара" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Подаване на заявка за одобрение от администратор" }, - "approveWithMasterPassword": { - "message": "Одобряване с главната парола" - }, "trustedDeviceEncryption": { "message": "Шифроване чрез доверено устройство" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Вашата заявка беше изпратена до администратора Ви." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ще получите известие, когато тя бъде одобрена." - }, "troubleLoggingIn": { "message": "Имате проблем с вписването?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Настройте управлението на устройства в Битуорден, като използвате ръководството за внедряване за платформата си." }, + "deviceIdMissing": { + "message": "Липсва идентификатор на устройството" + }, + "deviceTypeMissing": { + "message": "Липсва тип на устройството" + }, + "deviceCreationDateMissing": { + "message": "Липсва дата на създаване на устройството" + }, "desktopRequired": { "message": "Трябва да сте на компютър" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Научете повече относно ППИ на Биуорден" }, + "fileSend": { + "message": "Файлово изпращане" + }, "fileSends": { "message": "Файлови изпращания" }, + "textSend": { + "message": "Текстово изпращане" + }, "textSends": { "message": "Текстови изпращания" }, @@ -10084,10 +10088,6 @@ "message": "Включване на специални знаци", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Добавяне на прикачен файл" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Името на организацията не може да бъде по-дълго от 50 знака." }, + "sshKeyWrongPassword": { + "message": "Въведената парола е неправилна." + }, + "importSshKey": { + "message": "Внасяне" + }, + "confirmSshKeyPassword": { + "message": "Потвърждаване на паролата" + }, + "enterSshKeyPasswordDesc": { + "message": "Въведете паролата за SSH-ключа." + }, + "enterSshKeyPassword": { + "message": "Въведете паролата" + }, + "invalidSshKey": { + "message": "SSH ключът е неправилен" + }, + "sshKeyTypeUnsupported": { + "message": "Типът на SSH ключа не се поддържа" + }, + "importSshKeyFromClipboard": { + "message": "Внасяне на ключ от буфера за обмен" + }, + "sshKeyImported": { + "message": "SSH ключът е внесен успешно" + }, + "copySSHPrivateKey": { + "message": "Копиране на частния ключ" + }, "openingExtension": { "message": "Отваряне на добавката за браузър на Битуорден" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Назначените места превишават наличния брой." }, + "changeAtRiskPassword": { + "message": "Промяна на парола в риск" + }, "removeUnlockWithPinPolicyTitle": { "message": "Премахване на отключването чрез ПИН" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Тези събития са само за пример и не отразяват истинските събития във Вашата организация." + }, + "cannotCreateCollection": { + "message": "Безплатните организации могат да имат не повече от 2 колекции. Надградете до платен план, ако искате да имате повече колекции." } } diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 853bf4fe67d..8c082c57e30 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "মন্তব্য" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "বাছাই করতে টানুন" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "পাঠ্য" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "ফোল্ডার সম্পাদনা" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "আপনার সুরক্ষিত ভল্টে প্রবেশ করতে লগ ইন করুন অথবা একটি নতুন অ্যাকাউন্ট তৈরি করুন।" }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "পাসওয়ার্ড ইঙ্গিত" - }, - "enterEmailToGetHint": { - "message": "আপনার মূল পাসওয়ার্ডের ইঙ্গিতটি পেতে আপনার অ্যাকাউন্টের ইমেল ঠিকানা প্রবেশ করুন।" - }, "getMasterPasswordHint": { "message": "মূল পাসওয়ার্ডের ইঙ্গিত পান" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ফাইল" }, "sendTypeText": { "message": "পাঠ্য" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index 83b7892bb93..7efb47bd86c 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Bilješke" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Povuci za sortiranje" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Uredite folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Premjestite Odabrano u Organizaciju" - }, "deleteSelected": { "message": "Obrišite Odabrano" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Odabrane stavke premještene u $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Nagovještaj lozinke" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Broj korisnika" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index b1e2d60f263..a4f2aeb7f55 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Arrossega per ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edita la carpeta" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Carpeta nova" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtre" }, - "moveSelectedToOrg": { - "message": "Desplaça la selecció a l'organització" - }, "deleteSelected": { "message": "Suprimeix selecció" }, @@ -918,15 +934,6 @@ } } }, - "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": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Inicieu sessió o creeu un compte nou per accedir a la caixa forta." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "La sessió d'autenticació s'ha esgotat. Reinicieu el procés d'inici de sessió." }, - "verifyIdentity": { - "message": "Verificació de la vostra identitat" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "No reconeixem aquest dispositiu. Introduïu el codi que us hem enviat al correu electrònic per verificar la identitat." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduïu l'adreça de correu electrònic del compte i se us enviarà la pista de contrasenya" }, - "passwordHint": { - "message": "Pista de la contrasenya" - }, - "enterEmailToGetHint": { - "message": "Introduïu l'adreça electrònica del vostre compte per rebre la contrasenya mestra." - }, "getMasterPasswordHint": { "message": "Obteniu la pista de la contrasenya mestra" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Trieu una organització a la qual vulgueu desplaçar aquest element. El trasllat a una organització transfereix la propietat de l'element a aquesta organització. Ja no sereu el propietari directe d'aquest element una vegada s'haja mogut." }, - "moveManyToOrgDesc": { - "message": "Trieu una organització a la qual vulgueu desplaçar aquests elements. El trasllat a una organització transfereix la propietat dels elements a aquesta organització. Ja no sereu el propietari directe d'aquests elements una vegada s'hagen mogut." - }, "collectionsDesc": { "message": "Editeu les col·leccions amb les què es comparteix aquest element. Només els usuaris de l'organització que tinguen accés a aquestes col·leccions podran veure'l." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Heu seleccionat $COUNT$ elements. $MOVEABLE_COUNT$ elements es poden desplaçar a una organització, $NONMOVEABLE_COUNT$ no.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Codi de verificació (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoca l'accés" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Aquest proveïdor d'inici de sessió en dos passos està habilitat al vostre compte." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Els propietaris i administradors d’organitzacions estan exempts de fer complir aquesta política." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fitxer" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nou Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Suprimeix el Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Esteu segur que voleu suprimir aquest Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Quin tipus de Send és aquest?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data de supressió" }, - "deletionDateDesc": { - "message": "L'enviament se suprimirà permanentment a la data i hora especificades.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Recompte màxim d'accés" }, - "maxAccessCountDesc": { - "message": "Si s’estableix, els usuaris ja no podran accedir a aquest Send una vegada s’assolisca el nombre màxim d’accessos.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Recompte d’accés actual" - }, - "sendPasswordDesc": { - "message": "Opcionalment, necessiteu una contrasenya perquè els usuaris accedisquen a aquest enviament.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Notes privades sobre aquest enviament.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Inhabilitat" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Esteu segur que voleu suprimir la contrasenya?" }, - "hideEmail": { - "message": "Amagueu la meua adreça de correu electrònic als destinataris." - }, - "disableThisSend": { - "message": "Desactiveu aquest enviament perquè ningú no hi puga accedir.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Tots els Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pendent de supressió" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Caducat" }, @@ -5415,13 +5441,6 @@ "message": "Mostra sempre l'adreça de correu electrònic del membre amb els destinataris quan creeu o editeu un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Actualment estan en vigor les polítiques organitzatives següents:" - }, - "sendDisableHideEmailInEffect": { - "message": "No es permet als usuaris amagar la seua adreça de correu electrònic dels destinataris en crear o editar un Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Política modificada $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Desactiva la propietat personal per als usuaris de l'organització" }, - "textHiddenByDefault": { - "message": "Quan accediu a Enviar, amaga el text per defecte", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Un nom apropiat per descriure aquest Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "El text que voleu pel Send." - }, - "sendFileDesc": { - "message": "El fitxer que voleu pel Send." - }, - "copySendLinkOnSave": { - "message": "Copie l'enllaç per compartir aquest Send al meu porta-retalls després de guardar-lo." - }, - "sendLinkLabel": { - "message": "Enllaç Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "S'ha produït un error en guardar les dates de supressió i caducitat." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Per verificar el vostre 2FA, feu clic al botó següent." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Nombre d'usuaris" }, - "loggingInAs": { - "message": "Has iniciat sessió com" - }, - "notYou": { - "message": "No sou vosaltres?" - }, "pickAnAvatarColor": { "message": "Tria un color d'avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Sol·liciteu l'aprovació de l'administrador" }, - "approveWithMasterPassword": { - "message": "Aprova amb contrasenya mestra" - }, "trustedDeviceEncryption": { "message": "Encriptació de dispositius de confiança" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La vostra sol·licitud s'ha enviat a l'administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se us notificarà una vegada aprovat." - }, "troubleLoggingIn": { "message": "Teniu problemes per iniciar la sessió?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index b24b86bdb49..46b510a6459 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Poznámka" }, + "privateNote": { + "message": "Soukromá poznámka" + }, "note": { "message": "Poznámka" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Přetáhnutím seřadíte" }, + "dragToReorder": { + "message": "Přesuňte tažením" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Upravit složku" }, + "editWithName": { + "message": "Upravit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nová složka" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtr" }, - "moveSelectedToOrg": { - "message": "Přesunout vybrané do organizace" - }, "deleteSelected": { "message": "Smazat vybrané" }, @@ -918,15 +934,6 @@ } } }, - "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": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Umístění" + }, "loginOrCreateNewAccount": { "message": "Pro přístup do Vašeho bezpečného trezoru se přihlaste nebo si vytvořte nový účet." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Vypršel časový limit relace ověřování. Restartujte proces přihlášení." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Ověřte svou totožnost" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadejte svou e-mailovou adresu, na kterou Vám zašleme nápovědu k heslu" }, - "passwordHint": { - "message": "Nápověda pro heslo" - }, - "enterEmailToGetHint": { - "message": "Zadejte e-mailovou adresu pro zaslání nápovědy k hlavnímu heslu." - }, "getMasterPasswordHint": { "message": "Zaslat nápovědu k hlavnímu heslu" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Vyberte organizaci, do které chcete tuto položku přesunout. Přesun do organizace převede vlastnictví položky této organizaci. Po přesunutí této položky již nebudete přímým vlastníkem této položky." }, - "moveManyToOrgDesc": { - "message": "Vyberte organizaci, do které chcete tyto položky přesunout. Přesun do organizace převede vlastnictví položek této organizaci. Po přesunutí již nebudete přímým vlastníkem těchto položek." - }, "collectionsDesc": { "message": "Upravte kolekce, ve kterých je tato položka sdílená. Pouze uživatelé organizace, kteří mají přístup k těmto kolekcím, budou moci tuto položku vidět." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Vybrali jste $COUNT$ položek. $MOVEABLE_COUNT$ položek lze přesunout do organizace, $NONMOVEABLE_COUNT$ nelze.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Ověřovací kód (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Zrušit přístup" }, + "revoke": { + "message": "Odvolat" + }, "twoStepLoginProviderEnabled": { "message": "Tento poskytovatel dvoufázového přihlášení je ve Vašem účtu aktivní." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ - přesunuto nahoru, pozice $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ - přesunuto dolů, pozice $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Při aktualizaci šifrovacího klíče se nepodařilo dešifrovat Vaše složky. Chcete-li pokračovat v aktualizaci, musí být Vaše složky smazány. Pokud budete pokračovat, nebudou smazány žádné položky trezoru." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Majitelé a administrátoři organizací jsou od prosazování těchto zásad osvobozeni." }, + "limitSendViews": { + "message": "Omezit zobrazení" + }, + "limitSendViewsHint": { + "message": "Po dosažení limitu nebude nikdo moci zobrazit tento Send.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Zbývá $ACCESSCOUNT$ zobrazení", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Podrobnosti Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text ke sdílení" + }, "sendTypeFile": { "message": "Soubor" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Přidá volitelné heslo pro příjemce pro přístup k tomuto Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nový Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Smazat Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Opravdu chcete smazat tento Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Jakého typu je tento Send?", + "deleteSendPermanentConfirmation": { + "message": "Opravdu chcete tento Send trvale smazat?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Datum smazání" }, - "deletionDateDesc": { - "message": "Tento Send bude trvale smazán v určený datum a čas.", + "deletionDateDescV2": { + "message": "Tento Send bude trvale smazán v určené datum.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximální počet přístupů" }, - "maxAccessCountDesc": { - "message": "Je-li nastaveno, uživatelé již nebudou mít přístup k tomuto Send, jakmile bude dosaženo maximálního počtu přístupů.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Aktuální počet přístupů" - }, - "sendPasswordDesc": { - "message": "Volitelně vyžadovat heslo pro přístup k tomuto Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Soukromé poznámky o tomto Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Zakázáno" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Opravdu chcete odebrat heslo?" }, - "hideEmail": { - "message": "Skrýt moji e-mailovou adresu před příjemci" - }, - "disableThisSend": { - "message": "Deaktivovat tento Send, takže k němu nebude moci nikdo přistoupit", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Všechny Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Čekání na smazání" }, + "hideTextByDefault": { + "message": "Ve výchozím nastavení skrýt text" + }, "expired": { "message": "Vypršela platnost" }, @@ -5415,13 +5441,6 @@ "message": "Při vytváření nebo úpravách Send vždy zobrazí e-mailovou adresu člena s příjemci.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Aktuálně platí následující zásady organizace:" - }, - "sendDisableHideEmailInEffect": { - "message": "Uživatelé nesmí při vytváření nebo úpravách Send skrýt svou e-mailovou adresu před příjemci.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Byly změněny zásady $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Odebere osobní vlastnictví pro uživatele organizace" }, - "textHiddenByDefault": { - "message": "Při přístupu k Send skrýt text ve výchozím nastavení", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Přátelský název pro popis tohoto Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Text, který chcete odeslat." - }, - "sendFileDesc": { - "message": "Soubor, který chcete odeslat." - }, - "copySendLinkOnSave": { - "message": "Kopírovat odkaz pro sdílení tohoto Send do mé schránky při uložení" - }, - "sendLinkLabel": { - "message": "Odkaz tohoto Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Došlo k chybě při ukládání datumů smazání a vypršení platnosti." }, + "hideYourEmail": { + "message": "Skryje Vaši e-mailovou adresu před zobrazením." + }, "webAuthnFallbackMsg": { "message": "Pro ověření dvoufaktorového ověření klepněte na tlačítko níže." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Počet uživatelů" }, - "loggingInAs": { - "message": "Přihlašování jako" - }, - "notYou": { - "message": "Nejste to Vy?" - }, "pickAnAvatarColor": { "message": "Zvolte barvu avatara" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Žádost o schválení správcem" }, - "approveWithMasterPassword": { - "message": "Schválit hlavním heslem" - }, "trustedDeviceEncryption": { "message": "Šifrování důvěryhodného zařízení" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Váš požadavek byl odeslán Vašemu správci." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete upozorněni." - }, "troubleLoggingIn": { "message": "Potíže s přihlášením?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Nastaví správu zařízení pro Bitwarden pomocí implementačního průvodce pro Vaši platformu." }, + "deviceIdMissing": { + "message": "Chybí ID zařízení" + }, + "deviceTypeMissing": { + "message": "Chybí typ zařízení" + }, + "deviceCreationDateMissing": { + "message": "Chybí datum vytvoření zařízení" + }, "desktopRequired": { "message": "Je vyžadována desktopová aplikace" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Další informace o API Bitwardenu" }, + "fileSend": { + "message": "Send souboru" + }, "fileSends": { "message": "Sends se soubory" }, + "textSend": { + "message": "Send textu" + }, "textSends": { "message": "Sends s texty" }, @@ -10084,10 +10088,6 @@ "message": "Zahrnout speciální znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Přidat přílohu" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Název organizace nesmí přesáhnout 50 znaků." }, + "sshKeyWrongPassword": { + "message": "Zadané heslo není správné." + }, + "importSshKey": { + "message": "Importovat" + }, + "confirmSshKeyPassword": { + "message": "Potvrdit heslo" + }, + "enterSshKeyPasswordDesc": { + "message": "Zadejte heslo pro SSH klíč." + }, + "enterSshKeyPassword": { + "message": "Zadejte heslo" + }, + "invalidSshKey": { + "message": "SSH klíč je neplatný" + }, + "sshKeyTypeUnsupported": { + "message": "Typ SSH klíče není podporován" + }, + "importSshKeyFromClipboard": { + "message": "Importovat klíč ze schránky" + }, + "sshKeyImported": { + "message": "SSH klíč byl úspěšně importován" + }, + "copySSHPrivateKey": { + "message": "Kopírovat soukromý klíč" + }, "openingExtension": { "message": "Otevírání rozšíření Bitwarden pro prohlížeč" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Přiřazení uživatelé překračují dostupné uživatele." }, + "changeAtRiskPassword": { + "message": "Změnit ohrožené heslo" + }, "removeUnlockWithPinPolicyTitle": { "message": "Odebrat odemknutí pomocí PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Tyto události jsou jen příklady a neodrážejí skutečné události v rámci Vaší organizace Bitwarden." + }, + "cannotCreateCollection": { + "message": "Bezplatné organizace mohou mít až 2 kolekce. Chcete-li přidat více kolekcí, přejděte na placený tarif." } } diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index ff08a6fbe7f..2fd61e01526 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Nodiadau" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 530a9ce0b03..f8a335011e5 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notater" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Notat" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Træk for at sortere" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Redigér mappe" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtre" }, - "moveSelectedToOrg": { - "message": "Flyt valgte til organisation" - }, "deleteSelected": { "message": "Slet valgte" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Valgte emner flyttet til $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Emner flyttet til $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log ind eller opret en ny konto for at tilgå din sikre boks." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "Godkendelsessessionen fik timeout. Genstart loginprocessen." }, - "verifyIdentity": { - "message": "Bekræft din identitet" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Denne enhed er ikke genkendt. Angiv koden i den tilsendte e-mail for at bekræfte identiteten." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Angiv kontoens e-mailadresse og få et adgangskodetip fremsendt" }, - "passwordHint": { - "message": "Adgangskodetip" - }, - "enterEmailToGetHint": { - "message": "Angiv din kontos e-mailadresse for at modtage dit hovedadgangskodetip." - }, "getMasterPasswordHint": { "message": "Få hovedadgangskodetip" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Vælg den organisation, til hvilken dette emne ønskes flyttet. Flytning overfører ejerskab af emnet til organisationen, og du vil efter flytningen ikke længere være den direkte ejer af emnet." }, - "moveManyToOrgDesc": { - "message": "Vælg organisationen, til hvilken disse emner ønskes flyttet. Flytning til en organisation overfører ejerskabet af emnerne til denne organisation, og du vil efter flytningen ikke længere være den direkte ejer af disse emner." - }, "collectionsDesc": { "message": "Redigér de samlinger, med hvilke dette emne deles. Kun organisationsbrugere med adgang til disse samlinger vil kunne se dette emne." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ emne(r) valgt, hvoraf $MOVEABLE_COUNT$ kan flyttes til en organisation, mens $NONMOVEABLE_COUNT$ ikke kan.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Bekræftelseskode (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Ophæv adgang" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Denne totrins-loginudbyder er aktiveret på kontoen." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Under opdatering af krypteringsnøglen kunne de relevante mapper ikke dekrypteres. For at fortsætte opdateringen skal mapperne slettes. Ingen boks-emner slettes, hvis der fortsættes." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Denne politik håndhæves ikke for organisationsejere og -admins." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Ny Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Slet Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Sikker på, at denne Send skal slettes?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Hvilken type Send er denne?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Sletningsdato" }, - "deletionDateDesc": { - "message": "Denne Send slettes permanent på den angivne dato og tidspunkt.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimalt adgangsantal" }, - "maxAccessCountDesc": { - "message": "Hvis opsat, vil brugere ikke længere kunne tilgå denne Send, når det maksimale adgangsantal er nået.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Aktuelt adgangsantal" - }, - "sendPasswordDesc": { - "message": "Valgfrit brugeradgangskodekrav for tilgang til denne Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Fortrolige notater om denne Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Deaktiveret" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Sikker på, at adgangskoden skal fjernes?" }, - "hideEmail": { - "message": "Skjul min e-mailadresse for modtagere." - }, - "disableThisSend": { - "message": "Deaktivér denne Send så ingen kan tilgå den.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alle Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Afventer sletning" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Udløbet" }, @@ -5415,13 +5441,6 @@ "message": "Vis altid medlemmets e-mailadresse med modtagere, når Sends oprettes eller redigeres.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Følgende organisationspolitikker er i øjeblikket gældende:" - }, - "sendDisableHideEmailInEffect": { - "message": "Brugere har ikke lov til at skjule deres e-mailadresser for modtagere, når en Send oprettes eller redigeres.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Redigerede politik $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Fjern personligt ejerskab for organisationsbrugere" }, - "textHiddenByDefault": { - "message": "Når Send tilgås, skjul som standard teksten", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Et logisk navn til at beskrive denne Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Teksten, du vil sende." - }, - "sendFileDesc": { - "message": "Filen, du vil sende." - }, - "copySendLinkOnSave": { - "message": "Kopiér linket for at dele denne Send til udklipsholden ved gem." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "En fejl opstod under forsøget på at gemme sletnings- og udløbsdatoer." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Klik på knappen nedenfor for at bekræfte din 2FA." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Antal brugere" }, - "loggingInAs": { - "message": "Logger ind som" - }, - "notYou": { - "message": "Ikke dig?" - }, "pickAnAvatarColor": { "message": "Vælg avatarfarve" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Anmod om admin-godkendelse" }, - "approveWithMasterPassword": { - "message": "Godkend med hovedadgangskode" - }, "trustedDeviceEncryption": { "message": "Betroet enhedskryptering" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Anmodningen er sendt til din gruppe-admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du underrettes, når godkendelse foreligger." - }, "troubleLoggingIn": { "message": "Problemer med at logge ind?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Opsæt enhedshåndtering for Bitwarden vha. implementeringsvejledningen for den aktuelle platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Læs mere om Bitwardens API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "Fil-Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Tekst-Sends" }, @@ -10084,10 +10088,6 @@ "message": "Inkludér specialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Tilføj vedhæftning" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organisationsnavn må ikke overstige 50 tegn." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index a27de099a74..e0a25e99ae2 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -6,7 +6,7 @@ "message": "Kritische Anwendungen" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "Keine kritischen Anwendungen gefährdet" }, "accessIntelligence": { "message": "Zugriff auf Informationen" @@ -201,6 +201,9 @@ "notes": { "message": "Notizen" }, + "privateNote": { + "message": "Private Notiz" + }, "note": { "message": "Notiz" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Zum Sortieren ziehen" }, + "dragToReorder": { + "message": "Ziehen zum umsortieren" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Ordner bearbeiten" }, + "editWithName": { + "message": "$ITEM$: $NAME$ bearbeiten", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Neuer Ordner" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Auswahl in Organisation verschieben" - }, "deleteSelected": { "message": "Auswahl löschen" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Ausgewählte Einträge in $ORGNAME$ verschoben", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Einträge verschoben nach $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nein" }, + "location": { + "message": "Standort" + }, "loginOrCreateNewAccount": { "message": "Sie müssen sich anmelden oder ein neues Konto erstellen, um auf den Tresor zugreifen zu können." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Die Authentifizierungssitzung ist abgelaufen. Bitte starte den Anmeldeprozess neu." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifiziere deine Identität" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Gib deine E-Mail-Adresse ein und dein Passwort-Hinweis wird dir zugesandt" }, - "passwordHint": { - "message": "Passwort-Hinweis" - }, - "enterEmailToGetHint": { - "message": "Geben Sie die E-Mail Adresse Ihres Kontos ein, um einen Hinweis auf ihr Master-Passwort zu erhalten." - }, "getMasterPasswordHint": { "message": "Hinweis zum Master-Passwort erhalten" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Eigentümer dieses Eintrags, sobald er verschoben wurde." }, - "moveManyToOrgDesc": { - "message": "Wähle eine Organisation aus, in die du diese Einträge verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum der Einträge an diese Organisation. Du bist nicht mehr der direkte Eigentümer dieser Einträge, sobald sie verschoben wurden." - }, "collectionsDesc": { "message": "Bearbeite die Sammlungen, mit denen dieser Eintrag geteilt wird. Nur Organisationsmitglieder mit Zugriff auf diese Sammlungen werden diesen Eintrag sehen können." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Du hast $COUNT$ Eintrag/Einträge ausgewählt. $MOVEABLE_COUNT$ Eintrag/Einträge kann/können in eine Organisation verschoben werden, $NONMOVEABLE_COUNT$ nicht.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verifizierungscode (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Zugriff widerrufen" }, + "revoke": { + "message": "Widerrufen" + }, "twoStepLoginProviderEnabled": { "message": "Dieser Zwei-Faktor-Authentifizierungsanbieter ist für dein Konto aktiviert." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ nach oben verschoben, Position $INDEX$ von $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ nach unten verschoben, Position $INDEX$ von $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Beim Aktualisieren deines Verschlüsselungsschlüssels konnten deine Ordner nicht entschlüsselt werden. Um mit der Aktualisierung fortzufahren, müssen deine Ordner gelöscht werden. Es werden keine Tresor-Einträge gelöscht, wenn du fortfährst." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisationseigentümer und Administratoren sind von der Durchsetzung dieser Richtlinie ausgenommen." }, + "limitSendViews": { + "message": "Ansichten begrenzen" + }, + "limitSendViewsHint": { + "message": "Nach Erreichen des Limits kann niemand mehr dieses Send sehen.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ Ansichten übrig", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send-Details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Zu teilender Text" + }, "sendTypeFile": { "message": "Datei" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Füge ein optionales Passwort hinzu, mit dem Empfänger auf dieses Send zugreifen können.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Neues Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send löschen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Bist du sicher, dass du dieses Send löschen möchtest?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Welche Art von Send ist das?", + "deleteSendPermanentConfirmation": { + "message": "Bist du sicher, dass du dieses Send dauerhaft löschen möchtest?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Löschdatum" }, - "deletionDateDesc": { - "message": "Das Send wird am angegebenen Datum zur angegebenen Uhrzeit dauerhaft gelöscht.", + "deletionDateDescV2": { + "message": "Das Send wird an diesem Datum dauerhaft gelöscht.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximale Zugriffsanzahl" }, - "maxAccessCountDesc": { - "message": "Falls aktiviert, können Benutzer nicht mehr auf dieses Send zugreifen, sobald die maximale Zugriffsanzahl erreicht ist.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Aktuelle Zugriffsanzahl" - }, - "sendPasswordDesc": { - "message": "Optional ein Passwort verlangen, damit Benutzer auf dieses Send zugreifen können.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private Notizen zu diesem Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Deaktiviert" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Bist du sicher, dass du das Passwort entfernen möchtest?" }, - "hideEmail": { - "message": "Meine E-Mail-Adresse vor den Empfängern ausblenden." - }, - "disableThisSend": { - "message": "Dieses Send deaktivieren, damit niemand darauf zugreifen kann.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alle Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Ausstehende Löschung" }, + "hideTextByDefault": { + "message": "Text standardmäßig ausblenden" + }, "expired": { "message": "Abgelaufen" }, @@ -5415,13 +5441,6 @@ "message": "Benutzern nicht gestatten, ihre E-Mail-Adresse vor Empfängern zu verstecken, wenn sie ein Send erstellen oder bearbeiten.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Die folgenden Organisationsrichtlinien sind derzeit gültig:" - }, - "sendDisableHideEmailInEffect": { - "message": "Benutzer dürfen ihre E-Mail-Adresse beim Erstellen oder Bearbeiten eines Sends nicht vor den Empfängern verstecken.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Richtlinie $ID$ geändert.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Persönliches Eigentum für Organisationsbenutzer deaktivieren" }, - "textHiddenByDefault": { - "message": "Beim Zugriff auf dieses Send den Text standardmäßig ausblenden", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Ein eigener Name, um dieses Send zu beschreiben.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Der Text, den du versenden möchtest." - }, - "sendFileDesc": { - "message": "Die Datei, die du versenden möchtest." - }, - "copySendLinkOnSave": { - "message": "Den Link zum Teilen dieses Sends beim Speichern in meine Zwischenablage kopieren." - }, - "sendLinkLabel": { - "message": "Send-Link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Es gab einen Fehler beim Speichern deiner Lösch- und Verfallsdaten." }, + "hideYourEmail": { + "message": "Verberge deine E-Mail-Adresse vor Betrachtern." + }, "webAuthnFallbackMsg": { "message": "Um deine 2FA zu verifizieren, klicke bitte unten auf den Button." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Anzahl der Benutzer" }, - "loggingInAs": { - "message": "Anmelden als" - }, - "notYou": { - "message": "Nicht du?" - }, "pickAnAvatarColor": { "message": "Wähle eine Profilbild-Farbe" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Admin-Genehmigung anfragen" }, - "approveWithMasterPassword": { - "message": "Mit Master-Passwort genehmigen" - }, "trustedDeviceEncryption": { "message": "Vertrauenswürdige Geräteverschlüsselung" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Deine Anfrage wurde an deinen Administrator gesendet." }, - "youWillBeNotifiedOnceApproved": { - "message": "Nach einer Genehmigung wirst du benachrichtigt." - }, "troubleLoggingIn": { "message": "Probleme beim Anmelden?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Konfiguriere die Geräteverwaltung für Bitwarden mithilfe der Implementierungsanleitung für deine Plattform." }, + "deviceIdMissing": { + "message": "Geräte-ID fehlt" + }, + "deviceTypeMissing": { + "message": "Gerätetyp fehlt" + }, + "deviceCreationDateMissing": { + "message": "Geräteerstellungsdatum fehlt" + }, "desktopRequired": { "message": "Desktop-Rechner erforderlich" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Erfahre mehr über die API von Bitwarden" }, + "fileSend": { + "message": "Datei-Send" + }, "fileSends": { "message": "Datei-Sends" }, + "textSend": { + "message": "Text-Send" + }, "textSends": { "message": "Text-Sends" }, @@ -10084,10 +10088,6 @@ "message": "Sonderzeichen einschließen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Anhang hinzufügen" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Der Name der Organisation darf 50 Zeichen nicht überschreiten." }, + "sshKeyWrongPassword": { + "message": "Dein eingegebenes Passwort ist falsch." + }, + "importSshKey": { + "message": "Importieren" + }, + "confirmSshKeyPassword": { + "message": "Passwort bestätigen" + }, + "enterSshKeyPasswordDesc": { + "message": "Gib das Passwort für den SSH-Schlüssel ein." + }, + "enterSshKeyPassword": { + "message": "Passwort eingeben" + }, + "invalidSshKey": { + "message": "Der SSH-Schlüssel ist ungültig" + }, + "sshKeyTypeUnsupported": { + "message": "Der SSH-Schlüsseltyp wird nicht unterstützt" + }, + "importSshKeyFromClipboard": { + "message": "Schlüssel aus Zwischenablage importieren" + }, + "sshKeyImported": { + "message": "SSH-Schlüssel erfolgreich importiert" + }, + "copySSHPrivateKey": { + "message": "Privaten Schlüssel kopieren" + }, "openingExtension": { "message": "Bitwarden-Browser-Erweiterung wird geöffnet" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Die zugewiesenen Plätze überschreiten die verfügbaren Plätze." }, + "changeAtRiskPassword": { + "message": "Gefährdetes Passwort ändern" + }, "removeUnlockWithPinPolicyTitle": { "message": "Entsperren mit PIN entfernen" }, @@ -10494,7 +10527,7 @@ "message": "Mitgliedern nicht erlauben, ihr Konto mit einer PIN zu entsperren." }, "limitedEventLogs": { - "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "message": "$PRODUCT_TYPE$-Abos haben keinen Zugriff auf echte Ereignisprotokolle", "placeholders": { "product_type": { "content": "$1", @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + "message": "Erhalte vollen Zugriff auf Ereignisprotokolle von Organisationen durch ein Upgrade auf ein Teams- oder Enterprise-Abo." }, "upgradeEventLogTitle": { - "message": "Upgrade for real event log data" + "message": "Upgrade für echte Ereignisprotokolldaten" }, "upgradeEventLogMessage": { - "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + "message": "Diese Ereignisse sind nur Beispiele und spiegeln keine realen Ereignisse in deiner Bitwarden-Organisation wider." + }, + "cannotCreateCollection": { + "message": "Kostenlose Organisationen können bis zu 2 Sammlungen haben. Upgrade auf ein kostenpflichtiges Abo, um mehr Sammlungen hinzuzufügen." } } diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index 0cdb9b68bf1..e20b5cc52a0 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Σημειώσεις" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Σημείωση" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Σύρετε για ταξινόμηση" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Κείμενο" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Επεξεργασία Φακέλου" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Φίλτρο" }, - "moveSelectedToOrg": { - "message": "Μετακίνηση Επιλεγμένων στον Οργανισμό" - }, "deleteSelected": { "message": "Διαγραφή επιλεγμένων" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Τα επιλεγμένα αντικείμενα μετακινήθηκαν στο $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Τα αντικείμενα μεταφέρθηκαν στο $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Όχι" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Συνδεθείτε ή δημιουργήστε νέο λογαριασμό για να αποκτήσετε πρόσβαση στο vault σας." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "Επαληθεύστε την ταυτότητά σας" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Εισαγάγετε τη διεύθυνση email του λογαριασμού σας και θα σας αποσταλεί η υπόδειξη για τον κωδικό πρόσβασής σας" }, - "passwordHint": { - "message": "Υπόδειξη Κωδικού" - }, - "enterEmailToGetHint": { - "message": "Παρακαλούμε εισάγετε το email του λογαριασμού σας, ώστε να λάβετε την υπόδειξη του κύριου κωδικού πρόσβασης." - }, "getMasterPasswordHint": { "message": "Λήψη υπόδειξης κύριου κωδικού" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Επιλέξτε έναν οργανισμό στον οποίο θέλετε να μετακινήσετε αυτό το στοιχείο. Η μετακίνηση σε έναν οργανισμό μεταβιβάζει την ιδιοκτησία του στοιχείου σε αυτό τον οργανισμό. Δεν θα είστε πλέον ο άμεσος ιδιοκτήτης αυτού του στοιχείου μόλις το μετακινήσετε." }, - "moveManyToOrgDesc": { - "message": "Επιλέξτε έναν οργανισμό στον οποίο θέλετε να μετακινήσετε αυτά τα στοιχεία. Η μετακίνηση σε έναν οργανισμό μεταβιβάζει την ιδιοκτησία του στοιχείου σε αυτό τον οργανισμό. Δεν θα είστε πλέον ο άμεσος ιδιοκτήτης αυτού του στοιχείου μόλις το μετακινήσετε." - }, "collectionsDesc": { "message": "Επεξεργαστείτε τις συλλογές με τις οποίες μοιράζεται αυτό το στοιχείο. Μόνο οι χρήστες των οργανισμών που έχουν πρόσβαση σε αυτές τις συλλογές θα μπορούν να βλέπουν αυτό το στοιχείο." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Έχετε επιλέξει $COUNT$ αντικείμενα. $MOVEABLE_COUNT$ αντικείμενα μπορούν να μετακινηθούν σε έναν οργανισμό, $NONMOVEABLE_COUNT$ δεν μπορεί.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Κωδικός Επαλήθευσης (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Ανάκληση πρόσβασης" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Ο πάροχος σύνδεσης δύο βημάτων του λογαριασμού σας, είναι ενεργοποιημένος." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Οι κάτοχοι και οι διαχειριστές του οργανισμού εξαιρούνται από την εφαρμογή αυτής της πολιτικής." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Αρχείο" }, "sendTypeText": { "message": "Κείμενο" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Δημιουργία Νέου Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Διαγραφή Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε το Send;", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Τι είδους Send είναι αυτό;", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Ημερομηνία διαγραφής" }, - "deletionDateDesc": { - "message": "Το Send θα διαγραφεί οριστικά την καθορισμένη ημερομηνία και ώρα.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Μέγιστος Αριθμός Πρόσβασης" }, - "maxAccessCountDesc": { - "message": "Εάν οριστεί, οι χρήστες δεν θα μπορούν πλέον να έχουν πρόσβαση σε αυτό το send μόλις επιτευχθεί ο μέγιστος αριθμός πρόσβασης.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Τρέχων Αριθμός Πρόσβασης" - }, - "sendPasswordDesc": { - "message": "Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Ιδιωτικές σημειώσεις σχετικά με αυτό το Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Απενεργοποιημένο" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Είστε βέβαιοι ότι θέλετε να καταργήσετε τον κωδικό πρόσβασης;" }, - "hideEmail": { - "message": "Απόκρυψη της διεύθυνσης email μου από τους παραλήπτες." - }, - "disableThisSend": { - "message": "Απενεργοποιήστε αυτό το Send έτσι ώστε κανείς να μην μπορεί να έχει πρόσβαση σε αυτό.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Όλα τα Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Εκκρεμεί διαγραφή" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Έληξε" }, @@ -5415,13 +5441,6 @@ "message": "Μην επιτρέπετε στους χρήστες να αποκρύψουν τη διεύθυνση email τους από τους παραλήπτες κατά τη δημιουργία ή την επεξεργασία ενός send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Οι ακόλουθες οργανωτικές πολιτικές εφαρμόζονται επί του παρόντος:" - }, - "sendDisableHideEmailInEffect": { - "message": "Οι χρήστες δεν επιτρέπεται να αποκρύψουν τη διεύθυνση email τους από τους παραλήπτες κατά τη δημιουργία ή την επεξεργασία ενός send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Τροποποιημένη πολιτική $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Απενεργοποίηση προσωπικής ιδιοκτησίας για χρήστες οργανισμού" }, - "textHiddenByDefault": { - "message": "Κατά την πρόσβαση στην αποστολή, απόκρυψη του κειμένου από προεπιλογή", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Ένα φιλικό όνομα για την περιγραφή αυτού του Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Το κείμενο που θέλετε να στείλετε." - }, - "sendFileDesc": { - "message": "Το αρχείο που θέλετε να στείλετε." - }, - "copySendLinkOnSave": { - "message": "Αντιγράψτε το σύνδεσμο, για να μοιραστείτε αυτό το Send στο πρόχειρο μου, κατά την αποθήκευση." - }, - "sendLinkLabel": { - "message": "Σύνδεσμος Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Παρουσιάστηκε σφάλμα κατά την αποθήκευση των ημερομηνιών διαγραφής και λήξης." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Για να επαληθεύσετε τον 2FA σας παρακαλώ κάντε κλικ στο παρακάτω κουμπί." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Αριθμός χρηστών" }, - "loggingInAs": { - "message": "Σύνδεση ως" - }, - "notYou": { - "message": "Όχι εσείς;" - }, "pickAnAvatarColor": { "message": "Επιλέξτε ένα χρώμα avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Αίτημα έγκρισης διαχειριστή" }, - "approveWithMasterPassword": { - "message": "Έγκριση με κύριο κωδικό πρόσβασης" - }, "trustedDeviceEncryption": { "message": "Κρυπτογράφηση έμπιστης συσκευής" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Το αίτημά σας εστάλη στον διαχειριστή σας." }, - "youWillBeNotifiedOnceApproved": { - "message": "Θα ειδοποιηθείτε μόλις εγκριθεί." - }, "troubleLoggingIn": { "message": "Πρόβλημα σύνδεσης;" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Μάθετε περισσότερα για το API του Bitwarden" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "Send αρχείων" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Send κειμένων" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Προσθήκη συνημμένου" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 3ca78730a9a..7f9c89484c2 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -38,7 +38,7 @@ "restoreMembers": { "message": "Restore members" }, - "cannotRestoreAccessError":{ + "cannotRestoreAccessError": { "message": "Cannot restore organization access" }, "allApplicationsWithCount": { @@ -449,6 +449,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -491,6 +494,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -884,9 +900,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -942,15 +955,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1053,6 +1057,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1203,7 +1210,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1288,12 +1295,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1352,8 +1353,8 @@ "yourAccountIsLocked": { "message": "Your account is locked" }, - "uuid":{ - "message" : "UUID" + "uuid": { + "message": "UUID" }, "unlock": { "message": "Unlock" @@ -1579,9 +1580,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1615,23 +1613,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -4548,6 +4529,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5901,10 +5916,10 @@ "bulkFilteredMessage": { "message": "Excluded, not applicable for this action" }, - "nonCompliantMembersTitle":{ + "nonCompliantMembersTitle": { "message": "Non-compliant members" }, - "nonCompliantMembersError":{ + "nonCompliantMembersError": { "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" }, "fingerprint": { @@ -7282,12 +7297,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8411,9 +8420,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8628,9 +8634,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9327,7 +9330,7 @@ "message": "for Bitwarden using the implementation guide for your Identity Provider.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, - "userProvisioning":{ + "userProvisioning": { "message": "User provisioning" }, "scimIntegration": { @@ -9341,31 +9344,40 @@ "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, - "bwdc":{ + "bwdc": { "message": "Bitwarden Directory Connector" }, "bwdcDesc": { "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." }, - "eventManagement":{ + "eventManagement": { "message": "Event management" }, - "eventManagementDesc":{ + "eventManagementDesc": { "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." }, - "deviceManagement":{ + "deviceManagement": { "message": "Device management" }, - "deviceManagementDesc":{ + "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, "reopenLinkOnDesktop": { "message": "Reopen this link from your email on a desktop." }, - "integrationCardTooltip":{ + "integrationCardTooltip": { "message": "Launch $INTEGRATION$ implementation guide.", "placeholders": { "integration": { @@ -9374,7 +9386,7 @@ } } }, - "smIntegrationTooltip":{ + "smIntegrationTooltip": { "message": "Set up $INTEGRATION$.", "placeholders": { "integration": { @@ -9383,7 +9395,7 @@ } } }, - "smSdkTooltip":{ + "smSdkTooltip": { "message": "View $SDK$ repository", "placeholders": { "sdk": { @@ -9392,7 +9404,7 @@ } } }, - "integrationCardAriaLabel":{ + "integrationCardAriaLabel": { "message": "open $INTEGRATION$ implementation guide in a new tab.", "placeholders": { "integration": { @@ -9401,7 +9413,7 @@ } } }, - "smSdkAriaLabel":{ + "smSdkAriaLabel": { "message": "view $SDK$ repository in a new tab.", "placeholders": { "sdk": { @@ -9410,7 +9422,7 @@ } } }, - "smIntegrationCardAriaLabel":{ + "smIntegrationCardAriaLabel": { "message": "set up $INTEGRATION$ implementation guide in a new tab.", "placeholders": { "integration": { @@ -9817,7 +9829,7 @@ "message": "Config" }, "learnMoreAboutEmergencyAccess": { - "message":"Learn more about emergency access" + "message": "Learn more about emergency access" }, "learnMoreAboutMatchDetection": { "message": "Learn more about match detection" @@ -10100,10 +10112,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10123,7 +10131,7 @@ "selfHostingTitleProper": { "message": "Self-Hosting" }, - "claim-domain-single-org-warning" : { + "claim-domain-single-org-warning": { "message": "Claiming a domain will turn on the single organization policy." }, "single-org-revoked-user-warning": { @@ -10364,6 +10372,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10529,5 +10567,8 @@ }, "upgradeEventLogMessage":{ "message" : "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index 7179a886761..b211ec070ab 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organisation" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organisation that you wish to move this item to. Moving to an organisation transfers ownership of the item to that organisation. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organisation that you wish to move these items to. Moving to an organisation transfers ownership of the items to that organisation. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organisation users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organisation, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisation owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organisation policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organisation users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organisation name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organisation." + }, + "cannotCreateCollection": { + "message": "Free organisations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index 035cdd6143d..6b4b6e11ab3 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move Selected to Organisation" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organisation that you wish to move this item to. Moving to an organisation transfers ownership of the item to that organisation. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organisation that you wish to move these items to. Moving to an organisation transfers ownership of the items to that organisation. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organisation users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organisation, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is enabled on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization Owners and Administrators are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Create New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion Date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum Access Count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current Access Count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Disable this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Do not allow users to hide their email address from recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organisation policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Disable personal ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to send." - }, - "sendFileDesc": { - "message": "The file you want to send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar colour" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organisation name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organisation." + }, + "cannotCreateCollection": { + "message": "Free organisations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index 17d4bc9fe1e..ce40767f4c1 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notoj" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Trenu por ordigi" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teksto" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Redakti dosierujon" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Movu Elektitaĵojn al Organizo" - }, "deleteSelected": { "message": "Forigi Elektitajn" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Ensalutu aŭ kreu novan konton por aliri vian sekuran trezorejon." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Pasvorta Konsilo" - }, - "enterEmailToGetHint": { - "message": "Enigu vian retpoŝtadreson por ricevi vian ĉefan pasvortan aludon." - }, "getMasterPasswordHint": { "message": "Akiru ĉefan pasvortan sugeston" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Redaktu la kolektojn kun kiuj ĉi tiu ero estas dividita. Nur organizaj uzantoj kun aliro al ĉi tiuj kolektoj povos vidi ĉi tiun eron." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Kontrola Kodo (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Ĉi tiu du-ŝtupa ensaluta provizanto estas ebligita en via konto." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organizaj Posedantoj kaj Administrantoj estas esceptitaj de la apliko de ĉi tiu politiko." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Dosiero" }, "sendTypeText": { "message": "Teksto" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Krei novan sendon", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Forigi Sendu", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Ĉu vi certe volas forigi ĉi tiun Sendon?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Kia Sendo estas ĉi tio?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Dato de Forigo" }, - "deletionDateDesc": { - "message": "La Sendo estos definitive forigita en la specifaj dato kaj horo.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimuma Aliro-Kalkulo" }, - "maxAccessCountDesc": { - "message": "Se agordite, uzantoj ne plu povos aliri ĉi tiun sendon post kiam la maksimuma alira kalkulo estos atingita.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Nuna Alira Kalkulo" - }, - "sendPasswordDesc": { - "message": "Laŭvole postulas pasvorton por uzantoj aliri ĉi tiun Sendon.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privataj notoj pri ĉi tiu Sendo.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Neebligita" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Ĉu vi certe volas forigi la pasvorton?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Malŝalti ĉi tiun Sendon por ke neniu povu aliri ĝin.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Ĉiuj Sendoj" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Atendanta forigo" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Eksvalidiĝis" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Malebligi personan posedon por organizaj uzantoj" }, - "textHiddenByDefault": { - "message": "Alirante la Sendon, kaŝu la tekston defaŭlte", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Amika nomo por priskribi ĉi tiun Sendon.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "La teksto, kiun vi volas sendi." - }, - "sendFileDesc": { - "message": "La dosiero, kiun vi volas sendi." - }, - "copySendLinkOnSave": { - "message": "Kopiu la ligon por dividi ĉi tion Sendu al mia tondujo post konservado." - }, - "sendLinkLabel": { - "message": "Sendi ligon", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Sendi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Estis eraro konservante viajn forigajn kaj eksvalidajn datojn." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Nombro de uzantoj" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 906092a2d4b..1c71a29f48b 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Arrastra para ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Texto" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Editar carpeta" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtro" }, - "moveSelectedToOrg": { - "message": "Mover los seleccionados a la organización" - }, "deleteSelected": { "message": "Eliminar selección" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Elementos seleccionados movidos a $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Identifícate o crea una nueva cuenta para acceder a tu caja fuerte." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "Verifica tu identidad" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Pista de contraseña" - }, - "enterEmailToGetHint": { - "message": "Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra." - }, "getMasterPasswordHint": { "message": "Obtener pista de la contraseña maestra" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Elige una organización a la que deseas mover este objeto. Moviendo a una organización transfiere la propiedad del objeto a esa organización. Ya no serás el dueño directo de este objeto una vez que haya sido movido." }, - "moveManyToOrgDesc": { - "message": "Elija una organización a la que desea mover estos elementos. Moviendo a una organización transfiere la propiedad de los elementos a esa organización. Ya no serás el dueño directo de estos objetos una vez que hayan sido movidos." - }, "collectionsDesc": { "message": "Elige las colecciones con la que este elemento va a ser compartido. Solo los miembros de la organización que puedan acceder a esas colecciones podrán ver el elemento." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Ha seleccionado $COUNT$ elemento(s). Se pueden mover $MOVEABLE_COUNT$ elemento(s) a una organización, no se pueden mover $NONMOVEABLE_COUNT$.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Código de verificación (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revocar el acceso" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Este proveedor de autenticación en dos pasos está habilitado para tu cuenta." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Los propietarios y administradores de la organización están exentos de la aplicación de esta política." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Archivo" }, "sendTypeText": { "message": "Texto" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Crear nuevo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Eliminar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "¿Estás seguro de eliminar este Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "¿Qué tipo de Send es este?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Fecha de eliminación" }, - "deletionDateDesc": { - "message": "El envío se eliminará permanentemente en la fecha y hora especificadas.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Número máximo de accesos" }, - "maxAccessCountDesc": { - "message": "Si se establece, los usuarios ya no podrán acceder a este envío una vez que se alcance el número máximo de accesos.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Número de accesos actuales" - }, - "sendPasswordDesc": { - "message": "Opcionalmente se requiere una contraseña para que los usuarios accedan a este Envío.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Notas privadas sobre este Envío.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Deshabilitado" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "¿Está seguro que desea eliminar la contraseña?" }, - "hideEmail": { - "message": "Ocultar mi dirección de correo electrónico a los destinatarios." - }, - "disableThisSend": { - "message": "Deshabilita este envío para que nadie pueda acceder a él.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Todos los Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Borrado pendiente" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Caducado" }, @@ -5415,13 +5441,6 @@ "message": "No permitir a los usuarios ocultar su dirección de correo electrónico a los destinatarios al crear o editar un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Las siguientes políticas de organización están actualmente en vigor:" - }, - "sendDisableHideEmailInEffect": { - "message": "Los usuarios no pueden ocultar su dirección de correo electrónico a los destinatarios al crear o editar un Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Política modificada $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Desactivar la propiedad personal para los usuarios de la organización" }, - "textHiddenByDefault": { - "message": "Al acceder al Enviar, oculta el texto por defecto", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Un nombre amigable para describir este Envío.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "El texto que desea enviar." - }, - "sendFileDesc": { - "message": "El archivo que desea enviar." - }, - "copySendLinkOnSave": { - "message": "Copia el enlace para compartir este envío a mi portapapeles al guardar." - }, - "sendLinkLabel": { - "message": "Enviar enlace", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Enviar", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Hubo un error al guardar las fechas de eliminación y caducidad." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Para verificar su 2FA por favor haga clic en el botón de abajo." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Número de usuarios" }, - "loggingInAs": { - "message": "Iniciando sesión como" - }, - "notYou": { - "message": "¿No eres tú?" - }, "pickAnAvatarColor": { "message": "Elige un color de avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Solicitar aprobación del administrador" }, - "approveWithMasterPassword": { - "message": "Aprobar con contraseña maestra" - }, "trustedDeviceEncryption": { "message": "Cifrado de dispositivo de confianza" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Su solicitud ha sido enviada a su administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Se le notificará una vez aprobado." - }, "troubleLoggingIn": { "message": "¿Problemas para iniciar sesión?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index 47c3eeadfea..f9a5b810ded 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Märkmed" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Märge" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Lohista sorteerimiseks" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Muuda kausta" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Teisalda valitud organisatsiooni" - }, "deleteSelected": { "message": "Kustuta valitud" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Valitud kirjed teisaldati $ORGNAME$-le", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Kirjed liigutatud $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ei" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Logi sisse või loo uus konto." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "Kinnitage oma Identiteet" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Parooli vihje" - }, - "enterEmailToGetHint": { - "message": "Ülemparooli vihje saamiseks sisesta oma konto e-posti aadress." - }, "getMasterPasswordHint": { "message": "Tuleta ülemparooli vihjega meelde" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Vali organisatsioon, kuhu soovid seda kirjet teisaldada. Teisaldamisega saab kirje omanikuks organisatsioon. Pärast kirje teisaldamist ei ole sa enam selle otsene omanik." }, - "moveManyToOrgDesc": { - "message": "Vali organisatsioon, kuhu soovid seda kirjet teisaldada. Teisaldamisega saab kirje omanikuks organisatsioon. Pärast kirje teisaldamist ei ole sa enam selle otsene omanik." - }, "collectionsDesc": { "message": "Muuda kollektsioone, millega seda kirjet jagatakse. Seda kirjet näevad üksnes organisatsiooni kasutajad, kes omavad nendele kollektsioonidele ligipääsu." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Valisid $COUNT$ kirje(t). $MOVEABLE_COUNT$ kirje(t) saab teisaldada organisatsiooni, $NONMOVEABLE_COUNT$ ei saa.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Kinnituskood (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Tühistada ligipääsu luba" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "See kaheastmelise kinnitamise teenus on sinu kontol sisse lülitatud." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Selle poliitika rakendamine ei puuduta Omanikke ega Administraatoreid." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fail" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Loo uus Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Kustuta Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Soovid tõesti selle Sendi kustutada?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Mis tüüpi Send see on?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Kustutamise kuupäev" }, - "deletionDateDesc": { - "message": "Send kustutatakse määratud kuupäeval ja kellaajal jäädavalt.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimaalne ligipääsude arv" }, - "maxAccessCountDesc": { - "message": "Selle valimisel ei saa kasutajad pärast maksimaalse ligipääsude arvu saavutamist sellele Sendile enam ligi.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Hetkeline ligipääsude arv" - }, - "sendPasswordDesc": { - "message": "Soovi korral nõua parooli, millega Sendile ligi pääseb.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privaatne märkus selle Sendi kohta.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Keelatud" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Soovid kindlasti selle parooli eemaldada?" }, - "hideEmail": { - "message": "Ära näita saajatele minu e-posti aadressi." - }, - "disableThisSend": { - "message": "Keela see Send, et keegi ei pääseks sellele ligi.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Kõik Sendid" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Kustutamise ootel" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Aegunud" }, @@ -5415,13 +5441,6 @@ "message": "Ära luba kasutajatel Sendi loomisel või muutmisel oma e-posti aadressi saajate eest peita.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Hetkel on kehtivad järgmised organisatsiooni poliitikad:" - }, - "sendDisableHideEmailInEffect": { - "message": "Kasutajatel pole lubatud Sendi loomisel või muutmisel oma e-posti aadressi saajate eest peita.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Muutis poliitikat $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Keela organisatsiooni liikmetel paroolide salvestamine isiklikku Hoidlasse" }, - "textHiddenByDefault": { - "message": "Sendi avamisel peida tekst automaatselt", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Sisesta Sendi nimi (kohustuslik).", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Tekst, mida soovid saata." - }, - "sendFileDesc": { - "message": "Fail, mida soovid saata." - }, - "copySendLinkOnSave": { - "message": "Salvestamisel kopeeri Sendi jagamise link lõikepuhvrisse." - }, - "sendLinkLabel": { - "message": "Sendi link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Kustutamis- ja aegumiskuupäevade salvestamisel ilmnes tõrge." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "2FA kinnitamiseks kliki alloleval nupul." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Kasutajate arv" }, - "loggingInAs": { - "message": "Sisselogimas kui" - }, - "notYou": { - "message": "Pole sina?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index 97d636833ed..d0e99c73e66 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Oharrak" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Arrastatu txukuntzeko" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Testua" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Editatu Karpeta" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Mugitu hautatutako antolakundera" - }, "deleteSelected": { "message": "Ezabatu hautatutakoa" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Hautatutako elementuak $ORGNAME$-ra mugituak", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ez" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Saioa hasi edo sortu kontu berri bat zure kutxa gotorrera sartzeko." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Pasahitza gogoratzeko pista" - }, - "enterEmailToGetHint": { - "message": "Sartu zure kontuko emaila pasahitz nagusiaren pista jasotzeko." - }, "getMasterPasswordHint": { "message": "Jaso pasahitz nagusiaren pista" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Aukeratu elementu hau zein erakundetara eraman nahi duzun. Erakunde batera pasatzeak elementuaren jabetza erakunde horretara transferitzen du. Zu ez zara elementu honen jabe zuzena izango mugitzen duzunean." }, - "moveManyToOrgDesc": { - "message": "Aukeratu elementu hauek zein erakundetara eraman nahi dituzun. Erakunde batera pasatzeak elementuen jabetzak erakunde horretara transferitzen ditu. Zu ez zara elementu horien jabe zuzena izango mugitzen dituzunean." - }, "collectionsDesc": { "message": "Aukeratu elementu hau zein bildumarekin partekatzen den. Bilduma horietarako sarbidea duten erakundeko erabiltzaileek bakarrik ikus dezakete elementu hau." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ artikulu hautatu d(it)uzu. $MOVEABLE_COUNT$ artikulu erakunde batera alda daite(z)ke, $NONMOVEABLE_COUNT$ ezin d(ir)a.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Egiaztatze-kodea (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Sarbidea ezeztatu" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Zure kontuan gaituta dago bi urratseko saio hasieraren hornitzaile hori." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Erakundearen jabeak eta administratzaileak politika horretatik salbuetsita daude." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fitxategia" }, "sendTypeText": { "message": "Testua" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Sortu Send berria", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Ezabatu Send-a", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Ziur al zaude Send hau ezabatu nahi duzula?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Zein Send mota da hau?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Ezabatze data" }, - "deletionDateDesc": { - "message": "Send-a betiko ezabatuko da zehaztutako datan eta orduan.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Sarbide kopuru maximoa" }, - "maxAccessCountDesc": { - "message": "Hala ezartzen bada, erabiltzaileak ezin izango dira Send honetara sartu gehienezko sarbide kopurura iritsi ondoren.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Uneko sarbide kopurua" - }, - "sendPasswordDesc": { - "message": "Nahi izanez gero, pasahitza eskatu erabiltzaileak bidalketa honetara sar daitezen.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Send honi buruzko ohar pribatuak.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Desgaitua" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Ziur al zaude pasahitz hau ezabatu nahi duzula?" }, - "hideEmail": { - "message": "Ezkutatu nire emaila hartzaileei." - }, - "disableThisSend": { - "message": "Desgaitu Send hau inor sar ez dadin.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Send guztiak" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Ezabatzea egiteke" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Iraungita" }, @@ -5415,13 +5441,6 @@ "message": "Send bat sortzean edo editatzean, erakutsi beti kidearen emaila hartzaileari.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Une honetan, erakunderako politika hauek aplikatzen dira:" - }, - "sendDisableHideEmailInEffect": { - "message": "Erabiltzaileek ezin diete hartzaileei beren emaila ezkutatu Send bat sortu edo editatzen dutenean.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "$ID$ politika aldatua.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Erakundearen erabiltzaileentzako jabetza pertsonala desgaitzea" }, - "textHiddenByDefault": { - "message": "Send-era sartzean, ezkutatu testua modu lehenetsian", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Send hau deskribatzeko izena.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Bidali nahi duzun testua." - }, - "sendFileDesc": { - "message": "Bidali nahi duzun fitxategia." - }, - "copySendLinkOnSave": { - "message": "Gordetzean kopiatu Send honen esteka arbelean, ondoren partekatzeko." - }, - "sendLinkLabel": { - "message": "Send esteka", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Akatsa gertatu da ezabatze eta iraungitze datak gordetzean." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Zure 2FA egiaztatzeko, klikatu beheko botoian." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Erabiltzaile kopurua" }, - "loggingInAs": { - "message": "Honela hasi saioa" - }, - "notYou": { - "message": "Ez zara zu?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 083caa4b594..04cddc65f2f 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "یادداشت‌ها" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "برای مرتب‌سازی بکشید" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "متن" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "ويرايش پوشه" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "فیلتر" }, - "moveSelectedToOrg": { - "message": "انتقال مورد انتخاب شده به سازمان" - }, "deleteSelected": { "message": "حذف موارد انتخاب شده" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "موارد انتخاب شده به $ORGNAME$ منتقل شدند", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "خیر" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "وارد شوید یا یک حساب کاربری بسازید تا به گاوصندوق امن‌تان دسترسی یابید." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "یادآور کلمه عبور" - }, - "enterEmailToGetHint": { - "message": "برای دریافت یادآور کلمه عبور اصلی خود نشانی ایمیل‌تان را وارد کنید." - }, "getMasterPasswordHint": { "message": "دریافت یادآور کلمه عبور اصلی" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "سازمانی را انتخاب کنید که می‌خواهید این مورد را به آن منتقل کنید. انتقال به یک سازمان، مالکیت مورد را به آن سازمان منتقل می‌کند. پس از انتقال این مورد، دیگر مالک مستقیم آن نخواهید بود." }, - "moveManyToOrgDesc": { - "message": "سازمانی را انتخاب کنید که می‌خواهید این موارد را به آن منتقل کنید. انتقال به یک سازمان، مالکیت موارد را به آن سازمان منتقل می‌کند. پس از انتقال این موارد، دیگر مالک مستقیم آن‌ها نخواهید بود." - }, "collectionsDesc": { "message": "مجموعه‌هایی را ویرایش کنید که این مورد با آن‌ها به اشتراک گذاشته می‌شود. فقط کاربران سازمانی که به این مجموعه‌ها دسترسی دارند می‌توانند این مورد را ببینند." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "شما $COUNT$ مورد را انتخاب کرده اید. $MOVEABLE_COUNT$ مورد را می‌توان به یک سازمان منتقل کرد، $NONMOVEABLE_COUNT$ تا را نمی‌تواند.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "کد تأیید (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "لغو دسترسی" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "این ارائه دهنده ورود به سیستم دو مرحله ای در حساب شما فعال است." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "مالکان و سرپرستان سازمان از اجرای این سیاست مستثنی هستند." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "پرونده" }, "sendTypeText": { "message": "متن" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "ارسال جدید", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "حذف ارسال", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "آیا مطمئن هستید که می‌خواهید این ارسال را حذف کنید؟", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "این چه نوع ارسالی است؟", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "تاریخ حذف" }, - "deletionDateDesc": { - "message": "ارسال در تاریخ و ساعت مشخص شده برای همیشه حذف خواهد شد.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "تعداد دسترسی حداکثر" }, - "maxAccessCountDesc": { - "message": "در صورت تنظیم، با رسیدن به حداکثر تعداد دسترسی، کاربران دیگر نمی‌توانند به این ارسال دسترسی پیدا کنند.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "تعداد دسترسی فعلی" - }, - "sendPasswordDesc": { - "message": "به صورت اختیاری برای دسترسی کاربران به این ارسال به یک کلمه عبور نیاز دارید.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "یادداشت های خصوصی در مورد این ارسال.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "غیرفعال شد" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "مطمئنید که می‌خواهید کلمه عبور حذف شود؟" }, - "hideEmail": { - "message": "نشانی ایمیلم را از گیرندگان مخفی کن." - }, - "disableThisSend": { - "message": "این ارسال را غیرفعال کنید تا کسی نتواند به آن دسترسی پیدا کند.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "همه ارسال ها" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "در انتظار حذف" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "منقضی شده" }, @@ -5415,13 +5441,6 @@ "message": "هنگام ایجاد یا ویرایش ارسال، همیشه نشانی ایمیل اعضا را به گیرندگان نشان بده.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "سیاست‌های سازمان زیر در حال حاضر در حال اجرا هستند:" - }, - "sendDisableHideEmailInEffect": { - "message": "کاربران مجاز به مخفی کردن نشانی ایمیل خود در هنگام ایجاد یا ویرایش ارسال از گیرندگان نیستند.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "سیاست تغییر یافته $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "حذف مالکیت فردی برای کاربران سازمان" }, - "textHiddenByDefault": { - "message": "هنگام دسترسی به ارسال، متن را به طور پیش فرض پنهان کن", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "یک نام دوستانه برای توصیف این ارسال.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "متنی که می‌خواهید ارسال کنید." - }, - "sendFileDesc": { - "message": "پرونده ای که می‌خواهید ارسال کنید." - }, - "copySendLinkOnSave": { - "message": "این پیوند را برای به اشتراک گذاری ارسال بعد از ارسال کپی کن." - }, - "sendLinkLabel": { - "message": "ارسال پیوند", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "ارسال", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "هنگام ذخیره حذف و تاریخ انقضاء شما خطایی روی داد." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "برای تأیید 2FA خود لطفاً روی دکمه زیر کلیک کنید." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "تعداد کاربران" }, - "loggingInAs": { - "message": "در حال ورود به عنوان" - }, - "notYou": { - "message": "شما نیستید؟" - }, "pickAnAvatarColor": { "message": "یک رنگ آواتار را انتخاب کنید" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "درخواست تأیید مدیر" }, - "approveWithMasterPassword": { - "message": "تأیید با کلمه عبور اصلی" - }, "trustedDeviceEncryption": { "message": "رمزگذاری دستگاه مورد اعتماد" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "درخواست شما به مدیرتان فرستاده شد." }, - "youWillBeNotifiedOnceApproved": { - "message": "به محض تأیید مطلع خواهید شد." - }, "troubleLoggingIn": { "message": "در ورود مشکلی دارید؟" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 55aa712c6dc..9427a4e8e22 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -117,7 +117,7 @@ "message": "Riskialttiit jäsenet" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "Vaarantuneet jäsenet ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -126,7 +126,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Vaarantuneet sovellukset ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -196,11 +196,14 @@ "message": "Uusi salasana" }, "passphrase": { - "message": "Salauslauseke" + "message": "Salauslause" }, "notes": { "message": "Merkinnät" }, + "privateNote": { + "message": "Yksityinen muistiinpano" + }, "note": { "message": "Muistiinpano" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Järjestele raahaamalla" }, + "dragToReorder": { + "message": "Järjestä vetämällä" + }, "cfTypeText": { "message": "Teksti" }, @@ -467,17 +473,30 @@ "editFolder": { "message": "Muokkaa kansiota" }, + "editWithName": { + "message": "Muokkaa $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { - "message": "New folder" + "message": "Uusi kansio" }, "folderName": { - "message": "Folder name" + "message": "Kansion nimi" }, "folderHintText": { "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Haluatko varmasti poistaa tämän kansion pysyvästi?" }, "baseDomain": { "message": "Pääverkkotunnus", @@ -860,9 +879,6 @@ "filter": { "message": "Suodattimet" }, - "moveSelectedToOrg": { - "message": "Siirrä valitut organisaatiolle" - }, "deleteSelected": { "message": "Poista valitut" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Valitut kohteet siirrettiin organisaatiolle $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Kohteet siirrettiin organisaatiolle $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ei" }, + "location": { + "message": "Sijainti" + }, "loginOrCreateNewAccount": { "message": "Käytä salattua holviasi kirjautumalla sisään tai luo uusi tili." }, @@ -1171,7 +1181,7 @@ "message": "Enter the code from your authenticator app" }, "pressYourYubiKeyToAuthenticate": { - "message": "Tunnistaudu painamalla YubiKeytäsi" + "message": "Tunnistaudu koskettamalla YubiKeytäsi" }, "authenticationTimeout": { "message": "Todennuksen aikakatkaisu" @@ -1179,17 +1189,17 @@ "authenticationSessionTimedOut": { "message": "Todennusistunto aikakatkaistiin. Ole hyvä ja aloita kirjautumisprosessi uudelleen." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Vahvista henkilöllisyytesi" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Jatka kirjautumista" }, "whatIsADevice": { - "message": "What is a device?" + "message": "Mikä on laite?" }, "aDeviceIs": { "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." @@ -1198,7 +1208,7 @@ "message": "Kirjautuminen aloitettu" }, "logInRequestSent": { - "message": "Request sent" + "message": "Pyyntö lähetetty" }, "submit": { "message": "Jatka" @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Syötä tilisi sähköpostiosoite, niin salasanavihjeesi lähetetään sinulle sähköpostitse" }, - "passwordHint": { - "message": "Salasanavihje" - }, - "enterEmailToGetHint": { - "message": "Syötä tilisi sähköpostiosoite saadaksesi pääsalasanan vihjeen." - }, "getMasterPasswordHint": { "message": "Pyydä pääsalasanan vihjettä" }, @@ -1414,10 +1418,10 @@ "message": "web app" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Ennen hyväksyntää varmista, että tunnistelause vastaa alla olevaa lausetta." }, "notificationSentDeviceComplete": { - "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + "message": "Avaa Bitwarden laitteellasi. Ennen hyväksyntää varmista, että tunnistelause vastaa alla olevaa lausetta." }, "aNotificationWasSentToYourDevice": { "message": "Laitteeseesi lähetettiin ilmoitus" @@ -1456,7 +1460,7 @@ "message": "Muista minut" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Älä kysy uudelleen tällä laitteella 30 päivään" }, "sendVerificationCodeEmailAgain": { "message": "Lähetä todennuskoodi sähköpostitse uudelleen" @@ -1465,14 +1469,14 @@ "message": "Käytä vaihtoehtoista todennustapaa" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Valitse vaihtoehtoinen tapa", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Käytä palautuskoodiasi" }, "insertYubiKey": { - "message": "Kytke YubiKey-todennuslaitteesi tietokoneen USB-porttiin ja paina sen painiketta." + "message": "Kytke YubiKey-suojausavaimesi tietokoneen USB-porttiin ja kosketa sen painiketta." }, "insertU2f": { "message": "Kytke suojausavaimesi tietokoneen USB-porttiin ja jos laitteessa on painike, paina sitä." @@ -1490,10 +1494,10 @@ "message": "Kaksivaiheisen kirjautumisen asetukset" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Valitse todennustapa" }, "recoveryCodeDesc": { - "message": "Etkö voi käyttää kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki määritetyt todentajat käytöstä palautuskoodillasi." + "message": "Etkö voi käyttää kaksivaiheisen kirjautumisen todentajiasi? Poista kaikki tilillesi määritetyt todentajat käytöstä palautuskoodillasi." }, "recoveryCodeTitle": { "message": "Palautuskoodi" @@ -1509,7 +1513,7 @@ "message": "Yubico OTP -suojausavain" }, "yubiKeyDesc": { - "message": "Vahvista kirjatuminen YubiKey-todennuslaiteella. Toimii YubiKey 4 ja 5 -sarjojen sekä NEO -laitteiden kanssa." + "message": "Vahvista kirjatuminen YubiKey-suojausavaimella. Toimii YubiKey 4, 5 ja NEO -laitteiden kanssa." }, "duoDescV2": { "message": "Syötä Duo Securityn luoma koodi.", @@ -1523,7 +1527,7 @@ "message": "Vahvista kirjautuminen FIDO U2F -suojausavaimella." }, "u2fTitle": { - "message": "FIDO U2F ‑todennuslaite" + "message": "FIDO U2F ‑suojausavain" }, "webAuthnTitle": { "message": "Pääsyavain" @@ -1535,7 +1539,7 @@ "message": "(siirretty FIDO:sta)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Avaa uudessa välilehdessä" }, "emailTitle": { "message": "Sähköposti" @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Valitse organisaatio, jolle haluat siirtää kohteen. Tämä siirtää kohteen organisaation omistukseen, etkä tämän jälkeen ole enää sen suora omistaja." }, - "moveManyToOrgDesc": { - "message": "Valitse organisaatio, jolle haluat siirtää kohteet. Tämä siirtää kohteet organisaation omistukseen, etkä tämän jälkeen ole enää niiden suora omistaja." - }, "collectionsDesc": { "message": "Muokkaa kokoelmia, joihin tämä kohde on jaettu. Kohteen näkevät vain ne organisaation käyttäjät, joilla on käyttöoikeudet näihin kokoelmiin." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Olet valinnut $COUNT$ kohdetta. $MOVEABLE_COUNT$ kohdetta voidaan siirtää organisaatioon, $NONMOVEABLE_COUNT$ ei.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Todennuskoodi (TOTP)" }, @@ -1798,7 +1782,7 @@ "message": "Vaihda sähköpostiosoite" }, "changeEmailTwoFactorWarning": { - "message": "Jatkamalla tilisi sähköpostiosoite vaihtuu, muttei kaksivaiheiseen kirjautumiseen käytettävä osoite. Voit vaihtaa sen kaksivaiheisen kirjautumisen asetuksista." + "message": "Jos jatkat, tilisi sähköpostiosoite vaihtuu, muttei kaksivaiheiseen kirjautumiseen käytettävä osoite. Tämän osoitteen voit vaihtaa kaksivaiheisen kirjautumisen asetuksista." }, "newEmail": { "message": "Uusi sähköpostiosoite" @@ -1825,7 +1809,7 @@ "message": "Kirjaudu sisään uudelleen." }, "currentSession": { - "message": "Current session" + "message": "Nykyinen istunto" }, "requestPending": { "message": "Request pending" @@ -1901,10 +1885,10 @@ "message": "Mitätöi kaikki istunnot" }, "deauthorizeSessionsDesc": { - "message": "Oletko huolissasi, että tilisi on kirjautuneena muissa laitteissa? Jatka alla kirjataksesi ulos kaikki aiemmin käyttämäsi tietokoneet ja muut laitteet. Tämä suojaustoimenpide on suositeltava, jos olet aiemmin käyttänyt esimerkiksi julkista tietokonetta tai vahingossa tallentanut salasanasi laitteelle, joka ei ole sinun. Tämä mitätöi myös kaikki aiemmin muistetut kaksivaiheiset kirjautumiset." + "message": "Oletko huolissasi, että tilisi on kirjautuneena muila laitteilla? Alta voit kirjata ulos kaikki aiemmin käyttämäsi tietokoneet ja muut laitteet. Tämä suojaustoimenpide on suositeltava, jos olet aiemmin käyttänyt esimerkiksi julkista tietokonetta tai vahingossa tallentanut salasanasi laitteelle, joka ei ole sinun. Tämä mitätöi myös kaikki aiemmin muistetut kaksivaiheiset kirjautumiset." }, "deauthorizeSessionsWarning": { - "message": "Jatkaminen uloskirjaa myös nykyisen istunnon pakottaen uudelleenkirjautumisen sekä kaksivaiheinen kirjautumisen, jos se on määritetty. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." + "message": "Jatkaminen uloskirjaa myös nykyisen istunnon pakottaen uudelleenkirjautumisen sekä kaksivaiheinen kirjautumisen, jos määritetty. Muiden laitteiden aktiiviset istunnot saattavat toimia vielä tunnin ajan." }, "newDeviceLoginProtection": { "message": "New device login" @@ -1922,7 +1906,7 @@ "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "Uuden laitteen sisäänkirjautumissuojan ollessa pois käytöstä kuka tahansa pääsalasanasi haltija voi käyttää tiliäsi millä tahansa laitteella. Suojaa tilsi ilman vahvistussähköposteja määrittämällä kaksivaiheinen kirjautuminen." }, "accountNewDeviceLoginProtectionSaved": { "message": "New device login protection changes saved" @@ -2166,7 +2150,7 @@ "message": "Kaksivaiheinen kirjautuminen" }, "twoStepLoginEnforcement": { - "message": "Kaksivaiheisen kirjautumisen pakotus" + "message": "Kaksivaiheisen kirjautumisen pakottaminen" }, "twoStepLoginDesc": { "message": "Suojaa tilisi vaatimalla sisäänkirjautumiseen toinen todennusvaihe." @@ -2175,7 +2159,7 @@ "message": "Ota kaksivaiheinen kirjautuminen käyttöön organisaatiollesi." }, "twoStepLoginEnterpriseDescStart": { - "message": "Pakota jäseniä määrittämään Bitwardenin kaksivaiheinen kirjautuminen käytännöllä: ", + "message": "Pakota jäsenet määrittämään Bitwardenin kaksivaiheinen kirjautuminen käytännöllä: ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { @@ -2188,10 +2172,10 @@ "message": "Jos olet määrittänyt kertakirjautumisen tai aiot määrittää sen, on kaksivaiheinen kirjautuminen saatettu jo pakottaa identiteettitoimittajasi kautta." }, "twoStepLoginRecoveryWarning": { - "message": "Kaksivaiheisen kirjautumisen käyttöönotto voi lukita sinut ulos Bitwarden-tililtäsi pysyvästi. Palautuskoodi mahdollistaa pääsyn tilillesi myös silloin, kun et voi käyttää normaaleja kaksivaiheisen kirjautumisen todentajiasi (esim. kadotat todennuslaitteesi tai se varastetaan). Bitwardenin asiakaspalvelukaan ei voi auttaa sinua, jos menetät pääsyn tillesi. Suosittelemme, että kirjoitat palautuskoodin muistiin tai tulostat sen ja säilytät sitä turvallisessa paikassa (esim. kassakaapissa tai pankin tallelokerossa)." + "message": "Kaksivaiheisen kirjautumisen käyttöönotto voi lukita sinut ulos Bitwarden-tililtäsi pysyvästi. Palautuskoodi mahdollistaa pääsyn tilillesi myös silloin, kun et voi käyttää normaaleja kaksivaiheisen tunnistautumisen vahvistustapoja (esim. kadotat suojausavaimesi tai se varastetaan). Bitwardenin asiakaspalvelukaan ei voi auttaa sinua, jos menetät pääsyn tillesi. Suosittelemme, että kirjoitat palautuskoodin muistiin tai tulostat sen ja säilytät turvallisessa paikassa (esim. kassakaapissa tai pankin tallelokerossa)." }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "Kertakäyttöisellä palautuskoodillasi voit poistaa kaksivaiheisen kirjautumisen käytöstä, mikäli et voi käyttää kaksivaiheista todennustapaasi. Bitwarden suosittelee kirjoittamaan palautuskoodin ylös ja säilyttämään sen turvallisessa paikassa." }, "viewRecoveryCode": { "message": "Näytä palautuskoodi" @@ -2235,16 +2219,16 @@ "message": "Manage collection" }, "viewItems": { - "message": "View items" + "message": "Näytä kohteet" }, "viewItemsHidePass": { - "message": "View items, hidden passwords" + "message": "Näytä kohteet, piilotetut salasanat" }, "editItems": { - "message": "Edit items" + "message": "Muokkaa kohteita" }, "editItemsHidePass": { - "message": "Edit items, hidden passwords" + "message": "Muokkaa kohteita, piilotettuja salasanoja" }, "disable": { "message": "Poista käytöstä" @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Mitätöi käyttöoikeudet" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Tämä kaksivaiheisen kirjautumisen todentaja on määritetty tilillesi." }, @@ -2298,7 +2285,7 @@ "message": "Avain" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Todennuskoodi" + "message": "Vahvistuskoodi" }, "twoStepAuthenticatorReaddDesc": { "message": "Jos sinun on lisättävä tai siirrettävä todennus toiseen laitteeseen, löydät alta todennussovelluksesi tarvitseman QR-koodin (tai avaimen)." @@ -2307,31 +2294,31 @@ "message": "Haluatko varmasti poistaa tämän kaksivaiheisen kirjautumisen todentajan käytöstä?" }, "twoStepDisabled": { - "message": "Kaksivaiheisen kirjautumisen todentaja on poistettu käytöstä." + "message": "Kaksivaiheisen kirjautumisen todentaja poistettiin käytöstä." }, "twoFactorYubikeyAdd": { - "message": "Lisää tilillesi YubiKey-todennuslaite" + "message": "Lisää tilillesi uusi YubiKey-suojausavain" }, "twoFactorYubikeyPlugIn": { - "message": "Kytke YubiKey-todennuslaitteesi tietokoneesi USB-porttiin." + "message": "Kytke YubiKey tietokoneesi USB-porttiin." }, "twoFactorYubikeySelectKey": { "message": "Valitse alta ensimmäinen tyhjä YubiKey-syöttökenttä." }, "twoFactorYubikeyTouchButton": { - "message": "Paina YubiKey-todennuslaitteen painiketta." + "message": "Kosketa YubiKeyn painiketta." }, "twoFactorYubikeySaveForm": { "message": "Tallenna lomake." }, "twoFactorYubikeyWarning": { - "message": "Alustakohtaisten rajoitusten vuoksi YubiKey-todennuslaiteet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa. Sinun tulisi määrittää eri kaksivaiheisen kirjautumisen todentaja, jotta pääset tilillesi myös silloin kun YubiKey-laitteen käyttö ei ole mahdollista. Tuetut alustat:" + "message": "Alustakohtaisten rajoitusten vuoksi YubiKey-avaimet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa ja sinun tulisi määrittää vaihtoehtoinen kaksivaiheisen tunnistautumisen vahvistustapa, jotta pääset tilillesi myös silloin kun YubiKey-avaimesi ei ole käytettävissä. Tuetut alustat:" }, "twoFactorYubikeySupportUsb": { - "message": "Verkkoholvi, työpöytäsovellus, CLI ja kaikki selainlaajennukset laitteessa, jossa on YubiKey-todennuslaitteen käyttöön soveltuva USB-portti." + "message": "Verkkoholvi, työpöytäsovellus, CLI ja kaikki selainlaajennukset laitteessa, jossa on YubiKeyn käyttöön soveltuva USB-portti." }, "twoFactorYubikeySupportMobile": { - "message": "Mobiilisovellukset laitteessa, jossa on NFC-ominaisuus tai YubiKey-todennuslaitteen kanssa yhteensopiva tietoliikenneportti." + "message": "Mobiilisovellukset laitteessa, jossa on NFC-ominaisuus tai YubiKey-yhteensopiva tiedonsiirtoliitäntä." }, "yubikeyX": { "message": "YubiKey $INDEX$", @@ -2352,7 +2339,7 @@ } }, "webAuthnkeyX": { - "message": "WebAuthn-todennuslaite $INDEX$", + "message": "WebAuthn-suojausavain $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2364,16 +2351,16 @@ "message": "NFC-tuki" }, "twoFactorYubikeySupportsNfc": { - "message": "Jokin laitteeni tukee NFC-tekniikkaa." + "message": "Minulla on NFC-tekniikkaa tukeva avain." }, "twoFactorYubikeySupportsNfcDesc": { - "message": "Jos jokin YubiKey-todennuslaitteesi tukee NFC-tekniikkaa (kuten YubiKey NEO), näytetään mobiililaitteissa kehote NFC:n ollessa käytettävissä." + "message": "Jos jokin YubiKey-avaimesi tukee NFC-tekniikkaa (kuten YubiKey NEO), näytetään mobiililaitteissa kehote NFC:n ollessa käytettävissä." }, "yubikeysUpdated": { - "message": "YubiKey-todennuslaitteet päivitettiin" + "message": "YubiKeyt päivitettiin" }, "disableAllKeys": { - "message": "Poista kaikki todennuslaitteet käytöstä" + "message": "Poista kaikki avaimet käytöstä" }, "twoFactorDuoDesc": { "message": "Syötä Bitwarden-sovelluksen tiedot Duo Security -tilisi hallintapaneelista." @@ -2427,7 +2414,7 @@ "message": "Tallenna lomake." }, "twoFactorU2fWarning": { - "message": "Alustakohtaisten rajoitusten vuoksi FIDO U2F -todennuslaiteet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa. Sinun tulisi määrittää eri kaksivaiheisen kirjautumisen todentaja, jotta pääset tilillesi myös silloin kun FIDO U2F -laitteen käyttö ei ole mahdollista. Tuetut alustat:" + "message": "Alustakohtaisten rajoitusten vuoksi FIDO U2F -avaimet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa ja sinun tulisi määrittää vaihtoehtoinen kaksivaiheisen tunnistautumisen vahvistustapa, jotta pääset tilillesi myös silloin kun FIDO U2F -laitteesi ei ole käytettävissä. Tuetut alustat:" }, "twoFactorU2fSupportWeb": { "message": "Verkkoholvi ja selainlaajennukset pöytäkoneissa/kannettavissa, joissa on U2F-tekniikkaa tukeva selain (Chrome, Opera, Vivaldi tai Firefox FIDO U2F käyttöön otettuna)." @@ -2442,7 +2429,7 @@ "message": "Suojausavainta luettaessa havaittiin ongelma. Yritä uudelleen." }, "twoFactorWebAuthnWarning1": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." + "message": "Alustakohtaisten rajoitusten vuoksi WebAuthn-avaimet eivät ole käytettävissä kaikissa Bitwarden-sovelluksissa ja sinun tulisi määrittää vaihtoehtoinen kaksivaiheisen tunnistautumisen vahvistustapa, jotta pääset tilillesi myös silloin kun WebAuthn-laitteesi ei ole käytettävissä." }, "twoFactorRecoveryYourCode": { "message": "Bitwardenin kaksivaiheisen kirjautumisen palautuskoodisi" @@ -2730,7 +2717,7 @@ "message": "1 Gt salattua tallennustilaa tiedostoliitteille." }, "premiumSignUpTwoStepOptions": { - "message": "Omisteiset kaksivaiheisen kirjautumisen vaihtoehdot, kuten YubiKey ja Duo." + "message": "Kaksivaiheisen kirjautumisen erikoisvaihtoehdot, kuten YubiKey ja Duo." }, "premiumSignUpEmergency": { "message": "Varmuuskäyttö" @@ -3517,7 +3504,7 @@ "message": "Sisäänkirjautumisyritys epäonnistui väärän salasanan vuoksi." }, "failedLogin2fa": { - "message": "Kirjautuminen epäonnistui virheellisen toisen vaiheen vahvistuksen vuoksi." + "message": "Kirjautuminen epäonnistui virheellisen todennuksen vuoksi." }, "incorrectPassword": { "message": "Virheellinen salasana" @@ -3941,19 +3928,19 @@ } }, "deviceType": { - "message": "Device Type" + "message": "Laitteen tyyppi" }, "ipAddress": { - "message": "IP Address" + "message": "IP-osoite" }, "confirmLogIn": { - "message": "Confirm login" + "message": "Vahvista kirjautuminen" }, "denyLogIn": { - "message": "Deny login" + "message": "Hylkää kirjautuminen" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "Tämä pyyntö ei ole enää voimassa." }, "logInConfirmedForEmailOnDevice": { "message": "Login confirmed for $EMAIL$ on $DEVICE$", @@ -3972,7 +3959,7 @@ "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "Kirjautumispyyntö on jo erääntynyt." }, "justNow": { "message": "Juuri nyt" @@ -4113,7 +4100,7 @@ "message": "You have a pending login request from another device." }, "reviewLoginRequest": { - "message": "Review login request" + "message": "Tarkastele kirjautumispyyntöä" }, "freeTrialEndPromptCount": { "message": "Ilmainen kokeilujakso päättyy $COUNT$ päivän kuluttua.", @@ -4162,7 +4149,7 @@ "message": "Ilmainen kokeilujaksosi päättyy tänään." }, "clickHereToAddPaymentMethod": { - "message": "Click here to add a payment method." + "message": "Klikkaa tästä lisätäksesi maksutavan." }, "joinOrganization": { "message": "Liity organisaatioon" @@ -4210,7 +4197,7 @@ "message": "Jos et pääse tilillesi käyttämilläsi kaksivaiheisen kirjautumisen todentajilla, voit kaksivaiheisen kirjautumisen palautuskoodillasi poistaa kaikki tilillesi määritetyt todentajat käytöstä." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "Kirjaudu kertakäyttöisellä palautuskoodillasi alla. Tämä poistaa tilisi kaikki kaksivaiheiset kirjautumistavat käytöstä." }, "recoverAccountTwoStep": { "message": "Vapauta tili kaksivaiheisesta kirjautumisesta" @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Kansioidesi salausta ei voitu purkaa salausavaimesi päivityksen aikana. Jatkaaksesi päivitystä kansiosi on poistettava. Holvin kohteita ei poisteta, jos jatkat." }, @@ -4722,21 +4743,21 @@ "message": "Holvissasi on vanhoja tiedostoliitteitä, jotka on korjattava ennen kuin voit uudistaa tilisi salausavaimen." }, "yourAccountsFingerprint": { - "message": "Tilisi tunnistelauseke", + "message": "Tilisi tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintEnsureIntegrityVerify": { - "message": "Varmistaaksesi salausavaintesi eheyden, vahvista käyttäjän tunnistelauseke ennen kuin jatkat.", + "message": "Varmistaaksesi salausavaintesi eheyden, vahvista käyttäjän tunnistelause ennen kuin jatkat.", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelausekkeen." + "message": "Varmista, että vahvistavan laitteen holvi on avattu ja että se näyttää saman tunnistelauseen." }, "fingerprintPhraseHeader": { - "message": "Tunnistelauseke" + "message": "Tunnistelause" }, "dontAskFingerprintAgain": { - "message": "Älä koskaan kehota vahvistamaan kutsuttujen käyttäjien tunnistelausekkeita (ei suositella)", + "message": "Älä koskaan kehota vahvistamaan kutsuttujen käyttäjien tunnistelauseita (ei suositella)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisaation omistajat ja ylläpitäjät on vapautettu tämän käytännön piiristä." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Sendin tiedot", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Jaettava teksti" + }, "sendTypeFile": { "message": "Tiedosto" }, "sendTypeText": { "message": "Teksti" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Uusi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Poista Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Haluatko varmasti poistaa Sendin?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Minkä tyyppinen Send tämä on?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Poistoajankohta" }, - "deletionDateDesc": { - "message": "Send poistuu pysyvästi määritettynä ajankohtana.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Käyttökertojen enimmäismäärä" }, - "maxAccessCountDesc": { - "message": "Jos määritetty, käyttäjät eivät voi avata Sendiä käyttökertojen enimmäismäärän täytyttyä.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Käyttökertojen nykyinen määrä" - }, - "sendPasswordDesc": { - "message": "Halutessasi, vaadi käyttäjiä syöttämään salasana Sendin avaamiseksi.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Yksityisiä merkintöjä tästä Sendistä.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Poistettu käytöstä" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Haluatko varmasti poistaa salasanan?" }, - "hideEmail": { - "message": "Piilota sähköpostiosoitteeni vastaanottajilta." - }, - "disableThisSend": { - "message": "Poista Send käytöstä, jottei kukaan voi avata sitä.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Kaikki Sendit" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Odottaa poistoa" }, + "hideTextByDefault": { + "message": "Piilota teksti oletuksena" + }, "expired": { "message": "Erääntynyt" }, @@ -5415,13 +5441,6 @@ "message": "Näytä jäsenen sähköpostiosoite aina vastaanottajien ohessa, kun Send luodaan tai sitä muokataan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Seuraavat organisaatiokäytännöt ovat aktiivisia:" - }, - "sendDisableHideEmailInEffect": { - "message": "Käyttäjiltä on estetty sähköpostiosoitteen piilotus kun he luovat tai muokkaavat Sendiä.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Muokkasi käytäntöä \"$ID$\".", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Poista yksityisen omistajuuden valinta käytöstä organisaation käyttäjiltä" }, - "textHiddenByDefault": { - "message": "Piilota teksti oletuksena kun Send avataan", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Kuvaava nimi Sendille.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Teksti, jonka haluat lähettää." - }, - "sendFileDesc": { - "message": "Tiedosto, jonka haluat lähettää." - }, - "copySendLinkOnSave": { - "message": "Kopioi Sendin linkki leikepöydälle tallennettaessa." - }, - "sendLinkLabel": { - "message": "Send-linkki", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Tapahtui virhe tallennettaessa poisto- ja erääntymisajankohtia." }, + "hideYourEmail": { + "message": "Piilota sähköpostiosoitteeni avaajilta." + }, "webAuthnFallbackMsg": { "message": "Vahvista kaksivaiheinen kirjautuminen (2FA) alla olevalla painikeella." }, @@ -5697,7 +5698,7 @@ "message": "WebAuthn-todennus" }, "readSecurityKey": { - "message": "Read security key" + "message": "Lue suojausavain" }, "awaitingSecurityKeyInteraction": { "message": "Awaiting security key interaction..." @@ -5916,7 +5917,7 @@ "message": "Virhe" }, "decryptionError": { - "message": "Decryption error" + "message": "Salauksen purkuvirhe" }, "couldNotDecryptVaultItemsBelow": { "message": "Bitwarden could not decrypt the vault item(s) listed below." @@ -6821,7 +6822,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Käytä $RECOMMENDED$ tai useampaa sanaa vahvan salalauseen luomiseksi.", + "message": " Käytä vahvaan salalauseeseen ainakin $RECOMMENDED$ sanaa.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6844,7 +6845,7 @@ "message": "Käytä verkkotunnuksesi catch-all-postilaatikkoa." }, "useThisEmail": { - "message": "Use this email" + "message": "Käytä tätä sähköpostia" }, "random": { "message": "Satunnainen", @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Käyttäjien määrä" }, - "loggingInAs": { - "message": "Kirjaudutaan tunnuksella" - }, - "notYou": { - "message": "Etkö se ollut sinä?" - }, "pickAnAvatarColor": { "message": "Valitse hahmon väri" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Pyydä hyväksyntää ylläpidolta" }, - "approveWithMasterPassword": { - "message": "Hyväksy pääsalasanalla" - }, "trustedDeviceEncryption": { "message": "Luotettu laitesalaus" }, @@ -8492,7 +8484,7 @@ "message": "Aktivoi Salaisuushallinta" }, "yourOrganizationsFingerprint": { - "message": "Organisaatiosi tunnistelauseke", + "message": "Organisaatiosi tunnistelause", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their organization's public key with another user, for the purposes of sharing." }, "deviceApprovals": { @@ -8517,13 +8509,13 @@ "message": "Hyväksy pyyntö" }, "deviceApproved": { - "message": "Device approved" + "message": "Laite hyväksyttiin" }, "deviceRemoved": { - "message": "Device removed" + "message": "Laite poistettiin" }, "removeDevice": { - "message": "Remove device" + "message": "Poista laite" }, "removeDeviceConfirmation": { "message": "Are you sure you want to remove this device?" @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pyyntösi on välitetty ylläpidollesi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Saat ilmoituksen kun se on hyväksytty." - }, "troubleLoggingIn": { "message": "Ongelmia kirjautumisessa?" }, @@ -9349,8 +9338,17 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Laitteen luontipäivä puuttuu" + }, "desktopRequired": { - "message": "Desktop required" + "message": "Työpöytä vaaditaan" }, "reopenLinkOnDesktop": { "message": "Reopen this link from your email on a desktop." @@ -9819,7 +9817,7 @@ "message": "Lisätietoja holvisi hausta" }, "learnMoreAboutYourAccountFingerprintPhrase": { - "message": "Lisätietoja tilisi tunnistelausekkeesta" + "message": "Lisätietoja tilisi tunnistelauseesta" }, "impactOfRotatingYourEncryptionKey": { "message": "Salausavaimesi kierrätyksen vaikutus" @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Lisätietoja Bitwardenin API:sta" }, + "fileSend": { + "message": "Tiedosto-Send" + }, "fileSends": { "message": "Tiedosto-Sendit" }, + "textSend": { + "message": "Teksti-Send" + }, "textSends": { "message": "Teksti-Sendit" }, @@ -9945,13 +9949,13 @@ "message": "Avainalgoritmi" }, "sshPrivateKey": { - "message": "Private key" + "message": "Yksityinen avain" }, "sshPublicKey": { - "message": "Public key" + "message": "Julkinen avain" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Sormenjälki" }, "sshKeyFingerprint": { "message": "Sormenjälki" @@ -10084,10 +10088,6 @@ "message": "Sisällytä erikoismerkkejä", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Lisää liite" }, @@ -10228,7 +10228,7 @@ "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." }, "remindMeLater": { - "message": "Remind me later" + "message": "Muistuta myöhemmin" }, "newDeviceVerificationNoticePageOneFormContent": { "message": "Do you have reliable access to your email, $EMAIL$?", @@ -10255,7 +10255,7 @@ "message": "Poista jäsenet" }, "devices": { - "message": "Devices" + "message": "Laitteet" }, "deviceListDescription": { "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." @@ -10294,7 +10294,7 @@ "message": "Claimed" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "Vahvistettavana" }, "claimedDomainsDesc": { "message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts." @@ -10348,26 +10348,56 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "Syöttämäsi salasana on virheellinen." + }, + "importSshKey": { + "message": "Tuo" + }, + "confirmSshKeyPassword": { + "message": "Vahvista salasana" + }, + "enterSshKeyPasswordDesc": { + "message": "Syötä SSH-avaimen salasana." + }, + "enterSshKeyPassword": { + "message": "Syötä salasana" + }, + "invalidSshKey": { + "message": "SSH-avain on virheellinen" + }, + "sshKeyTypeUnsupported": { + "message": "SSH-avaintyyppiä ei ole tuettu" + }, + "importSshKeyFromClipboard": { + "message": "Tuo avain leikepöydältä" + }, + "sshKeyImported": { + "message": "SSH-avain on tuotu" + }, + "copySSHPrivateKey": { + "message": "Kopioi yksityinen avain" + }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "Avataan Bitwarden-selainlaajennusta" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "Jokin meni pieleen..." }, "openingExtensionError": { "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." }, "openExtension": { - "message": "Open extension" + "message": "Avaa laajennus" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "Eikö sinulla ole Bitwarden-selainlaajennusta?" }, "installExtension": { - "message": "Install extension" + "message": "Asenna laajennus" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "Avaa selainlaajennus" }, "openedExtensionViewAtRiskPasswords": { "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." @@ -10424,10 +10454,10 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "Organisaatiotilaus aloitettiin uudelleen" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "Aloita tilauksesi uudelleen" }, "suspendedManagedOrgMessage": { "message": "Contact $PROVIDER$ for assistance.", @@ -10445,7 +10475,7 @@ "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." }, "deleteManagedUserWarning": { - "message": "Delete is a new action!" + "message": "Poisto on uusi toiminto!" }, "seatsRemaining": { "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", @@ -10461,7 +10491,7 @@ } }, "existingOrganization": { - "message": "Existing organization" + "message": "Olemassa oleva organisaatio" }, "selectOrganizationProviderPortal": { "message": "Select an organization to add to your Provider Portal." @@ -10482,11 +10512,14 @@ } }, "addedExistingOrganization": { - "message": "Added existing organization" + "message": "Olemassa oleva organisaatio lisättiin" }, "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Vaihda vaarantunut salasana" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index 0f1fc9c2b7e..414bbda91d8 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Mga Tala" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Hilahin para pagsunud-sunurin" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teksto" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Baguhin ang folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Mga pansala" }, - "moveSelectedToOrg": { - "message": "Ilipat sa napiling organisasyon" - }, "deleteSelected": { "message": "Burahin ang napili" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Inilipat ang mga napiling item sa $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Hindi" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Mag-log in o gumawa ng bagong account para ma-access ang secure vault mo." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Palatandaan ng password" - }, - "enterEmailToGetHint": { - "message": "Ipasok ang email address ng account mo para makita ang palatandaan ng master password mo." - }, "getMasterPasswordHint": { "message": "Kunin ang palatandaan ng master password" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Piliin kung saang organisasyon mo ililipat ang item na ito. Magiging pag-aari ng organisasyon ang anumang item na ililipat mo rito. Hindi ka na ang direktang may-ari ng item na ito pagkalipat." }, - "moveManyToOrgDesc": { - "message": "Piliin kung saang organisasyon mo ililipat ang mga item na ito. Magiging pag-aari ng organisasyon ang mga item na ililipat mo rito. Hindi ka na ang direktang may-ari ng mga item na ito pagkalipat." - }, "collectionsDesc": { "message": "Baguhin kung saang mga koleksyon ibinabahagi ang item na ito. Ang mga user sa organisasyon na may access sa koleksyon na ito lang ang makakakita sa item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ item ang napili mo. Pwedeng mailipat sa isang organisasyon ang $MOVEABLE_COUNT$ item, habang $NONMOVEABLE_COUNT$ item ang hindi pwedeng mailipat.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Code pamberipika (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Tanggalin ang access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Aktibo ang provider na ito ng dalawang-hakbang na pag-log in sa account mo." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Ang mga may ari ng organisasyon at mga admin ay exempted mula sa pagpapatupad ng patakaran na ito." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Mag-file" }, "sendTypeText": { "message": "Teksto" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Bagong Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "I-delete ang Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Sigurado ka bang gusto mo na i-delete ang Ipadala na ito?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Anong type ng Send ito", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Petsa ng Pagtanggal" }, - "deletionDateDesc": { - "message": "Ang Ipadala ay tatanggalin nang permanente sa tinukoy na petsa at oras.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum na bilang ng access" }, - "maxAccessCountDesc": { - "message": "Kung nakatakda, ang mga user ay hindi na maaaring ma-access ang Send na ito pagkatapos makarating sa maximum access count.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Kasalukuyang access count" - }, - "sendPasswordDesc": { - "message": "Maipapayo na mag-require ng password para sa mga user na ma-access ang Send na ito.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Pribadong mga tala tungkol sa Send na ito.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Ipadala nai-delete" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Sigurado ka bang gusto mo na tanggalin ang password?" }, - "hideEmail": { - "message": "Itago ang aking email address mula sa mga tatanggap." - }, - "disableThisSend": { - "message": "Deactivate ang Send na ito para walang maka access dito.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Lahat ng Mga Padala" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Nakabinbing pagbura" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Paso na" }, @@ -5415,13 +5441,6 @@ "message": "Laging ipakita ang email address ng miyembro sa mga tatanggap kapag lumilikha o nag edit ng isang Ipadala.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Isang o higit pang mga patakaran ng organisasyon ay nakaapekto sa iyong mga pagpipilian sa Pagpadala." - }, - "sendDisableHideEmailInEffect": { - "message": "Hindi pinapayagan ang mga gumagamit na itago ang kanilang email address mula sa mga tatanggap kapag lumilikha o nag edit ng isang Ipadala.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Binagong patakaran $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Alisin ang indibidwal na pagmamay ari para sa mga gumagamit ng organisasyon" }, - "textHiddenByDefault": { - "message": "Kapag na access ang Ipadala, itago ang teksto sa pamamagitan ng default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Isang friendly name upang ilarawan ang Ipadala na ito.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Ang teksto na nais mong ipadala." - }, - "sendFileDesc": { - "message": "Ang file na gusto mong ipadala." - }, - "copySendLinkOnSave": { - "message": "Kopyahin ang link upang ibahagi ito Ipadala sa aking clipboard sa save." - }, - "sendLinkLabel": { - "message": "Magpadala ng link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Ipadala", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Nagkaroon ng error sa pag-save ng iyong mga petsa ng pagbura at pagpaso." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Upang i verify ang iyong 2FA mangyaring i click ang pindutan sa ibaba." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Bilang ng mga gumagamit" }, - "loggingInAs": { - "message": "Naglolog-in bilang" - }, - "notYou": { - "message": "Hindi ikaw?" - }, "pickAnAvatarColor": { "message": "Pumili ng kulay ng avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index c4acc33f79a..95aa573f14b 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Note privée" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Glissez pour trier" }, + "dragToReorder": { + "message": "Faire glisser pour réorganiser" + }, "cfTypeText": { "message": "Texte" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Modifier le dossier" }, + "editWithName": { + "message": "Modifier $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nouveau dossier" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtre" }, - "moveSelectedToOrg": { - "message": "Déplacer la sélection vers l'organisation" - }, "deleteSelected": { "message": "Supprimer la sélection" }, @@ -918,15 +934,6 @@ } } }, - "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": { @@ -1029,6 +1036,9 @@ "no": { "message": "Non" }, + "location": { + "message": "Localisation" + }, "loginOrCreateNewAccount": { "message": "Connectez-vous ou créez un nouveau compte pour accéder à votre coffre sécurisé." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "La session d'authentification a expiré. Veuillez redémarrer le processus de connexion." }, - "verifyIdentity": { - "message": "Vérifiez votre Identité" + "verifyYourIdentity": { + "message": "Vérifiez votre identité" }, "weDontRecognizeThisDevice": { "message": "Nous ne reconnaissons pas cet appareil. Entrez le code envoyé à votre courriel pour vérifier votre identité." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Entrez l'adresse courriel de votre compte et l'indice de votre mot de passe vous sera envoyé" }, - "passwordHint": { - "message": "Indice de mot de passe" - }, - "enterEmailToGetHint": { - "message": "Saisissez l'adresse électronique de votre compte pour recevoir l'indice de votre mot de passe principal." - }, "getMasterPasswordHint": { "message": "Obtenir l'indice du mot de passe principal" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choisissez une organisation vers laquelle vous souhaitez déplacer cet élément. Déplacer un élément vers une organisation transfère la propriété de l'élément à cette organisation. Vous ne serez plus le propriétaire direct de cet élément une fois qu'il aura été déplacé." }, - "moveManyToOrgDesc": { - "message": "Choisissez une organisation vers laquelle vous souhaitez déplacer ces éléments. Déplacer des éléments vers une organisation transfère la propriété des éléments à cette organisation. Vous ne serez plus le propriétaire direct de ces éléments une fois qu'ils auront été déplacés." - }, "collectionsDesc": { "message": "Modifier les collections avec lesquelles cet élément est partagé. Seuls les utilisateurs de l'organisation avec un accès à ces collections pourront voir cet élément." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Vous avez sélectionné $COUNT$ élément(s). $MOVEABLE_COUNT$ élément(s) peuvent être déplacés vers une organisation, $NONMOVEABLE_COUNT$ ne le peuvent pas.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Code de vérification (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Révoquer l'Accès" }, + "revoke": { + "message": "Révoquer" + }, "twoStepLoginProviderEnabled": { "message": "Ce fournisseur d'authentification à deux facteurs est actif sur votre compte." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ déplacé vers le haut, position $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ déplacé vers le bas, position $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Lors de la mise à jour de votre clé de chiffrement, vos dossiers n'ont pas pu être déchiffrés. Pour continuer avec la mise à jour, vos dossiers doivent être supprimés. Aucun élément du coffre ne sera supprimé si vous continuez." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Les propriétaires et les administrateurs de l'organisation sont exonérés de l'application de cette politique." }, + "limitSendViews": { + "message": "Limiter le nombre d'affichages" + }, + "limitSendViewsHint": { + "message": "Personne ne peut afficher ce Send une fois la limite atteinte.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ affichages restants", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Détails du Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Texte à partager" + }, "sendTypeFile": { "message": "Fichier" }, "sendTypeText": { "message": "Texte" }, + "sendPasswordDescV3": { + "message": "Ajouter un mot de passe facultatif pour que les destinataires puissent accéder à ce Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nouveau Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Supprimer le Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Êtes-vous sûr de vouloir supprimer ce Send ?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "De quel type de Send s'agit-il ?", + "deleteSendPermanentConfirmation": { + "message": "Êtes-vous sûr de vouloir supprimer définitivement ce Send ?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Date de suppression" }, - "deletionDateDesc": { - "message": "Le Send sera définitivement supprimé à la date et heure spécifiées.", + "deletionDateDescV2": { + "message": "Le Send sera définitivement supprimé à cette date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Nombre maximum d'accès" }, - "maxAccessCountDesc": { - "message": "Si défini, les utilisateurs ne seront plus en mesure d'accéder à ce Send une fois que le nombre maximum d'accès sera atteint.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Nombre d'accès actuel" - }, - "sendPasswordDesc": { - "message": "Vous pouvez, si vous le souhaitez, exiger un mot de passe pour accéder à ce Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Notes privées à propos de ce Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Désactivé" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Êtes-vous sûr de vouloir supprimer le mot de passe ?" }, - "hideEmail": { - "message": "Masquer mon adresse électronique aux destinataires." - }, - "disableThisSend": { - "message": "Désactiver ce Send pour que personne ne puisse y accéder.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Tous les Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "En attente de suppression" }, + "hideTextByDefault": { + "message": "Masquer le texte par défaut" + }, "expired": { "message": "Expiré" }, @@ -5415,13 +5441,6 @@ "message": "Toujours afficher l'adresse électronique du membre avec les destinataires lors de la création ou de l'édition d'un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Les politiques de sécurité de l'organisation suivantes sont actuellement en vigueur :" - }, - "sendDisableHideEmailInEffect": { - "message": "Les utilisateurs ne sont pas autorisés à masquer leur adresse électronique aux destinataires lors de la création ou de l'édition d'un Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Politique $ID$ modifiée.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Supprimer la propriété individuelle des utilisateurs de l'organisation" }, - "textHiddenByDefault": { - "message": "Lors de l'accès à ce Send, masquer le texte par défaut", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Un nom convivial pour décrire ce Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Le texte que vous voulez envoyer." - }, - "sendFileDesc": { - "message": "Le fichier que vous voulez envoyer." - }, - "copySendLinkOnSave": { - "message": "Copier le lien de ce Send dans mon presse-papiers lors de l'enregistrement." - }, - "sendLinkLabel": { - "message": "Lien du Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Une erreur s'est produite lors de l'enregistrement de vos dates de suppression et d'expiration." }, + "hideYourEmail": { + "message": "Masquer mon adresse courriel aux destinataires." + }, "webAuthnFallbackMsg": { "message": "Pour vérifier votre 2FA, veuillez cliquer sur le bouton ci-dessous." }, @@ -6359,7 +6360,7 @@ "message": "Il vous a été offert un plan organisation Bitwarden \"Families\" gratuit. Pour continuer, vous devez vous connecter au compte qui a reçu l'offre." }, "sponsoredFamiliesAcceptFailed": { - "message": "Impossible d'accepter l'offre. Veuillez renvoyer le courriel de l'offre depuis votre compte d'entreprise et réessayer." + "message": "Impossible d'accepter l'offre. Veuillez renvoyer le courriel de l'offre depuis votre compte Entreprise et réessayer." }, "sponsoredFamiliesAcceptFailedShort": { "message": "Impossible d'accepter l'offre. $DESCRIPTION$", @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Nombre d’utilisateurs" }, - "loggingInAs": { - "message": "Connexion en tant que" - }, - "notYou": { - "message": "Ce n'est pas vous ?" - }, "pickAnAvatarColor": { "message": "Choisissez une couleur d'avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Demander l'approbation de l'administrateur" }, - "approveWithMasterPassword": { - "message": "Approuver avec le mot de passe principal" - }, "trustedDeviceEncryption": { "message": "Chiffrement de l'appareil de confiance" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Votre demande a été envoyée à votre administrateur." }, - "youWillBeNotifiedOnceApproved": { - "message": "Vous serez notifié une fois approuvé." - }, "troubleLoggingIn": { "message": "Problème pour vous connecter ?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configurez la gestion des appareils pour Bitwarden en utilisant le guide d'implémentation pour votre plateforme." }, + "deviceIdMissing": { + "message": "L'identification de l'appareil est manquante" + }, + "deviceTypeMissing": { + "message": "Le type d'appareil est manquant" + }, + "deviceCreationDateMissing": { + "message": "La date de création de l'appareil est manquante" + }, "desktopRequired": { "message": "Ordinateur de bureau requis" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "En savoir plus sur l'API de Bitwarden" }, + "fileSend": { + "message": "Send d'un fichier" + }, "fileSends": { "message": "Déposer des Sends" }, + "textSend": { + "message": "Send d'un texte" + }, "textSends": { "message": "Texter des Sends" }, @@ -10084,10 +10088,6 @@ "message": "Inclure des caractères spéciaux", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Ajouter une pièce jointe" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Le nom de l'organisation ne doit pas dépasser 50 caractères." }, + "sshKeyWrongPassword": { + "message": "Le mot de passe que vous avez entré est incorrect." + }, + "importSshKey": { + "message": "Importer" + }, + "confirmSshKeyPassword": { + "message": "Confirmez le mot de passe" + }, + "enterSshKeyPasswordDesc": { + "message": "Entrez le mot de passe pour la clé SSH." + }, + "enterSshKeyPassword": { + "message": "Entrer le mot de passe" + }, + "invalidSshKey": { + "message": "La clé SSH est invalide" + }, + "sshKeyTypeUnsupported": { + "message": "Le type de clé SSH n'est pas pris en charge" + }, + "importSshKeyFromClipboard": { + "message": "Importer une clé depuis le presse-papiers" + }, + "sshKeyImported": { + "message": "Clé SSH importée avec succès" + }, + "copySSHPrivateKey": { + "message": "Copier la clé privée" + }, "openingExtension": { "message": "Ouverture de l'extension de navigateur Bitwarden" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Les places assignées dépassent les places disponibles." }, + "changeAtRiskPassword": { + "message": "Changer le mot de passe à risque" + }, "removeUnlockWithPinPolicyTitle": { "message": "Supprimer Déverrouiller avec un NIP" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Ces événements sont des exemples et ne reflètent pas les événements réels au sein de votre organisation Bitwarden." + }, + "cannotCreateCollection": { + "message": "Les organisations gratuites peuvent avoir jusqu'à 2 collections. Passez à une offre payante pour ajouter plus de collections." } } diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index d466c972baf..38a94f9307f 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Non" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Rexístrate ou crea unha nova conta para acceder ó teu baúl." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 2201e8b4968..4df39c8496f 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -1,27 +1,27 @@ { "allApplications": { - "message": "All applications" + "message": "כל היישומים" }, "criticalApplications": { - "message": "Critical applications" + "message": "יישומים קריטיים" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "אין יישומים קריטיים בסיכון" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "גישה למודיעין" }, "riskInsights": { - "message": "Risk Insights" + "message": "תובנות סיכון" }, "passwordRisk": { - "message": "Password Risk" + "message": "סיכון סיסמה" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "סקור סיסמאות בסיכון (חלשות, חשופות, או משומשות) בין יישומים. בחר את היישומים הכי קריטיים שלך על מנת לתעדף פעולות אבטחה עבור המשתמשים שלך כדי לטפל בסיסמאות בסיכון." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "הנתונים עודכנו לאחרונה: $DATE$", "placeholders": { "date": { "content": "$1", @@ -30,19 +30,19 @@ } }, "notifiedMembers": { - "message": "Notified members" + "message": "חברים שהודיעו להם" }, "revokeMembers": { - "message": "Revoke members" + "message": "בטל חברים" }, "restoreMembers": { - "message": "Restore members" + "message": "שחזר חברים" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "לא ניתן לשחזר גישת ארגון" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "כל היישומים ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -51,10 +51,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "צור פריט כניסה חדש" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "יישומים קריטיים ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -63,7 +63,7 @@ } }, "notifiedMembersWithCount": { - "message": "Notified members ($COUNT$)", + "message": "חברים שהודיעו להם ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -72,7 +72,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "לא נמצאו יישומים אצל $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -81,43 +81,43 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "ככל שמשתמשים שומרים כניסות, יישומים מופיעים כאן, ומוצגות כל הסיסמאות בסיכון. סמן יישומים קריטיים והודע למשתמשים לעדכן סיסמאות." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "לא סימנת אף יישום כקריטי" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "בחר את היישומים הכי קריטיים שלך כדי לגלות סיסמאות בסיכון, ולהודיע למשתמשים לשנות את הסיסמאות הללו." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "סמן יישומים קריטיים" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "סמן יישום כקריטי" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "יישומים המסומנים כקריטיים" }, "application": { - "message": "Application" + "message": "יישום" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "סיסמאות בסיכון" }, "requestPasswordChange": { - "message": "Request password change" + "message": "בקש שינוי סיסמה" }, "totalPasswords": { - "message": "Total passwords" + "message": "סה\"כ סיסמאות" }, "searchApps": { - "message": "Search applications" + "message": "חפש יישומים" }, "atRiskMembers": { - "message": "At-risk members" + "message": "חברים בסיכון" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "חברים בסיכון ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -126,7 +126,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "יישומים בסיכון ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -135,13 +135,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "חברים אלה נכנסו אל יישומים עם סיסמאות חלשות, חשופות, או משומשות." }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "ליישומים האלה יש סיסמאות חלשות, חשופות, או משומשות." }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "החברים האלה נכנסו אל $APPNAME$ עם סיסמאות חלשות, חשופות, או משומשות.", "placeholders": { "appname": { "content": "$1", @@ -150,19 +150,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "סה\"כ חברים" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "יישומים בסיכון" }, "totalApplications": { - "message": "Total applications" + "message": "סה\"כ יישומים" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "בטל סימון כיישום קריטי" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "בוטל סימון יישום קריטי בהצלחה" }, "whatTypeOfItem": { "message": "מאיזה סוג פריט זה?" @@ -201,8 +201,11 @@ "notes": { "message": "הערות" }, + "privateNote": { + "message": "הערה פרטית" + }, "note": { - "message": "Note" + "message": "הערה" }, "customFields": { "message": "שדות מותאמים אישית" @@ -211,22 +214,22 @@ "message": "שם בעל הכרטיס" }, "loginCredentials": { - "message": "Login credentials" + "message": "אישורי כניסה" }, "personalDetails": { - "message": "Personal details" + "message": "פרטים אישיים" }, "identification": { - "message": "Identification" + "message": "הזדהות" }, "contactInfo": { - "message": "Contact info" + "message": "פרטי קשר" }, "cardDetails": { - "message": "Card details" + "message": "פרטי כרטיס" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "פרטי $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -235,19 +238,19 @@ } }, "itemHistory": { - "message": "Item history" + "message": "היסטוריית פריט" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "מפתח מאמת" }, "autofillOptions": { - "message": "Autofill options" + "message": "אפשרויות מילוי אוטומטי" }, "websiteUri": { - "message": "Website (URI)" + "message": "אתר אינטרנט (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "אתר אינטרנט (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -257,16 +260,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "אתר האינטרנט נוסף" }, "addWebsite": { - "message": "Add website" + "message": "הוסף אתר אינטרנט" }, "deleteWebsite": { - "message": "Delete website" + "message": "מחק אתר אינטרנט" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "ברירת מחדל ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -276,7 +279,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "הצג זיהוי התאמה $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -285,7 +288,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "הסתר זיהוי התאמה $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -294,7 +297,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "למלא אוטומטית בעת טעינת עמוד?" }, "number": { "message": "מספר" @@ -306,25 +309,25 @@ "message": "תוקף" }, "securityCode": { - "message": "קוד האבטחה (CVV)" + "message": "קוד אבטחה (CVV)" }, "securityCodeSlashCVV": { - "message": "Security code / CVV" + "message": "קוד אבטחה / CVV" }, "identityName": { - "message": "שם הזהות" + "message": "שם זהות" }, "company": { "message": "חברה" }, "ssn": { - "message": "מספר ביטוח לאומי" + "message": "מספר תעודת זהות" }, "passportNumber": { "message": "מספר דרכון" }, "licenseNumber": { - "message": "מספר רשיון" + "message": "מספר רישיון" }, "email": { "message": "אימייל" @@ -381,37 +384,37 @@ "message": "העלמה" }, "mx": { - "message": "Mx" + "message": "מיקס" }, "dr": { "message": "דוקטור" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "כרטיס פג תוקף" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "אם חידשת אותו, עדכן את פרטי הכרטיס" }, "expirationMonth": { - "message": "תוקף אשראי - חודש" + "message": "חודש תפוגה" }, "expirationYear": { - "message": "תוקף אשראי - שנה" + "message": "שנת תפוגה" }, "authenticatorKeyTotp": { "message": "מפתח מאמת (TOTP)" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "הפוך את האימות הדו־שלבי לחלק" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו־שלבי. העתק והדבק את המפתח לשדה זה." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden יכול לאחסון ולמלא קודים של אימות דו־שלבי. בחר את סמל המצלמה כדי לצלם את הקוד QR המאמת של אתר זה, או העתק והדבק את המפתח לתוך שדה זה." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "למד עוד על מאמתים" }, "folder": { "message": "תיקייה" @@ -425,6 +428,9 @@ "dragToSort": { "message": "גרור כדי למיין" }, + "dragToReorder": { + "message": "גרור כדי לסדר מחדש" + }, "cfTypeText": { "message": "טקסט" }, @@ -435,17 +441,17 @@ "message": "אמת או שקר" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "תיבת סימון" }, "cfTypeLinked": { "message": "מקושר", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "סוג שדה" }, "fieldLabel": { - "message": "Field label" + "message": "תווית שדה" }, "remove": { "message": "הסר" @@ -454,30 +460,43 @@ "message": "לא מוקצה" }, "noneFolder": { - "message": "ללא תיקיה", + "message": "ללא תיקייה", "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { - "message": "You", + "message": "את/ה", "description": "Used as a label to indicate that the user is the owner of an item." }, "addFolder": { - "message": "הוסף תיקיה" + "message": "הוסף תיקייה" }, "editFolder": { "message": "ערוך תיקייה" }, + "editWithName": { + "message": "ערוך $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { - "message": "New folder" + "message": "תיקייה חדשה" }, "folderName": { - "message": "Folder name" + "message": "שם תיקייה" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "צור תיקייה מקוננת על ידי הוספת שם תיקיית האב ואחריו “/”. דוגמה: חברתי/פורומים" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "האם אתה בטוח שברצונך למחוק תיקייה זו לצמיתות?" }, "baseDomain": { "message": "שם בסיס הדומיין", @@ -513,17 +532,17 @@ "message": "לעולם לא" }, "toggleVisibility": { - "message": "הצג או הסתר" + "message": "שנה מצב נראות" }, "toggleCollapse": { - "message": "הצג או קפל", + "message": "שנה מצב כיווץ", "description": "Toggling an expand/collapse state." }, "generatePassword": { "message": "צור סיסמה" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "צור ביטוי סיסמה" }, "checkPassword": { "message": "בדוק אם הסיסמה נחשפה." @@ -574,35 +593,35 @@ "message": "חפש מועדפים" }, "searchLogin": { - "message": "Search logins", + "message": "חפש כניסות", "description": "Search Login type" }, "searchCard": { - "message": "Search cards", + "message": "חפש כרטיסים", "description": "Search Card type" }, "searchIdentity": { - "message": "Search identities", + "message": "חפש זהויות", "description": "Search Identity type" }, "searchSecureNote": { - "message": "Search secure notes", + "message": "חפש הערות מאובטחות", "description": "Search Secure Note type" }, "searchVault": { "message": "חפש כספת" }, "searchMyVault": { - "message": "Search my vault" + "message": "חפש בכספת שלי" }, "searchOrganization": { - "message": "Search organization" + "message": "חפש בארגון" }, "searchMembers": { - "message": "Search members" + "message": "חפש חברים" }, "searchGroups": { - "message": "Search groups" + "message": "חפש קבוצות" }, "allItems": { "message": "כל הפריטים" @@ -623,13 +642,13 @@ "message": "זהות" }, "typeSecureNote": { - "message": "פתק מאובטח" + "message": "הערה מאובטחת" }, "typeSshKey": { - "message": "SSH key" + "message": "מפתח SSH" }, "typeLoginPlural": { - "message": "התחברויות" + "message": "כניסות" }, "typeCardPlural": { "message": "כרטיסים" @@ -638,7 +657,7 @@ "message": "זהויות" }, "typeSecureNotePlural": { - "message": "פתקים מאובטחים" + "message": "הערות מאובטחות" }, "folders": { "message": "תיקיות" @@ -659,7 +678,7 @@ "message": "שם מלא" }, "address": { - "message": "Address" + "message": "כתובת" }, "address1": { "message": "כתובת 1" @@ -692,7 +711,7 @@ "message": "בחר" }, "newItem": { - "message": "New item" + "message": "פריט חדש" }, "addItem": { "message": "הוסף פריט" @@ -704,7 +723,7 @@ "message": "הצג פריט" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "$TYPE$ חדש", "placeholders": { "type": { "content": "$1", @@ -713,7 +732,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "ערוך $TYPE$", "placeholders": { "type": { "content": "$1", @@ -722,7 +741,7 @@ } }, "viewItemType": { - "message": "View $ITEMTYPE$", + "message": "הצג $ITEMTYPE$", "placeholders": { "itemtype": { "content": "$1", @@ -731,17 +750,17 @@ } }, "new": { - "message": "New", + "message": "חדש", "description": "for adding new items" }, "item": { - "message": "Item" + "message": "פריט" }, "itemDetails": { - "message": "Item details" + "message": "פרטי הפריט" }, "itemName": { - "message": "Item name" + "message": "שם הפריט" }, "ex": { "message": "לדוגמא", @@ -754,7 +773,7 @@ "message": "שתף" }, "moveToOrganization": { - "message": "העברה לארגון" + "message": "העבר לארגון" }, "valueCopied": { "message": "השדה $VALUE$ הועתק לזיכרון", @@ -767,7 +786,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "העתקה מוצלחת" }, "copyValue": { "message": "העתק ערך", @@ -778,11 +797,11 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "העתק ביטוי סיסמה", "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "הסיסמה הועתקה" }, "copyUsername": { "message": "העתק שם משתמש", @@ -801,7 +820,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "העתק $FIELD$", "placeholders": { "field": { "content": "$1", @@ -810,58 +829,55 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "העתק אתר אינטרנט" }, "copyNotes": { - "message": "Copy notes" + "message": "העתק הערות" }, "copyAddress": { - "message": "Copy address" + "message": "העתק כתובת" }, "copyPhone": { - "message": "Copy phone" + "message": "העתק טלפון" }, "copyEmail": { - "message": "Copy email" + "message": "העתק דוא\"ל" }, "copyCompany": { - "message": "Copy company" + "message": "העתק חברה" }, "copySSN": { - "message": "Copy Social Security number" + "message": "העתק מספר תעודת זהות" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "העתק מספר דרכון" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "העתק מספר רישיון" }, "copyName": { - "message": "Copy name" + "message": "העתק שם" }, "me": { - "message": "Me" + "message": "אני" }, "myVault": { "message": "הכספת שלי" }, "allVaults": { - "message": "All vaults" + "message": "כל הכספות" }, "vault": { "message": "כספת" }, "vaults": { - "message": "Vaults" + "message": "כספות" }, "vaultItems": { - "message": "Vault items" + "message": "פריטי כספת" }, "filter": { - "message": "Filter" - }, - "moveSelectedToOrg": { - "message": "העבר בחירה לארגון" + "message": "מסנן" }, "deleteSelected": { "message": "מחק בחירה" @@ -879,7 +895,7 @@ "message": "הפעל" }, "newAttachment": { - "message": "צרף קובץ חדש" + "message": "הוסף צרופה חדשה" }, "deletedAttachment": { "message": "קובץ מצורף שנמחק" @@ -888,7 +904,7 @@ "message": "האם אתה בטוח שברצונך למחוק קובץ מצורף זה?" }, "attachmentSaved": { - "message": "הקובץ המצורף נשמר." + "message": "הצרופה נשמרה" }, "file": { "message": "קובץ" @@ -897,16 +913,16 @@ "message": "בחר קובץ." }, "maxFileSize": { - "message": "גודל הקובץ המירבי הוא 500 מגה." + "message": "גודל הקובץ המרבי הוא 500MB." }, "addedItem": { - "message": "פריט שהתווסף" + "message": "הפריט נוסף" }, "editedItem": { - "message": "פריט שנערך" + "message": "הפריט נשמר" }, "movedItemToOrg": { - "message": "$ITEMNAME$ הועבר ל־$ORGNAME$", + "message": "$ITEMNAME$ הועבר אל $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -918,17 +934,8 @@ } } }, - "movedItemsToOrg": { - "message": "פריטים נבחרים הועברו ל־$ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "פריטים הועברו אל $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -937,7 +944,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "פריט הועבר אל $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -952,7 +959,7 @@ "message": "מחק תיקייה" }, "deleteAttachment": { - "message": "מחק קובץ מצורף" + "message": "מחק צרופה" }, "deleteItemConfirmation": { "message": "האם אתה בטוח שברצונך למחוק פריט זה?" @@ -964,61 +971,61 @@ "message": "הפריטים נשלחו לסל המחזור" }, "movedItems": { - "message": "פריטים שהועברו" + "message": "פריטים הועברו" }, "overwritePasswordConfirmation": { "message": "האם אתה בטוח שברצונך לדרוס את הסיסמה הנוכחית?" }, "editedFolder": { - "message": "תיקיה שנערכה" + "message": "תיקייה נשמרה" }, "addedFolder": { - "message": "תיקיה שנוספה" + "message": "תיקייה נוספה" }, "deleteFolderConfirmation": { "message": "האם אתה בטוח שברצונך למחוק את התיקייה?" }, "deletedFolder": { - "message": "תיקיה שנמחקה" + "message": "תיקייה נמחקה" }, "editInfo": { - "message": "Edit info" + "message": "ערוך מידע" }, "access": { - "message": "Access" + "message": "גישה" }, "accessLevel": { - "message": "Access level" + "message": "רמת גישה" }, "accessing": { - "message": "Accessing" + "message": "ניגש אל" }, "loggedOut": { "message": "בוצעה יציאה" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "יצאת מהחשבון שלך." }, "loginExpired": { "message": "תוקף החיבור שלך הסתיים." }, "restartRegistration": { - "message": "Restart registration" + "message": "התחל הרשמה מחדש" }, "expiredLink": { - "message": "Expired link" + "message": "קישור פג תוקף" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "נא להתחיל הרשמה מחדש או לנסות להיכנס." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "ייתכן שכבר יש לך חשבון" }, "logOutConfirmation": { "message": "האם אתה בטוח שברצונך להתנתק?" }, "logOut": { - "message": "התנתק" + "message": "צא" }, "ok": { "message": "אישור" @@ -1029,95 +1036,98 @@ "no": { "message": "לא" }, + "location": { + "message": "מיקום" + }, "loginOrCreateNewAccount": { "message": "צור חשבון חדש או התחבר כדי לגשת לכספת המאובטחת שלך." }, "loginWithDevice": { - "message": "Log in with device" + "message": "כניסה עם מכשיר" }, "loginWithDeviceEnabledNote": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "כניסה עם מכשיר צריכה להיות מוגדרת בהגדרות של היישום Bitwarden. צריך אפשרות אחרת?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "צריך אפשרות אחרת?" }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "כניסה עם סיסמה ראשית" }, "readingPasskeyLoading": { - "message": "Reading passkey..." + "message": "קורא מפתח גישה..." }, "readingPasskeyLoadingInfo": { - "message": "Keep this window open and follow prompts from your browser." + "message": "השאר חלון זה פתוח ועקוב אחר ההנחיות מהדפדפן שלך." }, "useADifferentLogInMethod": { - "message": "Use a different log in method" + "message": "השתמש בשיטת כניסה אחרת" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "כניסה עם מפתח גישה" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "השתמש בכניסה יחידה" }, "welcomeBack": { - "message": "Welcome back" + "message": "ברוך שובך" }, "invalidPasskeyPleaseTryAgain": { - "message": "Invalid Passkey. Please try again." + "message": "מפתח גישה לא חוקי. נא לנסות שוב." }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "2FA for passkeys is not supported. Update the app to log in." + "message": "אימות דו־גורמי (2FA) עבור מפתחות גישה אינו נתמך. עדכן את היישום כדי להיכנס." }, "loginWithPasskeyInfo": { - "message": "Use a generated passkey that will automatically log you in without a password. Biometrics, like facial recognition or fingerprint, or another FIDO2 security method will verify your identity." + "message": "השתמש במפתח גישה שנוצר אשר יכניס אותך באופן אוטומטי ללא סיסמה. זיהוי ביומטרי, כמו זיהוי פנים או טביעת אצבע, או שיטת אבטחה מסוג FIDO2 אחרת יאמתו את זהותך." }, "newPasskey": { - "message": "New passkey" + "message": "מפתח גישה חדש" }, "learnMoreAboutPasswordless": { - "message": "Learn more about passwordless" + "message": "למד עוד על ללא סיסמה" }, "creatingPasskeyLoading": { - "message": "Creating passkey..." + "message": "יוצר מפתח גישה..." }, "creatingPasskeyLoadingInfo": { - "message": "Keep this window open and follow prompts from your browser." + "message": "השאר חלון זה פתוח ועקוב אחר ההנחיות מהדפדפן שלך." }, "errorCreatingPasskey": { - "message": "Error creating passkey" + "message": "שגיאה ביצירת מפתח גישה" }, "errorCreatingPasskeyInfo": { - "message": "There was a problem creating your passkey." + "message": "הייתה בעיה ביצירת מפתח הגישה שלך." }, "passkeySuccessfullyCreated": { - "message": "Passkey successfully created!" + "message": "מפתח גישה נוצר בהצלחה!" }, "customPasskeyNameInfo": { - "message": "Name your passkey to help you identify it." + "message": "תן שם למפתח הגישה שלך כדי לעזור לך לזהות אותו." }, "useForVaultEncryption": { - "message": "Use for vault encryption" + "message": "השתמש עבור הצפנת כספת" }, "useForVaultEncryptionInfo": { - "message": "Log in and unlock on supported devices without your master password. Follow the prompts from your browser to finalize setup." + "message": "היכנס ובטל נעילה במכשירים נתמכים ללא הסיסמה הראשית שלך. עקוב אחר ההנחיות מהדפדפן שלך כדי לסיים את ההגדרה." }, "useForVaultEncryptionErrorReadingPasskey": { - "message": "Error reading passkey. Try again or uncheck this option." + "message": "שגיאה בקריאת מפתח גישה. נסה שוב או בטל את הסימון של אפשרות זו." }, "encryptionNotSupported": { - "message": "Encryption not supported" + "message": "הצפנה לא נתמכת" }, "enablePasskeyEncryption": { - "message": "Set up encryption" + "message": "הגדר הצפנה" }, "usedForEncryption": { - "message": "Used for encryption" + "message": "משמש עבור הצפנה" }, "loginWithPasskeyEnabled": { - "message": "Log in with passkey turned on" + "message": "כניסה עם מפתח גישה מופעלת" }, "passkeySaved": { - "message": "$NAME$ saved", + "message": "$NAME$ נשמר", "placeholders": { "name": { "content": "$1", @@ -1126,79 +1136,79 @@ } }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "מפתח גישה הוסר" }, "removePasskey": { - "message": "Remove passkey" + "message": "הסר מפתח גישה" }, "removePasskeyInfo": { - "message": "If all passkeys are removed, you will be unable to log into new devices without your master password." + "message": "אם כל מפתחות הגישה מוסרים, לא תוכל להיכנס למכשירים חדשים ללא הסיסמה הראשית שלך." }, "passkeyLimitReachedInfo": { - "message": "Passkey limit reached. Remove a passkey to add another." + "message": "הגעת למגבלת מפתחות גישה. הסר מפתח גישה כדי להוסיף אחד נוסף." }, "tryAgain": { - "message": "Try again" + "message": "נסה שוב" }, "createAccount": { "message": "צור חשבון" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "חדש ב־Bitwarden?" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "הגדר סיסמה חזקה" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "סיים ליצור את החשבון שלך על ידי הגדרת סיסמה" }, "newAroundHere": { - "message": "New around here?" + "message": "חדש כאן?" }, "startTrial": { - "message": "Start trial" + "message": "התחל ניסיון" }, "logIn": { - "message": "התחבר" + "message": "היכנס" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "היכנס אל Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "הזן את הקוד שנשלח לדוא\"ל שלך" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "הזן את הקוד מיישום המאמת שלך" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "לחץ על ה־YubiKey שלך כדי לאמת" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "פסק זמן לאימות" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "זמן אימות ההפעלה תם. נא להתחיל מחדש את תהליך הכניסה." }, - "verifyIdentity": { - "message": "Verify your Identity" + "verifyYourIdentity": { + "message": "אמת את זהותך" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "אנחנו לא מזהים את המכשיר הזה. הזן את הקוד שנשלח לדוא\"ל שלך כדי לאמת את זהותך." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "המשך להיכנס" }, "whatIsADevice": { - "message": "What is a device?" + "message": "מהו מכשיר?" }, "aDeviceIs": { - "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." + "message": "מכשיר הוא התקנה ייחודית של היישום Bitwarden היכן שנכנסת. התקנה מחדש, ניקוי נתוני היישום, או ניקוי העוגיות שלך עלולים לגרום למכשיר להופיע מספר פעמים." }, "logInInitiated": { - "message": "Log in initiated" + "message": "הכניסה החלה" }, "logInRequestSent": { - "message": "Request sent" + "message": "בקשה נשלחה" }, "submit": { "message": "שלח" @@ -1219,7 +1229,7 @@ "message": "הסיסמה הראשית היא הסיסמה שבאמצעותה תיגש לכספת שלך. חשוב מאוד שלא תשכח את הסיסמה הזו. אין שום דרך לשחזר אותה במקרה ושכחת אותה." }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "הסיסמה הראשית שלך לא ניתנת לשחזור אם אתה שוכח אותה!" }, "masterPassHintDesc": { "message": "ניתן להשתמש ברמז לסיסמה הראשית אם שכחת אותה." @@ -1228,16 +1238,16 @@ "message": "הקלד שוב סיסמה ראשית" }, "masterPassHint": { - "message": "רמז לסיסמה ראשית (אופציונאלי)" + "message": "רמז לסיסמה הראשית (אופציונלי)" }, "newMasterPassHint": { - "message": "New master password hint (optional)" + "message": "רמז לסיסמה הראשית חדש (אופציונלי)" }, "masterPassHintLabel": { - "message": "רמז לסיסמה ראשית" + "message": "רמז לסיסמה הראשית" }, "masterPassHintText": { - "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "message": "אם תשכח את הסיסמה שלך, הרמז לסיסמה יכול להישלח לדוא\"ל שלך. $CURRENT$/$MAXIMUM$ תווים לכל היותר.", "placeholders": { "current": { "content": "$1", @@ -1253,22 +1263,16 @@ "message": "הגדרות" }, "accountEmail": { - "message": "Account email" + "message": "דוא\"ל חשבון" }, "requestHint": { - "message": "Request hint" + "message": "בקש רמז" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "בקש רמז לסיסמה" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" - }, - "passwordHint": { - "message": "רמז לסיסמה" - }, - "enterEmailToGetHint": { - "message": "הכנס את כתובת האימייל שלך לקבלת רמז עבור הסיסמה הראשית." + "message": "הזן את כתובת דוא\"ל החשבון שלך והרמז לסיסמה שלך יישלח אליך" }, "getMasterPasswordHint": { "message": "הצג את הרמז לסיסמה הראשית" @@ -1280,13 +1284,13 @@ "message": "כתובת אימייל לא תקינה." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "נדרשת סיסמה ראשית." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "נדרשת הזנה מחדש של הסיסמה הראשית." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "סיסמה ראשית חייבת להיות לפחות באורך $VALUE$ תווים.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -1302,13 +1306,13 @@ "message": "החשבון החדש שלך נוצר בהצלחה! כעת ניתן להתחבר למערכת." }, "newAccountCreated2": { - "message": "Your new account has been created!" + "message": "החשבון החדש שלך נוצר!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "נכנסת!" }, "trialAccountCreated": { - "message": "Account created successfully." + "message": "החשבון נוצר בהצלחה." }, "masterPassSent": { "message": "שלחנו לך אימייל עם רמז לסיסמה הראשית." @@ -1317,16 +1321,16 @@ "message": "אירעה שגיאה לא צפויה." }, "expirationDateError": { - "message": "Please select an expiration date that is in the future." + "message": "נא לבחור תאריך תפוגה שהוא בעתיד." }, "emailAddress": { - "message": "כתובת אימייל" + "message": "כתובת דוא\"ל" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "הכספת שלך נעולה" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "החשבון שלך נעול" }, "uuid": { "message": "UUID" @@ -1351,7 +1355,7 @@ "message": "סיסמה ראשית שגויה" }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "סיסמת קובץ שגויה, נא להשתמש בסיסמה שהזנת כשיצרת את קובץ הייצוא." }, "lockNow": { "message": "נעל עכשיו" @@ -1360,10 +1364,10 @@ "message": "אין פריטים להצגה ברשימה." }, "noPermissionToViewAllCollectionItems": { - "message": "You do not have permission to view all items in this collection." + "message": "אין לך הרשאה להציג את כל הפריטים באוסף זה." }, "youDoNotHavePermissions": { - "message": "You do not have permissions to this collection" + "message": "אין לך הרשאות לאוסף זה" }, "noCollectionsInList": { "message": "אין אוספים להצגה ברשימה." @@ -1375,7 +1379,7 @@ "message": "אין משתמשים להצגה ברשימה." }, "noMembersInList": { - "message": "There are no members to list." + "message": "אין חברים להצגה ברשימה." }, "noEventsInList": { "message": "אין אירועים להצגה ברשימה." @@ -1387,16 +1391,16 @@ "message": "אינך משויך לארגון. ניתן לשתף באופן מאובטח פריטים רק עם משתמשים אחרים בתוך ארגון." }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "התראה נשלחה למכשיר שלך." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "בטל נעילת Bitwarden במכשיר שלך או ב" }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "האם אתה מנסה לגשת לחשבון שלך?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "ניסיון גישה על ידי $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -1405,22 +1409,22 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "אשר גישה" }, "denyAccess": { - "message": "Deny access" + "message": "דחה גישה" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "יישום רשת" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "וודא שביטוי טביעת האצבע תואם את זה שלמטה לפני שתאשר." }, "notificationSentDeviceComplete": { - "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + "message": "פתח את Bitwarden במכשיר שלך. וודא שביטוי טביעת האצבע תואם את זה שלמטה לפני שתאשר." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "התראה נשלחה למכשיר שלך" }, "versionNumber": { "message": "גרסה $VERSION_NUMBER$", @@ -1456,7 +1460,7 @@ "message": "זכור אותי" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "אל תשאל אותי שוב במכשיר זה למשך 30 יום" }, "sendVerificationCodeEmailAgain": { "message": "שלח שוב קוד אימות לאימייל" @@ -1465,11 +1469,11 @@ "message": "השתמש בשיטה אחרת עבור כניסה דו שלבית" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "בחר שיטה אחרת", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "השתמש בקוד השחזור שלך" }, "insertYubiKey": { "message": "הכנס את ה-YubiKey אל כניסת ה-USB במחשבך, ואז גע בכפתור שלו." @@ -1478,41 +1482,41 @@ "message": "הכנס את מפתח האבטחה שלך אל כניסת ה-USB במחשבך. אם יש לו כפתור, לחץ עליו." }, "loginUnavailable": { - "message": "פרטי כניסה לא זמינים" + "message": "כניסה לא זמינה" }, "noTwoStepProviders": { - "message": "כניסה דו-שלבית פעילה בחשבון זה, אך אף אחד מספקי הכניסה הדו-שלבית לא נתמכים בדפדפן זה." + "message": "לחשבון זה מוגדרת כניסה דו־שלבית, עם זאת, אף אחד מהספקים הדו־שלביים שהוגדרו אינו נתמך על ידי דפדפן זה." }, "noTwoStepProviders2": { "message": "אנא השתמש בדפדפן נתמך (כמו לדוגמא Chrome) ו\\או הוסף ספק כניסה דו-שלבית הנתמך בדפדפן זה (כמו לדוגמא אפליקצית אימות)." }, "twoStepOptions": { - "message": "אפשרויות כניסה דו שלבית" + "message": "אפשרויות כניסה דו־שלבית" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "בחר שיטת כניסה דו־שלבית" }, "recoveryCodeDesc": { - "message": "איבדת גישה לכל ספקי האימות הדו-שלבי שלך? השתמש בקוד האימות כדי לבטל את הספקים הקיימים מתוך החשבון שלך." + "message": "איבדת גישה לכל ספקי הכניסות הדו־שלביות שלך? השתמש בקוד השחזור שלך כדי לכבות את כל ספקי הכניסות הדו־שלביות מהחשבון שלך." }, "recoveryCodeTitle": { "message": "קוד שחזור" }, "authenticatorAppTitle": { - "message": "אפליקציית אימות" + "message": "יישום מאמת" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "הזן קוד שנוצר על ידי יישום מאמת כמו מאמת Bitwarden.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP security key" + "message": "מפתח אבטחה OTP של Yubico" }, "yubiKeyDesc": { - "message": "השתמש בYubiKey עבור גישה לחשבון שלך. עובד עם YubiKey מסדרה 4, סדרה 5, ומכשירי NEO." + "message": "השתמש ב־YubiKey מסדרה 4, 5, או מכשיר NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "הזן קוד שנוצר על ידי Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1520,28 +1524,28 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "u2fDesc": { - "message": "השתמש בכל מפתח אבטחה התומך בFIDO U2F עבור גישה לחשבונך." + "message": "השתמש בכל מפתח אבטחה תואם FIDO U2F כדי לגשת לחשבונך." }, "u2fTitle": { "message": "מפתח אבטחה FIDO U2F" }, "webAuthnTitle": { - "message": "Passkey" + "message": "מפתח גישה" }, "webAuthnDesc": { - "message": "Use your device's biometrics or a FIDO2 compatible security key." + "message": "השתמש בזיהוי ביומטרי של המכשיר שלך או במפתח אבטחה תואם FIDO2." }, "webAuthnMigrated": { - "message": "(Migrated from FIDO)" + "message": "(הועבר מ־FIDO)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "פתח בכרטיסיה חדשה" }, "emailTitle": { "message": "אימייל" }, "emailDescV2": { - "message": "Enter a code sent to your email." + "message": "הזן קוד שנשלח לדוא\"ל שלך." }, "continue": { "message": "המשך" @@ -1553,16 +1557,13 @@ "message": "ארגונים" }, "moveToOrgDesc": { - "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." - }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." + "message": "בחר ארגון שאליו ברצונך להעביר פריט זה. העברה אל ארגון מעבירה בעלות של הפריט אל אותו ארגון. לא תוכל להיות הבעלים הישיר של פריט זה ברגע שהוא הועבר." }, "collectionsDesc": { "message": "ערוך את האוסף המשותף של פריט זה. רק משתמשים מורשים מתוך הארגון יוכלו לראות פריט זה." }, "deleteSelectedItemsDesc": { - "message": "בחרת $COUNT$ פריט(ים) למחיקה. האם אתה בטוח שברצונך למחוק את כולם?", + "message": "$COUNT$ פריט(ים) ישלח(ו) לאשפה.", "placeholders": { "count": { "content": "$1", @@ -1571,7 +1572,7 @@ } }, "deleteSelectedCollectionsDesc": { - "message": "$COUNT$ collection(s) will be permanently deleted.", + "message": "$COUNT$ אוספ(ים) יימחק(ו) לצמיתות.", "placeholders": { "count": { "content": "$1", @@ -1580,10 +1581,10 @@ } }, "deleteSelectedConfirmation": { - "message": "Are you sure you want to continue?" + "message": "האם אתה בטוח שברצונך להמשיך?" }, "moveSelectedItemsDesc": { - "message": "Choose a folder that you would like to add the $COUNT$ selected item(s) to.", + "message": "בחר תיקייה שאליה תרצה להוסיף את $COUNT$ הפריט(ים) שבחרת.", "placeholders": { "count": { "content": "$1", @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "קוד אימות (TOTP)" }, @@ -1615,139 +1599,139 @@ "message": "העתק קוד אימות" }, "copyUuid": { - "message": "Copy UUID" + "message": "העתק UUID" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "שגיאת רענון אסימון גישה" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "לא נמצאו אסימון רענון או מפתחות API. נא לנסות לצאת ולהיכנס חזרה." }, "warning": { "message": "אזהרה" }, "confirmVaultExport": { - "message": "Confirm vault export" + "message": "אשר ייצוא כספת" }, "confirmSecretsExport": { - "message": "Confirm secrets export" + "message": "אשר ייצוא סודות" }, "exportWarningDesc": { "message": "הקובץ מכיל את פרטי הכספת שלך בפורמט לא מוצפן. מומלץ להעביר את הקובץ רק בדרכים מוצפנות, ומאוד לא מומלץ לשמור או לשלוח את הקובץ הזה בדרכים לא מוצפנות (כדוגמת סתם אימייל). מחק את הקובץ מיד לאחר שסיימת את השימוש בו." }, "exportSecretsWarningDesc": { - "message": "This export contains your secrets data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + "message": "ייצוא זה מכיל את נתוני הכספת שלך בפורמט לא מוצפן. אתה לא אמור לאחסן או לשלוח את הקובץ המיוצא דרך ערוצים לא מאובטחים (כמו דוא\"ל). מחק אותו מיד לאחר שסיימת להשתמש בו." }, "encExportKeyWarningDesc": { - "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + "message": "ייצוא זה מצפין את הנתונים שלך באמצעות מפתח ההצפנה של חשבונך. אם אי פעם תבצע סיבוב למפתח ההצפנה של חשבונך, תצטרך לייצא שוב משום שלא תוכל לפענח קובץ ייצוא זה." }, "encExportAccountWarningDesc": { - "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + "message": "מפתחות הצפנת חשבון הם ייחודים לכל חשבון משתמש של Bitwarden, לכן אינך יכול לייבא ייצוא מוצפן אל תוך חשבון אחר." }, "export": { - "message": "Export" + "message": "ייצא" }, "exportFrom": { - "message": "Export from" + "message": "ייצא מ־" }, "exportVault": { - "message": "יצוא כספת" + "message": "ייצא כספת" }, "exportSecrets": { - "message": "Export secrets" + "message": "ייצא סודות" }, "fileFormat": { "message": "פורמט קובץ" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "קובץ ייצוא זה יהיה מוגן סיסמה ודורש את סיסמת הקובץ כדי לפענח." }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "סיסמה זו תשמש כדי לייצא ולייבא קובץ זה" }, "confirmMasterPassword": { - "message": "Confirm master password" + "message": "אמת סיסמה ראשית" }, "confirmFormat": { - "message": "Confirm format" + "message": "אשר פורמט" }, "filePassword": { - "message": "File password" + "message": "סיסמת קובץ" }, "confirmFilePassword": { - "message": "Confirm file password" + "message": "אשר סיסמת קובץ" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "השתמש במפתח הצפנת החשבון שלך, הנגזר משם המשתמש והסיסמה הראשית של חשבונך, כדי להצפין את הייצוא ולהגביל את הייבוא רק לחשבון Bitwarden הנוכחי." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "הגדר סיסמת קובץ כדי להצפין את הייצוא ולייבא אותו לכל חשבון Bitwarden באמצעות הסיסמה לפענוח." }, "exportTypeHeading": { - "message": "Export type" + "message": "סוג ייצוא" }, "accountRestricted": { - "message": "Account restricted" + "message": "מוגבל חשבון" }, "passwordProtected": { - "message": "Password protected" + "message": "מוגן סיסמה" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "\"סיסמת קובץ\" ו\"אשר סיסמת קובץ\" אינם תואמים." }, "confirmVaultImport": { - "message": "Confirm vault import" + "message": "אשר ייבוא כספת" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "קובץ זה מוגן סיסמה. נא להזין את סיסמת הקובץ כדי לייבא נתונים." }, "exportSuccess": { - "message": "הוצאת המידע מהכספת שלך הסתיימה." + "message": "נתוני הכספת יוצאו" }, "passwordGenerator": { - "message": "יוצר הסיסמאות" + "message": "מחולל הסיסמאות" }, "minComplexityScore": { - "message": "ניקוד מורכבות מינימלי" + "message": "ציון מורכבות מינימלי" }, "minNumbers": { - "message": "מינימום ספרות" + "message": "מינימום מספרים" }, "minSpecial": { - "message": "מינימום תווים מיוחדים", + "message": "מינימום מיוחדים", "description": "Minimum special characters" }, "ambiguous": { - "message": "המנע מאותיות ותווים דומים", + "message": "הימנע מתווים דו־משמעיים", "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "הימנע מתווים דו־משמעיים", "description": "Label for the avoid ambiguous characters checkbox." }, "length": { "message": "אורך" }, "passwordMinLength": { - "message": "Minimum password length" + "message": "אורך סיסמה מינימלי" }, "uppercase": { - "message": "Uppercase (A-Z)", + "message": "אותיות גדולות (A-Z)", "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)", + "message": "אותיות קטנות (a-z)", "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)", + "message": "מספרים (0-9)", "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "תווים מיוחדים (*&^%$#@!)" }, "numWords": { - "message": "מספר מילים" + "message": "מספר המילים" }, "wordSeparator": { "message": "מפריד מילים" @@ -1757,48 +1741,48 @@ "description": "Make the first letter of a word uppercase." }, "includeNumber": { - "message": "כלול מספרים" + "message": "כלול מספר" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "דרישות מדיניות ארגונית הוחלו על אפשרויות המחולל שלך.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { "message": "היסטוריית סיסמאות" }, "generatorHistory": { - "message": "Generator history" + "message": "היסטוריית מחולל" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "נקה היסטוריית מחולל" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "אם תמשיך, כל הרשומות יימחקו לצמיתות מהיסטוריית המחולל. האם אתה בטוח שברצונך להמשיך?" }, "noPasswordsInList": { "message": "אין סיסמאות להצגה ברשימה." }, "clearHistory": { - "message": "Clear history" + "message": "נקה היסטוריה" }, "nothingToShow": { - "message": "Nothing to show" + "message": "אין מה להראות" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "לא יצרת שום דבר לאחרונה" }, "clear": { "message": "נקה", "description": "To clear something out. Example: To clear browser history." }, "accountUpdated": { - "message": "החשבון עודכן" + "message": "החשבון נשמר" }, "changeEmail": { - "message": "החלף אימייל" + "message": "שנה דוא\"ל" }, "changeEmailTwoFactorWarning": { - "message": "Proceeding will change your account email address. It will not change the email address used for two-step login authentication. You can change this email address in the two-step login settings." + "message": "המשך התהליך ישנה את כתובת הדוא\"ל של החשבון שלך. זה לא ישנה את כתובת הדוא\"ל המשמשת עבור אימות כניסה דו־שלבית. אתה יכול לשנות את כתובת דוא\"ל זו בהגדרות הכניסה הדו־שלבית." }, "newEmail": { "message": "דוא\"ל חדש" @@ -1819,16 +1803,16 @@ "message": "בכדי להמשיך הסשן הנוכחי ינותק, ותדרש להזין את פרטי הכניסה החדשים. כל הסשנים הפעילים במכשירים אחרים ישארו פעילים עד שעה ממועד הכניסה החדשה." }, "emailChanged": { - "message": "כתובת האימייל שונתה" + "message": "דוא\"ל נשמר" }, "logBackIn": { "message": "אנא התחבר שוב." }, "currentSession": { - "message": "Current session" + "message": "הפעלה נוכחית" }, "requestPending": { - "message": "Request pending" + "message": "בקשה בהמתנה" }, "logBackInOthersToo": { "message": "אנא התחבר שוב. אם אתה משתמש באפליקציות נוספות של Bitwarden, סגור את החיבור והתחבר שוב גם באפליקציות הללו." @@ -1837,7 +1821,7 @@ "message": "החלף סיסמה ראשית" }, "masterPasswordChanged": { - "message": "הסיסמה הראשית הוחלפה" + "message": "הסיסמה הראשית נשמרה" }, "currentMasterPass": { "message": "סיסמה ראשית נוכחית" @@ -1855,7 +1839,7 @@ "message": "אלגוריתם KDF" }, "kdfIterations": { - "message": "איטרציות KDF" + "message": "חזרות KDF" }, "kdfIterationsDesc": { "message": "קביעת ערך גבוה עבור מספר האיטרציות של KDF עוזרת בהגנה על הסיסמה הראשית שלך מפני תקיפת Brute force (תְּקִיפָה כּוֹחָנִית). אנו ממליצים להשתמש בערך $VALUE$ או ערך גבוה יותר.", @@ -1867,7 +1851,7 @@ } }, "kdfIterationsWarning": { - "message": "קביעת ערך גבוה מדי עבור מספר האיטרציות KDF עלול לגרום לבעיות ביצועים בזמן הכניסה (ובזמן ביטול הנעילה) לחשבון Bitwarden במכשירים בעלי מעבד חלש. אנו ממליצים שתעלה את הערך בקפיצות של $INCREMENT$ ובדוק את ההשפעה של הביצועים בכל המכשירים שלך.", + "message": "הגדרת חזרות KDF שלך לערך גבוה מדי עלולה לגרום לביצועים ירודים בעת כניסה אל (וביטול נעילת) Bitwarden במכשירים איטיים או ישנים יותר. אנו ממליצים להגדיל את הערך במרווחים של $INCREMENT$ ואז לבדוק את כל המכשירים שלך.", "placeholders": { "increment": { "content": "$1", @@ -1876,62 +1860,62 @@ } }, "kdfMemory": { - "message": "KDF memory (MB)", + "message": "זיכרון KDF (ב־MB)", "description": "Memory refers to computer memory (RAM). MB is short for megabytes." }, "argon2Warning": { - "message": "Setting your KDF iterations, memory, and parallelism too high could result in poor performance when logging into (and unlocking) Bitwarden on slower or older devices. We recommend changing these individually in small increments and then test all of your devices." + "message": "הגדרת חזרות, זיכרון, ומקבילות ה־KDF שלך לערכים גבוהים מדי עלולה לגרום לביצועים ירודים בעת כניסה אל (וביטול נעילת) Bitwarden במכשירים איטיים או ישנים יותר. אנו ממליצים לשנות אותם באופן נפרד במרווחים קטנים ואז לבדוק את כל המכשירים שלך." }, "kdfParallelism": { - "message": "KDF parallelism" + "message": "מקבילות KDF" }, "argon2Desc": { - "message": "Higher KDF iterations, memory, and parallelism can help protect your master password from being brute forced by an attacker." + "message": "ערכי חזרות, זיכרון, ומקבילות KDF גבוהים יותר יכולים לעזור להגן על הסיסמה הראשית מפני תקיפה כוחנית על ידי תוקף." }, "changeKdf": { "message": "שנה KDF" }, "encKeySettingsChanged": { - "message": "הגדרות מפתח ההצפנה השתנו" + "message": "הגדרות מפתח ההצפנה נשמרו" }, "dangerZone": { - "message": "אזור מסוכן" + "message": "אזור סכנה" }, "deauthorizeSessions": { - "message": "בטל הרשאות סשנים" + "message": "בטל אישור הפעלות" }, "deauthorizeSessionsDesc": { "message": "מודאג אם השארת את החשבון שלך מחובר במכשיר אחר? המשך כאן להסרת ההרשאות של סשנים מכל המחשבים או המכשירים שהשתמשת בעבר. צעד אבטחה זה מומלץ אם השתמשת בעבר במחשב ציבורי או ששמרת את הסיסמה בטעות במכשיר שאינו שלך. כמו כן, צעד זה ינקה גם את כל הסיסמאות השמורות עבור סשנים שהשתמשו באימות דו-שלבי." }, "deauthorizeSessionsWarning": { - "message": "בכדי להמשיך הסשן הנוכחי ינותק, ותדרש להזין את פרטי הכניסה החדשים וגם את פרטי האימות הדו-שלבי, אם הוא מאופשר. כל הסשנים הפעילים במכשירים אחרים ישארו פעילים עד שעה ממועד הכניסה החדשה." + "message": "המשך התהליך יוציא אותך גם מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. אתה גם תתבקש לבצע כניסה דו־שלבית שוב, אם מוגדרת. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "כניסת מכשיר חדש" }, "turnOffNewDeviceLoginProtection": { - "message": "Turn off new device login protection" + "message": "כבה הגנת כניסת מכשיר חדש" }, "turnOnNewDeviceLoginProtection": { - "message": "Turn on new device login protection" + "message": "הפעל הגנת כניסת מכשיר חדש" }, "turnOffNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to turn off the verification emails bitwarden sends when you login from a new device." + "message": "המשך למטה כדי לכבות הודעות דוא\"ל של אימות ש־Bitwarden שולח כאשר אתה נכנס ממכשיר חדש." }, "turnOnNewDeviceLoginProtectionModalDesc": { - "message": "Proceed below to have bitwarden send you verification emails when you login from a new device." + "message": "המשך למטה כדי ש־Bitwarden ישלח לך הודעות דוא\"ל של אימות כאשר אתה נכנס ממכשיר חדש." }, "turnOffNewDeviceLoginProtectionWarning": { - "message": "With new device login protection turned off, anyone with your master password can access your account from any device. To protect your account without verification emails, set up two-step login." + "message": "עם הגנת כניסת מכשיר חדש כבויה, כל אחד עם הסיסמה הראשית שלך יכול לגשת למכשיר שלך מכל מכשיר. כדי להגן על חשבונך ללא הודעות דוא\"ל של אימות, הגדר כניסה דו־שלבית." }, "accountNewDeviceLoginProtectionSaved": { - "message": "New device login protection changes saved" + "message": "שינויי הגנת כניסת מכשיר חדש נשמרו" }, "sessionsDeauthorized": { - "message": "הוסרה ההרשאה מכל הסשנים" + "message": "כל אישורי ההפעלות בוטלו" }, "accountIsOwnedMessage": { - "message": "This account is owned by $ORGANIZATIONNAME$", + "message": "חשבון זה הוא בבעלות $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -1940,13 +1924,13 @@ } }, "purgeVault": { - "message": "מחק תוכן כספת" + "message": "טיהור כספת" }, "purgedOrganizationVault": { "message": "מחק תוכן כספת ארגונית." }, "vaultAccessedByProvider": { - "message": "Vault accessed by Provider." + "message": "בוצעה גישה לפריט על ידי ספק." }, "purgeVaultDesc": { "message": "המשך כאן בכדי למחוק את כל הפריטים והתיקיות שבכספת שלך. פריטים השייכים לארגון לא ימחקו." @@ -1958,13 +1942,13 @@ "message": "מחיקת תוכן הכספת היא סופית. פעולה זו היא בלתי הפיכה." }, "vaultPurged": { - "message": "המידע בכספת נמחק." + "message": "הכספת טוהרה." }, "deleteAccount": { "message": "מחק חשבון" }, "deleteAccountDesc": { - "message": "המשך כאן בכדי למחוק את החשבון שלך וכל המידע המשויך אליו." + "message": "המשך למטה כדי למחוק את החשבון שלך ואת כל נתוני הכספת." }, "deleteAccountWarning": { "message": "מחיקת החשבון היא פעולה בלתי הפיכה." @@ -1976,7 +1960,7 @@ "message": "חשבונך נסגר וכל המידע המשויך אליו נמחק." }, "deleteOrganizationWarning": { - "message": "Deleting your organization is permanent. It cannot be undone." + "message": "מחיקת הארגון שלך היא לצמיתות. לא ניתן לבטלה." }, "myAccount": { "message": "החשבון שלי" @@ -1988,36 +1972,36 @@ "message": "ייבא נתונים" }, "onboardingImportDataDetailsPartOne": { - "message": "If you don't have any data to import, you can create a ", + "message": "אם אין לך נתוני לייבא, אתה יכול ליצור ", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLink": { - "message": "new item", + "message": "פריט חדש", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsLoginLink": { - "message": "new login", + "message": "כניסה חדשה", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)" }, "onboardingImportDataDetailsPartTwoNoOrgs": { - "message": " instead.", + "message": " במקום.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead." }, "onboardingImportDataDetailsPartTwoWithOrgs": { - "message": " instead. You may need to wait until your administrator confirms your organization membership.", + "message": " במקום. ייתכן שתצטרך לחכות עד שהמנהל שלך יאשר את החברות בארגון שלך.", "description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. You may need to wait until your administrator confirms your organization membership." }, "importError": { - "message": "Import error" + "message": "שגיאת ייבוא" }, "importErrorDesc": { - "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + "message": "הייתה בעיה עם הנתונים שניסית לייבא. נא לפתור את השגיאות למטה בקובץ המקור שלך ולנסות שוב." }, "importSuccess": { - "message": "נתונים יובאו בהצלחה אל תוך הכספת שלך." + "message": "הנתונים יובאו בהצלחה" }, "importSuccessNumberOfItems": { - "message": "A total of $AMOUNT$ items were imported.", + "message": "בסך הכל יובאו $AMOUNT$ פריטים.", "placeholders": { "amount": { "content": "$1", @@ -2026,10 +2010,10 @@ } }, "dataExportSuccess": { - "message": "Data successfully exported" + "message": "הנתונים יוצאו בהצלחה" }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "אתה מייבא נתונים אל $ORGANIZATION$. ייתכן שהנתונים שלך ישותפו עם חברים של הארגון הזה. האם אתה רוצה להמשיך?", "placeholders": { "organization": { "content": "$1", @@ -2044,22 +2028,22 @@ "message": "לא יובא דבר." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "שגיאה בפענוח הקובץ המיוצא. מפתח ההצפנה שלך אינו תואם את מפתח ההצפנה המשמש לייצוא הנתונים." }, "destination": { - "message": "Destination" + "message": "יעד" }, "learnAboutImportOptions": { - "message": "Learn about your import options" + "message": "למד על אפשרויות הייבוא שלך" }, "selectImportFolder": { - "message": "Select a folder" + "message": "בחר תיקייה" }, "selectImportCollection": { - "message": "Select a collection" + "message": "בחר אוסף" }, "importTargetHint": { - "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "message": "בחר באפשרות זו אם ברצונך להעביר את תוכן הקובץ המיובא אל $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -2069,7 +2053,7 @@ } }, "importUnassignedItemsError": { - "message": "File contains unassigned items." + "message": "קובץ מכיל פריטים לא מוקצים." }, "selectFormat": { "message": "בחר את פורמט הקובץ לייבוא" @@ -2078,10 +2062,10 @@ "message": "בחר את הקובץ לייבוא" }, "chooseFile": { - "message": "Choose File" + "message": "בחר קובץ" }, "noFileChosen": { - "message": "No file chosen" + "message": "לא נבחר קובץ" }, "orCopyPasteFileContents": { "message": "או העתק\\הדבק את תוכן הקובץ ליבוא" @@ -2100,13 +2084,13 @@ "message": "אפשרויות" }, "preferences": { - "message": "Preferences" + "message": "העדפות" }, "preferencesDesc": { - "message": "Customize your web vault experience." + "message": "התאם אישית את חווית כספת הרשת שלך." }, "preferencesUpdated": { - "message": "Preferences saved" + "message": "העדפות נשמרו" }, "language": { "message": "שפה" @@ -2115,10 +2099,10 @@ "message": "שנה את השפה של כספת הרשת." }, "enableFavicon": { - "message": "Show website icons" + "message": "הצג סמלי אתר אינטרנט" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "הצג תמונה מוכרת ליד כל כניסה." }, "default": { "message": "ברירת מחדל" @@ -2130,10 +2114,10 @@ "message": "אם אתה משתמש באותם פרטי כניסה עבור אתרים שונים באותו דומיין, באפשרות לסמן את האתר כ\"שווה\". הערכים הרגילים שנוצרים על ידי Bitwarden מסומנים כדומיין \"גלובלי\"." }, "globalEqDomains": { - "message": "דומיינים גלובליים שווים" + "message": "דומיינים שקולים גלובליים" }, "customEqDomains": { - "message": "דומיינים שווים מותאמים אישית" + "message": "דומיינים שקולים מותאמים אישית" }, "exclude": { "message": "אל תכלול" @@ -2160,41 +2144,41 @@ } }, "domainsUpdated": { - "message": "הדומיינים עודכנו" + "message": "הדומיינים נשמרו" }, "twoStepLogin": { - "message": "התחברות בשני-שלבים" + "message": "כניסה דו־שלבית" }, "twoStepLoginEnforcement": { - "message": "Two-step Login Enforcement" + "message": "אכיפת כניסה דו־שלבית" }, "twoStepLoginDesc": { "message": "שפר את אבטחת החשבון שלך על ידי דרישת צעד נוסף עבור כל נסיון חיבור." }, "twoStepLoginTeamsDesc": { - "message": "Enable two-step login for your organization." + "message": "אפשר כניסה דו־שלבית עבור הארגון שלך." }, "twoStepLoginEnterpriseDescStart": { - "message": "Enforce Bitwarden Two-step Login options for members by using the ", + "message": "אכוף אפשרויות כניסה דו־שלבית של Bitwarden עבור חברים על ידי שימוש ב", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Enforce Bitwarden Two-step Login options for members by using the Two-step Login Policy.'" }, "twoStepLoginPolicy": { - "message": "Two-step Login Policy" + "message": "מדיניות כניסה דו־שלבית" }, "twoStepLoginOrganizationDuoDesc": { - "message": "To enforce Two-step Login through Duo, use the options below." + "message": "כדי לאכוף כניסה דו־שלבית דרך Duo, השתמש באפשרויות למטה." }, "twoStepLoginOrganizationSsoDesc": { - "message": "If you have setup SSO or plan to, Two-step Login may already be enforced through your Identity Provider." + "message": "אם הגדרת SSO או מתכוון לעשות כן, ייתכן שכניסה דו־שלבית כבר נאכפת דרך ספק הזהות שלך." }, "twoStepLoginRecoveryWarning": { - "message": "שים לב: שימוש לא נכון בכניסה דו-שלבית עשוי לגרום לך להנעל ללא גישה לחשבון Bitwarden שלך. מומלץ לשמור קוד שחזור לגישה לחשבון שלך למקרה שלא תוכל להשתמש בספק הכניסה הדו-שלבית (לדוגמא: איבדת את הפלאפון או את מפתח החומרה שלך). גם צוות התמיכה של Bitwarden לא יוכל לעזור לך במקרה שתאבד גישה לחשבון שלך. אנו ממליצים שתכתוב או תדפיס את קודי השחזור ותשמור אותם במקום בטוח." + "message": "הגדרת כניסה דו־שלבית יכולה לנעול אותך לצמיתות מחוץ לחשבון Bitwarden שלך. קוד שחזור מאפשר לך לגשת לחשבון שלך במקרה שאתה לא יכול להשתמש בספק הכניסה הד־שלבית הרגיל שלך (דוגמה: איבדת את המכשיר שלך). התמיכה של Bitwarden לא תוכל לסייע לך אם תאבד גישה לחשבון שלך. אנו ממליצים שתכתוב או תדפיס את קוד השחזור ותשמור אותו במקום בטוח." }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "ניתן להשתמש בקוד השחזור החד־פעמי שלך כדי לכבות כניסה דו־שלבית במקרה שאתה מאבד גישה לספק הכניסה הדו־שלבית שלך. Bitwarden ממליץ לך לרשום את קוד השחזור ולשמור אותו במקום בטוח." }, "viewRecoveryCode": { - "message": "צפה בקוד שחזור" + "message": "הצג קוד שחזור" }, "providers": { "message": "ספקים", @@ -2207,71 +2191,74 @@ "message": "מופעל" }, "restoreAccess": { - "message": "Restore access" + "message": "שחזר גישה" }, "premium": { "message": "פרימיום", "description": "Premium membership" }, "premiumMembership": { - "message": "חשבון פרימיום" + "message": "חברות פרימיום" }, "premiumRequired": { - "message": "נדרש חשבון פרימיום" + "message": "נדרש פרימיום" }, "premiumRequiredDesc": { - "message": "בכדי להשתמש ביכולת זו יש צורך בחשבון פרמיום." + "message": "נדרשת חברות פרימיום כדי להשתמש בתכונה זו." }, "youHavePremiumAccess": { "message": "יש לך גישת פרימיום" }, "alreadyPremiumFromOrg": { - "message": "לארגון שאתה חבר בו, כבר יש גישת פרימיום, ולכן יש לך גישה ליכולות פרמיום." + "message": "כבר יש לך גישה ליכולות פרימיום בזכות ארגון שאתה חבר בו." }, "manage": { "message": "נהל" }, "manageCollection": { - "message": "Manage collection" + "message": "ניהול אוסף" }, "viewItems": { - "message": "View items" + "message": "הצג פריטים" }, "viewItemsHidePass": { - "message": "View items, hidden passwords" + "message": "הצג פריטים, סיסמאות מוסתרות" }, "editItems": { - "message": "Edit items" + "message": "ערוך פריטים" }, "editItemsHidePass": { - "message": "Edit items, hidden passwords" + "message": "ערוך פריטים, סיסמאות מוסתרות" }, "disable": { - "message": "בטל" + "message": "כבה" }, "revokeAccess": { - "message": "Revoke access" + "message": "בטל גישה" + }, + "revoke": { + "message": "בטל" }, "twoStepLoginProviderEnabled": { - "message": "ספק כניסה דו-שלבית זה נתמך בחשבון שלך." + "message": "ספק כניסה דו־שלבית זה פעיל בחשבון שלך." }, "twoStepLoginAuthDesc": { "message": "הזן את הסיסמה הראשית שלך בכדי לשנות הגדרות הנוגעות לכניסה דו-שלבית." }, "twoStepAuthenticatorInstructionPrefix": { - "message": "Download an authenticator app such as" + "message": "הורד יישום מאמת כגון" }, "twoStepAuthenticatorInstructionInfix1": { "message": "," }, "twoStepAuthenticatorInstructionInfix2": { - "message": "or" + "message": "או" }, "twoStepAuthenticatorInstructionSuffix": { "message": "." }, "continueToExternalUrlTitle": { - "message": "Continue to $URL$?", + "message": "להמשיך אל $URL$?", "placeholders": { "url": { "content": "$1", @@ -2280,34 +2267,34 @@ } }, "continueToExternalUrlDesc": { - "message": "You are leaving Bitwarden and launching an external website in a new window." + "message": "אתה עוזב את Bitwarden ופותח אתר אינטרנט חיצוני בחלון חדש." }, "twoStepContinueToBitwardenUrlTitle": { - "message": "Continue to bitwarden.com?" + "message": "להמשיך אל bitwarden.com?" }, "twoStepContinueToBitwardenUrlDesc": { - "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website." + "message": "מאמת Bitwarden מאפשר לך לאחסן מפתחות מאמת וליצור קודי TOTP עבור זרימת אימות דו־שלבית. למד עוד באתר האינטרנט bitwarden.com." }, "twoStepAuthenticatorScanCodeV2": { - "message": "Scan the QR code below with your authenticator app or enter the key." + "message": "סרוק את קוד ה־QR למטה עם יישום המאמת שלך או הזן את המפתח." }, "twoStepAuthenticatorQRCanvasError": { - "message": "Could not load QR code. Try again or use the key below." + "message": "לא היה ניתן לטעון קוד QR. נסה שוב או השתמש במפתח למטה." }, "key": { "message": "מפתח" }, "twoStepAuthenticatorEnterCodeV2": { - "message": "Verification code" + "message": "קוד אימות" }, "twoStepAuthenticatorReaddDesc": { "message": "במקרה שאתה צריך את אפשרות הכניסה זמינה גם במכשיר אחר, כאן ניתן למצוא את קוד הQR (או המפתח) הנחוץ לאפליקציית האימות במכשיר הנוסף." }, "twoStepDisableDesc": { - "message": "האם אתה בטוח שברצונך לבטל את הספק הזה עבור הכניסה הדו-שלבית?" + "message": "האם אתה בטוח שברצונך לכבות ספק כניסה דו־שלבית זה?" }, "twoStepDisabled": { - "message": "ספק עבור כניסה דו-שלבית מבוטל." + "message": "ספק כניסה דו־שלבית כבוי." }, "twoFactorYubikeyAdd": { "message": "הוסף מפתח YubiKey לחשבונך" @@ -2325,7 +2312,7 @@ "message": "שמור את הטופס." }, "twoFactorYubikeyWarning": { - "message": "עקב מגבלות פלטפורמה, לא ניתן להשתמש בYubiKey בכל האפליקציות של Bitwarden. עליך לאפשר ספק כניסה דו-שלבית נוסף למקרה שבו הYubiKey שלך לא זמין. פלטפורמות נתמכות:" + "message": "עקב מגבלות פלטפורמה, לא ניתן להשתמש במפתחות YubiKey בכל היישומים של Bitwarden. עליך להגדיר ספק כניסה דו־שלבית אחר כך שתוכל לגשת לחשבון שלך כאשר לא ניתן להשתמש במפתחות YubiKey. פלטפורמות נתמכות:" }, "twoFactorYubikeySupportUsb": { "message": "כספת רשת, אפליקציית שולחן עבודה, שורת הפקודה, וכל התוספים לדפדפן על מכשיר עם חיבור USB עבור הYubiKey שלך." @@ -2352,7 +2339,7 @@ } }, "webAuthnkeyX": { - "message": "WebAuthn Key $INDEX$", + "message": "מפתח WebAuthn $INDEX$", "placeholders": { "index": { "content": "$1", @@ -2373,19 +2360,19 @@ "message": "מפתחות YubiKey עודכנו" }, "disableAllKeys": { - "message": "בטל את כל המפתחות" + "message": "השבת את כל המפתחות" }, "twoFactorDuoDesc": { "message": "הזן את פרטי אפליקציית Bitwarden מתוך עמוד הניהול של Duo." }, "twoFactorDuoClientId": { - "message": "Client Id" + "message": "מזהה משתמש" }, "twoFactorDuoClientSecret": { - "message": "Client Secret" + "message": "סוד לקוח" }, "twoFactorDuoApiHostname": { - "message": "שם שרת הAPI" + "message": "שם מארח API" }, "twoFactorEmailDesc": { "message": "עקוב אחר הצעדים הבאים להגדרת כניסה דו-שלבית עם אימייל:" @@ -2406,7 +2393,7 @@ "message": "האם אתה בטוח שברצונך למחוק מפתח אבטחה זה?" }, "twoFactorWebAuthnAdd": { - "message": "Add a WebAuthn security key to your account" + "message": "הוסף מפתח אבטחה מסוג WebAuthn לחשבון שלך" }, "readKey": { "message": "קרא מפתח" @@ -2427,28 +2414,28 @@ "message": "שמור את הטופס." }, "twoFactorU2fWarning": { - "message": "עקב מגבלות פלטפורמה, לא ניתן להשתמש בFIDO U2F בכל האפליקציות של Bitwarden. עליך לאפשר ספק כניסה דו-שלבית נוסף למקרה שבו הFIDO U2F שלך לא זמין. פלטפורמות נתמכות:" + "message": "עקב מגבלות פלטפורמה, לא ניתן להשתמש ב־FIDO U2F בכל היישומים של Bitwarden. עליך להגדיר ספק כניסה דו־שלבית אחר כך שתוכל לגשת לחשבון שלך כאשר לא ניתן להשתמש ב־FIDO U2F. פלטפורמות נתמכות:" }, "twoFactorU2fSupportWeb": { - "message": "כספת ברשת ותוספי אבטחה למחשב נייח\\נייד עם דפדפן תומך בU2F (כרום, אופרה, Vivaldi, או פיירפוקס עם תמיכה בFIDO U2F)." + "message": "כספת רשת והרחבות דפדפן במחשב נייח/נייד עם דפדפן התומך ב־U2F (Vivaldi, Opera, Chrome או Firefox עם FIDO U2F מופעל)." }, "twoFactorU2fWaiting": { "message": "ממתין ללחיצה על כפתור במפתח האבטחה שלך" }, "twoFactorU2fClickSave": { - "message": "לחץ על כפתור \"שמירה\" בכדי לאפשר כניסה דו-שלבית בעזרת מפתח אבטחה זה." + "message": "לחץ על הלחצן \"שמור\" למטה כדי להפעיל את מפתח האבטחה הזה עבור כניסה דו־שלבית." }, "twoFactorU2fProblemReadingTryAgain": { "message": "היתה בעיה בקריאת מפתח האבטחה. נסה בשנית." }, "twoFactorWebAuthnWarning1": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." + "message": "עקב מגבלות פלטפורמה, לא ניתן להשתמש ב־WebAuthn בכל היישומים של Bitwarden. עליך להגדיר ספק כניסה דו־שלבית אחר כך שתוכל לגשת לחשבון שלך כאשר לא ניתן להשתמש ב־WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "קוד השחזור שלך עבור כניסה דו שלבית לBitwarden" }, "twoFactorRecoveryNoCode": { - "message": "עדיין לא הוספת אף ספק לכניסה דו-שלבית. לאחר שתאפשר כניסה באמצעות ספק עם כניסה דו שלבית תוכל לבדוק כאן שוב ולראות את קוד השחזור שלך." + "message": "עדיין לא הגדרת אף ספק כניסה דו־שלבית. לאחר שתגדיר ספק כניסה דו־שלבית, תוכל לבדוק שוב כאן עבור קוד השחזור שלך." }, "printCode": { "message": "הדפס קוד", @@ -2458,24 +2445,24 @@ "message": "דוחות" }, "reportsDesc": { - "message": "Identify and close security gaps in your online accounts by clicking the reports below.", + "message": "זהה וסגור פערי אבטחה בחשבונות המקוונים שלך על ידי לחיצה על הדוחות למטה.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "orgsReportsDesc": { - "message": "Identify and close security gaps in your organization's accounts by clicking the reports below.", + "message": "זהה וסגור פערי אבטחה בחשבונות של הארגון שלך על ידי לחיצה על הדוחות למטה.", "description": "Vault health reports can be used to evaluate the security of your Bitwarden individual or organization vault." }, "unsecuredWebsitesReport": { - "message": "דוח אתרים לא מאובטחים" + "message": "אתרים לא מאובטחים" }, "unsecuredWebsitesReportDesc": { - "message": "שימוש באתרים לא מאובטחים שמתחילים בקידומת http:// יכול להיות מסוכן. אם האתר מאפשר זאת, תמיד נסה להשתמש בקידומת https:// כך שהחיבור יהיה מוצפן." + "message": "כתובות URL שמתחילות עם //:http אינן משתמשות בהצפנה הטובה ביותר שזמינה. שנה את הכתובות URI של הכניסות עבור החשבונות האלה כך שיתחילו עם //:https בשביל גלישה בטוחה יותר." }, "unsecuredWebsitesFound": { "message": "נמצאו אתרים לא מאובטחים" }, "unsecuredWebsitesFoundReportDesc": { - "message": "We found $COUNT$ items in your $VAULT$ with unsecured URIs. You should change their URI scheme to https:// if the website allows it.", + "message": "מצאנו $COUNT$ פריטים בכספת שלך עם כתובות URI לא מאובטחות. עליך לשנות את סכמת ה־URI שלהם ל־//:https אם האתר מאפשר זאת.", "placeholders": { "count": { "content": "$1", @@ -2491,16 +2478,16 @@ "message": "לא נמצאו פריטים בכספת המכילים כתובות לא מאובטחות." }, "inactive2faReport": { - "message": "דוח 2FA לא פעילים" + "message": "כניסה דו־שלבית לא פעילה" }, "inactive2faReportDesc": { - "message": "אימות דו-שלבי (2FA) היא הגדרת אבטחה חשובה שעוזרת לאבטח את החשבון שלך. אם האתר מאפשר זאת, מומלץ לאפשר את האימות הדו-שלבי." + "message": "כניסה דו-שלבית מוסיפה שכבת הגנה לחשבונות שלך. הגדר כניסה דו־שלבית באמצעות המאמת של Bitwarden עבור החשבונות האלה או השתמש בשיטה חלופית." }, "inactive2faFound": { - "message": "נמצאו פרטי כניסות שלא פעילה בהן אופציית 2FA" + "message": "נמצאו כניסות ללא כניסה דו־שלבית" }, "inactive2faFoundReportDesc": { - "message": "We found $COUNT$ website(s) in your $VAULT$ that may not be configured with two-step login (according to 2fa.directory). To further protect these accounts, you should set up two-step login.", + "message": "מצאנו $COUNT$ אתרים בכספת שלך שייתכן שלא הוגדרו עם כניסה דו־שלבית (על פי 2fa.directory). כדי להגן עוד יותר על החשבונות הללו, עליך להגדיר כניסה דו־שלבית.", "placeholders": { "count": { "content": "$1", @@ -2513,22 +2500,22 @@ } }, "noInactive2fa": { - "message": "לא נמצאו אתרים ללא אימות דו-שלבי בכספת שלך." + "message": "לא נמצאו אתרים בכספת שלך עם תצורת כניסה דו־שלבית חסרה." }, "instructions": { "message": "הוראות" }, "exposedPasswordsReport": { - "message": "דו\"ח סיסמאות שנחשפו" + "message": "סיסמאות חשופות" }, "exposedPasswordsReportDesc": { - "message": "Passwords exposed in a data breach are easy targets for attackers. Change these passwords to prevent potential break-ins." + "message": "סיסמאות חשופות בפרצת נתונים הן מטרות קלות עבור תוקפים. שנה סיסמאות אלה כדי למנוע פריצות פוטנציאליות." }, "exposedPasswordsFound": { - "message": "נמצאו סיסמאות שנחשפו" + "message": "נמצאו סיסמאות חשופות" }, "exposedPasswordsFoundReportDesc": { - "message": "We found $COUNT$ items in your $VAULT$ that have passwords that were exposed in known data breaches. You should change them to use a new password.", + "message": "מצאנו $COUNT$ פריטים בכספת שלך שיש להם סיסמאות שנחשפו בפרצות נתונים ידועות. עליך לשנות אותם כך שישתמשו בסיסמה חדשה.", "placeholders": { "count": { "content": "$1", @@ -2544,10 +2531,10 @@ "message": "לא נמצאו פריטים בכספת שלך שנחשפו בפריצות ידועות." }, "checkExposedPasswords": { - "message": "בדוק אם קיימות סיסמאות שנפרצו" + "message": "בדוק סיסמאות חשופות" }, "timesExposed": { - "message": "Times exposed" + "message": "פעמים נחשפו" }, "exposedXTimes": { "message": "נחשף $COUNT$ פעמים", @@ -2559,16 +2546,16 @@ } }, "weakPasswordsReport": { - "message": "דו\"ח סיסמאות חלשות" + "message": "סיסמאות חלשות" }, "weakPasswordsReportDesc": { - "message": "סיסמאות חלשות קלות לניחוש על ידי האקרים וכלים אוטומטיים לפריצת סיסמאות. מחולל הסיסמאות של Bitwarden יכול לעזור לך ליצור סיסמאות חזקות." + "message": "תוקפים יכולים לנחש סיסמאות חלשות בקלות. שנה את הסיסמאות הללו לסיסמאות חזקות באמצעות מחולל הסיסמאות." }, "weakPasswordsFound": { "message": "נמצאו סיסמאות חלשות" }, "weakPasswordsFoundReportDesc": { - "message": "We found $COUNT$ items in your $VAULT$ with passwords that are not strong. You should update them to use stronger passwords.", + "message": "מצאנו $COUNT$ פריטים בכספת שלך עם סיסמאות לא חזקות. עליך לעדכן אותם כך שישתמשו בסיסמאות חזקות יותר.", "placeholders": { "count": { "content": "$1", @@ -2584,19 +2571,19 @@ "message": "אין פריטים בכספת שלך עם סיסמאות חלשות." }, "weakness": { - "message": "Weakness" + "message": "חולשה" }, "reusedPasswordsReport": { - "message": "דו\"ח סיסמאות משומשות" + "message": "סיסמאות בשימוש חוזר" }, "reusedPasswordsReportDesc": { - "message": "אם שירות שהשתמשת בו נפרץ, שימוש באותה הסיסמה במקום אחר מאפשר להאקרים לקבל גישה לחשבונות נוספים שלך בקלות רבה. מומלץ מאוד להשתמש בסיסמה יחודית עבור כל חשבון או שירות." + "message": "שימוש חוזר של סיסמאות מקל על תוקפים לפרוץ לחשבונות מרובים. שנה את הסיסמאות הללו כך שכל אחת תהיה ייחודית." }, "reusedPasswordsFound": { - "message": "נמצאו סיסמאות משומשות" + "message": "נמצאו סיסמאות בשימוש חוזר" }, "reusedPasswordsFoundReportDesc": { - "message": "We found $COUNT$ passwords that are being reused in your $VAULT$. You should change them to a unique value.", + "message": "מצאנו $COUNT$ סיסמאות שנמצאות בשימוש חוזר בכספת שלך. עליך לשנות אותם לערך ייחודי.", "placeholders": { "count": { "content": "$1", @@ -2612,7 +2599,7 @@ "message": "אין פרטי התחברות בכספת שלך עם סיסמאות משומשות." }, "timesReused": { - "message": "Times reused" + "message": "פעמים בשימוש חוזר" }, "reusedXTimes": { "message": "היה בשימוש $COUNT$ פעמים", @@ -2624,16 +2611,16 @@ } }, "dataBreachReport": { - "message": "דו\"ח פריצת אבטחה" + "message": "פרצת נתונים" }, "breachDesc": { - "message": "אירוע \"דליפה\" הוא תקרית שבה המידע של האתר היה נגיש בצורה לא חוקית להאקרים והם הפיצו אותו באופן פומבי. עבור על המידע שנחשף (כתובות אימייל, סיסמאות, כרטיסי אשראי וכו') ובצע את הפעולות הנחוצות, לדוגמא - לשנות את הסיסמאות שפורסמו." + "message": "חשבונות שנפרצו יכולים לחשוף את המידע האישי שלך. אבטח חשבונות שנפרצו על ידי הפעלת אימות דו־גורמי (2FA) או יצירת סיסמה חזקה יותר." }, "breachCheckUsernameEmail": { "message": "בדוק את כל שמות המשתמשים או כתובות המייל שאתה משתמש בהם." }, "checkBreaches": { - "message": "בדוק פריצות אבטחה" + "message": "בדוק פרצות" }, "breachUsernameNotFound": { "message": "שם המשתמש $USERNAME$ לא נמצא בפריצות אבטחה ידועות.", @@ -2662,7 +2649,7 @@ } }, "breachFound": { - "message": "נמצאו חשבונות שדלפו" + "message": "נמצאו חשבונות שנפרצו" }, "compromisedData": { "message": "מידע שנחשף" @@ -2674,10 +2661,10 @@ "message": "משתמשים שהושפעו" }, "breachOccurred": { - "message": "פריצת אבטחה אירעה" + "message": "אירעה פרצה" }, "breachReported": { - "message": "פריצת אבטחה דווחה" + "message": "דווחה פרצה" }, "reportError": { "message": "אירעה שגיאה בטעינת הדו\"ח. נסה שוב" @@ -2686,21 +2673,21 @@ "message": "חיוב" }, "billingPlanLabel": { - "message": "Billing plan" + "message": "תוכנית חיוב" }, "paymentType": { - "message": "Payment type" + "message": "סוג תשלום" }, "accountCredit": { - "message": "מאזן החשבון", + "message": "אשראי חשבון", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "accountBalance": { - "message": "יתרת חשבון", + "message": "מאזן חשבון", "description": "Financial term. In the case of Bitwarden, a positive balance means that you owe money, while a negative balance means that you have a credit (Bitwarden owes you money)." }, "addCredit": { - "message": "הוסף קרדיט", + "message": "הוסף אשראי", "description": "Add more credit to your account's balance." }, "amount": { @@ -2724,16 +2711,16 @@ "message": "שדרגת לפרימיום." }, "premiumUpgradeUnlockFeatures": { - "message": "שדרג את חשבונך לפרמיום כדי להשתמש ביכולות נהדרות נוספות." + "message": "שדרג את חשבונך לחברות פרמיום ופתח כמה תכונות נוספות נהדרות." }, "premiumSignUpStorage": { "message": "1 ג'יגה של מקום אחסון מוצפן עבור קבצים מצורפים." }, "premiumSignUpTwoStepOptions": { - "message": "Proprietary two-step login options such as YubiKey and Duo." + "message": "אפשרויות כניסה דו־שלבית קנייניות כגון YubiKey ו־Duo." }, "premiumSignUpEmergency": { - "message": "Emergency access" + "message": "גישת חירום" }, "premiumSignUpReports": { "message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה." @@ -2745,7 +2732,7 @@ "message": "קדימות בתמיכה הטכנית." }, "premiumSignUpFuture": { - "message": "כל יכולות הפרימיום העתידיות שנפתח. עוד יכולות מגיעות בקרוב!" + "message": "כל תכונות הפרימיום העתידיות. עוד מגיעות בקרוב!" }, "premiumPrice": { "message": "הכל רק ב-$PRICE$ לשנה!", @@ -2757,7 +2744,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "Go premium for just $PRICE$ /year, or get premium accounts for $FAMILYPLANUSERCOUNT$ users and unlimited family sharing with a ", + "message": "עבור לפרימיום תמורת $PRICE$ /שנה בלבד, או קבל חשבונות פרימיום ל־$FAMILYPLANUSERCOUNT$ משתמשים ושיתוף משפחתי בלתי מוגבל עם ", "placeholders": { "price": { "content": "$1", @@ -2770,7 +2757,7 @@ } }, "bitwardenFamiliesPlan": { - "message": "Bitwarden Families plan." + "message": "תוכנית Bitwarden למשפחות." }, "addons": { "message": "תוספים" @@ -2779,7 +2766,7 @@ "message": "גישת פרימיום" }, "premiumAccessDesc": { - "message": "ניתן להוסיף גישת פרימיום לכל חברי הארגון שלך ב-$PRICE$ ל$INTERVAL$.", + "message": "אתה יכול להוסיף גישת פרימיום לכל חברי הארגון שלך עבור $PRICE$ /$INTERVAL$.", "placeholders": { "price": { "content": "$1", @@ -2792,7 +2779,7 @@ } }, "additionalStorageGb": { - "message": "מקום אחסון נוסף (בג'יגה)" + "message": "אחסון נוסף (GB)" }, "additionalStorageGbDesc": { "message": "# של ג'יגה בייט נוספים" @@ -2824,7 +2811,7 @@ "message": "שנה" }, "yr": { - "message": "yr" + "message": "שנה" }, "month": { "message": "חודש" @@ -2846,43 +2833,43 @@ } }, "paymentChargedWithUnpaidSubscription": { - "message": "Your payment method will be charged for any unpaid subscriptions." + "message": "שיטת התשלום שלך תחויב עבור כל מנוי שלא שולם." }, "paymentChargedWithTrial": { - "message": "התוכנית שבחרת מגיעה עם 7 ימי נסיון חינמי. שיטת התשלום שבחרת לא תחויב עד לתום תקופת הנסיון. ביצוע החשבון יתבצע על בסיס מתחדש בכל $INTERVAL$. באפשרותך לבטל בכל עת." + "message": "התוכנית שלך מגיעה עם 7 ימי ניסיון בחינם. שיטת התשלום שלך לא תחויב עד שהניסיון יסתיים. אתה רשאי לבטל בכל עת." }, "paymentInformation": { "message": "פרטי תשלום" }, "billingInformation": { - "message": "Billing information" + "message": "פרטי חיוב" }, "billingTrialSubLabel": { - "message": "Your payment method will not be charged during the 7 day free trial." + "message": "שיטת התשלום שלך לא תחויב במהלך 7 ימי הניסיון בחינם." }, "creditCard": { "message": "כרטיס אשראי" }, "paypalClickSubmit": { - "message": "לחץ על כפתור PayPal בכדי להכנס לחשבון PayPal שלך, ואז לחץ על כפתור התשלום כדי להמשיך." + "message": "בחר את הלחצן PayPal כדי להיכנס לחשבון PayPal שלך, ואז לחץ על הלחצן 'שלח' למטה כדי להמשיך." }, "cancelSubscription": { "message": "בטל מנוי" }, "subscriptionExpiration": { - "message": "Subscription expiration" + "message": "תפוגת מנוי" }, "subscriptionCanceled": { "message": "המנוי בוטל." }, "pendingCancellation": { - "message": "בקשת ביטול ממתינה" + "message": "ממתין לביטול" }, "subscriptionPendingCanceled": { "message": "המנוי סומן כמיועד לביטול בסיום תקופת החיוב הנוכחית." }, "reinstateSubscription": { - "message": "הפעל מחדש את המנוי" + "message": "החזר מנוי" }, "reinstateConfirmation": { "message": "האם אתה בטוח שברצונך להסיר את בקשת הביטול הממתינה ולהפעיל מחדש את חשבונך?" @@ -2894,10 +2881,10 @@ "message": "האם אתה בטוח שברצונך לבטל? ביטול המנוי יגרום לאיבוד כל האפשרויות השמורות למנויים בסיום מחזור החיוב הנוכחי." }, "canceledSubscription": { - "message": "המנוי בוטל." + "message": "המנוי בוטל" }, "neverExpires": { - "message": "ללא תאריך תפוגה" + "message": "לא פג תוקף לעולם" }, "status": { "message": "סטטוס" @@ -2912,16 +2899,16 @@ "message": "הורד רישיון" }, "viewBillingToken": { - "message": "View Billing Token" + "message": "הצג אסימון חיוב" }, "updateLicense": { "message": "עדכן רישיון" }, "manageSubscription": { - "message": "ניהול מנוי" + "message": "נהל מנוי" }, "launchCloudSubscription": { - "message": "Launch Cloud Subscription" + "message": "הפעל מנוי ענן" }, "storage": { "message": "אחסון" @@ -2961,10 +2948,10 @@ "message": "חשבוניות" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "אין חשבוניות לא משולמות." }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "אין חשבוניות משולמות." }, "paid": { "message": "שולם", @@ -3020,10 +3007,10 @@ } }, "contactSupport": { - "message": "צור קשר עם התמיכה" + "message": "צור קשר עם תמיכת הלקוחות" }, "contactSupportShort": { - "message": "Contact Support" + "message": "פנה לתמיכה" }, "updatedPaymentMethod": { "message": "שיטת תשלום עודכנה." @@ -3044,7 +3031,7 @@ } }, "uploadLicenseFilePremium": { - "message": "כדי לשדרג את החשבון שלך לפרמיום עליך להעלות קובץ רשיון תקין." + "message": "כדי לשדרג את החשבון שלך לחברות פרימיום, אתה צריך להעלות קובץ רישיון חוקי." }, "uploadLicenseFileOrg": { "message": "ליצירת שרת on-premises בארגון לך עליך להעלות קובץ רשיון תקין." @@ -3065,7 +3052,7 @@ "message": "החשבון הזה נמצא בבעלות עסק." }, "billingEmail": { - "message": "מייל לחשבוניות" + "message": "דוא\"ל לחיוב" }, "businessName": { "message": "שם העסק" @@ -3077,10 +3064,10 @@ "message": "משתמשים" }, "userSeats": { - "message": "כסאות משתמשים" + "message": "מקומות למשתמשים" }, "additionalUserSeats": { - "message": "כסאות משתמשים נוספים" + "message": "מקומות למשתמשים נוספים" }, "userSeatsDesc": { "message": "כמות כסאות משתמשים" @@ -3127,7 +3114,7 @@ "message": "לעסקים וקבוצות ארגוניות." }, "planNameTeamsStarter": { - "message": "Teams Starter" + "message": "צוותים מתחילים" }, "planNameEnterprise": { "message": "ארגון" @@ -3190,7 +3177,7 @@ "message": "הוסף ושתף עם כמות בלתי מוגבלת של משתמשים" }, "createUnlimitedCollections": { - "message": "צור מספר בלתי מוגבל של אוספים" + "message": "צור אוספים ללא הגבלה" }, "gbEncryptedFileStorage": { "message": "גודל קובץ מוצפן: $SIZE$", @@ -3202,16 +3189,16 @@ } }, "onPremHostingOptional": { - "message": "אחסון שרת מקומי (אופציונאלי)" + "message": "אירוח מקומי (אופציונלי)" }, "usersGetPremium": { - "message": "המשתמשים יקבלו גישה ליכולות פרימיום" + "message": "המשתמשים יקבלו גישה לתכונות פרימיום" }, "controlAccessWithGroups": { "message": "שלוט על גישת משתמשים בעזרת קבוצות" }, "syncUsersFromDirectory": { - "message": "סנכרן את המשתמשים והקבוצות עם Active Directory" + "message": "סנכרן את המשתמשים והקבוצות שלך מתוך ספריה" }, "trackAuditLogs": { "message": "עקוב אחר פעולות המשתמשים בעזרת יומן ביקורת" @@ -3232,7 +3219,7 @@ } }, "trialThankYou": { - "message": "Thanks for signing up for Bitwarden for $PLAN$!", + "message": "תודה שנרשמת ל־Bitwarden עבור $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -3241,7 +3228,7 @@ } }, "trialSecretsManagerThankYou": { - "message": "Thanks for signing up for Bitwarden Secrets Manager for $PLAN$!", + "message": "תודה שנרשמת למנהל הסודות של Bitwarden עבור $PLAN$!", "placeholders": { "plan": { "content": "$1", @@ -3250,7 +3237,7 @@ } }, "trialPaidInfoMessage": { - "message": "Your $PLAN$ 7 day free trial will be converted to a paid subscription after 7 days.", + "message": "7 ימי הניסיון בחינם של ה־$PLAN$ שלך יומרו למנוי בתשלום לאחר 7 ימים.", "placeholders": { "plan": { "content": "$1", @@ -3259,7 +3246,7 @@ } }, "trialConfirmationEmail": { - "message": "We've sent a confirmation email to your team's billing email at " + "message": "שלחנו דוא\"ל אימות לדוא\"ל החיוב של הצוות שלך ב־" }, "monthly": { "message": "חודשי" @@ -3268,10 +3255,10 @@ "message": "שנתי" }, "annual": { - "message": "Annual" + "message": "שנתי" }, "basePrice": { - "message": "מחיר בסיסי" + "message": "מחיר בסיס" }, "organizationCreated": { "message": "הארגון נוצר" @@ -3280,7 +3267,7 @@ "message": "הארגון החדש שלך מוכן!" }, "organizationUpgraded": { - "message": "הארגון שלך שודרג." + "message": "הארגון שודרג" }, "leave": { "message": "יציאה" @@ -3289,7 +3276,7 @@ "message": "האם אתה בטוח שברצונך לצאת מהארגון?" }, "leftOrganization": { - "message": "יצאת מהארגון." + "message": "עזבת את הארגון" }, "defaultCollection": { "message": "אוסף ברירת מחדל" @@ -3298,13 +3285,13 @@ "message": "קבל עזרה" }, "getApps": { - "message": "הורד את האפליקציות" + "message": "הורד את היישומים" }, "loggedInAs": { "message": "מחובר בשם" }, "eventLogs": { - "message": "יומן אירועים" + "message": "יומני אירועים" }, "people": { "message": "אנשים" @@ -3313,7 +3300,7 @@ "message": "מדיניות" }, "singleSignOn": { - "message": "Single sign-on" + "message": "כניסה יחידה" }, "editPolicy": { "message": "ערוך מדיניות" @@ -3334,7 +3321,7 @@ "message": "האם אתה בטוח שברצונך למחוק קבוצה זו?" }, "deleteMultipleGroupsConfirmation": { - "message": "Are you sure you want to delete the following $QUANTITY$ group(s)?", + "message": "האם אתה בטח שברצונך להסיר את $QUANTITY$ הקבוצות הבאות?", "placeholders": { "quantity": { "content": "$1", @@ -3346,22 +3333,22 @@ "message": "האם אתה בטוח שברצונך להסיר משתמש זה?" }, "removeOrgUserConfirmation": { - "message": "When a member is removed, they no longer have access to organization data and this action is irreversible. To add the member back to the organization, they must be invited and onboarded again." + "message": "כאשר חבר מוסר, אין לו יותר גישה לנתוני הארגון ופעולה זו היא בלתי הפיכה. כדי להוסיף את החבר בחזרה לארגון, יש להזמין ולקלוט אותו שוב." }, "revokeUserConfirmation": { - "message": "When a member is revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab." + "message": "כאשר חבר מבוטל, אין לו יותר גישה לנתוני הארגון. כדי לשחזר במהירות גישת חבר, עבור לכרטיסיה 'מבוטל'." }, "removeUserConfirmationKeyConnector": { - "message": "Warning! This user requires Key Connector to manage their encryption. Removing this user from your organization will permanently deactivate their account. This action cannot be undone. Do you want to proceed?" + "message": "אזהרה! משתמש זה דורש Key Connector כדי לנהל את ההצפנה שלו. הסרת משתמש זה מהארגון שלך תשבית לצמיתות את החשבון שלו. פעולה זו אינה ניתנת לביטול. האם ברצונך להמשיך?" }, "externalId": { "message": "מזהה חיצוני" }, "externalIdDesc": { - "message": "ניתן להשתמש במזהה החיצוני כקישור בין משאב זה למערכת חיצונית כמו לדוגמא תיקיית משתמש." + "message": "מזהה חיצוני הוא הפניה לא מוצפנת בשימוש על ידי מחבר הספריות וה־API של Bitwarden." }, "nestCollectionUnder": { - "message": "Nest collection under" + "message": "לקנן אוסף תחת" }, "accessControl": { "message": "בקרת גישה" @@ -3379,16 +3366,16 @@ "message": "ערוך אוסף" }, "collectionInfo": { - "message": "Collection info" + "message": "פרטי אוסף" }, "deleteCollectionConfirmation": { "message": "האם אתה בטוח שברצונך למחוק אוסף זה?" }, "editMember": { - "message": "Edit member" + "message": "ערוך חבר" }, "fieldOnTabRequiresAttention": { - "message": "A field on the '$TAB$' tab requires your attention.", + "message": "שדה בכרטיסיית ה־'$TAB$' דורש את תשומת לבך.", "placeholders": { "tab": { "content": "$1", @@ -3400,7 +3387,7 @@ "message": "הזמן משתמש חדש לארגון שלך על ידי הזנת כתובת האימייל שלהם שמשמשת אותם בחשבון Bitwarden. אם אין להם חשבון Bitwarden, הם יתבקשו ליצור חשבון." }, "inviteMultipleEmailDesc": { - "message": "באפשרותך להזמין עד $COUNT$ משתמשים בכל פעם על ידי הפרדת הכתובות בעזרת פסיק.", + "message": "הזן עד $COUNT$ כתובות דוא\"ל על ידי הפרדה עם פסיק.", "placeholders": { "count": { "content": "$1", @@ -3409,10 +3396,10 @@ } }, "inviteSingleEmailDesc": { - "message": "You have 1 invite remaining." + "message": "נותרה לך הזמנה 1." }, "inviteZeroEmailDesc": { - "message": "You have 0 invites remaining." + "message": "נותרו לך 0 הזמנות." }, "userUsingTwoStep": { "message": "משתמש זה הפעיל כניסה דו שלבית כדי להגן על חשבונו." @@ -3427,37 +3414,37 @@ "message": "אושר" }, "clientOwnerEmail": { - "message": "Client owner email" + "message": "דוא\"ל בעל לקוח" }, "owner": { "message": "בעלים" }, "ownerDesc": { - "message": "החשבון בעל ההרשאות הגבוהות ביותר שיכול לנהל את כל ההיבטים של הארגון." + "message": "נהל את כל ההיבטים של הארגון שלך, כולל חיובים ומנויים" }, "clientOwnerDesc": { - "message": "This user should be independent of the Provider. If the Provider is disassociated with the organization, this user will maintain ownership of the organization." + "message": "על משתמש זה להיות עצמאי מהספק. אם הספק מנותק מהארגון, משתמש זה ישמור על הבעלות של הארגון." }, "admin": { "message": "מנהל" }, "adminDesc": { - "message": "מנהלים יכולים לגשת ולנהל את כל הפריטים, האוספים והמשתמשים שבארגונך." + "message": "נהל גישת ארגון, כל האוספים, חברים, דיווח, והגדרות אבטחה" }, "user": { "message": "משתמש" }, "userDesc": { - "message": "משתמש רגיל עם גישה לאוספים נבחרים בארגון שלך." + "message": "גישה והוספת פריטים לאוספים מוקצים" }, "all": { "message": "הכל" }, "addAccess": { - "message": "Add Access" + "message": "הוסף גישה" }, "addAccessFilter": { - "message": "Add Access Filter" + "message": "הוסף מסנן גישה" }, "refresh": { "message": "רענן" @@ -3493,25 +3480,25 @@ "message": "CLI" }, "bitWebVault": { - "message": "Bitwarden Web vault" + "message": "כספת הרשת של Bitwarden" }, "bitSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "מנהל הסודות של Bitwarden" }, "loggedIn": { - "message": "מחובר." + "message": "מחובר" }, "changedPassword": { - "message": "סיסמת החשבון שונתה." + "message": "סיסמת החשבון שונתה" }, "enabledUpdated2fa": { - "message": "כניסה דו שלבית הופעלה\\עודכנה." + "message": "כניסה דו־שלבית נשמרה" }, "disabled2fa": { - "message": "בטל כניסה דו שלבית." + "message": "כניסה דו־שלבית כבויה" }, "recovered2fa": { - "message": "חשבון שוחזר מכניסה דו שלבית." + "message": "חשבון שוחזר מכניסה דו־שלבית." }, "failedLogin": { "message": "נסיון כניסה נכשל עם סיסמה שגויה." @@ -3520,23 +3507,23 @@ "message": "נסיונות כניסה עם אימות דו שלבי נכשלו." }, "incorrectPassword": { - "message": "Incorrect password" + "message": "סיסמה שגויה" }, "incorrectCode": { - "message": "Incorrect code" + "message": "קוד שגוי" }, "incorrectPin": { - "message": "Incorrect PIN" + "message": "PIN שגוי" }, "pin": { "message": "PIN", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "exportedVault": { - "message": "יצוא כספת." + "message": "הכספת יוצאה" }, "exportedOrganizationVault": { - "message": "יצוא של תוכן הכספת הארגונית." + "message": "כספת הארגון יוצאה." }, "editedOrgSettings": { "message": "הגדרות הארגון נערכו." @@ -3569,7 +3556,7 @@ } }, "movedItemIdToOrg": { - "message": "Moved item $ID$ to an organization.", + "message": "העביר פריט $ID$ אל ארגון.", "placeholders": { "id": { "content": "$1", @@ -3578,10 +3565,10 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "הצג את כל אפשרויות הכניסה" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "הצג את כל אפשרויות הכניסה" }, "viewedItemId": { "message": "פריט שנצפה $ID$.", @@ -3611,7 +3598,7 @@ } }, "viewedCardNumberItemId": { - "message": "Viewed Card Number for item $ID$.", + "message": "צפה במספר כרטיס עבור פריט $ID$.", "placeholders": { "id": { "content": "$1", @@ -3629,7 +3616,7 @@ } }, "viewCollectionWithName": { - "message": "View collection - $NAME$", + "message": "הצג אוסף - $NAME$", "placeholders": { "name": { "content": "$1", @@ -3638,7 +3625,7 @@ } }, "editItemWithName": { - "message": "Edit item - $NAME$", + "message": "ערוך פריט - $NAME$", "placeholders": { "name": { "content": "$1", @@ -3701,7 +3688,7 @@ } }, "deletedCollections": { - "message": "Deleted collections" + "message": "אוספים שנמחקו" }, "deletedCollectionId": { "message": "אוסף שנמחק $ID$.", @@ -3749,7 +3736,7 @@ } }, "deletedManyGroups": { - "message": "Deleted $QUANTITY$ group(s).", + "message": "נמחקו $QUANTITY$ אוספ(ים).", "placeholders": { "quantity": { "content": "$1", @@ -3767,7 +3754,7 @@ } }, "removeUserIdAccess": { - "message": "Remove $ID$ access", + "message": "הסר את הגישה של $ID$", "placeholders": { "id": { "content": "$1", @@ -3776,7 +3763,7 @@ } }, "revokedUserId": { - "message": "Revoked organization access for $ID$.", + "message": "הגישה לארגון בוטלה עבור $ID$.", "placeholders": { "id": { "content": "$1", @@ -3785,7 +3772,7 @@ } }, "restoredUserId": { - "message": "Restored organization access for $ID$.", + "message": "הגישה לארגון שוחזרה עבור $ID$.", "placeholders": { "id": { "content": "$1", @@ -3794,7 +3781,7 @@ } }, "revokeUserId": { - "message": "Revoke $ID$ access", + "message": "בטל את הגישה של $ID$", "placeholders": { "id": { "content": "$1", @@ -3866,10 +3853,10 @@ } }, "unlinkedSso": { - "message": "Unlinked SSO." + "message": "SSO נותק." }, "unlinkedSsoUser": { - "message": "Unlinked SSO for user $ID$.", + "message": "SSO נותק עבור משתמש $ID$.", "placeholders": { "id": { "content": "$1", @@ -3878,7 +3865,7 @@ } }, "createdOrganizationId": { - "message": "Created organization $ID$.", + "message": "נוצר ארגון $ID$.", "placeholders": { "id": { "content": "$1", @@ -3887,7 +3874,7 @@ } }, "addedOrganizationId": { - "message": "Added organization $ID$.", + "message": "נוסף ארגון $ID$.", "placeholders": { "id": { "content": "$1", @@ -3896,7 +3883,7 @@ } }, "removedOrganizationId": { - "message": "Removed organization $ID$.", + "message": "הוסר ארגון $ID$.", "placeholders": { "id": { "content": "$1", @@ -3905,7 +3892,7 @@ } }, "accessedClientVault": { - "message": "Accessed $ID$ organization vault.", + "message": "ניגש אל כספת הארגון של $ID$.", "placeholders": { "id": { "content": "$1", @@ -3917,22 +3904,22 @@ "message": "מכשיר" }, "loginStatus": { - "message": "Login status" + "message": "מצב כניסה" }, "firstLogin": { - "message": "First login" + "message": "כניסה ראשונה" }, "trusted": { - "message": "Trusted" + "message": "מהימן" }, "needsApproval": { - "message": "Needs approval" + "message": "צריך אישור" }, "areYouTryingtoLogin": { - "message": "Are you trying to log in?" + "message": "האם את/ה מנסה להיכנס?" }, "logInAttemptBy": { - "message": "Login attempt by $EMAIL$", + "message": "ניסיון כניסה על ידי $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -3941,22 +3928,22 @@ } }, "deviceType": { - "message": "Device Type" + "message": "סוג מכשיר" }, "ipAddress": { - "message": "IP Address" + "message": "‏כתובת IP" }, "confirmLogIn": { - "message": "Confirm login" + "message": "אשר כניסה" }, "denyLogIn": { - "message": "Deny login" + "message": "דחה כניסה" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "בקשה זו אינה תקפה עוד." }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "הכניסה אושרה עבור $EMAIL$ ב־$DEVICE$", "placeholders": { "email": { "content": "$1", @@ -3969,16 +3956,16 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "דחית ניסיון כניסה ממכשיר אחר. אם זה באמת היית אתה, נסה להיכנס עם המכשיר שוב." }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "כבר פג תוקפה של בקשת הכניסה." }, "justNow": { - "message": "Just now" + "message": "זה עתה" }, "requestedXMinutesAgo": { - "message": "Requested $MINUTES$ minutes ago", + "message": "התבקשה לפני $MINUTES$ דקות", "placeholders": { "minutes": { "content": "$1", @@ -3987,25 +3974,25 @@ } }, "creatingAccountOn": { - "message": "Creating account on" + "message": "יוצר חשבון ב־" }, "checkYourEmail": { - "message": "Check your email" + "message": "בדוק את הדוא\"ל שלך" }, "followTheLinkInTheEmailSentTo": { - "message": "Follow the link in the email sent to" + "message": "עקוב אחר הקישור בדוא\"ל הנשלח אל" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "והמשך ליצור את החשבון שלך." }, "noEmail": { - "message": "No email?" + "message": "אין דוא\"ל?" }, "goBack": { - "message": "Go back" + "message": "חזור" }, "toEditYourEmailAddress": { - "message": "to edit your email address." + "message": "כדי לערוך את כתובת הדוא\"ל שלך." }, "view": { "message": "צפה" @@ -4023,22 +4010,22 @@ "message": "סוג משתמש" }, "groupAccess": { - "message": "גישה לקבוצה" + "message": "גישה קבוצתית" }, "groupAccessUserDesc": { - "message": "ערוך את הקבוצות שמשתמש זה משויך אליהן." + "message": "הענק לחבר גישה לאוספים על ידי הוספתו לקבוצה אחת או יותר." }, "invitedUsers": { - "message": "משתמשים שהוזמנו." + "message": "משתמש(ים) הוזמנ(ו)" }, "resendInvitation": { "message": "שלח הזמנה מחדש" }, "resendEmail": { - "message": "שלח מייל בשנית" + "message": "שלח דוא\"ל מחדש" }, "hasBeenReinvited": { - "message": "$USER$ הוזמן מחדש.", + "message": "$USER$ הוזמן מחדש", "placeholders": { "user": { "content": "$1", @@ -4062,10 +4049,10 @@ } }, "confirmUsers": { - "message": "אשר משתמשים" + "message": "אשר חברים" }, "usersNeedConfirmed": { - "message": "ישנם משתמשים שקיבלו את הזמנתך, אך עדיין צריך לאשר אותם. למשתמשים אלו לא תהיה גישה לארגון עד שיאשרו אותם." + "message": "יש לך חברים שקיבלו את ההזמנה שלהם, אבל עדיין צריך לאשר אותם. לחברים לא תהיה גישה לארגון עד שיאושרו." }, "startDate": { "message": "תאריך התחלה" @@ -4074,7 +4061,7 @@ "message": "תאריך סיום" }, "verifyEmail": { - "message": "אמת כתובת אימייל" + "message": "אמת דוא\"ל" }, "verifyEmailDesc": { "message": "אמת את האימייל שלך בכדי לאפשר גישה לכל היכולות." @@ -4086,37 +4073,37 @@ "message": "בדוק אם קיבלת את קוד האימות באימייל." }, "emailVerified": { - "message": "כתובת האימייל שלך אומתה." + "message": "דוא\"ל החשבון אומת" }, "emailVerifiedV2": { - "message": "Email verified" + "message": "דוא\"ל אומת" }, "emailVerifiedFailed": { "message": "לא ניתן לאמת את האימייל שלך. נסה לשלוח מייל אימות חדש." }, "emailVerificationRequired": { - "message": "יש לאמת את כתובת האימייל" + "message": "נדרש אימות דוא\"ל" }, "emailVerificationRequiredDesc": { - "message": "נדרש אישור אימות בדוא\"ל כדי לאפשר שימוש בתכונה זו." + "message": "אתה מוכרח לאמת את הדוא\"ל שלך כדי להשתמש בתכונה זו." }, "updateBrowser": { "message": "עדכן דפדפן" }, "generatingRiskInsights": { - "message": "Generating your risk insights..." + "message": "יוצר את תובנות הסיכון שלך..." }, "updateBrowserDesc": { "message": "אתה משתמש בדפדפן אינטרנט שאיננו נתמך. כספת הרשת עלולה שלא לפעול כראוי." }, "youHaveAPendingLoginRequest": { - "message": "You have a pending login request from another device." + "message": "יש לך בקשת לכניסה ממתינה ממכשיר אחר." }, "reviewLoginRequest": { - "message": "Review login request" + "message": "סקור בקשת כניסה" }, "freeTrialEndPromptCount": { - "message": "Your free trial ends in $COUNT$ days.", + "message": "הניסיון החינמי שלך מסתיים בעוד $COUNT$ ימים.", "placeholders": { "count": { "content": "$1", @@ -4125,7 +4112,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.", + "message": "$ORGANIZATION$, הניסיון החינמי שלך מסתיים בעוד $COUNT$ ימים.", "placeholders": { "count": { "content": "$2", @@ -4138,7 +4125,7 @@ } }, "freeTrialEndPromptTomorrow": { - "message": "$ORGANIZATION$, your free trial ends tomorrow.", + "message": "$ORGANIZATION$, הניסיון החינמי שלך מסתיים מחר.", "placeholders": { "organization": { "content": "$1", @@ -4147,10 +4134,10 @@ } }, "freeTrialEndPromptTomorrowNoOrgName": { - "message": "Your free trial ends tomorrow." + "message": "הניסיון החינמי שלך מסתיים מחר." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, your free trial ends today.", + "message": "$ORGANIZATION$, הניסיון החינמי שלך מסתיים היום.", "placeholders": { "organization": { "content": "$1", @@ -4159,16 +4146,16 @@ } }, "freeTrialEndingTodayWithoutOrgName": { - "message": "Your free trial ends today." + "message": "הניסיון החינמי שלך מסתיים היום." }, "clickHereToAddPaymentMethod": { - "message": "Click here to add a payment method." + "message": "לחץ כאן כדי להוסיף שיטת תשלום." }, "joinOrganization": { "message": "הצטרף לארגון" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "הצטרף אל $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -4180,7 +4167,7 @@ "message": "הוזמנת להצטרף לארגון הרשום לעיל. בכדי להסכים, עליך להתחבר או ליצור חשבון Bitwarden חדש." }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "סיים להצטרף לארגון זה על ידי הגדרת סיסמה ראשית." }, "inviteAccepted": { "message": "ההזמנה התקבלה" @@ -4189,7 +4176,7 @@ "message": "תוכל לקבל גישה לארגון זה כשאחד המנהלים יאשר את החברות שלך. נשלח לך מייל כשזה יקרה." }, "inviteInitAcceptedDesc": { - "message": "You can now access this organization." + "message": "אתה יכול עכשיו לגשת אל ארגון זה." }, "inviteAcceptFailed": { "message": "לא ניתן לקבל את ההזמנה. בקש ממנהל הארגון שישלח הזמנה חדשה." @@ -4207,16 +4194,16 @@ "message": "זכור אימייל" }, "recoverAccountTwoStepDesc": { - "message": "אם אין באפשרות לגשת לחשבונך דרך השיטות הדו-שלביות הרגילות, תוכל להשתמש בקוד לשחזור האימות הדו שלבי בכדי לבטל את כל ספקי האימות הדו שלבי בחשבונך." + "message": "אם אינך יכול לגשת לחשבון שלך דרך שיטות הכניסה הדו־שלבית הרגילות שלך, אתה יכול להשתמש בקוד השחזור של הכניסה הדו־שלבית שלך כדי לכבות את כל הספקים הדו־שלביים בחשבונך." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "היכנס למטה באמצעות קוד השחזור החד־פעמי שלך. זה יכבה את כל הספקים הדו־שלביים בחשבון שלך." }, "recoverAccountTwoStep": { - "message": "שחזר כניסה דו שלבית לחשבון" + "message": "שחזר כניסה דו־שלבית לחשבון" }, "twoStepRecoverDisabled": { - "message": "כניסה דו שלבית בוטלה בחשבונך." + "message": "כניסה דו־שלבית כבויה בחשבונך." }, "learnMore": { "message": "למידע נוסף" @@ -4228,22 +4215,22 @@ "message": "אם החשבון שלך אכן קיים, שלחנו אליך מייל עם הוראות נוספות." }, "deleteRecoverConfirmDesc": { - "message": "ביקשת למחוק את חשבון ה-Bitwarden שלך. לחץ על הכפתור למטה בכדי לאשר זאת." + "message": "ביקשת למחוק את החשבון Bitwarden שלך. לחץ על הכפתור למטה כדי לאשר." }, "deleteRecoverOrgConfirmDesc": { - "message": "You have requested to delete your Bitwarden organization." + "message": "ביקשת למחוק את ארגון ה־Bitwarden שלך." }, "myOrganization": { "message": "הארגון שלי" }, "organizationInfo": { - "message": "Organization info" + "message": "מידע על הארגון" }, "deleteOrganization": { "message": "מחק ארגון" }, "deletingOrganizationContentWarning": { - "message": "Enter the master password to confirm deletion of $ORGANIZATION$ and all associated data. Vault data in $ORGANIZATION$ includes:", + "message": "הזן את הסיסמה הראשית כדי לאשר את מחיקה של $ORGANIZATION$ וכל הנתונים המשויכים. נתוני כספת ב־$ORGANIZATION$ כוללים:", "placeholders": { "organization": { "content": "$1", @@ -4252,10 +4239,10 @@ } }, "deletingOrganizationActiveUserAccountsWarning": { - "message": "User accounts will remain active after deletion but will no longer be associated to this organization." + "message": "חשבונות משתמשים יישארו פעילים לאחר המחיקה אבל לא יהיו משויכים יותר אל ארגון זה." }, "deletingOrganizationIsPermanentWarning": { - "message": "Deleting $ORGANIZATION$ is permanent and irreversible.", + "message": "מחיקת $ORGANIZATION$ היא לצמיתות ובלתי הפיכה.", "placeholders": { "organization": { "content": "$1", @@ -4273,7 +4260,7 @@ "message": "הארגון עודכן" }, "taxInformation": { - "message": "מידע מיסים" + "message": "פרטי מס" }, "taxInformationDesc": { "message": "עבור לקוחות בתוך ארצות הברית, יש לכתוב מיקוד לצורך דיווח מיסוי. עבור לקוחות ממדינות אחרות ניתן למלא מספר זיהוי מס (VAT/GST) ו\\או כתובת שתופיע על הקבלות שלך." @@ -4283,7 +4270,7 @@ "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlan": { - "message": "שנה תוכנית", + "message": "שדרג תוכנית", "description": "A billing plan/package. For example: Families, Teams, Enterprise, etc." }, "changeBillingPlanUpgrade": { @@ -4301,7 +4288,7 @@ } }, "viewInvoice": { - "message": "צפה בחשבונית" + "message": "הצג חשבונית" }, "downloadInvoice": { "message": "הורד חשבונית" @@ -4316,10 +4303,10 @@ "message": "אופציית תשלום באמצעות חשבון בנק זמינה אך ורק ללקוחות תושבי ארצות הברית. תצטרך לאמת את פרטי החשבון. אנו נבצע 2 מיקרו-הפקדות בתוך 1-2 ימי עסקים. הזן את הסכומים בעמוד פרטי הארגון המשלם בכדי לאמת את חשבון הבנק." }, "verifyBankAccountFailureWarning": { - "message": "בעיות באימות פרטי החשבון עלולות להסתיים בתשלומים ש'התפספסו' ויכולות לגרום למנוי שלך, להתבטל." + "message": "כשל באימות חשבון הבנק יגרום לפספוס תשלום ולהשעיית המנוי שלך." }, "verifiedBankAccount": { - "message": "חשבון בנק אומת." + "message": "חשבון הבנק אומת" }, "bankAccount": { "message": "חשבון בנק" @@ -4335,7 +4322,7 @@ } }, "routingNumber": { - "message": "מספר הניתוב", + "message": "מספר ניתוב", "description": "Bank account routing number" }, "accountNumber": { @@ -4357,31 +4344,31 @@ "message": "הכנס את מספר ההתקנה שלך" }, "limitSubscriptionDesc": { - "message": "Set a seat limit for your subscription. Once this limit is reached, you will not be able to invite new members." + "message": "הגדר מגבלת מקום עבור המנוי שלך. ברגע שמגבלה זו תושג, לא תוכל להזמין חברים חדשים." }, "limitSmSubscriptionDesc": { - "message": "Set a seat limit for your Secrets Manager subscription. Once this limit is reached, you will not be able to invite new members." + "message": "הגדר מגבלת מקום עבור המנוי של מנהל הסודות שלך. ברגע שמגבלה זו תושג, לא תוכל להזמין חברים חדשים." }, "maxSeatLimit": { - "message": "Seat Limit (optional)", + "message": "מגבלת מקום (אופציונלי)", "description": "Upper limit of seats to allow through autoscaling" }, "maxSeatCost": { - "message": "Max potential seat cost" + "message": "עלות מקום פוטנציאלית מרבית" }, "addSeats": { - "message": "הוסף כסאות", + "message": "הוסף מקומות", "description": "Seat = User Seat" }, "removeSeats": { - "message": "הסר כסאות", + "message": "הסר מקומות", "description": "Seat = User Seat" }, "subscriptionDesc": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited users exceed your subscription seats, you will immediately receive a prorated charge for the additional users." + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים לסך כל החיובים שלך. אם משתמשים חדשים שהוזמנו חורגים ממקומות המנוי שלך, תקבל באופן מיידי חיוב יחסי עבור המשתמשים הנוספים." }, "subscriptionUserSeats": { - "message": "המנוי שלך מתיר עד $COUNT$ משתמשים.", + "message": "המנוי שלך מאפשר בסך הכל $COUNT$ חברים.", "placeholders": { "count": { "content": "$1", @@ -4390,34 +4377,34 @@ } }, "limitSubscription": { - "message": "Limit subscription (optional)" + "message": "הגבל מנוי (אופציונלי)" }, "subscriptionSeats": { - "message": "Subscription seats" + "message": "מקומות מנוי" }, "subscriptionUpdated": { - "message": "Subscription updated" + "message": "המנוי עודכן" }, "subscribedToSecretsManager": { - "message": "Subscription updated. You now have access to Secrets Manager." + "message": "המנוי עודכן. עכשיו יש לך גישה למנהל הסודות." }, "additionalOptions": { - "message": "Additional options" + "message": "אפשרויות נוספות" }, "additionalOptionsDesc": { - "message": "For additional help in managing your subscription, please contact Customer Support." + "message": "לעזרה נוספת בניהול המנוי שלך, נא לפנות לתמיכת הלקוחות." }, "subscriptionUserSeatsUnlimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members." + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים לסך כל החיובים שלך. אם חברים חדשים שהוזמנו חורגים ממקומות המנוי שלך, תקבל באופן מיידי חיוב יחסי עבור החברים הנוספים." }, "smStandaloneTrialSeatCountUpdateMessageFragment1": { - "message": "If you want to add additional" + "message": "אם אתה רוצה להוסיף מקומות נוספים של" }, "smStandaloneTrialSeatCountUpdateMessageFragment2": { - "message": "seats without the bundled offer, please contact" + "message": "ללא ההצעה המצורפת, נא לפנות אל" }, "subscriptionUserSeatsLimitedAutoscale": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. If newly invited members exceed your subscription seats, you will immediately receive a prorated charge for the additional members until your $MAX$ seat limit is reached.", + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים לסך כל החיובים שלך. אם חברים חדשים שהוזמנו חורגים ממקומות המנוי שלך, תקבל באופן מיידי חיוב יחסי עבור החברים הנוספים עד שתושג מגבלת $MAX$ המקומות שלך.", "placeholders": { "max": { "content": "$1", @@ -4426,7 +4413,7 @@ } }, "subscriptionUserSeatsWithoutAdditionalSeatsOption": { - "message": "You can invite up to $COUNT$ members for no additional charge. Contact Customer Support to upgrade your plan and invite more members.", + "message": "אתה יכול להזמין עד $COUNT$ חברים ללא תשלום נוסף. פנה אל תמיכת לקוחות כדי לשדרג את התוכנית שלך ולהזמין עוד חברים.", "placeholders": { "count": { "content": "$1", @@ -4435,7 +4422,7 @@ } }, "subscriptionFreePlan": { - "message": "You cannot invite more than $COUNT$ members without upgrading your plan.", + "message": "אתה לא יכול להזמין יותר מ־$COUNT$ חברים מבלי לשדרג את התוכנית שלך.", "placeholders": { "count": { "content": "$1", @@ -4444,7 +4431,7 @@ } }, "subscriptionUpgrade": { - "message": "You cannot invite more than $COUNT$ members without upgrading your plan.", + "message": "אתה לא יכול להזמין יותר מ־$COUNT$ חברים מבלי לשדרג את התוכנית שלך.", "placeholders": { "count": { "content": "$1", @@ -4453,7 +4440,7 @@ } }, "subscriptionSponsoredFamiliesPlan": { - "message": "Your subscription allows for a total of $COUNT$ members. Your plan is sponsored and billed to an external organization.", + "message": "המנוי שלך מאפשר סך הכל $COUNT$ חברים. התוכנית שלך ממומנת ומחויבת לארגון חיצוני.", "placeholders": { "count": { "content": "$1", @@ -4462,7 +4449,7 @@ } }, "subscriptionMaxReached": { - "message": "Adjustments to your subscription will result in prorated changes to your billing totals. You cannot invite more than $COUNT$ members without increasing your subscription seats.", + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים לסך כל החיובים שלך. אתה לא יכול להזמין יותר מ־$COUNT$ חברים מבלי להגדיל את מקומות המנוי שלך.", "placeholders": { "count": { "content": "$1", @@ -4471,7 +4458,7 @@ } }, "subscriptionSeatMaxReached": { - "message": "You cannot invite more than $COUNT$ members without increasing your subscription seats.", + "message": "אתה לא יכול להזמין יותר מ־$COUNT$ חברים מבלי להגדיל את מקומות המנוי שלך.", "placeholders": { "count": { "content": "$1", @@ -4480,10 +4467,10 @@ } }, "seatsToAdd": { - "message": "כסאות להוספה" + "message": "מקומות להוספה" }, "seatsToRemove": { - "message": "כסאות להסרה" + "message": "מקומות להסרה" }, "seatsAddNote": { "message": "הוספת כסאות משתמשים משנה את העלויות. פעולה זו מחוייבת באופן מיידי לפי שיטת החיוב שלך. בנוסף, החיוב הבא יכלול את ההפרש היחסי ממחזור החיוב הנוכחי." @@ -4501,10 +4488,10 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "עדכון מפתח הצפנה לא יכול להמשיך" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "ערוך $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4513,7 +4500,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "סדר מחדש את $LABEL$. השתמש במקש חץ כדי להעביר את הפריט למעלה או למטה.", "placeholders": { "label": { "content": "$1", @@ -4521,8 +4508,42 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ עבר למעלה, מיקום $INDEX$ מתוך $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ עבר למטה, מיקום $INDEX$ מתוך $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "בעת עדכון מפתח ההצפנה שלך, התיקיות שלך לא היה ניתנות לפענוח. כדי להמשיך עם העדכון, התיקיות שלך מוכרחות להימחק. לא יימחקו פריטי כספת אם תמשיך." }, "keyUpdated": { "message": "המפתח עודכן" @@ -4531,13 +4552,13 @@ "message": "עדכן מפתח הצפנה" }, "updateEncryptionSchemeDesc": { - "message": "We've changed the encryption scheme to provide better security. Update your encryption key now by entering your master password below." + "message": "שינינו את סכמת ההצפנה כדי לספק אבטחה טובה יותר. עדכן את מפתח ההצפנה שלך כעת על ידי הזנת הסיסמה הראשית שלך למטה." }, "updateEncryptionKeyWarning": { "message": "לאחר עדכון מפתחות ההצפנה שלך, תתבקש לצאת ולהכנס שוב בכל אפליקציות Bitwarden שאתה משתמש בהן (האפליקציה לפלאפון או ההרחבה לדפדפן). אם לא תצא ותכנס שוב (פעולת הכניסה מורידה את המפתח החדש), יתכן שתתקל במידע שגוי. אנו ננסה לגרום ליציאה אוטומטית, אך יתכן שהדבר לא יקרה מיידית." }, "updateEncryptionKeyExportWarning": { - "message": "Any encrypted exports that you have saved will also become invalid." + "message": "כל הייצואים המוצפנים ששמרת יהפכו גם הם ללא תקפים." }, "subscription": { "message": "מנוי" @@ -4555,7 +4576,7 @@ "message": "תכונה זו לא זמינה בתוכנית החינמיית עבור ארגונים. עבור לתוכנית בתשלום בכדי להשתמש בתכונות נוספות." }, "createOrganizationStep1": { - "message": "יצירת ארגון: צעד 1" + "message": "צור ארגון: שלב 1" }, "createOrganizationCreatePersonalAccount": { "message": "לפני יצירת הארגון, עליך ליצור חשבון אישי חינמי." @@ -4567,25 +4588,25 @@ "message": "לא בחרת כלום." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "קבל עצות, הכרזות, והזדמנויות מחקר מאת Bitwarden בדואר הנכנס שלך." }, "unsubscribe": { - "message": "Unsubscribe" + "message": "בטל הרשמה" }, "atAnyTime": { - "message": "at any time." + "message": "בכל זמן." }, "byContinuingYouAgreeToThe": { - "message": "By continuing, you agree to the" + "message": "על ידי המשך, אתה מסכים ל" }, "and": { - "message": "and" + "message": "ו" }, "acceptPolicies": { "message": "סימון תיבה זו מהווה את הסכמתך לתנאים הבאים:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "תנאי השימוש ומדיניות הפרטיות לא הוכרו." }, "termsOfService": { "message": "תנאי שירות" @@ -4597,16 +4618,16 @@ "message": "מסננים" }, "vaultTimeout": { - "message": "משך זמן מירבי עבור חיבור לכספת" + "message": "פסק זמן לכספת" }, "vaultTimeout1": { - "message": "Timeout" + "message": "פסק זמן" }, "vaultTimeoutDesc": { - "message": "בחר כמה זמן יעבור כדי שהכספת תסגר לאחר חוסר פעילות ותבצע את הפעולה שנבחרה." + "message": "בחר מתי הכספת שלך תנקוט בפעולת פסק הזמן לכספת." }, "vaultTimeoutLogoutDesc": { - "message": "Choose when your vault will be logged out." + "message": "בחר מתי הכספת שלך תינעל." }, "oneMinute": { "message": "דקה אחת" @@ -4634,7 +4655,7 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Created", + "message": "נוצר", "description": "ex. Date this item was created" }, "datePasswordUpdated": { @@ -4642,22 +4663,22 @@ "description": "ex. Date this password was updated" }, "organizationIsDisabled": { - "message": "הארגון הושבת." + "message": "הארגון הושעה" }, "secretsAccessSuspended": { - "message": "Suspended organizations cannot be accessed. Please contact your organization owner for assistance." + "message": "לא ניתן לגשת אל ארגונים מושעים. נא לפנות לבעל הארגון שלך עבור סיוע." }, "secretsCannotCreate": { - "message": "Secrets cannot be created in suspended organizations. Please contact your organization owner for assistance." + "message": "לא ניתן ליצור סודות בארגונים מושעים. נא לפנות לבעל הארגון שלך עבור סיוע." }, "projectsCannotCreate": { - "message": "Projects cannot be created in suspended organizations. Please contact your organization owner for assistance." + "message": "לא ניתן ליצור פרויקטים בארגונים מושעים. נא לפנות אל בעל הארגון שלך עבור סיוע." }, "serviceAccountsCannotCreate": { - "message": "Service accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." + "message": "לא ניתן ליצור חשבונות שירות בארגונים מושעים. נא לפנות אל בעל הארגון שלך עבור סיוע." }, "disabledOrganizationFilterError": { - "message": "Items in suspended organizations cannot be accessed. Contact your organization owner for assistance." + "message": "לא ניתן לגשת לפריטים בארגון מושעה. פנה אל בעל הארגון שלך עבור סיוע." }, "licenseIsExpired": { "message": "תוקף הרשיון הסתיים." @@ -4669,7 +4690,7 @@ "message": "נבחר\\ו" }, "recommended": { - "message": "Recommended" + "message": "מומלץ" }, "ownership": { "message": "בעלות" @@ -4697,13 +4718,13 @@ "message": "סיסמה ראשית חלשה" }, "weakMasterPasswordDesc": { - "message": "הסיסמה הראשית שבחרת חלשה מאוד. עליך לבחור סיסמה חזקה יותר (או להשתמש במשפט במקום מילה אחת) בכדי לאבטח את החשבון שלך. האם אתה בטוח שברצונך להשתמש בסיסמה ראשית זו?" + "message": "סיסמה חלשה זוהתה. השתמש בסיסמה חזקה כדי להגן על חשבונך. האם אתה בטוח שאתה רוצה להשתמש בסיסמה חלשה?" }, "rotateAccountEncKey": { "message": "כמו כן החלף את מפתח ההצפנה של החשבון שלי" }, "rotateEncKeyTitle": { - "message": "החלף מפתח הצפנה" + "message": "סובב מפתח הצפנה" }, "rotateEncKeyConfirmation": { "message": "האם אתה בטוח שברצונך להחליף (לבצע רוטציה) של מפתח ההצפנה בחשבונך?" @@ -4712,7 +4733,7 @@ "message": "לפריט זה יש קובץ מצורף שצריך תיקון." }, "attachmentFixDescription": { - "message": "This attachment uses outdated encryption. Select 'Fix' to download, re-encrypt, and re-upload the attachment." + "message": "צרופה זו משתמשת בהצפנה מיושנת. בחר 'תקן' כדי להוריד, להצפין מחדש, ולהעלות מחדש את הצרופה." }, "fix": { "message": "תקן", @@ -4730,17 +4751,17 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and Fingerprint phrase matches the other device." + "message": "נא לוודא שהכספת שלך פתוחה ושביטוי טביעת האצבע תואם את המכשיר האחר." }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "ביטוי טביעת אצבע" }, "dontAskFingerprintAgain": { - "message": "אל תבקש ממני לאמת את משפט טביעת האצבע יותר", + "message": "לעולם אל תנחה משתמשים מוזמנים לאמת ביטוי טביעת אצבע (לא מומלץ)", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "תקבל התראה כאשר הבקשה תאושר" }, "free": { "message": "חינם", @@ -4769,10 +4790,10 @@ "description": "'OAuth 2.0' is a programming protocol. It should probably not be translated." }, "viewApiKey": { - "message": "צפה במפתח API" + "message": "הצג מפתח API" }, "rotateApiKey": { - "message": "קבל מפתח API חדש" + "message": "סובב מפתח API" }, "selectOneCollection": { "message": "עליך לבחור לפחות אוסף אחד." @@ -4787,13 +4808,13 @@ "message": "שכפול" }, "masterPassPolicyTitle": { - "message": "Master password requirements" + "message": "דרישות סיסמה ראשית" }, "masterPassPolicyDesc": { - "message": "קבע דרישות מינימום עבור חוזק הסיסמה הראשית." + "message": "קבע דרישות עבור חוזק הסיסמה הראשית." }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "ציון חוזק סיסמה $SCORE$", "placeholders": { "score": { "content": "$1", @@ -4802,19 +4823,19 @@ } }, "twoStepLoginPolicyTitle": { - "message": "Require two-step login" + "message": "דרוש כניסה דו-שלבית" }, "twoStepLoginPolicyDesc": { - "message": "דרוש מהמשתמשים להגדיר כניסה דו-שלבית בחשבונות האישיים שלהם." + "message": "דרוש מחברים להגדיר כניסה דו־שלבית." }, "twoStepLoginPolicyWarning": { - "message": "חברי ארגון ללא הגדרת כניסה דו-שלבית יוסרו מהארגון ויקבלו אימייל המסביר את השינוי." + "message": "חברי ארגון שאינם בעלים או מנהלים ואין להם כניסה דו־שלבית מוגדרת עבור חשבונם יוסרו מהארגון ויקבלו דוא\"ל המודיע להם על השינוי." }, "twoStepLoginPolicyUserWarning": { - "message": "הינך חבר בארגון המחייב כניסה דו-שלבית מוגדרת בחשבונך. אם תבטל את כל הספקים המאפשרים כניסה דו-שלבית, תוסר אוטומטית מהארגון." + "message": "הנך חבר בארגון אשר דורש שכניסה דו־שלבית תהיה מוגדרת בחשבון המשתמש שלך. אם תכבה את כל ספקי הכניסה הדו־שלבית, אתה תוסר באופן אוטומטי מהארגונים האלה." }, "passwordGeneratorPolicyDesc": { - "message": "הגדר דרישות מינימום במחולל הסיסמאות." + "message": "הגדר דרישות עבור מחולל הסיסמאות." }, "masterPasswordPolicyInEffect": { "message": "אחד או יותר מכללי מדיניות הארגון דורשים שסיסמתך הראשית תעמוד בדרישות הבאות:" @@ -4859,23 +4880,23 @@ "message": "הסיסמה הראשית החדשה שלך לא עומדת בדרישות המדיניות." }, "minimumNumberOfWords": { - "message": "מספר מינימאלי של מילים" + "message": "מספר מינימלי של מילים" }, "overridePasswordTypePolicy": { - "message": "Password Type", + "message": "סוג סיסמה", "description": "Name of the password generator policy that overrides the user's password/passphrase selection." }, "userPreference": { - "message": "העדפות משתמש" + "message": "העדפת משתמש" }, "vaultTimeoutAction": { - "message": "פעולה לביצוע בכספת בתום זמן החיבור" + "message": "פעולת פסק זמן לכספת" }, "vaultTimeoutActionLockDesc": { - "message": "בכדי לקבל גישה לכספת נעולה, יש להזין את הסיסמה הראשית שוב." + "message": "נדרשת סיסמה ראשית או שיטת ביטול נעילה אחרת כדי לגשת לכספת שלך שוב." }, "vaultTimeoutActionLogOutDesc": { - "message": "בכדי לקבל גישה לכספת שיצאו ממנה, יש לבצע אימות מחדש." + "message": "נדרש אימות מחדש כדי לגשת לכספת שלך שוב." }, "lock": { "message": "נעילה", @@ -4886,25 +4907,25 @@ "description": "Noun: A special folder for holding deleted items that have not yet been permanently deleted" }, "searchTrash": { - "message": "חפש בסל המחזור" + "message": "חפש באשפה" }, "permanentlyDelete": { "message": "מחק לצמיתות" }, "permanentlyDeleteSelected": { - "message": "מחק לצמיתות פריטים שנבחרו" + "message": "מחק לצמיתות את מה שנבחר" }, "permanentlyDeleteItem": { - "message": "מחק לצמיתות פריט שנבחר" + "message": "מחק לצמיתות פריט" }, "permanentlyDeleteItemConfirmation": { "message": "האם אתה בטוח שברצונך למחוק את הפריט הזה?" }, "permanentlyDeletedItem": { - "message": "פריט שנמחק לצמיתות" + "message": "הפריט נמחק לצמיתות" }, "permanentlyDeletedItems": { - "message": "פריטים שנמחקו לצמיתות" + "message": "הפריטים נמחקו לצמיתות" }, "permanentlyDeleteSelectedItemsDesc": { "message": "בחרת $COUNT$ פריט(ים) למחיקה לצמיתות. האם אתה בטוח שברצונך למחוק את כולם?", @@ -4916,7 +4937,7 @@ } }, "permanentlyDeletedItemId": { - "message": "פריט שנמחק לצמיתות $ID$.", + "message": "הפריט $ID$ נמחק לצמיתות", "placeholders": { "id": { "content": "$1", @@ -4928,16 +4949,16 @@ "message": "שחזר" }, "restoreSelected": { - "message": "שחזר בחירה" + "message": "שחזר את מה שנבחר" }, "restoredItem": { - "message": "פריט ששוחזר" + "message": "הפריט שוחזר" }, "restoredItems": { - "message": "פריטים ששוחזרו" + "message": "הפריטים שוחזרו" }, "restoredItemId": { - "message": "פריט ששוחזר $ID$.", + "message": "הפריט $ID$ שוחזר", "placeholders": { "id": { "content": "$1", @@ -4949,7 +4970,7 @@ "message": "יציאה תגרום להסרת כל גישה שיש לך לכספת ודורשת אימות אונליין לאחר משך זמן מסויים. האם אתה בטוח שברצונך להשתמש באפשרות זו?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "אישור פעולת אימות לאחר חוסר פעילות" + "message": "אישור פעולת פסק זמן" }, "hidePasswords": { "message": "הסתר סיסמאות" @@ -4967,7 +4988,7 @@ "message": "מידע מיסוי עודכן." }, "setMasterPassword": { - "message": "קבע סיסמה ראשית" + "message": "הגדר סיסמה ראשית" }, "identifier": { "message": "מזהה" @@ -4976,40 +4997,40 @@ "message": "מזהה ארגוני" }, "ssoLogInWithOrgIdentifier": { - "message": "הכנס באמצעות פורטל ההזדהות האחודה (SSO) הארגוני שלך. אנא הזן את המזהה הארגוני שלך כדי להתחיל." + "message": "כנס באמצעות הפורטל לכניסה יחידה של הארגון שלך. אנא הזן את מזהה ה־SSO של הארגון שלך כדי להתחיל." }, "singleSignOnEnterOrgIdentifier": { - "message": "Enter your organization's SSO identifier to begin" + "message": "הזן את מזהה ה־SSO של הארגון שלך כדי להתחיל" }, "singleSignOnEnterOrgIdentifierText": { - "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device." + "message": "כדי להיכנס ספק ה־SSO שלך, הזן את מזהה ה־SSO של הארגון שלך כדי להתחיל. ייתכן שתצטרך להזין את מזהה SSO זה כאשר אתה נכנס ממכשיר חדש." }, "enterpriseSingleSignOn": { - "message": "כניסה ארגונית אחודה" + "message": "כניסה יחידה ארגונית" }, "ssoHandOff": { "message": "ניתן לסגור את הטאב הנוכחי ולהמשיך את השימוש בתוסף." }, "youSuccessfullyLoggedIn": { - "message": "You successfully logged in" + "message": "נכנסת בהצלחה" }, "thisWindowWillCloseIn5Seconds": { - "message": "This window will automatically close in 5 seconds" + "message": "חלון זה ייסגר באופן אוטומטי בעוד 5 שניות" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "אתה רשאי לסגור חלון זה" }, "includeAllTeamsFeatures": { "message": "כל התכונות הקיימות ב\"צוות\", ובנוסף:" }, "includeAllTeamsStarterFeatures": { - "message": "All Teams Starter features, plus:" + "message": "כל התכונות של צוותים מתחילים, ובנוסף:" }, "chooseMonthlyOrAnnualBilling": { - "message": "Choose monthly or annual billing" + "message": "בחר חיוב חודשי או שנתי" }, "abilityToAddMoreThanNMembers": { - "message": "Ability to add more than $COUNT$ members", + "message": "יכולת להוסיף יותר מ־$COUNT$ חברים", "placeholders": { "count": { "content": "$1", @@ -5021,65 +5042,89 @@ "message": "אימות SSO דרך SAML2.0 וOpenID Connect" }, "includeEnterprisePolicies": { - "message": "מדיניות ארגונית" + "message": "פוליסות ארגוניות" }, "ssoValidationFailed": { "message": "אימות SSO נכשל" }, "ssoIdentifierRequired": { - "message": "מזהה הארגון נחוץ." + "message": "נדרש מזהה SSO של הארגון." }, "ssoIdentifier": { - "message": "SSO identifier" + "message": "מזהה SSO" }, "ssoIdentifierHintPartOne": { - "message": "Provide this ID to your members to login with SSO. To bypass this step, set up ", + "message": "ספק את המזהה הזה לחברים שלך כדי שיכנסו עם SSO. כדי לעקוף את השלב הזה, הגדר ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Provide this ID to your members to login with SSO. To bypass this step, set up Domain verification'" }, "unlinkSso": { "message": "נתק SSO" }, "unlinkSsoConfirmation": { - "message": "Are you sure you want to unlink SSO for this organization?" + "message": "האם אתה בטוח שברצונך לנתק SSO עבור ארגון זה?" }, "linkSso": { "message": "חבר SSO" }, "singleOrg": { - "message": "ארגון יחידני" + "message": "ארגון יחיד" }, "singleOrgDesc": { - "message": "מונע מהמשתמשים אפשרות צירוף לארגונים אחרים." + "message": "מנע מחברים מלהצטרף לארגונים אחרים." }, "singleOrgPolicyDesc": { - "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification." + "message": "הגבל משתמשים מלהצטרף לארגונים אחרים. מדיניות זו נדרשת עבור ארגונים שאפשרו אימות דומיין." }, "singleOrgBlockCreateMessage": { "message": "לפי מדיניות הארגון שלך, אין באפשרותך להצטרף ליותר מארגון אחד. אנא צור קשר עם מנהלי הארגון שלך, או לחלופין - צור חשבון Bitwarden נפרד." }, "singleOrgPolicyWarning": { - "message": "חברי ארגון שאינם הבעלים או המנהלים וכבר עכשיו הם חלק מארגון אחר - יוסרו מהארגון שלך." + "message": "חברי ארגון שאינם בעלים או מנהלים ושכבר חברים בארגון אחר יוסרו מהארגון שלך." }, "singleOrgPolicyMemberWarning": { - "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met." + "message": "חברים שאינם עומדים בדרישות במצב מבוטל עד שיעזבו את כל שאר הארגונים. מנהלים הם פטורים ויכולים לשחזר חברים ברגע שיעמדו בדרישות." }, "requireSso": { - "message": "אימות בעזרת כניסה אחודה" + "message": "דרוש אימות כניסה יחידה" }, "requireSsoPolicyDesc": { - "message": "מחייב את המשתמשים להשתמש בכניסה אחודה של הארגון." + "message": "דרוש מחברים להיכנס עם שיטת הכניסה היחידה הארגונית." }, "prerequisite": { "message": "תנאים מקדימים" }, "requireSsoPolicyReq": { - "message": "יש לסמן את מדיניות הארגון היחידני לפני הפעלת מדיניות זו." + "message": "יש להפעיל את המדיניות הארגונית של הארגון היחיד לפני הפעלת מדיניות זו." }, "requireSsoPolicyReqError": { - "message": "מדיניות ארגון יחידני לא הופעלה." + "message": "מדיניות ארגון יחיד לא הוגדרה." }, "requireSsoExemption": { - "message": "מנהלי ובעלי הארגון מוחרגים מאכיפת מדיניות זו." + "message": "מנהלי ובעלי הארגון פטורים מהאכיפה של מדיניות זו." + }, + "limitSendViews": { + "message": "הגבל צפיות" + }, + "limitSendViewsHint": { + "message": "אף אחד לא יכול לצפות בסֵנְד זה לאחר ההגעה למגבלה.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ צפיות נותרו", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "פרטי סֵנְד", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "טקסט לשיתוף" }, "sendTypeFile": { "message": "קובץ" @@ -5087,8 +5132,12 @@ "sendTypeText": { "message": "טקסט" }, + "sendPasswordDescV3": { + "message": "הוסף סיסמה אופציונלית עבור נמענים כדי לגשת לסֵנְד זה.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { - "message": "צור Send חדש", + "message": "סֵנְד חדש", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -5096,76 +5145,57 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "הSend נוצר בהצלחה", + "message": "סֵנְד נשמר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "הSend נערך", + "message": "סֵנְד נשמר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletedSend": { - "message": "הSend נמחק", + "message": "סֵנְד נמחק", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSend": { "message": "מחק Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "האם אתה בטוח שברצונך למחוק Send זה?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "מה סוג הSend?", + "deleteSendPermanentConfirmation": { + "message": "האם אתה בטוח שברצונך למחוק לצמיתות סֵנְד זה?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "תאריך מחיקה" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "סֵנְד זה יימחק לצמיתות בתאריך זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { "message": "תאריך תפוגה" }, "expirationDateDesc": { - "message": "If set, access to this Send will expire on the specified date and time.", + "message": "אם מוגדר, גישה לסֵנְד זה תפוג בתאריך ובשעה שצוינו.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "כמות גישות מקסימלית" - }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "כמות גישות נוכחית" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "מספר גישות מרבי" }, "disabled": { "message": "מבוטל" }, "revoked": { - "message": "Revoked" + "message": "מבוטל" }, "sendLink": { - "message": "לינק לSend", + "message": "קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "copyLink": { - "message": "Copy link" + "message": "העתק קישור" }, "copySendLink": { - "message": "העתק לינק לSend", + "message": "העתק קישור סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -5177,23 +5207,19 @@ "removePasswordConfirmation": { "message": "האם אתה בטוח שברצונך להסיר את הסיסמה?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "כל הSendים" }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "מספר הגישות המרבי הושג", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "pendingDeletion": { "message": "ממתין להסרה" }, + "hideTextByDefault": { + "message": "הסתר טקסט כברירת מחדל" + }, "expired": { "message": "פג תוקף" }, @@ -5206,22 +5232,22 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendProtectedPasswordDontKnow": { - "message": "לא יודע מה הסיסמה? בקש מהשולח את הסיסמה עבור הSend.", + "message": "לא יודע את הסיסמה? בקש מהשולח את הסיסמה הדרושה עבור סֵנְד זה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendHiddenByDefault": { - "message": "הSend הזה מוסתר כברירת מחדל. באפשרותך לשנות את מצב ההסתרה בעזרת הכפתור להלן.", + "message": "סֵנְד זה מוסתר כברירת מחדל. אתה יכול לשנות את מצב הנראות שלו באמצעות הלחצן למטה.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "downloadAttachments": { - "message": "Download attachments" + "message": "הורד צרופות" }, "sendAccessUnavailable": { - "message": "The Send you are trying to access does not exist or is no longer available.", + "message": "הסֵנְד שאליו אתה מנסה לגשת אינו קיים או לא זמין יותר.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "missingSendFile": { - "message": "The file associated with this Send could not be found.", + "message": "הקובץ המשויך עם סֵנְד זה לא נמצא.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "noSendsInList": { @@ -5229,64 +5255,64 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "emergencyAccess": { - "message": "Emergency access" + "message": "גישת חירום" }, "emergencyAccessDesc": { - "message": "Grant and manage emergency access for trusted contacts. Trusted contacts may request access to either View or Takeover your account in case of an emergency. Visit our help page for more information and details into how zero knowledge sharing works." + "message": "הענק ונהל גישת חירום עבור אנשי קשר מהימנים. ייתכן שאנשי קשר מהימנים ידרשו גישה כדי לצפות בחשבון שלך או להשתלט עליו במקרה של מקרה חירום. בקר בעמוד העזרה שלנו עבור מידע נוסף ופרטים על איך שיתוף באפס ידיעה עובד." }, "emergencyAccessOwnerWarning": { - "message": "You are an owner of one or more organizations. If you give takeover access to an emergency contact, they will be able to use all your permissions as owner after a takeover." + "message": "אתה הבעלים של ארגון אחד או יותר. אם תתן גישת השתלטות לאיש קשר לשעת חירום, הוא יוכל להשתמש בכל ההרשאות שלך כבעלים לאחר ההשתלטות." }, "trustedEmergencyContacts": { - "message": "Trusted emergency contacts" + "message": "אנשי קשר לשעת חירום מהימנים" }, "noTrustedContacts": { - "message": "You have not added any emergency contacts yet, invite a trusted contact to get started." + "message": "עדיין לא הוספת איש קשר לשעת חירום, הזמן איש קשר מהימן כדי להתחיל." }, "addEmergencyContact": { - "message": "Add emergency contact" + "message": "הוסף איש קשר לשעת חירום" }, "designatedEmergencyContacts": { - "message": "Designated as emergency contact" + "message": "מונה כאיש קשר לשעת חירום" }, "noGrantedAccess": { - "message": "You have not been designated as an emergency contact for anyone yet." + "message": "עדיין אף אחד לא מינה אותך כאיש קשר לשעת חירום." }, "inviteEmergencyContact": { - "message": "Invite emergency contact" + "message": "הזמן איש קשר לשעת חירום" }, "editEmergencyContact": { - "message": "Edit emergency contact" + "message": "ערוך איש קשר לשעת חירום" }, "inviteEmergencyContactDesc": { - "message": "Invite a new emergency contact by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." + "message": "הזמן איש קשר לשעת חירום חדש על ידי הזנת כתובת הדוא\"ל של חשבון ה־Bitwarden שלו למטה. אם אין לו כבר חשבון Bitwarden, הוא יתבקש ליצור חשבון חדש." }, "emergencyAccessRecoveryInitiated": { - "message": "Emergency access initiated" + "message": "גישת חירום החלה" }, "emergencyAccessRecoveryApproved": { - "message": "Emergency access approved" + "message": "גישת חירום אושרה" }, "viewDesc": { - "message": "Can view all items in your own vault." + "message": "יכול לצפות בכל הפריטים בכספת שלך." }, "takeover": { - "message": "Takeover" + "message": "השתלטות" }, "takeoverDesc": { - "message": "Can reset your account with a new master password." + "message": "יכול לאפס את החשבון שלך עם סיסמה ראשית חדשה." }, "waitTime": { - "message": "Wait time" + "message": "זמן המתנה" }, "waitTimeDesc": { - "message": "Time required before automatically granting access." + "message": "הזמן הנדרש לפני הענקת גישה באופן אוטומטי." }, "oneDay": { - "message": "1 day" + "message": "יום 1" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ ימים", "placeholders": { "days": { "content": "$1", @@ -5295,16 +5321,16 @@ } }, "invitedUser": { - "message": "Invited user." + "message": "המשתמש הוזמן." }, "acceptEmergencyAccess": { - "message": "You've been invited to become an emergency contact for the user listed above. To accept the invitation, you need to log in or create a new Bitwarden account." + "message": "הוזמנת להפוך להיות איש קשר לשעת חירום עבור המשתמש הרשום לעיל. כדי לאשר את ההזמנה, אתה מוכרח להיכנס או ליצור חשבון Bitwarden חדש." }, "emergencyInviteAcceptFailed": { - "message": "Unable to accept invitation. Ask the user to send a new invitation." + "message": "לא ניתן לקבל הזמנה. בקש מהמשתמש לשלוח הזמנה חדשה." }, "emergencyInviteAcceptFailedShort": { - "message": "Unable to accept invitation. $DESCRIPTION$", + "message": "לא ניתן לקבל הזמנה. $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -5313,13 +5339,13 @@ } }, "emergencyInviteAcceptedDesc": { - "message": "You can access the emergency options for this user after your identity has been confirmed. We'll send you an email when that happens." + "message": "אתה יכול לגשת אל אפשרויות החירום עבור משתמש זה לאחר שהזהות שלך אושרה. נשלח לך דוא\"ל כשזה יקרה." }, "requestAccess": { - "message": "Request Access" + "message": "בקש גישה" }, "requestAccessConfirmation": { - "message": "Are you sure you want to request emergency access? You will be provided access after $WAITTIME$ day(s) or whenever the user manually approves the request.", + "message": "האם אתה בטוח שברצונך לבקש גישת חירום? תינתן לך גישה לאחר $WAITTIME$ ימים או מתי שהמשתמש מאשר את הבקשה באופן ידני.", "placeholders": { "waittime": { "content": "$1", @@ -5328,7 +5354,7 @@ } }, "requestSent": { - "message": "Emergency access requested for $USER$. We'll notify you by email when it's possible to continue.", + "message": "ביקשת גישת חירום עבור $USER$. נודיע לך באמצעות דוא\"ל כאשר אפשר להמשיך.", "placeholders": { "user": { "content": "$1", @@ -5337,13 +5363,13 @@ } }, "approve": { - "message": "Approve" + "message": "אשר" }, "reject": { - "message": "Reject" + "message": "דחה" }, "approveAccessConfirmation": { - "message": "Are you sure you want to approve emergency access? This will allow $USER$ to $ACTION$ your account.", + "message": "האם אתה בטוח שברצונך לאשר גישת חירום? זה יאפשר ל־$USER$ לבצע את הפעולה הבאה בחשבון שלך: $ACTION$.", "placeholders": { "user": { "content": "$1", @@ -5356,13 +5382,13 @@ } }, "emergencyApproved": { - "message": "Emergency access approved" + "message": "גישת חירום אושרה" }, "emergencyRejected": { - "message": "Emergency access rejected" + "message": "גישת חירום נדחתה" }, "passwordResetFor": { - "message": "Password reset for $USER$. You can now login using the new password.", + "message": "הסיסמה אופסה עבור $USER$. אתה יכול כעת להיכנס באמצעות הסיסמה החדשה.", "placeholders": { "user": { "content": "$1", @@ -5371,59 +5397,52 @@ } }, "personalOwnership": { - "message": "Remove individual vault" + "message": "הסר כספת אישית" }, "personalOwnershipPolicyDesc": { - "message": "Require members to save items to an organization by removing the individual vault option." + "message": "דרוש מחברים לשמור פריטים לארגון על ידי הסרת האפשרות של כספת אישית." }, "personalOwnershipExemption": { - "message": "Organization owners and administrators are exempt from this policy's enforcement." + "message": "בעלי ארגונים ומנהלים פטורים מהאכיפה של המדיניות הזאת." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise policy, you are restricted from saving items to your individual vault. Change the ownership option to an organization and choose from available collections." + "message": "בשל מדיניות ארגונית, אתה מוגבל מלשמור פריטים לכספת האישית שלך. שנה את אפשרות הבעלות לארגון ובחר מאוספים זמינים." }, "disableSend": { - "message": "Remove Send" + "message": "הסר סֵנְד" }, "disableSendPolicyDesc": { - "message": "Do not allow members to create or edit Sends.", + "message": "אל תאפשר לחברים ליצור או לערוך סֵנְדים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disableSendExemption": { - "message": "Organization members that can manage the organization's policies are exempt from this policy's enforcement." + "message": "חברי ארגון שיכולים לנהל את הפוליסות של הארגון הם פטורים מהאכיפה של המדיניות הזאת." }, "sendDisabled": { - "message": "Send removed", + "message": "סֵנְד הוסר", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an Enterprise policy, you are only able to delete an existing Send.", + "message": "בשל מדיניות ארגונית, אתה יכול למחוק רק סֵנְד קיים.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptions": { - "message": "Send options", + "message": "אפשרויות סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsPolicyDesc": { - "message": "Set options for creating and editing Sends.", + "message": "הגדר אפשרויות ליצירת ועריכת סֵנְדים.", "description": "'Sends' is a plural noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendOptionsExemption": { - "message": "Organization members that can manage the organization's policies are exempt from this policy's enforcement." + "message": "חברי ארגון שיכולים לנהל את הפוליסות של הארגון הם פטורים מהאכיפה של המדיניות הזאת." }, "disableHideEmail": { - "message": "Always show member’s email address with recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", + "message": "הצג תמיד את כתובת הדוא\"ל של חבר מנמענים בעת יצירת או עריכת סֵנְד.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "modifiedPolicyId": { - "message": "Modified policy $ID$.", + "message": "מדיניות $ID$ שונתה.", "placeholders": { "id": { "content": "$1", @@ -5432,79 +5451,79 @@ } }, "planPrice": { - "message": "Plan price" + "message": "מחיר תוכנית" }, "estimatedTax": { - "message": "Estimated tax" + "message": "מס משוער" }, "custom": { - "message": "Custom" + "message": "מותאם אישית" }, "customDesc": { - "message": "Grant customized permissions to members" + "message": "הענק הרשאות מותאמות אישית לחברים" }, "customDescNonEnterpriseStart": { - "message": "Custom roles is an ", + "message": "תפקידים מותאמים אישית היא ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseLink": { - "message": "enterprise feature", + "message": "תכונה ארגונית", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customDescNonEnterpriseEnd": { - "message": ". Contact our support team to upgrade your subscription", + "message": ". פנה אל צוות התמיכה שלנו כדי לשדרג את המנוי שלך", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'" }, "customNonEnterpriseError": { - "message": "To enable custom permissions the organization must be on an Enterprise 2020 plan." + "message": "כדי לאפשר הרשאות מותאמות אישית, הארגון מוכרח להיות בתוכנית ארגונית 2020." }, "permissions": { - "message": "Permissions" + "message": "הרשאות" }, "permission": { - "message": "Permission" + "message": "הרשאה" }, "accessEventLogs": { - "message": "Access event logs" + "message": "גישת יומני אירועים" }, "accessImportExport": { - "message": "Access import/export" + "message": "גישת ייבוא/ייצוא" }, "accessReports": { - "message": "Access reports" + "message": "גישת דוחות" }, "missingPermissions": { - "message": "You lack the necessary permissions to perform this action." + "message": "חסרות לך ההרשאות הנחוצות כדי לבצע פעולה זו." }, "manageAllCollections": { - "message": "Manage all collections" + "message": "ניהול כל האוספים" }, "createNewCollections": { - "message": "Create new collections" + "message": "יצירת אוספים חדשים" }, "editAnyCollection": { - "message": "Edit any collection" + "message": "עריכת כל אוסף" }, "deleteAnyCollection": { - "message": "Delete any collection" + "message": "מחיקת כל אוסף" }, "manageGroups": { - "message": "Manage groups" + "message": "ניהול קבוצות" }, "managePolicies": { - "message": "Manage policies" + "message": "ניהול פוליסות" }, "manageSso": { - "message": "Manage SSO" + "message": "ניהול SSO" }, "manageUsers": { - "message": "Manage users" + "message": "ניהול משתמשים" }, "manageAccountRecovery": { - "message": "Manage account recovery" + "message": "ניהול שחזור חשבון" }, "disableRequiredError": { - "message": "You must manually turn the $POLICYNAME$ policy before this policy can be turned off.", + "message": "אתה מוכרח להפעיל באופן ידני את המדיניות $POLICYNAME$ לפני שיהיה ניתן לכבות את המדיניות הזאת.", "placeholders": { "policyName": { "content": "$1", @@ -5513,153 +5532,132 @@ } }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "מדיניות ארגון משפיעה על אפשרויות הבעלות שלך." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "מדיניות ארגון חסמה ייבוא פריטים אל תוך הכספת האישית שלך." }, "personalOwnershipCheckboxDesc": { - "message": "Remove individual ownership for organization users" - }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "הסר בעלות אישית עבור משתמשי ארגון" }, "send": { - "message": "Send", + "message": "סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineProductDesc": { - "message": "Bitwarden Send transmits sensitive, temporary information to others easily and securely.", + "message": "Bitwarden סֵנְד משדר מידע רגיש וזמני לאחרים באופן קל ומאובטח.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAccessTaglineLearnMore": { - "message": "Learn more about", + "message": "למד עוד אודות", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more about** Bitwarden Send or sign up to try it today.'" }, "sendVaultCardProductDesc": { - "message": "Share text or files directly with anyone." + "message": "שתף קישור או טקסט ישירות עם כל אחד." }, "sendVaultCardLearnMore": { - "message": "Learn more", + "message": "למד עוד", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**Learn more**, see how it works, or try it now. '" }, "sendVaultCardSee": { - "message": "see", + "message": "ראה", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, **see** how it works, or try it now.'" }, "sendVaultCardHowItWorks": { - "message": "how it works", + "message": "איך זה עובד", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see **how it works**, or try it now.'" }, "sendVaultCardOr": { - "message": "or", + "message": "או", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'" }, "developmentDevOpsAndITTeamsChooseBWSecret": { - "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets." + "message": "צוותי פיתוח, DevOps, וטכ\"מ בוחרים את מנהל הסודות של Bitwarden כדי לנהל ולפרוס באופן מאובטח את התשתיות וסודות מכונה שלהם." }, "centralizeSecretsManagement": { - "message": "Centralize secrets management." + "message": "רכז את ניהול הסודות." }, "centralizeSecretsManagementDescription": { - "message": "Securely store and manage secrets in one location to prevent secret sprawl across your organization." + "message": "אחסן ונהל באופן מאובטח סודות במקום אחד כדי למנוע התפשטות סודות ברחבי הארגון שלך." }, "preventSecretLeaks": { - "message": "Prevent secret leaks." + "message": "מנע דליפת סודות." }, "preventSecretLeaksDescription": { - "message": "Protect secrets with end-to-end encryption. No more hard coding secrets or sharing through .env files." + "message": "הגן על הסודות שלך עם הצפנה מקצה־לקצה. לא עוד תכנות נוקשה של סודות או שיתוף באמצעות קבצי env." }, "enhanceDeveloperProductivity": { - "message": "Enhance developer productivity." + "message": "שפר את פריון המפתחים." }, "enhanceDeveloperProductivityDescription": { - "message": "Programmatically retrieve and deploy secrets at runtime so developers can focus on what matters most, like improving code quality." + "message": "אחזר ופרוס סודות באופן תכנותי בזמן ריצה כך שמפתחים יכולים להתמקד במה שחשוב יותר מכל, כמו שיפור איכות הקוד." }, "strengthenBusinessSecurity": { - "message": "Strengthen business security." + "message": "חזק את אבטחת העסק." }, "strengthenBusinessSecurityDescription": { - "message": "Maintain tight control over machine and human access to secrets with SSO integrations, event logs, and access rotation." + "message": "שמור על שליטה הדוקה בגישת מכונות ובני אדם אל סודות עם אינטגרציות SSO, יומני אירועים, ורוטציית גישה." }, "tryItNow": { - "message": "Try it now" + "message": "נסה את זה עכשיו" }, "sendRequest": { - "message": "Send request" + "message": "שלח בקשה" }, "addANote": { - "message": "Add a note" + "message": "הוסף הערה" }, "bitwardenSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "מנהל הסודות של Bitwarden" }, "moreProductsFromBitwarden": { - "message": "More products from Bitwarden" + "message": "עוד מוצרים מאת Bitwarden" }, "requestAccessToSecretsManager": { - "message": "Request access to Secrets Manager" + "message": "בקש גישה אל מנהל הסודות" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { - "message": "You need approval from your administrator to try Secrets Manager." + "message": "אתה צריך אישור מהמנהל שלך כדי לנסות את מנהל הסודות." }, "smAccessRequestEmailSent": { - "message": "Access request for secrets manager email sent to admins." + "message": "דוא\"ל בקשת גישה אל מנהל הסודות נשלח למנהלים." }, "requestAccessSMDefaultEmailContent": { - "message": "Hi,\n\nI am requesting a subscription to Bitwarden Secrets Manager for our team. Your support would mean a great deal!\n\nBitwarden Secrets Manager is an end-to-end encrypted secrets management solution for securely storing, sharing, and deploying machine credentials like API keys, database passwords, and authentication certificates.\n\nSecrets Manager will help us to:\n\n- Improve security\n- Streamline operations\n- Prevent costly secret leaks\n\nTo request a free trial for our team, please reach out to Bitwarden.\n\nThank you for your help!" + "message": "היי,\n\nאני מבקש מנוי למנהל הסודות של Bitwarden עבור הצוות שלנו. התמיכה שלך תהיה משמעותית מאוד!\n\nמנהל הסיסמאות של Bitwarden הוא פתרון ניהול סודות בהצפנה מקצה־לקצה עבור אחסון, שיתוף, ופריסה באופן מאובטח של אישורי מכונה כמו מפתחות API, סיסמאות מסדי נתונים, ותעודות אימות.\n\nמנהל הסודות יכול לעזור לנו:\n\n- לשפר אבטחה\n- לייעל פעולות\n- למנוע דליפת סודות יקרה\n\nכדי לבקש ניסיון חינמי עבור הצוות שלנו, נא ליצור קשר עם Bitwarden.\n\nתודה לך על העזרה שלך!" }, "giveMembersAccess": { - "message": "Give members access:" + "message": "תן לחברים גישה:" }, "viewAndSelectTheMembers": { - "message": "view and select the members you want to give access to Secrets Manager." + "message": "הצג ובחר את החברים שברצונך להעניק להם גישה אל מנהל הסודות." }, "openYourOrganizations": { - "message": "Open your organization's" + "message": "פתח את של הארגון שלך" }, "usingTheMenuSelect": { - "message": "Using the menu, select" + "message": "באמצעות התפריט, בחר את" }, "toGrantAccessToSelectedMembers": { - "message": "to grant access to selected members." + "message": "כדי להעניק גישה לחברים שנבחרו." }, "sendVaultCardTryItNow": { - "message": "try it now", + "message": "נסה את זה עכשיו", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, or **try it now**.'" }, "sendAccessTaglineOr": { - "message": "or", + "message": "או", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send **or** sign up to try it today.'" }, "sendAccessTaglineSignUp": { - "message": "sign up", + "message": "הירשם", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or **sign up** to try it today.'" }, "sendAccessTaglineTryToday": { - "message": "to try it today.", + "message": "כדי לנסות את זה היום.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more about Bitwarden Send or sign up to **try it today.**'" }, "sendAccessCreatorIdentifier": { - "message": "Bitwarden member $USER_IDENTIFIER$ shared the following with you", + "message": "חבר Bitwarden עם המזהה $USER_IDENTIFIER$ שיתף איתך את הדברים הבאים", "placeholders": { "user_identifier": { "content": "$1", @@ -5668,66 +5666,69 @@ } }, "viewSend": { - "message": "View Send", + "message": "הצג סֵנְד", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "viewSendHiddenEmailWarning": { - "message": "The Bitwarden user who created this Send has chosen to hide their email address. You should ensure you trust the source of this link before using or downloading its content.", + "message": "משתמש ה־Bitwarden שיצר את סֵנְד זה בחר להסתיר את כתובת הדוא\"ל שלו. עליך לוודא שאתה בוטח במקור של קישור זה לפני שימוש או הורדה של התוכן שלו.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "תאריך התפוגה שסופק אינו חוקי." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "תאריך המחיקה שסופק אינו חוקי." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "נדרשים תאריך וזמן תפוגה." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "נדרשים תאריך וזמן מחיקה." }, "dateParsingError": { - "message": "There was an error saving your deletion and expiration dates." + "message": "הייתה שגיאה בשמירת תאריכי המחיקה והתפוגה שלך." + }, + "hideYourEmail": { + "message": "הסתר את כתובת הדוא\"ל שלך מצופים." }, "webAuthnFallbackMsg": { - "message": "To verify your 2FA please click the button below." + "message": "כדי לאמת את האימות הדו־גורמי (2FA) שלך לחץ על הלחצן למטה." }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "אמת WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "קרא מפתח אבטחה" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "ממתין לאינטראקציה עם מפתח אבטחה..." }, "webAuthnNotSupported": { - "message": "WebAuthn is not supported in this browser." + "message": "WebAuthn אינו נתמך בדפדפן זה." }, "webAuthnSuccess": { - "message": "WebAuthn verified successfully! You may close this tab." + "message": "WebAuthn אומת בהצלחה! אתה רשאי לסגור כרטיסיה זו." }, "hintEqualsPassword": { - "message": "Your password hint cannot be the same as your password." + "message": "רמז הסיסמה שלך לא יכול להיות אותו הדבר כמו הסיסמה שלך." }, "enrollAccountRecovery": { - "message": "Enroll in account recovery" + "message": "להירשם לשחזור חשבון" }, "enrolledAccountRecovery": { - "message": "Enrolled in account recovery" + "message": "נרשם לשחזור חשבון" }, "withdrawAccountRecovery": { - "message": "Withdraw from account recovery" + "message": "לסגת משחזור חשבון" }, "enrollPasswordResetSuccess": { - "message": "Enrollment success!" + "message": "הצלחת הרשמה!" }, "withdrawPasswordResetSuccess": { - "message": "Withdrawal success!" + "message": "הצלחת נסיגה!" }, "eventEnrollAccountRecovery": { - "message": "User $ID$ enrolled in account recovery.", + "message": "המשתמש $ID$ נרשם לשחזור חשבון.", "placeholders": { "id": { "content": "$1", @@ -5736,7 +5737,7 @@ } }, "eventWithdrawAccountRecovery": { - "message": "User $ID$ withdrew from account recovery.", + "message": "המשתמש $ID$ נסוג משחזור חשבון.", "placeholders": { "id": { "content": "$1", @@ -5745,7 +5746,7 @@ } }, "eventAdminPasswordReset": { - "message": "Master password reset for user $ID$.", + "message": "סיסמה ראשית אופסה עבור המשתמש $ID$.", "placeholders": { "id": { "content": "$1", @@ -5754,7 +5755,7 @@ } }, "eventResetSsoLink": { - "message": "Reset SSO link for user $ID$", + "message": "אפס קישור SSO עבור המשתמש $ID$", "placeholders": { "id": { "content": "$1", @@ -5763,7 +5764,7 @@ } }, "firstSsoLogin": { - "message": "$ID$ logged in using Sso for the first time", + "message": "$ID$ נכנס באמצעות SSO בפעם הראשונה", "placeholders": { "id": { "content": "$1", @@ -5772,10 +5773,10 @@ } }, "resetPassword": { - "message": "Reset password" + "message": "אפס סיסמה" }, "resetPasswordLoggedOutWarning": { - "message": "Proceeding will log $NAME$ out of their current session, requiring them to log back in. Active sessions on other devices may continue to remain active for up to one hour.", + "message": "המשך התהליך יוציא את $NAME$ מההפעלה הנוכחית שלו והוא יידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת.", "placeholders": { "name": { "content": "$1", @@ -5784,229 +5785,229 @@ } }, "thisUser": { - "message": "this user" + "message": "משתמש זה" }, "resetPasswordMasterPasswordPolicyInEffect": { - "message": "One or more organization policies require the master password to meet the following requirements:" + "message": "מדיניות ארגון אחת או יותר דורשת שהסיסמה הראשית תעמוד בדרישות הבאות:" }, "resetPasswordSuccess": { - "message": "Password reset success!" + "message": "הצלחת איפוס סיסמה!" }, "resetPasswordEnrollmentWarning": { - "message": "Enrollment will allow organization administrators to change your master password" + "message": "הרשמה תאפשר למנהלי ארגון לשנות את הסיסמה הראשית שלך" }, "accountRecoveryPolicy": { - "message": "Account recovery administration" + "message": "ניהול שחזור חשבון" }, "accountRecoveryPolicyDesc": { - "message": "Based on the encryption method, recover accounts when master passwords or trusted devices are forgotten or lost." + "message": "בהתבסס על שיטת ההצפנה, שחזר חשבונות כאשר סיסמאות ראשיות או מכשירים מהימנים נשכחו או אבדו." }, "accountRecoveryPolicyWarning": { - "message": "Existing accounts with master passwords will require members to self-enroll before administrators can recover their accounts. Automatic enrollment will turn on account recovery for new members." + "message": "חברים בעלי חשבונות קיימים עם סיסמאות ראשיות יידרשו להירשם בעצמם לפני שמנהלים יוכלו לשחזר את החשבונות שלהם. הרשמה אוטומטית תפעיל שחזור חשבון עבור חברים חדשים." }, "accountRecoverySingleOrgRequirementDesc": { - "message": "The single organization Enterprise policy must be turned on before activating this policy." + "message": "יש להפעיל את המדיניות הארגונית של הארגון היחיד לפני הפעלת מדיניות זו." }, "resetPasswordPolicyAutoEnroll": { - "message": "Automatic enrollment" + "message": "הרשמה אוטומטית" }, "resetPasswordPolicyAutoEnrollCheckbox": { - "message": "Require new members to be enrolled automatically" + "message": "דרוש מחברים חדשים להיות רשומים באופן אוטומטי" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an Enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "לארגון זה יש מדיניות ארגונית שתרשום אותך באופן אוטומטי לאיפוס סיסמה. הרישום יאפשר למנהלי הארגון לשנות את הסיסמה הראשית שלך." }, "resetPasswordOrgKeysError": { - "message": "Organization keys response is null" + "message": "תגובת מפתחות ארגון היא ריקה" }, "resetPasswordDetailsError": { - "message": "Reset password details response is null" + "message": "תגובת פרטי איפוס סיסמה היא ריקה" }, "trashCleanupWarning": { - "message": "Items that have been in trash more than 30 days will be automatically deleted." + "message": "פריטים שהיו באשפה יותר מ־30 יום יימחקו באופן אוטומטי." }, "trashCleanupWarningSelfHosted": { - "message": "Items that have been in trash for a while will be automatically deleted." + "message": "פריטים שהיו באשפה לזמן מה יימחקו באופן אוטומטי." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "בקשה חוזרת של סיסמה ראשית" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "אישור סיסמה ראשית" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "פעולה זו מוגנת. כדי להמשיך, נא להזין שוב את הסיסמה הראשית שלך כדי לאמת את זהותך." }, "reinviteSelected": { - "message": "Resend invitations" + "message": "שלח מחדש הזמנות" }, "resendNotification": { - "message": "Resend notification" + "message": "שלח מחדש התראה" }, "noSelectedUsersApplicable": { - "message": "This action is not applicable to any of the selected users." + "message": "פעולה זו אינה ישימה לאף אחד מהמשתמשים שנבחרו." }, "removeUsersWarning": { - "message": "Are you sure you want to remove the following users? The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "האם אתה בטוח שברצונך להסיר את המשתמשים הבאים? התהליך עלול לקחת מספר שניות להשלמה ולא ניתן לקטוע או לבטל אותו." }, "removeOrgUsersConfirmation": { - "message": "When member(s) are removed, they no longer have access to organization data and this action is irreversible. To add the member back to the organization, they must be invited and onboarded again. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "כאשר החברים מוסרים, אין להם יותר גישה אל נתוני הארגון ופעולה זו היא בלתי הפיכה. כדי להוסיף את החברים בחזרה לארגון, יש להזמין ולקלוט אותם שוב. התהליך עלול לקחת מספר שניות להשלמה ולא ניתן לקטוע או לבטל אותו." }, "revokeUsersWarning": { - "message": "When member(s) are revoked, they no longer have access to organization data. To quickly restore member access, go to the Revoked tab. The process may take a few seconds to complete and cannot be interrupted or canceled." + "message": "כאשר החברים מבוטלים, אין להם יותר גישה אל נתוני הארגון. כדי לשחזר במהירות גישת חבר, עבור לכרטיסיה 'מבוטל'. התהליך עלול לקחת מספר שניות להשלמה ולא ניתן לקטוע או לבטל אותו." }, "theme": { - "message": "Theme" + "message": "ערכת נושא" }, "themeDesc": { - "message": "Choose a theme for your web vault." + "message": "בחר ערכת נושא עבור כספת הרשת שלך." }, "themeSystem": { - "message": "Use system theme" + "message": "השתמש בערכת נושא של המערכת" }, "themeDark": { - "message": "Dark" + "message": "כהה" }, "themeLight": { - "message": "Light" + "message": "בהיר" }, "confirmSelected": { - "message": "Confirm selected" + "message": "אשר את שנבחר" }, "bulkConfirmStatus": { - "message": "Bulk action status" + "message": "מצב פעולה בכמות גדולה" }, "bulkConfirmMessage": { - "message": "Confirmed successfully" + "message": "אושרו בהצלחה" }, "bulkReinviteMessage": { - "message": "Reinvited successfully" + "message": "הוזמנו בהצלחה" }, "bulkRemovedMessage": { - "message": "Removed successfully" + "message": "הוסרו בהצלחה" }, "bulkRevokedMessage": { - "message": "Revoked organization access successfully" + "message": "הגישה לארגון בוטלה בהצלחה" }, "bulkRestoredMessage": { - "message": "Restored organization access successfully" + "message": "הגישה לארגון שוחזרה בהצלחה" }, "bulkFilteredMessage": { - "message": "Excluded, not applicable for this action" + "message": "לא נכללו, לא ישימים עבור פעולה זו" }, "nonCompliantMembersTitle": { - "message": "Non-compliant members" + "message": "חברים שאינם עומדים בדרישות" }, "nonCompliantMembersError": { - "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" + "message": "חברים שאינם עומדים בדרישות מדיניות הארגון היחיד או הכניסה הדו־שלבית אינם ניתנים לשחזור עד שהם יעמדו בדרישות המדיניות" }, "fingerprint": { - "message": "Fingerprint" + "message": "טביעת אצבע" }, "removeUsers": { - "message": "Remove users" + "message": "הסר משתמשים" }, "revokeUsers": { - "message": "Revoke users" + "message": "בטל משתמשים" }, "restoreUsers": { - "message": "Restore users" + "message": "שחזר משתמשים" }, "error": { - "message": "Error" + "message": "שגיאה" }, "decryptionError": { - "message": "Decryption error" + "message": "שגיאת פענוח" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden לא יכל לפענח את פריט(י) הכספת המפורט(ים) להלן." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "צור קשר עם הצלחת לקוחות", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "כדי למנוע אובדן נתונים נוסף.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "accountRecoveryManageUsers": { - "message": "Manage users must also be granted with the manage account recovery permission" + "message": "יש להעניק גם את הרשאת ניהול משתמשים עם ההרשאה לניהול שחזור חשבון" }, "setupProvider": { - "message": "Provider setup" + "message": "הגדרת ספק" }, "setupProviderLoginDesc": { - "message": "You've been invited to setup a new Provider. To continue, you need to log in or create a new Bitwarden account." + "message": "הוזמנת להגדיר ספק חדש. כדי להמשיך, תצטרך להיכנס או ליצור חשבון Bitwarden חדש." }, "setupProviderDesc": { - "message": "Please enter the details below to complete the Provider setup. Contact Customer Support if you have any questions." + "message": "נא להזין את הפרטים למטה כדי להשלים את הגדרת הספק. פנה אל תמיכת לקוחות אם יש לך שאלות כלשהן." }, "providerName": { - "message": "Provider name" + "message": "שם הספק" }, "providerSetup": { - "message": "Provider successfully set up" + "message": "הספק הוגדר בהצלחה" }, "clients": { - "message": "Clients" + "message": "לקוחות" }, "client": { - "message": "Client", + "message": "לקוח", "description": "This is used as a table header to describe which client application created an event log." }, "providerAdmin": { - "message": "Provider admin" + "message": "מנהל הספק" }, "providerAdminDesc": { - "message": "The highest access user that can manage all aspects of your Provider as well as access and manage client organizations." + "message": "המשתמש בעל הגישה הגבוהה ביותר שיכול לנהל את כל ההיבטים של הספק שלך כמו גם לגשת ולנהל ארגוני לקוחות." }, "serviceUser": { - "message": "Service user" + "message": "משתמש שירות" }, "serviceUserDesc": { - "message": "Service users can access and manage all client organizations." + "message": "משתמשי שירות יכולים לגשת אל ולנהל את כל ארגוני הלקוחות." }, "providerInviteUserDesc": { - "message": "Invite a new user to your Provider by entering their Bitwarden account email address below. If they do not have a Bitwarden account already, they will be prompted to create a new account." + "message": "הזמן משתמש חדש אל הספק שלך על ידי הזנת כתובת הדוא\"ל של חשבון ה־Bitwarden שלו למטה. אם אין לו כבר חשבון Bitwarden, הוא יתבקש ליצור חשבון חדש." }, "joinProvider": { - "message": "Join Provider" + "message": "הצטרף לספק" }, "joinProviderDesc": { - "message": "You've been invited to join the Provider listed above. To accept the invitation, you need to log in or create a new Bitwarden account." + "message": "הוזמנת להצטרף אל הספק הרשום לעיל. כדי לאשר את ההזמנה, אתה מוכרח להיכנס או ליצור חשבון Bitwarden חדש." }, "providerInviteAcceptFailed": { - "message": "Unable to accept invitation. Ask a Provider admin to send a new invitation." + "message": "לא ניתן לקבל הזמנה. בקש ממנהל ספק לשלוח הזמנה חדשה." }, "providerInviteAcceptedDesc": { - "message": "You can access this Provider once an administrator confirms your membership. We'll send you an email when that happens." + "message": "תוכל לגשת לספק הזה ברגע שמנהל יאשר את החברות שלך. נשלח לך דוא\"ל כשזה יקרה." }, "providerUsersNeedConfirmed": { - "message": "You have users that have accepted their invitation, but still need to be confirmed. Users will not have access to the Provider until they are confirmed." + "message": "יש לך משתמשים שקיבלו את ההזמנה שלהם, אבל עדיין צריך לאשר אותם. למשתמשים לא תהיה גישה אל הספק עד שהם יאושרו." }, "provider": { - "message": "Provider" + "message": "ספק" }, "newClientOrganization": { - "message": "New client organization" + "message": "ארגון לקוחות חדש" }, "newClientOrganizationDesc": { - "message": "Create a new client organization that will be associated with you as the Provider. You will be able to access and manage this organization." + "message": "צור ארגון לקוחות חדש שישויך אליך בתור הספק. תוכל לגשת לנהל את ארגון זה." }, "newClient": { - "message": "New client" + "message": "לקוח חדש" }, "addExistingOrganization": { - "message": "Add existing organization" + "message": "הוסף ארגון קיים" }, "addNewOrganization": { - "message": "Add new organization" + "message": "הוסף ארגון חדש" }, "myProvider": { - "message": "My Provider" + "message": "הספק שלי" }, "addOrganizationConfirmation": { - "message": "Are you sure you want to add $ORGANIZATION$ as a client to $PROVIDER$?", + "message": "האם אתה בטוח שברצונך להוסיף את $ORGANIZATION$ כלקוח אל $PROVIDER$?", "placeholders": { "organization": { "content": "$1", @@ -6019,10 +6020,10 @@ } }, "organizationJoinedProvider": { - "message": "Organization was successfully added to the Provider" + "message": "ארגון נוסף בהצלחה אל הספק" }, "accessingUsingProvider": { - "message": "Accessing organization using Provider $PROVIDER$", + "message": "ניגש לארגון באמצעות הספק $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -6031,13 +6032,13 @@ } }, "providerIsDisabled": { - "message": "Provider suspended" + "message": "ספק מושעה" }, "providerUpdated": { - "message": "Provider saved" + "message": "ספק נשמר" }, "yourProviderIs": { - "message": "Your Provider is $PROVIDER$. They have administrative and billing privileges for your organization.", + "message": "הספק שלך הוא $PROVIDER$. יש לו הרשאות ניהול וחיוב עבור הארגון שלך.", "placeholders": { "provider": { "content": "$1", @@ -6046,7 +6047,7 @@ } }, "detachedOrganization": { - "message": "The organization $ORGANIZATION$ has been detached from your Provider.", + "message": "הארגון $ORGANIZATION$ נותק מהספק שלך.", "placeholders": { "organization": { "content": "$1", @@ -6055,61 +6056,61 @@ } }, "detachOrganizationConfirmation": { - "message": "Are you sure you want to detach this organization? The organization will continue to exist but will no longer be managed by the Provider." + "message": "האם אתה בטוח שברצונך לנתק ארגון זה? הארגון ימשיך להיות קיים אבל לא ינוהל יותר על ידי הספק." }, "add": { - "message": "Add" + "message": "הוסף" }, "updatedMasterPassword": { - "message": "Master password saved" + "message": "הסיסמה הראשית נשמרה" }, "updateMasterPassword": { - "message": "Update master password" + "message": "עדכן סיסמה ראשית" }, "updateMasterPasswordWarning": { - "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "הסיסמה הראשית שלך שונתה לאחרונה על ידי מנהל בארגון שלך. כדי לגשת אל הכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "masterPasswordInvalidWarning": { - "message": "Your master password does not meet the policy requirements of this organization. In order to join the organization, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "הסיסמה הראשית שלך אינה עומדת בדרישות המדיניות של ארגון זה. כדי להצטרף לארגון, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. המשך התהליך יוציא אותך מההפעלה הנוכחית שלך ותידרש להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "הסיסמה הראשית שלך אינה עומדת באחת או יותר מפוליסות הארגון שלך. כדי לגשת לכספת, אתה מוכרח לעדכן את הסיסמה הראשית שלך עכשיו. בהמשך תנותק מההפעלה הנוכחית שלך, מה שידרוש ממך להיכנס חזרה. הפעלות פעילות במכשירים אחרים עלולות להישאר פעילות למשך עד שעה אחת." }, "automaticAppLogin": { - "message": "Automatically log in users for allowed applications" + "message": "הכנס באופן אוטומטי משתמשים עבור יישומים מותרים" }, "automaticAppLoginDesc": { - "message": "Login forms will automatically be filled and submitted for apps launched from your configured identity provider." + "message": "טפסי כניסה ימולאו ויוגשו באופן אוטומטי עבור יישומים שנפתחו מספק הזהות המוגדר שלך." }, "automaticAppLoginIdpHostLabel": { - "message": "Identity provider host" + "message": "מארח ספק זהות" }, "automaticAppLoginIdpHostDesc": { - "message": "Enter your identity provider host URL. Enter multiple URLs by separating with a comma." + "message": "הזן את כתובת ה־URL של מארח ספק הזהות שלך. הזן מספר כתובות URL על ידי הפרדה עם פסיק." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has updated your decryption options. Please set a master password to access your vault." + "message": "הארגון שלך עדכן את אפשרויות הפענוח שלך. נא להגדיר סיסמה ראשית כדי לגשת לכספת שלך." }, "maximumVaultTimeout": { - "message": "Vault timeout" + "message": "פסק זמן לכספת" }, "maximumVaultTimeoutDesc": { - "message": "Set a maximum vault timeout for members." + "message": "הגדר פסק זמן מרבי לכספת עבור חברים." }, "maximumVaultTimeoutLabel": { - "message": "Maximum vault timeout" + "message": "פסק זמן מרבי לכספת" }, "invalidMaximumVaultTimeout": { - "message": "Invalid maximum vault timeout." + "message": "פסק זמן מרבי לכספת לא חוקי." }, "hours": { - "message": "Hours" + "message": "שעות" }, "minutes": { - "message": "Minutes" + "message": "דקות" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "פוליסות הארגון שלך הגדירו את פסק הזמן לכספת המרבי שלך ל־$HOURS$ שעות ו־$MINUTES$ דקות.", "placeholders": { "hours": { "content": "$1", @@ -6122,7 +6123,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ שעות ו־$MINUTES$ דקות לכל היותר.", "placeholders": { "hours": { "content": "$1", @@ -6135,7 +6136,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "פוליסות הארגון שלך משפיעות על פסק הזמן לכספת שלך. פסק זמן מרבי המותר הוא $HOURS$ שעות ו־$MINUTES$ דקות. פעולת פסק הזמן לכספת שלך מוגדרת ל$ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -6152,7 +6153,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "פוליסות הארגון שלך הגדירו את פעולת פסק הזמן לכספת שלך ל$ACTION$.", "placeholders": { "action": { "content": "$1", @@ -6161,208 +6162,208 @@ } }, "vaultTimeoutToLarge": { - "message": "Your vault timeout exceeds the restriction set by your organization." + "message": "פסק הזמן לכספת שלך חורג מהמגבלה שנקבעה על ידי הארגון שלך." }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "פסק זמן מותאם אישית מינימלי הוא דקה 1." }, "vaultTimeoutRangeError": { - "message": "Vault timeout is not within allowed range." + "message": "פסק זמן לכספת אינו בטווח המותר." }, "disablePersonalVaultExport": { - "message": "Remove individual vault export" + "message": "הסר ייצוא כספת אישית" }, "disablePersonalVaultExportDescription": { - "message": "Do not allow members to export data from their individual vault." + "message": "אל תאפשר לחברים לייצא נתונים מהכספת האישית שלהם." }, "vaultExportDisabled": { - "message": "Vault export removed" + "message": "ייצוא כספת הוסר" }, "personalVaultExportPolicyInEffect": { - "message": "One or more organization policies prevents you from exporting your individual vault." + "message": "מדיניות ארגון אחת או יותר מונעת ממך מלייצא את הכספת האישית שלך." }, "activateAutofill": { - "message": "Activate auto-fill" + "message": "הפעל מילוי אוטומטי" }, "activateAutofillPolicyDesc": { - "message": "Activate the auto-fill on page load setting on the browser extension for all existing and new members." + "message": "הפעל את הגדרת המילוי האוטומטי בעת טעינת עמוד בהרחבת הדפדפן עבור כל החברים הקיימים והחדשים." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "אתרים פרוצים או לא מהימנים יכולים לנצל מילוי אוטומטי בעת טעינת עמוד." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "למד עוד על מילוי אוטומטי" }, "selectType": { - "message": "Select SSO type" + "message": "בחר סוג SSO" }, "type": { - "message": "Type" + "message": "סוג" }, "openIdConnectConfig": { - "message": "OpenID connect configuration" + "message": "תצורת OpenID Connect" }, "samlSpConfig": { - "message": "SAML service provider configuration" + "message": "תצורת ספק שירות SAML" }, "samlIdpConfig": { - "message": "SAML identity provider configuration" + "message": "תצורת ספק זהות SAML" }, "callbackPath": { - "message": "Callback path" + "message": "נתיב התקשרות חזרה" }, "signedOutCallbackPath": { - "message": "Signed out callback path" + "message": "נתיב התקשרות חזרה מנותק" }, "authority": { - "message": "Authority" + "message": "רשות" }, "clientId": { - "message": "Client ID" + "message": "מזהה לקוח" }, "clientSecret": { - "message": "Client secret" + "message": "סוג לקוח" }, "metadataAddress": { - "message": "Metadata address" + "message": "כתובת מטא־נתונים" }, "oidcRedirectBehavior": { - "message": "OIDC redirect behavior" + "message": "התנהגות OIDC בעת ניתוב מחדש" }, "getClaimsFromUserInfoEndpoint": { - "message": "Get claims from user info endpoint" + "message": "קבל דרישות מנקודת הקצה של פרטי המשתמש" }, "additionalScopes": { - "message": "Custom scopes" + "message": "תחום מותאם אישית" }, "additionalUserIdClaimTypes": { - "message": "Custom user ID claim types" + "message": "סוגי דרישות מזהה משתמש מותאם אישית" }, "additionalEmailClaimTypes": { - "message": "Email claim types" + "message": "סוגי דרישות דוא\"ל" }, "additionalNameClaimTypes": { - "message": "Custom name claim types" + "message": "סוגי דרישות שם מותאם אישית" }, "acrValues": { - "message": "Requested authentication context class reference values" + "message": "ערכי ייחוס של מחלקת הקשר אימות מבוקשים" }, "expectedReturnAcrValue": { - "message": "Expected \"acr\" claim value in response" + "message": "ציפה לערך דרישת \"acr\" בתגובה" }, "spEntityId": { - "message": "SP entity ID" + "message": "מזהה ישות ספק שרות (SP)" }, "spMetadataUrl": { - "message": "SAML 2.0 metadata URL" + "message": "כתובת URL של מטא־נתוני SAML 2.0" }, "spAcsUrl": { - "message": "Assertion consumer service (ACS) URL" + "message": "כתובת URL של קביעת שירות צרכן (ACS)" }, "spNameIdFormat": { - "message": "Name ID format" + "message": "תבנית מזהה שם" }, "spOutboundSigningAlgorithm": { - "message": "Outbound signing algorithm" + "message": "אלגוריתם חתימה יוצאת" }, "spSigningBehavior": { - "message": "Signing behavior" + "message": "התנהגות חתימה" }, "spMinIncomingSigningAlgorithm": { - "message": "Minimum incoming signing algorithm" + "message": "אלגוריתם חתימה נכנסת מינימלי" }, "spWantAssertionsSigned": { - "message": "Expect signed assertions" + "message": "צפה לקביעות חתומות" }, "spValidateCertificates": { - "message": "Validate certificates" + "message": "אמת אישורים" }, "spUniqueEntityId": { - "message": "Set a unique SP entity ID" + "message": "הגדר מזהה ישות ספק שירות (SP) ייחודי" }, "spUniqueEntityIdDesc": { - "message": "Generate an identifier that is unique to your organization" + "message": "צור מזהה שהוא ייחודי לארגון שלך" }, "idpEntityId": { - "message": "Entity ID" + "message": "מזהה ישות" }, "idpBindingType": { - "message": "Binding type" + "message": "סוג קשירה" }, "idpSingleSignOnServiceUrl": { - "message": "Single sign-on service URL" + "message": "כתובת URL של שירות כניסה יחידה" }, "idpSingleLogoutServiceUrl": { - "message": "Single log-out service URL" + "message": "כתובת URL של שירות יציאה יחידה" }, "idpX509PublicCert": { - "message": "X509 public certificate" + "message": "תעודת X509 ציבורית" }, "idpOutboundSigningAlgorithm": { - "message": "Outbound signing algorithm" + "message": "אלגוריתם חתימה יוצאת" }, "idpAllowUnsolicitedAuthnResponse": { - "message": "Allow unsolicited authentication response" + "message": "אפשר תגובת אימות לא רצויה" }, "idpAllowOutboundLogoutRequests": { - "message": "Allow outbound logout requests" + "message": "אפשר בקשות יציאה יוצאות" }, "idpSignAuthenticationRequests": { - "message": "Sign authentication requests" + "message": "חתום בקשות אימות" }, "ssoSettingsSaved": { - "message": "Single sign-on configuration saved" + "message": "תצורת כניסה יחידה נשמרה" }, "sponsoredFamilies": { - "message": "Free Bitwarden Families" + "message": "Bitwarden למשפחות בחינם" }, "sponsoredFamiliesEligible": { - "message": "You and your family are eligible for Free Bitwarden Families. Redeem with your personal email to keep your data secure even when you are not at work." + "message": "אתה והמשפחה שלך זכאים ל־Bitwarden למשפחות בחינם. ממש עם הדוא\"ל האישי שלך כדי לשמור על אבטחת הנתונים שלך אפילו כשאתה לא בעבודה." }, "sponsoredFamiliesEligibleCard": { - "message": "Redeem your Free Bitwarden for Families plan today to keep your data secure even when you are not at work." + "message": "ממש את תוכנית Bitwarden למשפחות בחינם שלך היום כדי לשמור על אבטחת הנתונים שלך אפילו כשאתה לא בעבודה." }, "sponsoredFamiliesInclude": { - "message": "The Bitwarden for Families plan include" + "message": "התוכנית Bitwarden למשפחות כוללת" }, "sponsoredFamiliesPremiumAccess": { - "message": "Premium access for up to 6 users" + "message": "גישת פרימיום עד 6 משתמשים" }, "sponsoredFamiliesSharedCollections": { - "message": "Shared collections for Family secrets" + "message": "אוספים משותפים עבור סודות משפחה" }, "badToken": { - "message": "The link is no longer valid. Please have the sponsor resend the offer." + "message": "הקישור אינו חוקי עוד. אנא בקש מנותן החסות לשלוח שוב את ההצעה." }, "reclaimedFreePlan": { - "message": "Reclaimed free plan" + "message": "החזרת את התוכנית החינמית" }, "redeem": { - "message": "Redeem" + "message": "מימוש" }, "sponsoredFamiliesSelectOffer": { - "message": "Select the organization you would like sponsored" + "message": "בחר את הארגון שברצונך להעניק לו חסות" }, "familiesSponsoringOrgSelect": { - "message": "Which Free Families offer would you like to redeem?" + "message": "איזו הצעה למשפחות בחינם היית רוצה לממש?" }, "sponsoredFamiliesEmail": { - "message": "Enter your personal email to redeem Bitwarden Families" + "message": "הזן את הדוא\"ל האישי שלך כדי לממש את Bitwarden למשפחות" }, "sponsoredFamiliesLeaveCopy": { - "message": "If you remove an offer or are removed from the sponsoring organization, your Families sponsorship will expire at the next renewal date." + "message": "אם תסיר הצעה או שהוסרת מהארגון המממן, החסות למשפחות שלך תפוג בתאריך החידוש הבא." }, "acceptBitwardenFamiliesHelp": { - "message": "Accept offer for an existing organization or create a new Families organization." + "message": "קבל הצעה עבור ארגון קיים או צור ארגון משפחות חדש." }, "setupSponsoredFamiliesLoginDesc": { - "message": "You've been offered a free Bitwarden Families plan organization. To continue, you need to log in to the account that received the offer." + "message": "הציעו לך ארגון תוכנית Bitwarden למשפחות בחינם. כדי להמשיך, תצטרך להיכנס לחשבון שקיבל את ההצעה." }, "sponsoredFamiliesAcceptFailed": { - "message": "Unable to accept offer. Please resend the offer email from your Enterprise account and try again." + "message": "לא ניתן לקבל הצעה. נא לשלוח מחדש את דוא\"ל ההצעה מהחשבון הארגוני שלך ולנסות שוב." }, "sponsoredFamiliesAcceptFailedShort": { - "message": "Unable to accept offer. $DESCRIPTION$", + "message": "לא ניתן לקבל הצעה: $DESCRIPTION$", "placeholders": { "description": { "content": "$1", @@ -6371,19 +6372,19 @@ } }, "sponsoredFamiliesOffer": { - "message": "Accept Free Bitwarden Families" + "message": "קבל Bitwarden למשפחות בחינם" }, "sponsoredFamiliesOfferRedeemed": { - "message": "Free Bitwarden Families offer successfully redeemed" + "message": "הצעת Bitwarden למשפחות בחינם מומשה בהצלחה" }, "redeemed": { - "message": "Redeemed" + "message": "מומש" }, "redeemedAccount": { - "message": "Account redeemed" + "message": "החשבון מומש" }, "revokeAccount": { - "message": "Revoke account $NAME$", + "message": "בטל חשבון $NAME$", "placeholders": { "name": { "content": "$1", @@ -6392,7 +6393,7 @@ } }, "resendEmailLabel": { - "message": "Resend sponsorship email to $NAME$ sponsorship", + "message": "שלח מחדש דוא\"ל חסות לנותן החסות $NAME$", "placeholders": { "name": { "content": "$1", @@ -6401,61 +6402,61 @@ } }, "freeFamiliesPlan": { - "message": "Free Families plan" + "message": "תוכנית למשפחות בחינם" }, "redeemNow": { - "message": "Redeem now" + "message": "ממש עכשיו" }, "recipient": { - "message": "Recipient" + "message": "נמען" }, "removeSponsorship": { - "message": "Remove sponsorship" + "message": "הסר חסות" }, "removeSponsorshipConfirmation": { - "message": "After removing a sponsorship, you will be responsible for this subscription and related invoices. Are you sure you want to continue?" + "message": "לאחר הסרת חסות, אתה תהיה אחראי למנוי זה ולחשבוניות קשורות. האם אתה בטוח שברצונך להמשיך?" }, "sponsorshipCreated": { - "message": "Sponsorship created" + "message": "החסות נוצרה" }, "emailSent": { - "message": "Email sent" + "message": "הדוא\"ל נשלח" }, "removeSponsorshipSuccess": { - "message": "Sponsorship removed" + "message": "החסות הוסרה" }, "ssoKeyConnectorError": { - "message": "Key Connector error: make sure Key Connector is available and working correctly." + "message": "שגיאת Key Connector: וודא שה־Key Connector זמין ופועל כראוי." }, "keyConnectorUrl": { - "message": "Key Connector URL" + "message": "כתובת URL של Key Connector" }, "sendVerificationCode": { - "message": "Send a verification code to your email" + "message": "שלח קוד אימות לדוא\"ל שלח" }, "sendCode": { - "message": "Send code" + "message": "שלח קוד" }, "codeSent": { - "message": "Code sent" + "message": "קוד נשלח" }, "verificationCode": { - "message": "Verification code" + "message": "קוד אימות" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "אשר את זהותך כדי להמשיך." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "נדרש קוד אימות." }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "האימות בוטל או לקח זמן רב מדי. נא לנסות שוב." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "קוד אימות שגוי" }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "$ORGANIZATION$ משתמש/ת ב־SSO עם שרת מפתחות באירוח עצמי. סיסמה ראשית כבר לא נדרשת כדי להיכנס עבור חברים של ארגון זה.", "placeholders": { "organization": { "content": "$1", @@ -6464,205 +6465,205 @@ } }, "leaveOrganization": { - "message": "Leave organization" + "message": "עזוב ארגון" }, "removeMasterPassword": { - "message": "Remove master password" + "message": "הסר סיסמה ראשית" }, "removedMasterPassword": { - "message": "Master password removed" + "message": "הסיסמה הראשית הוסרה" }, "allowSso": { - "message": "Allow SSO authentication" + "message": "אפשר אימות SSO" }, "allowSsoDesc": { - "message": "Once set up, your configuration will be saved and members will be able to authenticate using their Identity Provider credentials." + "message": "לאחר ההגדרה, התצורה שלך תשמר וחברים יוכלו לאמת באמצעות אישורי ספק הזהות שלהם." }, "ssoPolicyHelpStart": { - "message": "Use the", + "message": "השתמש ב", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpAnchor": { - "message": "require single sign-on authentication policy", + "message": "מדיניות דרוש אימות כניסה יחידה", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "ssoPolicyHelpEnd": { - "message": "to require all members to log in with SSO.", + "message": "כדי לדרוש מכל החברים להיכנס עם SSO.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Use the require single-sign-on authentication policy to require all members to log in with SSO.'" }, "memberDecryptionOption": { - "message": "Member decryption options" + "message": "אפשרויות פענוח חברים" }, "memberDecryptionPassDesc": { - "message": "Once authenticated, members will decrypt vault data using their master passwords." + "message": "ברגע שאומתו, חברים יפענחו נתוני כספת באמצעות הסיסמאות הראשיות שלהם." }, "keyConnector": { "message": "Key Connector" }, "memberDecryptionKeyConnectorDescStart": { - "message": "Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The", + "message": "חבר כניסה עם SSO למפתח הפענוח של השרת באירוח עצמי שלך. אם תשתמש באפשרות זו, חברים לא יצטרכו להשתמש בסיסמאות הראשיות שלהם כדי לפענח את נתוני הכספת.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescLink": { - "message": "require SSO authentication and single organization policies", + "message": "הפוליסות דרוש אימות SSO וארגון יחיד", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "memberDecryptionKeyConnectorDescEnd": { - "message": "are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.", + "message": "נדרשות עבור הגדרת פענוח Key Connector. פנה אל תמיכת Bitwarden עבור סיוע בהגדרה.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Connect login with SSO to your self-hosted decryption key server. Using this option, members won’t need to use their master passwords to decrypt vault data. The require SSO authentication and single organization policies are required to set up Key Connector decryption. Contact Bitwarden Support for set up assistance.'" }, "keyConnectorPolicyRestriction": { - "message": "\"Login with SSO and Key Connector Decryption\" is activated. This policy will only apply to owners and admins." + "message": "\"כניסה עם SSO ופענוח Key Connector\" מופעל. המדיניות תחול רק על בעלים ומנהלים." }, "enabledSso": { - "message": "SSO turned on" + "message": "SSO מופעל" }, "disabledSso": { - "message": "SSO turned on" + "message": "SSO כבוי" }, "enabledKeyConnector": { - "message": "Key Connector activated" + "message": "Key Connector הופעל" }, "disabledKeyConnector": { - "message": "Key Connector deactivated" + "message": "Key Connector הושבת" }, "keyConnectorWarning": { - "message": "Once members begin using Key Connector, your organization cannot revert to master password decryption. Proceed only if you are comfortable deploying and managing a key server." + "message": "ברגע שמחברים יתחילו להשתמש ב־Key Connector, הארגון שלך לא יוכל לחזור לפענוח סיסמה ראשית. המשך רק אם נוח לך לפרוס ולנהל שרת מפתחות." }, "migratedKeyConnector": { - "message": "Migrated to Key Connector" + "message": "העובר ל־Key Connector" }, "paymentSponsored": { - "message": "Please provide a payment method to associate with the organization. Don't worry, we won't charge you anything unless you select additional features or your sponsorship expires. " + "message": "נא לספק שיטת תשלום לשיוך עם הארגון. אל דאגה, אנחנו לא נחייב אותך בכלום אלא אם תבחר תכונות נוספות או שהחסות שלך תפוג. " }, "orgCreatedSponsorshipInvalid": { - "message": "The sponsorship offer has expired. You may delete the organization you created to avoid a charge at the end of your 7 day trial. Otherwise you may close this prompt to keep the organization and assume billing responsibility." + "message": "פג תוקפה של הצעת החסות. אתה יכול למחוק את הארגון שיצרת כדי להימנע מחיוב בסוף הניסיון בן 7 הימים שלך. אחרת אתה יכול לסגור הנחיה זו כדי להשאיר את הארגון ולקחת אחריות על החיוב." }, "newFamiliesOrganization": { - "message": "New Families organization" + "message": "ארגון משפחות חדש" }, "acceptOffer": { - "message": "Accept offer" + "message": "קבל הצעה" }, "sponsoringOrg": { - "message": "Sponsoring organization" + "message": "ארגון נותן חסות" }, "keyConnectorTest": { - "message": "Test" + "message": "בדיקה" }, "keyConnectorTestSuccess": { - "message": "Success! Key Connector reached." + "message": "הצלחה! Key Connector הושג." }, "keyConnectorTestFail": { - "message": "Cannot reach Key Connector. Check URL." + "message": "לא ניתן להשיג Key Connector. בדוק URL." }, "sponsorshipTokenHasExpired": { - "message": "The sponsorship offer has expired." + "message": "פג תוקפה של הצעת החסות." }, "freeWithSponsorship": { - "message": "FREE with sponsorship" + "message": "חינם עם חסות" }, "viewBillingSyncToken": { - "message": "View billing sync token" + "message": "הצג אסימון סנכרון חיוב" }, "generateBillingToken": { - "message": "Generate billing token" + "message": "צור אסימון חיוב" }, "copyPasteBillingSync": { - "message": "Copy and paste this token into the billing sync settings of your self-hosted organization." + "message": "העתק והדבק את האסימון הזה לתוך הגדרות סנכרון החיוב של הארגון באירוח עצמי שלך." }, "billingSyncCanAccess": { - "message": "Your billing sync token can access and edit this organization's subscription settings." + "message": "אסימון סנכרון החיוב שלך יכול לגשת אל ולערוך את הגדרות המנוי של ארגון זה." }, "manageBillingTokenSync": { - "message": "Manage Billing Token" + "message": "נהל אסימון חיוב" }, "setUpBillingSync": { - "message": "Set up billing sync" + "message": "הגדר סנכרון חיוב" }, "generateToken": { - "message": "Generate token" + "message": "צור אסימון" }, "rotateToken": { - "message": "Rotate token" + "message": "סובב אסימון" }, "rotateBillingSyncTokenWarning": { - "message": "If you proceed, you will need to re-setup billing sync on your self-hosted server." + "message": "אם תמשיך, תצטרך להגדיר מחדש סנכרון חיוב בשרת באירוח עצמי שלך." }, "rotateBillingSyncTokenTitle": { - "message": "Rotating the billing sync token will invalidate the previous token." + "message": "סיבוב של אסימון סנכרון החיוב יבטל את התוקף של האסימון הקודם." }, "selfHostedServer": { - "message": "self-hosted" + "message": "אירוח עצמי" }, "customEnvironment": { - "message": "Custom environment" + "message": "סביבה מותאמת אישית" }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "ציין את בסיס ה־URL של התקנת Bitwarden באירוח מקומי שלך. דוגמה: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { - "message": "For advanced configuration, you can specify the base URL of each service independently." + "message": "עבור תצורה מתקדמת, באפשרותך לציין את בסיס ה־URL של כל שירות בנפרד." }, "selfHostedEnvFormInvalid": { - "message": "You must add either the base Server URL or at least one custom environment." + "message": "אתה מוכרח להוסיף או את בסיס ה־URL של השרת או לפחות סביבה מותאמת אישית אחת." }, "apiUrl": { - "message": "API server URL" + "message": "URL של שרת ה־API" }, "webVaultUrl": { - "message": "Web vault server URL" + "message": "URL של שרת כספת הרשת" }, "identityUrl": { - "message": "Identity server URL" + "message": "URL של שרת הזהות" }, "notificationsUrl": { - "message": "Notifications server URL" + "message": "URL של שרת ההודעות" }, "iconsUrl": { - "message": "Icons server URL" + "message": "URL של שרת הסמלים" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "כתובות URL של הסביבה נשמרו" }, "selfHostingTitle": { - "message": "Self-hosting" + "message": "אירוח עצמי" }, "selfHostingEnterpriseOrganizationSectionCopy": { - "message": "To set-up your organization on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up billing sync." + "message": "כדי להגדיר את הארגון שלך בשרת שלך, תצטרך להעלות את קובץ הרישיון שלך. כדי לתמוך בתוכניות למשפחות בחינם וביכולות חיוב מתקדמות עבור הארגון באירוח עצמי שלך, תצטרך להגדיר סנכרון חיוב." }, "billingSyncApiKeyRotated": { - "message": "Token rotated" + "message": "האסימון סובב" }, "billingSyncKeyDesc": { - "message": "A billing sync token from your cloud organization's subscription settings is required to complete this form." + "message": "נדרש אסימון סנכרון חיוב מהגדרות המנוי של הארגון בענן שלך כדי להשלים טופס זה." }, "billingSyncKey": { - "message": "Billing sync token" + "message": "אסימון סנכרון חיוב" }, "automaticBillingSyncDesc": { - "message": "Automatic sync unlocks Families sponsorships and allows you to sync your license without uploading a file. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "סנכרון אוטומטי פותח חסויות למשפחות ומאפשר לך לסנכרן את הרישיון שלך מבלי להעלות קובץ. לאחר ביצוע עדכונים בשרת הענן של Bitwarden, בחר 'סנכרן רישיון' כדי להחיל שינויים." }, "active": { - "message": "Active" + "message": "פעיל" }, "inactive": { - "message": "Inactive" + "message": "לא פעיל" }, "sentAwaitingSync": { - "message": "Sent (awaiting sync)" + "message": "נשלח (ממתין לסנכרון)" }, "sent": { - "message": "Sent" + "message": "נשלח" }, "requestRemoved": { - "message": "Removed (awaiting sync)" + "message": "הוסר (ממתין לסנכרון)" }, "requested": { - "message": "Requested" + "message": "נדרש" }, "formErrorSummaryPlural": { - "message": "$COUNT$ fields above need your attention.", + "message": "$COUNT$ שדות למעלה צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -6671,10 +6672,10 @@ } }, "formErrorSummarySingle": { - "message": "1 field above needs your attention." + "message": "שדה 1 למעלה צריך את תשומת לבך." }, "fieldRequiredError": { - "message": "$FIELDNAME$ is required.", + "message": "$FIELDNAME$ נדרש/ת.", "placeholders": { "fieldname": { "content": "$1", @@ -6683,10 +6684,10 @@ } }, "required": { - "message": "required" + "message": "נדרש" }, "charactersCurrentAndMaximum": { - "message": "$CURRENT$/$MAX$ character maximum", + "message": "$CURRENT$/$MAX$ תווים מקסימום", "placeholders": { "current": { "content": "$1", @@ -6699,7 +6700,7 @@ } }, "characterMaximum": { - "message": "$MAX$ character maximum", + "message": "$MAX$ תווים מקסימום", "placeholders": { "max": { "content": "$1", @@ -6708,31 +6709,31 @@ } }, "idpSingleSignOnServiceUrlRequired": { - "message": "Required if Entity ID is not a URL." + "message": "נדרש אם מזהה הישות אינו URL." }, "offerNoLongerValid": { - "message": "This offer is no longer valid. Contact your organization administrators for more information." + "message": "הצעה זו אינה תקפה עוד. צור קשר עם מנהלי הארגון שלך למידע נוסף." }, "openIdOptionalCustomizations": { - "message": "Optional customizations" + "message": "התאמות אישיות אופציונליות" }, "openIdAuthorityRequired": { - "message": "Required if Authority is not valid." + "message": "נדרשת אם הרשות אינה חוקית." }, "separateMultipleWithComma": { - "message": "Separate multiple with a comma." + "message": "הפרד מרובים עם פסיק." }, "sessionTimeout": { - "message": "Your session has timed out. Please go back and try logging in again." + "message": "זמן ההפעלה שלך תם. נא לחזור ולנסות להיכנס שוב." }, "exportingPersonalVaultTitle": { - "message": "Exporting individual vault" + "message": "מייצא כספת אישית" }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "מייצא כספת ארגון" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "רק פריטי הכספת האישית המשויכת עם $EMAIL$ ייוצאו. פריטי כספת ארגון לא יכללו. רק פרטי פריט כספת ייוצאו ולא יכללו צרופות משויכות.", "placeholders": { "email": { "content": "$1", @@ -6741,7 +6742,7 @@ } }, "exportingOrganizationVaultDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "message": "רק כספת הארגון המשויכת עם $ORGANIZATION$ תיוצא. פריטים בכספת אישית או ארגונים אחרים לא יכללו.", "placeholders": { "organization": { "content": "$1", @@ -6750,32 +6751,32 @@ } }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "גישה נדחתה. אין לך הרשאות כדי לצפות בעמוד זה." }, "masterPassword": { - "message": "Master password" + "message": "סיסמה ראשית" }, "security": { - "message": "Security" + "message": "אבטחה" }, "keys": { - "message": "Keys" + "message": "מפתחות" }, "billingHistory": { - "message": "Billing history" + "message": "היסטוריית חיובים" }, "backToReports": { - "message": "Back to reports" + "message": "חזרה לדוחות" }, "organizationPicker": { - "message": "Organization picker" + "message": "בוחר ארגון" }, "currentOrganization": { - "message": "Current organization", + "message": "ארגון נוכחי", "description": "This is used by screen readers to indicate the organization that is currently being shown to the user." }, "accountLoggedInAsName": { - "message": "Account: Logged in as $NAME$", + "message": "חשבון: מחובר בתור $NAME$", "placeholders": { "name": { "content": "$1", @@ -6784,20 +6785,20 @@ } }, "accountSettings": { - "message": "Account settings" + "message": "הגדרות חשבון" }, "generator": { - "message": "Generator", + "message": "מחולל", "description": "Short for 'credential generator'." }, "generateUsername": { - "message": "Generate username" + "message": "צור שם משתמש" }, "generateEmail": { - "message": "Generate email" + "message": "צור דוא\"ל" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "הערך חייב להיות בין $MIN$ ל־$MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6811,7 +6812,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " השתמש ב־$RECOMMENDED$ תווים או יותר כדי ליצור סיסמה חזקה.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6821,7 +6822,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " השתמש ב־$RECOMMENDED$ מילים או יותר כדי ליצור ביטוי סיסמה חזק.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6831,59 +6832,59 @@ } }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "דוא\"ל ממוען בפלוס", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "השתמש ביכולות מיעון משנה של ספק הדוא\"ל שלך." }, "catchallEmail": { - "message": "Catch-all email" + "message": "דוא\"ל תופס־כל" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "השתמש בתיבת דואר תפוס־כל המוגדרת בדומיין שלך." }, "useThisEmail": { - "message": "Use this email" + "message": "השתמש בדוא\"ל זה" }, "random": { - "message": "Random", + "message": "אקראי", "description": "Generates domain-based username using random letters" }, "randomWord": { - "message": "Random word" + "message": "מילה אקראית" }, "usernameGenerator": { - "message": "Username generator" + "message": "מחולל שם משתמש" }, "useThisPassword": { - "message": "Use this password" + "message": "השתמש בסיסמה זו" }, "useThisUsername": { - "message": "Use this username" + "message": "השתמש בשם משתמש זה" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "סיסמה מאובטחת נוצרה! אל תשכח גם לעדכן את הסיסמה שלך באתר האינטרנט." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "השתמש במחולל", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "כדי ליצור סיסמה חזקה וייחודית", "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'" }, "service": { - "message": "Service" + "message": "שירות" }, "unknownCipher": { - "message": "Unknown item, you may need to request permission to access this item." + "message": "פריט לא ידוע, ייתכן שאתה צריך לבקש הרשאה כדי לגשת אל פריט זה." }, "cannotSponsorSelf": { - "message": "You cannot redeem for the active account. Enter a different email." + "message": "אינך יכול לממש עבור החשבון הפעיל. הזן דוא\"ל אחר." }, "revokeWhenExpired": { - "message": "Expires $DATE$", + "message": "יפוג $DATE$", "placeholders": { "date": { "content": "$1", @@ -6892,7 +6893,7 @@ } }, "awaitingSyncSingular": { - "message": "Token rotated $DAYS$ day ago. Update the billing sync token in your self-hosted organization settings.", + "message": "האסימון סובב לפני $DAYS$ יום. עדכן את אסימון סנכרון החיוב בהגדרות הארגון באירוח עצמי שלך.", "placeholders": { "days": { "content": "$1", @@ -6901,7 +6902,7 @@ } }, "awaitingSyncPlural": { - "message": "Token rotated $DAYS$ days ago. Update the billing sync token in your self-hosted organization settings.", + "message": "האסימון סובב לפני $DAYS$ יום. עדכן את אסימון סנכרון החיוב בהגדרות הארגון באירוח עצמי שלך.", "placeholders": { "days": { "content": "$1", @@ -6910,14 +6911,14 @@ } }, "lastSync": { - "message": "Last sync", + "message": "סנכרון אחרון", "description": "Used as a prefix to indicate the last time a sync occurred. Example \"Last sync 1968-11-16 00:00:00\"" }, "sponsorshipsSynced": { - "message": "Self-hosted sponsorships synced." + "message": "חסויות של אירוח עצמי סונכרנו." }, "billingManagedByProvider": { - "message": "Managed by $PROVIDER$", + "message": "מנוהל על ידי $PROVIDER$", "placeholders": { "provider": { "content": "$1", @@ -6926,25 +6927,25 @@ } }, "billingContactProviderForAssistance": { - "message": "Please reach out to them for further assistance", + "message": "נא ליצור איתם קשר עבור סיוע נוסף", "description": "This text is displayed if an organization's billing is managed by a Provider. It tells the user to contact the Provider for assistance." }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "כינוי דוא\"ל מועבר" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "צור כינוי דוא\"ל עם שירות העברה חיצוני." }, "forwarderDomainName": { - "message": "Email domain", + "message": "דומיין דוא\"ל", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "בחר דומיין שנתמך על ידי השירות הנבחר", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { - "message": "$SERVICENAME$ error: $ERRORMESSAGE$", + "message": "$SERVICENAME$ שגיאה: $ERRORMESSAGE$", "description": "Reports an error returned by a forwarding service to the user.", "placeholders": { "servicename": { @@ -6958,11 +6959,11 @@ } }, "forwarderGeneratedBy": { - "message": "Generated by Bitwarden.", + "message": "נוצר על ידי Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Website: $WEBSITE$. Generated by Bitwarden.", + "message": "אתר: $WEBSITE$. נוצר על ידי Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -6972,7 +6973,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "אסימון API של $SERVICENAME$ לא חוקי", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -6982,7 +6983,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "אסימון API של $SERVICENAME$ לא חוקי: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -6996,7 +6997,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ סירב לבקשה שלך. נא ליצור קשר עם נותן השירות שלך עבור סיוע.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -7006,7 +7007,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ סירב לבקשה שלך: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -7020,7 +7021,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "לא ניתן להשיג מזהה חשבון דוא\"ל מסווה של $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -7030,7 +7031,7 @@ } }, "forwarderNoDomain": { - "message": "Invalid $SERVICENAME$ domain.", + "message": "דומיין $SERVICENAME$ לא חוקי.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -7040,7 +7041,7 @@ } }, "forwarderNoUrl": { - "message": "Invalid $SERVICENAME$ url.", + "message": "כתובת url של $SERVICENAME$ לא חוקית.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -7050,7 +7051,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "התרחשה שגיאת $SERVICENAME$ לא ידועה.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -7060,7 +7061,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "משלח לא ידוע: '$SERVICENAME$'.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -7070,23 +7071,23 @@ } }, "hostname": { - "message": "Hostname", + "message": "שם מארח", "description": "Part of a URL." }, "deviceVerification": { - "message": "Device verification" + "message": "אימות מכשיר" }, "enableDeviceVerification": { - "message": "Turn on device verification" + "message": "הפעל אימות מכשיר" }, "deviceVerificationDesc": { - "message": "Verification codes are sent to your email address when logging in from an unrecognized device" + "message": "קודי אימות נשלחים לכתובת הדוא\"ל שלך בעת כניסה ממכשיר לא מזוהה" }, "updatedDeviceVerification": { - "message": "Updated device verification" + "message": "אימות מכשיר מעודכן" }, "areYouSureYouWantToEnableDeviceVerificationTheVerificationCodeEmailsWillArriveAtX": { - "message": "Are you sure you want to turn on device verification? The verification code emails will arrive at: $EMAIL$", + "message": "האם אתה בטוח שברצונך להפעיל אימות מכשיר? הודעות דוא\"ל עם קוד אימות יגיעו אל: $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -7095,52 +7096,52 @@ } }, "premiumSubcriptionRequired": { - "message": "Premium subscription required" + "message": "נדרש מנוי פרימיום" }, "scim": { - "message": "SCIM provisioning", + "message": "הקצאת SCIM", "description": "The text, 'SCIM', is an acronym and should not be translated." }, "scimDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning", + "message": "הקצה באופן אוטומטי משתמשים וקבוצות עם ספקי הזהות המועדפים עליך באמצעות הקצאת SCIM", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations", + "message": "הקצה באופן אוטומטי משתמשים וקבוצות עם ספקי הזהות המועדפים עליך באמצעות הקצאת SCIM. מצא שילובים נתמכים", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { - "message": "Enable SCIM", + "message": "הפעל SCIM", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDescHelpText": { - "message": "Set up your preferred identity provider by configuring the URL and SCIM API Key", + "message": "הגדר את ספק הזהות המועדף עליך באמצעות הגדרת כתובת ה־URL ומפתח ה־API של SCIM", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimApiKeyHelperText": { - "message": "This API key has access to manage users within your organization. It should be kept secret." + "message": "למפתח API זה יש גישה לנהל משתמשים בתוך הארגון שלך. יש לשמור עליו בסוד." }, "copyScimKey": { - "message": "Copy the SCIM API key to your clipboard", + "message": "העתק את מפתח ה־API של SCIM ללוח ההעתקה שלך", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKey": { - "message": "Rotate the SCIM API key", + "message": "סובב את מפתח ה־API של SCIM", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { - "message": "Are you sure you want to rotate the SCIM API Key? The current key will no longer work for any existing integrations.", + "message": "האם אתה בטוח שברצונך לסובב את מפתח ה־API של SCIM? המפתח הנוכחי לא יעבוד יותר עם שילובים קיימים כלשהם.", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { - "message": "Rotate key" + "message": "סובב מפתח" }, "scimApiKey": { - "message": "SCIM API key", + "message": "מפתח API של SCIM", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "copyScimUrl": { - "message": "Copy the SCIM endpoint URL to your clipboard", + "message": "העתק את כתובת ה־URL של נקודת קצה SCIM ללוח ההעתקה שלך", "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimUrl": { @@ -7148,21 +7149,21 @@ "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { - "message": "SCIM API key successfully rotated", + "message": "מפתח API של SCIM סובב בהצלחה", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { - "message": "SCIM settings saved", + "message": "הגדרות SCIM נשמרו", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "inputRequired": { - "message": "Input is required." + "message": "נדרש קלט." }, "inputEmail": { - "message": "Input is not an email address." + "message": "קלט הוא לא כתובת דוא\"ל." }, "inputMinLength": { - "message": "Input must be at least $COUNT$ characters long.", + "message": "אורך הקלט חייב להיות לפחות $COUNT$ תווים.", "placeholders": { "count": { "content": "$1", @@ -7171,7 +7172,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "אורך הקלט לא יעלה על $COUNT$ תווים.", "placeholders": { "count": { "content": "$1", @@ -7180,7 +7181,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "התווים הבאים אינם מותרים: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -7189,7 +7190,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "ערך הקלט חייב להיות לפחות $MIN$.", "placeholders": { "min": { "content": "$1", @@ -7198,7 +7199,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "ערך הקלט לא יעלה על $MAX$.", "placeholders": { "max": { "content": "$1", @@ -7207,10 +7208,10 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "כתובת דוא\"ל 1 או יותר אינה חוקית" }, "tooManyEmails": { - "message": "You can only submit up to $COUNT$ emails at a time", + "message": "אתה יכול לשלוח רק עד $COUNT$ הודעות דוא\"ל בו זמנית", "placeholders": { "count": { "content": "$1", @@ -7219,7 +7220,7 @@ } }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ שדות למעלה צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -7228,10 +7229,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "שדה 1 צריך את תשומת לבך." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ שדות צריכים את תשומת לבך.", "placeholders": { "count": { "content": "$1", @@ -7240,255 +7241,249 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "שגיאה בהתחברות עם השירות Duo. השתמש בשיטת כניסה דו־שלבית אחרת או פנה אל Duo לסיוע." }, "launchDuoAndFollowStepsToFinishLoggingIn": { - "message": "Launch Duo and follow the steps to finish logging in." + "message": "פתח את Duo ועקוב אחר השלבים כדי לסיים להיכנס." }, "duoRequiredByOrgForAccount": { - "message": "Duo two-step login is required for your account." + "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "נדרשת כניסה דו־שלבית של Duo עבור החשבון שלך. עקוב אחר השלבים למטה כדי לסיים להיכנס." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "עקוב אחר השלבים למטה כדי לסיים להיכנס." }, "launchDuo": { - "message": "Launch Duo" + "message": "פתח את Duo" }, "turnOn": { - "message": "Turn on" + "message": "הפעל" }, "on": { - "message": "On" + "message": "מופעל" }, "off": { - "message": "Off" + "message": "כבוי" }, "members": { - "message": "Members" + "message": "חברים" }, "reporting": { - "message": "Reporting" + "message": "מדווח" }, "numberOfUsers": { - "message": "Number of users" - }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" + "message": "מספר משתמשים" }, "pickAnAvatarColor": { - "message": "Pick an avatar color" + "message": "בחר צבע יצגן" }, "customizeAvatar": { - "message": "Customize avatar" + "message": "התאם אישית יצגן" }, "avatarUpdated": { - "message": "Avatar updated" + "message": "יצגן עודכן" }, "brightBlue": { - "message": "Bright Blue" + "message": "כחול בהיר" }, "green": { - "message": "Green" + "message": "ירוק" }, "orange": { - "message": "Orange" + "message": "כתום" }, "lavender": { - "message": "Lavender" + "message": "לבנדר" }, "yellow": { - "message": "Yellow" + "message": "צהוב" }, "indigo": { - "message": "Indigo" + "message": "אינדיגו" }, "teal": { - "message": "Teal" + "message": "ירוק כחלחל" }, "salmon": { - "message": "Salmon" + "message": "סלמון" }, "pink": { - "message": "Pink" + "message": "ורוד" }, "customColor": { - "message": "Custom Color" + "message": "צבע מותאם אישית" }, "selectPlaceholder": { - "message": "-- Select --" + "message": "-- בחר --" }, "multiSelectPlaceholder": { - "message": "-- Type to filter --" + "message": "-- הקלד כדי לסנן --" }, "multiSelectLoading": { - "message": "Retrieving options..." + "message": "מאחזר אפשרויות..." }, "multiSelectNotFound": { - "message": "No items found" + "message": "לא נמצאו פריטים" }, "multiSelectClearAll": { - "message": "Clear all" + "message": "נקה הכל" }, "toggleCharacterCount": { - "message": "Toggle character count", + "message": "החלף מצב מונה תווים", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "passwordCharacterCount": { - "message": "Password character count", + "message": "מונה תווי סיסמה", "description": "'Character count' describes a feature that displays a number next to each character of the password." }, "hide": { - "message": "Hide" + "message": "הסתר" }, "projects": { - "message": "Projects", + "message": "פרויקטים", "description": "Description for the Projects field." }, "lastEdited": { - "message": "Last edited", + "message": "נערך לאחרונה", "description": "The label for the date and time when a item was last edited." }, "editSecret": { - "message": "Edit secret", + "message": "ערוך סוד", "description": "Action to modify an existing secret." }, "addSecret": { - "message": "Add secret", + "message": "הוסף סוד", "description": "Action to create a new secret." }, "copySecretName": { - "message": "Copy secret name", + "message": "העתק שם סוד", "description": "Action to copy the name of a secret to the system's clipboard." }, "copySecretValue": { - "message": "Copy secret value", + "message": "העתק ערך סוד", "description": "Action to copy the value of a secret to the system's clipboard." }, "deleteSecret": { - "message": "Delete secret", + "message": "מחק סוד", "description": "Action to delete a single secret from the system." }, "deleteSecrets": { - "message": "Delete secrets", + "message": "מחק סודות", "description": "The action to delete multiple secrets from the system." }, "hardDeleteSecret": { - "message": "Permanently delete secret" + "message": "מחק סוד לצמיתות" }, "hardDeleteSecrets": { - "message": "Permanently delete secrets" + "message": "מחק סודות לצמיתות" }, "secretProjectAssociationDescription": { - "message": "Select projects that the secret will be associated with. Only organization users with access to these projects will be able to see the secret.", + "message": "בחר פרויקטים שאליהם הסוד ישויך. רק משתמשי ארגון עם גישה לפרויקטים האלה יוכלו לראות את הסוד.", "description": "A prompt explaining how secrets can be associated with projects." }, "selectProjects": { - "message": "Select projects", + "message": "בחירת פרויקטים", "description": "A label for a type-to-filter input field to choose projects." }, "searchProjects": { - "message": "Search projects", + "message": "חפש פרויקטים", "description": "Label for the search bar used to search projects." }, "project": { - "message": "Project", + "message": "פרויקט", "description": "Similar to collections, projects can be used to group secrets." }, "editProject": { - "message": "Edit project", + "message": "ערוך פרויקט", "description": "The action to modify an existing project." }, "viewProject": { - "message": "View project", + "message": "הצג פרויקט", "description": "The action to view details of a project." }, "deleteProject": { - "message": "Delete project", + "message": "מחק פרויקט", "description": "The action to delete a project from the system." }, "deleteProjects": { - "message": "Delete projects", + "message": "מחק פרויקטים", "description": "The action to delete multiple projects from the system." }, "secret": { - "message": "Secret", + "message": "סוד", "description": "Label for a secret (key/value pair)" }, "serviceAccount": { - "message": "Service account", + "message": "חשבון שירות", "description": "A machine user which can be used to automate processes and access secrets in the system." }, "serviceAccounts": { - "message": "Service accounts", + "message": "חשבונות שירות", "description": "The title for the section that deals with service accounts." }, "secrets": { - "message": "Secrets", + "message": "סודות", "description": "The title for the section of the application that deals with secrets." }, "nameValuePair": { - "message": "Name/Value pair", + "message": "צמד שם/ערך", "description": "Title for a name/ value pair. Secrets typically consist of a name and value pair." }, "secretEdited": { - "message": "Secret edited", + "message": "סוד נערך", "description": "Notification for the successful editing of a secret." }, "secretCreated": { - "message": "Secret created", + "message": "הסוד נוצר", "description": "Notification for the successful creation of a secret." }, "newSecret": { - "message": "New secret", + "message": "סוד חדש", "description": "Title for creating a new secret." }, "newServiceAccount": { - "message": "New service account", + "message": "חשבון שירות חדש", "description": "Title for creating a new service account." }, "secretsNoItemsTitle": { - "message": "No secrets to show", + "message": "אין סודות להצגה", "description": "Empty state to indicate that there are no secrets to display." }, "secretsNoItemsMessage": { - "message": "To get started, add a new secret or import secrets.", + "message": "כדי להתחיל, הוסף סוד חדש או יבא סודות.", "description": "Message to encourage the user to start adding secrets." }, "secretsTrashNoItemsMessage": { - "message": "There are no secrets in the trash." + "message": "אין סודות באשפה." }, "serviceAccountsNoItemsMessage": { - "message": "Create a new service account to get started automating secret access.", + "message": "צור חשבון שירות חדש כדי להתחיל לאטמט גישת סודות.", "description": "Message to encourage the user to start creating service accounts." }, "serviceAccountsNoItemsTitle": { - "message": "Nothing to show yet", + "message": "אין מה להראות עדיין", "description": "Title to indicate that there are no service accounts to display." }, "searchSecrets": { - "message": "Search secrets", + "message": "חפש סודות", "description": "Placeholder text for searching secrets." }, "deleteServiceAccounts": { - "message": "Delete service accounts", + "message": "מחק חשבונות שירות", "description": "Title for the action to delete one or multiple service accounts." }, "deleteServiceAccount": { - "message": "Delete service account", + "message": "מחק חשבון שירות", "description": "Title for the action to delete a single service account." }, "viewServiceAccount": { - "message": "View service account", + "message": "הצג חשבון שירות", "description": "Action to view the details of a service account." }, "deleteServiceAccountDialogMessage": { - "message": "Deleting service account $SERVICE_ACCOUNT$ is permanent and irreversible.", + "message": "מחיקת חשבון שירות $SERVICE_ACCOUNT$ היא לצמיתות ובלתי הפיכה.", "placeholders": { "service_account": { "content": "$1", @@ -7497,10 +7492,10 @@ } }, "deleteServiceAccountsDialogMessage": { - "message": "Deleting service accounts is permanent and irreversible." + "message": "מחיקת חשבונות שירות היא לצמיתות ובלתי הפיכה." }, "deleteServiceAccountsConfirmMessage": { - "message": "Delete $COUNT$ service accounts", + "message": "מחק $COUNT$ חשבונות שירות", "placeholders": { "count": { "content": "$1", @@ -7509,98 +7504,98 @@ } }, "deleteServiceAccountToast": { - "message": "Service account deleted" + "message": "חשבון השירות נמחק" }, "deleteServiceAccountsToast": { - "message": "Service accounts deleted" + "message": "חשבונות השירות נמחקו" }, "searchServiceAccounts": { - "message": "Search service accounts", + "message": "חפש חשבונות שירות", "description": "Placeholder text for searching service accounts." }, "editServiceAccount": { - "message": "Edit service account", + "message": "ערוך חשבון שירות", "description": "Title for editing a service account." }, "addProject": { - "message": "Add project", + "message": "הוסף פרויקט", "description": "Title for creating a new project." }, "projectEdited": { - "message": "Project edited", + "message": "הפרויקט נערך", "description": "Notification for the successful editing of a project." }, "projectSaved": { - "message": "Project saved", + "message": "הפרויקט נשמר", "description": "Notification for the successful saving of a project." }, "projectCreated": { - "message": "Project created", + "message": "הפרויקט נוצר", "description": "Notification for the successful creation of a project." }, "projectName": { - "message": "Project name", + "message": "שם הפרויקט", "description": "Label for entering the name of a project." }, "newProject": { - "message": "New project", + "message": "פרויקט חדש", "description": "Title for creating a new project." }, "softDeleteSecretWarning": { - "message": "Deleting secrets can affect existing integrations.", + "message": "מחיקת סודות עשויה להשפיע על שילובים קיימים.", "description": "Warns that deleting secrets can have consequences on integrations" }, "softDeletesSuccessToast": { - "message": "Secrets sent to trash", + "message": "סודות נשלחו לאשפה", "description": "Notifies that the selected secrets have been moved to the trash" }, "hardDeleteSecretConfirmation": { - "message": "Are you sure you want to permanently delete this secret?" + "message": "האם אתה בטוח שברצונך למחוק לצמיתות את הסוד הזה?" }, "hardDeleteSecretsConfirmation": { - "message": "Are you sure you want to permanently delete these secrets?" + "message": "האם אתה בטוח שברצונך למחוק לצמיתות את הסודות האלה?" }, "hardDeletesSuccessToast": { - "message": "Secrets permanently deleted" + "message": "הסודות נמחקו לצמיתות" }, "smAccess": { - "message": "Access", + "message": "גישה", "description": "Title indicating what permissions a service account has" }, "projectCommaSecret": { - "message": "Project, Secret", + "message": "פרויקט, סוד", "description": "" }, "serviceAccountName": { - "message": "Service account name", + "message": "שם חשבון שירות", "description": "Label for the name of a service account" }, "serviceAccountCreated": { - "message": "Service account created", + "message": "חשבון השירות נוצר", "description": "Notifies that a new service account has been created" }, "serviceAccountUpdated": { - "message": "Service account updated", + "message": "חשבון השירות עודכן", "description": "Notifies that a service account has been updated" }, "newSaSelectAccess": { - "message": "Type or select projects or secrets", + "message": "הקלד או בחר פרויקטים או סודות", "description": "Instructions for selecting projects or secrets for a new service account" }, "newSaTypeToFilter": { - "message": "Type to filter", + "message": "הקלד כדי לסנן", "description": "Instructions for filtering a list of projects or secrets" }, "deleteProjectsToast": { - "message": "Projects deleted", + "message": "הפרויקטים נמחקו", "description": "Notifies that the selected projects have been deleted" }, "deleteProjectToast": { - "message": "Project deleted", + "message": "הפרויקט נמחק", "description": "Notifies that a project has been deleted" }, "deleteProjectDialogMessage": { - "message": "Deleting project $PROJECT$ is permanent and irreversible.", + "message": "מחיקת הפרויקט $PROJECT$ היא לצמיתות ובלתי הפיכה.", "description": "Informs users that projects are hard deleted and not sent to trash", "placeholders": { "project": { @@ -7610,7 +7605,7 @@ } }, "deleteProjectInputLabel": { - "message": "Type \"$CONFIRM$\" to continue", + "message": "הקלד \"$CONFIRM$\" כדי להמשיך", "description": "Users are prompted to type 'confirm' to delete a project", "placeholders": { "confirm": { @@ -7620,7 +7615,7 @@ } }, "deleteProjectConfirmMessage": { - "message": "Delete $PROJECT$", + "message": "מחק $PROJECT$", "description": "Confirmation prompt to delete a specific project, where '$PROJECT$' is a placeholder for the name of the project.", "placeholders": { "project": { @@ -7630,7 +7625,7 @@ } }, "deleteProjectsConfirmMessage": { - "message": "Delete $COUNT$ Projects", + "message": "מחק $COUNT$ פרויקטים", "description": "Confirmation prompt to delete multiple projects, where '$COUNT$' is a placeholder for the number of projects to be deleted.", "placeholders": { "count": { @@ -7640,119 +7635,119 @@ } }, "deleteProjectsDialogMessage": { - "message": "Deleting projects is permanent and irreversible.", + "message": "מחיקת פרויקטים היא לצמיתות ובלתי הפיכה.", "description": "This message is displayed in a dialog box as a warning before proceeding with project deletion." }, "projectsNoItemsTitle": { - "message": "No projects to display", + "message": "אין פרויקטים להצגה", "description": "Empty state to be displayed when there are no projects to display in the list." }, "projectsNoItemsMessage": { - "message": "Add a new project to get started organizing secrets.", + "message": "הוסף פרויקט חדש כדי להתחיל לארגן סודות.", "description": "Message to be displayed when there are no projects to display in the list." }, "smConfirmationRequired": { - "message": "Confirmation required", + "message": "נדרש אישור", "description": "Indicates that user confirmation is required for an action to proceed." }, "bulkDeleteProjectsErrorMessage": { - "message": "The following projects could not be deleted:", + "message": "לא היה ניתן למחוק את הפרויקטים הבאים:", "description": "Message to be displayed when there is an error during bulk project deletion." }, "softDeleteSuccessToast": { - "message": "Secret sent to trash", + "message": "הסוד נשלח לאשפה", "description": "Notification to be displayed when a secret is successfully sent to the trash." }, "hardDeleteSuccessToast": { - "message": "Secret permanently deleted" + "message": "הסוד נמחק לצמיתות" }, "accessTokens": { - "message": "Access tokens", + "message": "אסימוני גישה", "description": "Title for the section displaying access tokens." }, "newAccessToken": { - "message": "New access token", + "message": "אסימון גישה חדש", "description": "Button label for creating a new access token." }, "expires": { - "message": "Expires", + "message": "יפוג", "description": "Label for the expiration date of an access token." }, "canRead": { - "message": "Can read", + "message": "יכול/ה לקרוא", "description": "Label for the access level of an access token (Read only)." }, "accessTokensNoItemsTitle": { - "message": "No access tokens to show", + "message": "אין אסימוני גישה להציג", "description": "Title to be displayed when there are no access tokens to display in the list." }, "accessTokensNoItemsDesc": { - "message": "To get started, create an access token", + "message": "כדי להתחיל, צור אסימון גישה", "description": "Message to be displayed when there are no access tokens to display in the list." }, "downloadAccessToken": { - "message": "Download or copy before closing.", + "message": "הורד או העתק לפני שתסגור.", "description": "Message to be displayed before closing an access token, reminding the user to download or copy it." }, "expiresOnAccessToken": { - "message": "Expires on:", + "message": "יפוג ב:", "description": "Label for the expiration date of an access token." }, "accessTokenCallOutTitle": { - "message": "Access tokens are not stored and cannot be retrieved", + "message": "אסימוני גישה אינם מאוחסנים ולא ניתן לאחזר אותם", "description": "Notification to inform the user that access tokens are only displayed once and cannot be retrieved again." }, "copyToken": { - "message": "Copy token", + "message": "העתק אסימון", "description": "Copies the generated access token to the user's clipboard." }, "accessToken": { - "message": "Access token", + "message": "אסימון גישה", "description": "A unique string that gives a client application (eg. CLI) access to a secret or set of secrets." }, "accessTokenExpirationRequired": { - "message": "Expiration date required", + "message": "נדרש תאריך תפוגה", "description": "Error message indicating that an expiration date for the access token must be set." }, "accessTokenCreatedAndCopied": { - "message": "Access token created and copied to clipboard", + "message": "אסימון גישה נוצר והועתק ללוח", "description": "Notification to inform the user that the access token has been created and copied to the clipboard." }, "revokeAccessToken": { - "message": "Revoke access token", + "message": "בטל אסימון גישה", "description": "Invalidates / cancels an access token and as such removes access to secrets for the client application." }, "revokeAccessTokens": { - "message": "Revoke access tokens" + "message": "בטל אסימוני גישה" }, "revokeAccessTokenDesc": { - "message": "Revoking access tokens is permanent and irreversible." + "message": "ביטול אסימוני גישה הוא לצמיתות ובלתי הפיך." }, "accessTokenRevoked": { - "message": "Access tokens revoked", + "message": "אסימוני הגישה בוטלו", "description": "Toast message after deleting one or multiple access tokens." }, "noAccessTokenSelected": { - "message": "No access token selected to revoke", + "message": "לא נבחר אסימון גישה לביטול", "description": "Toast error message after trying to delete access tokens but not selecting any access tokens." }, "submenu": { - "message": "Submenu" + "message": "תפריט משנה" }, "from": { - "message": "From" + "message": "מאת" }, "to": { - "message": "To" + "message": "אל" }, "member": { - "message": "Member" + "message": "חבר" }, "update": { - "message": "Update" + "message": "עדכן" }, "plusNMore": { - "message": "+ $QUANTITY$ more", + "message": "+ עוד $QUANTITY$", "placeholders": { "quantity": { "content": "$1", @@ -7761,106 +7756,106 @@ } }, "groupInfo": { - "message": "Group info" + "message": "פרטי קבוצה" }, "editGroupMembersDesc": { - "message": "Grant members access to the group's assigned collections." + "message": "הענק לחברים גישה לאוספים המוקצים של הקבוצה." }, "editGroupCollectionsDesc": { - "message": "Grant access to collections by adding them to this group." + "message": "העתק גישה לאוספים בכך שתוסיף אותם לקבוצה זו." }, "restrictedCollectionAssignmentDesc": { - "message": "You can only assign collections you manage." + "message": "אתה יכול רק להקצות אוספים שאתה מנהל." }, "selectMembers": { - "message": "Select members" + "message": "בחר חברים" }, "selectCollections": { - "message": "Select collections" + "message": "בחר אוספים" }, "role": { - "message": "Role" + "message": "תפקיד" }, "removeMember": { - "message": "Remove member" + "message": "הסר חבר" }, "collection": { - "message": "Collection" + "message": "אוסף" }, "noCollection": { - "message": "No collection" + "message": "אין אוסף" }, "noCollectionsAdded": { - "message": "No collections added" + "message": "לא נוספו אוספים" }, "noMembersAdded": { - "message": "No members added" + "message": "לא נוספו חברים" }, "noGroupsAdded": { - "message": "No groups added" + "message": "לא נוספו קבוצות" }, "group": { - "message": "Group" + "message": "קבוצה" }, "domainVerification": { - "message": "Domain verification" + "message": "אימות דומיין" }, "newDomain": { - "message": "New domain" + "message": "דומיין חדש" }, "noDomains": { - "message": "No domains" + "message": "אין דומיינים" }, "noDomainsSubText": { - "message": "Connecting a domain allows members to skip the SSO identifier field during Login with SSO." + "message": "חיבור דומיין מאפשר לחברים לדלג על שדה מזהה SSO במהלך כניסה עם SSO." }, "verifyDomain": { - "message": "Verify domain" + "message": "אמת דומיין" }, "reverifyDomain": { - "message": "Reverify domain" + "message": "אמת מחדש דומיין" }, "copyDnsTxtRecord": { - "message": "Copy DNS TXT record" + "message": "העתק רשומת DNS TXT" }, "dnsTxtRecord": { - "message": "DNS TXT record" + "message": "רשומת DNS TXT" }, "dnsTxtRecordInputHint": { - "message": "Copy and paste the TXT record into your DNS Provider." + "message": "העתק והדבק את רשומת ה־TXT אל ספק ה־DNS שלך." }, "domainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be verified." + "message": "דוגמה: mydomain.com. תת-דומיינים דורשים שרשומות נפרדות יאומתו." }, "automaticDomainVerification": { - "message": "Automatic Domain Verification" + "message": "אימות דומיין אוטומטי" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden will attempt to verify the domain 3 times during the first 72 hours. If the domain can’t be verified, check the DNS record in your host and manually verify. The domain will be removed from your organization in 7 days if it is not verified" + "message": "Bitwarden ינסה לאמת את הדומיין 3 פעמים במהלך 72 השעות הראשונות. אם הדומיין אינו ניתן לאימות, בדוק את רשומת ה־DNS במארח שלך ואמת באופן ידני. הדומיין יוסר מהארגון שלך תוך 7 ימים אם הוא לא מאומת" }, "invalidDomainNameMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be verified." + "message": "הקלט אינו בפורמט תקין. פורמט: mydomain.com. תת-דומיינים דורשים שרשומות נפרדות יאומתו." }, "removeDomain": { - "message": "Remove domain" + "message": "הסר דומיין" }, "removeDomainWarning": { - "message": "Removing a domain cannot be undone. Are you sure you want to continue?" + "message": "הסרת דומיין אינה ניתנת לביטול. האם אתה בטוח שברצונך להמשיך?" }, "domainRemoved": { - "message": "Domain removed" + "message": "דומיין הוסר" }, "domainSaved": { - "message": "Domain saved" + "message": "דומיין נשמר" }, "domainVerified": { - "message": "Domain verified" + "message": "דומיין אומת" }, "duplicateDomainError": { - "message": "You can't claim the same domain twice." + "message": "אתה לא יכול לדרוש את אותו הדומיין פעמיים." }, "domainNotAvailable": { - "message": "Someone else is using $DOMAIN$. Use a different domain to continue.", + "message": "מישהו אחר משתמש ב־$DOMAIN$. השתמש בדומיין אחר כדי להמשיך.", "placeholders": { "DOMAIN": { "content": "$1", @@ -7869,7 +7864,7 @@ } }, "domainNotVerified": { - "message": "$DOMAIN$ not verified. Check your DNS record.", + "message": "$DOMAIN$ אינו מאומת. בדוק את רשומת ה־DNS שלך.", "placeholders": { "DOMAIN": { "content": "$1", @@ -7878,28 +7873,28 @@ } }, "domainStatusVerified": { - "message": "Verified" + "message": "מאומת" }, "domainStatusUnverified": { - "message": "Unverified" + "message": "לא מאומת" }, "domainNameTh": { - "message": "Name" + "message": "שם" }, "domainStatusTh": { - "message": "Status" + "message": "מצב" }, "lastChecked": { - "message": "Last checked" + "message": "נבדק לאחרונה" }, "editDomain": { - "message": "Edit domain" + "message": "ערוך דומיין" }, "domainFormInvalid": { - "message": "There are form errors that need your attention" + "message": "ישנן שגיאות טופס שדורשות את תשומת לבך" }, "addedDomain": { - "message": "Added domain $DOMAIN$", + "message": "דומיין $DOMAIN$ נוסף", "placeholders": { "DOMAIN": { "content": "$1", @@ -7908,7 +7903,7 @@ } }, "removedDomain": { - "message": "Removed domain $DOMAIN$", + "message": "דומיין $DOMAIN$ הוסר", "placeholders": { "DOMAIN": { "content": "$1", @@ -7917,7 +7912,7 @@ } }, "domainVerifiedEvent": { - "message": "$DOMAIN$ verified", + "message": "$DOMAIN$ מאומת", "placeholders": { "DOMAIN": { "content": "$1", @@ -7926,7 +7921,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ not verified", + "message": "$DOMAIN$ אינו מאומת", "placeholders": { "DOMAIN": { "content": "$1", @@ -7935,79 +7930,79 @@ } }, "verificationRequiredForActionSetPinToContinue": { - "message": "Verification required for this action. Set a PIN to continue." + "message": "נדרש אימות עבור פעולה זו. הגדר PIN כדי להמשיך." }, "setPin": { - "message": "Set PIN" + "message": "הגדר PIN" }, "verifyWithBiometrics": { - "message": "Verify with biometrics" + "message": "אמת עם זיהוי ביומטרי" }, "awaitingConfirmation": { - "message": "Awaiting confirmation" + "message": "ממתין לאישור" }, "couldNotCompleteBiometrics": { - "message": "Could not complete biometrics." + "message": "לא היה ניתן להשלים את הזיהוי הביומטרי." }, "needADifferentMethod": { - "message": "Need a different method?" + "message": "זקוק לשיטה אחרת?" }, "useMasterPassword": { - "message": "Use master password" + "message": "השתמש בסיסמה ראשית" }, "usePin": { - "message": "Use PIN" + "message": "השתמש ב־PIN" }, "useBiometrics": { - "message": "Use biometrics" + "message": "השתמש בזיהוי ביומטרי" }, "enterVerificationCodeSentToEmail": { - "message": "Enter the verification code that was sent to your email." + "message": "הזן את קוד האימות שנשלח לדוא\"ל שלך." }, "resendCode": { - "message": "Resend code" + "message": "שלח קוד מחדש" }, "memberColumnHeader": { - "message": "Member" + "message": "חבר" }, "groupSlashMemberColumnHeader": { - "message": "Group/Member" + "message": "קבוצה/חבר" }, "selectGroupsAndMembers": { - "message": "Select groups and members" + "message": "בחר קבוצות וחברים" }, "selectGroups": { - "message": "Select groups" + "message": "בחר קבוצות" }, "userPermissionOverrideHelperDesc": { - "message": "Permissions set for a member will replace permissions set by that member's group." + "message": "הרשאות שהוגדרו עבור חבר יחליפו הרשאות שהוגדרו על ידי הקבוצה של אותו חבר." }, "noMembersOrGroupsAdded": { - "message": "No members or groups added" + "message": "לא נוספו חברים או קבוצות" }, "deleted": { - "message": "Deleted" + "message": "נמחקו" }, "memberStatusFilter": { - "message": "Member status filter" + "message": "מסנן מצב חבר" }, "inviteMember": { - "message": "Invite member" + "message": "הזמן חבר" }, "needsConfirmation": { - "message": "Needs confirmation" + "message": "צריך אישור" }, "memberRole": { - "message": "Member role" + "message": "תפקיד חבר" }, "moreFromBitwarden": { - "message": "More from Bitwarden" + "message": "עוד מאת Bitwarden" }, "switchProducts": { - "message": "Switch products" + "message": "החלף מוצרים" }, "freeOrgInvLimitReachedManageBilling": { - "message": "Free organizations may have up to $SEATCOUNT$ members. Upgrade to a paid plan to invite more members.", + "message": "לארגונים חינמיים יכולים להיות עד $SEATCOUNT$ חברים. שדרג לתוכנית בתשלום כדי להזמין חברים נוספים.", "placeholders": { "seatcount": { "content": "$1", @@ -8016,7 +8011,7 @@ } }, "freeOrgInvLimitReachedNoManageBilling": { - "message": "Free organizations may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade.", + "message": "לארגונים חינמיים יכולים להיות עד $SEATCOUNT$ חברים. צור קשר עם בעלי הארגון שלך כדי לשדרג.", "placeholders": { "seatcount": { "content": "$1", @@ -8025,7 +8020,7 @@ } }, "teamsStarterPlanInvLimitReachedManageBilling": { - "message": "Teams Starter plans may have up to $SEATCOUNT$ members. Upgrade to your plan to invite more members.", + "message": "לתוכניות צוותים מתחילים יכולים להיות עד $SEATCOUNT$ חברים. שדרג את התוכנית שלך כדי להזמין עוד חברים.", "placeholders": { "seatcount": { "content": "$1", @@ -8034,7 +8029,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "Teams Starter plans may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade your plan and invite more members.", + "message": "לתוכניות צוותים מתחילים יכולים להיות עד $SEATCOUNT$ חברים. צור קשר עם בעלי הארגון שלך כדי לשדרג את התוכנית שלך ולהזמין עוד חברים.", "placeholders": { "seatcount": { "content": "$1", @@ -8043,7 +8038,7 @@ } }, "freeOrgMaxCollectionReachedManageBilling": { - "message": "Free organizations may have up to $COLLECTIONCOUNT$ collections. Upgrade to a paid plan to add more collections.", + "message": "לארגונים חינמיים יכולים להיות עד $COLLECTIONCOUNT$ אוספים. שדרג לתוכנית בתשלום כדי להוסיף עוד אוספים.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -8052,7 +8047,7 @@ } }, "freeOrgMaxCollectionReachedNoManageBilling": { - "message": "Free organizations may have up to $COLLECTIONCOUNT$ collections. Contact your organization owner to upgrade.", + "message": "לארגונים חינמיים יכולים להיות עד $COLLECTIONCOUNT$ אוספים. צור קשר עם בעלי הארגון שלך כדי לשדרג.", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -8061,16 +8056,16 @@ } }, "server": { - "message": "Server" + "message": "שרת" }, "exportData": { - "message": "Export data" + "message": "ייצא נתונים" }, "exportingOrganizationSecretDataTitle": { - "message": "Exporting Organization Secret Data" + "message": "ייצוא נתונים ארגון סודיים" }, "exportingOrganizationSecretDataDescription": { - "message": "Only the Secrets Manager data associated with $ORGANIZATION$ will be exported. Items in other products or from other organizations will not be included.", + "message": "רק נתוני מנהל הסודות המשויכים עם $ORGANIZATION$ ייוצאו. פריטים במוצרים אחרים או מארגונים אחרים לא יכללו.", "placeholders": { "ORGANIZATION": { "content": "$1", @@ -8079,61 +8074,61 @@ } }, "fileUpload": { - "message": "File upload" + "message": "העלאת קובץ" }, "upload": { - "message": "Upload" + "message": "העלה" }, "acceptedFormats": { - "message": "Accepted Formats:" + "message": "פורמטים מקובלים:" }, "copyPasteImportContents": { - "message": "Copy & paste import contents:" + "message": "העתק & הדבק תוכן ייבוא:" }, "or": { - "message": "or" + "message": "או" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "בטל נעילה עם זיהוי ביומטרי" }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "בטל נעילה עם PIN" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "בטל נעילה עם סיסמה ראשית" }, "licenseAndBillingManagement": { - "message": "License and billing management" + "message": "ניהול רישיון וחיובים" }, "automaticSync": { - "message": "Automatic sync" + "message": "סנכרון אוטומטי" }, "manualUpload": { - "message": "Manual upload" + "message": "העלאה ידנית" }, "manualBillingTokenUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here. This will not automatically unlock Families sponsorships." + "message": "אם אתה לא רוצה להסכים לסנכרון חיובים, העלה ידנית את הרישיון שלך כאן. זה לא יפתח באופן אוטומטי חסויות למשפחות." }, "syncLicense": { - "message": "Sync License" + "message": "סנכרן רישיון" }, "licenseSyncSuccess": { - "message": "Successfully synced license" + "message": "הרישיון סונכרן בהצלחה" }, "licenseUploadSuccess": { - "message": "Successfully uploaded license" + "message": "הרישיון הועלה בהצלחה" }, "lastLicenseSync": { - "message": "Last license sync" + "message": "סנכרון רישיון אחרון" }, "billingSyncHelp": { - "message": "Billing Sync help" + "message": "עזרה עם סנכרון חיובים" }, "licensePaidFeaturesHelp": { - "message": "License paid features help" + "message": "עזרה עם תכונות בתשלום של רישיון" }, "selfHostGracePeriodHelp": { - "message": "After your subscription expires, you have 60 days to apply an updated license file to your organization. Grace period ends $GRACE_PERIOD_END_DATE$.", + "message": "לאחר שהמנוי שלך יפוג, יש לך 60 ימים להחיל קובץ רישיון מעודכן לארגון שלך. תקופת חסד מסתיימת $GRACE_PERIOD_END_DATE$.", "placeholders": { "GRACE_PERIOD_END_DATE": { "content": "$1", @@ -8142,67 +8137,67 @@ } }, "uploadLicense": { - "message": "Upload license" + "message": "העלה רישיון" }, "projectPeopleDescription": { - "message": "Grant groups or people access to this project." + "message": "הענק לקבוצות או אנשים גישה לפרויקט זה." }, "projectPeopleSelectHint": { - "message": "Type or select people or groups" + "message": "הקלד או בחר אנשים או קבוצות" }, "projectServiceAccountsDescription": { - "message": "Grant service accounts access to this project." + "message": "הענק לחשבונות שירות גישה לפרויקט הזה." }, "projectServiceAccountsSelectHint": { - "message": "Type or select service accounts" + "message": "הקלד או בחר חשבונות שירות" }, "projectEmptyPeopleAccessPolicies": { - "message": "Add people or groups to start collaborating" + "message": "הוסף אנשים או קבוצות כדי להתחיל לשתף פעולה" }, "projectEmptyServiceAccountAccessPolicies": { - "message": "Add service accounts to grant access" + "message": "הוסף חשבונות שירות כדי להעניק גישה" }, "serviceAccountPeopleDescription": { - "message": "Grant groups or people access to this service account." + "message": "הענק לקבוצות או אנשים גישה לחשבון שירות זה." }, "serviceAccountProjectsDescription": { - "message": "Assign projects to this service account. " + "message": "הקצה פרויקטים לחשבון השירות הזה: " }, "serviceAccountEmptyProjectAccesspolicies": { - "message": "Add projects to grant access" + "message": "הוסף פרויקטים כדי להעניק גישה" }, "canReadWrite": { - "message": "Can read, write" + "message": "יכול/ה לקרוא, לכתוב" }, "groupSlashUser": { - "message": "Group/User" + "message": "קבוצה/משתמש" }, "lowKdfIterations": { - "message": "Low KDF Iterations" + "message": "חזרות KDF נמוכות" }, "updateLowKdfIterationsDesc": { - "message": "Update your encryption settings to meet new security recommendations and improve account protection." + "message": "שדרג את הגדרות ההצפנה שלך כדי לעמוד בהמלצות אבטחה חדשות ולשפר את הגנת החשבון." }, "kdfSettingsChangeLogoutWarning": { - "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss." + "message": "המשך התהליך יוציא אותך מכל ההפעלות הפעילות שלך. תידרש להיכנס חזרה כדי להמשיך כניסה דו-שלבית, אם ישנה. אנו ממליצים על ייצוא הכספת שלך לפני שינוי הגדרות ההצפנה שלך כדי למנוע איבוד נתונים." }, "secretsManager": { - "message": "Secrets Manager" + "message": "מנהל הסודות" }, "secretsManagerAccessDescription": { - "message": "Activate user access to Secrets Manager." + "message": "הפעל גישת משתמש אל מנהל הסודות." }, "userAccessSecretsManagerGA": { - "message": "This user can access Secrets Manager" + "message": "משתמש זה יכול לגשת למנהל הסודות" }, "important": { - "message": "Important:" + "message": "חשוב:" }, "viewAll": { - "message": "View all" + "message": "הצג הכל" }, "showingPortionOfTotal": { - "message": "Showing $PORTION$ of $TOTAL$", + "message": "מראה $PORTION$ מתוך $TOTAL$", "placeholders": { "portion": { "content": "$1", @@ -8215,16 +8210,16 @@ } }, "resolveTheErrorsBelowAndTryAgain": { - "message": "Resolve the errors below and try again." + "message": "פתור את השגיאות למטה ונסה שוב." }, "description": { - "message": "Description" + "message": "תיאור" }, "errorReadingImportFile": { - "message": "An error occurred when trying to read the import file" + "message": "אירעה שגיאה בעת ניסיון לקרוא את קובץ הייבוא" }, "accessedSecret": { - "message": "Accessed secret $SECRET_ID$.", + "message": "ניגש אל סוד $SECRET_ID$.", "placeholders": { "secret_id": { "content": "$1", @@ -8237,32 +8232,32 @@ "description": "Software Development Kit" }, "createAnAccount": { - "message": "Create an account" + "message": "צור חשבון" }, "createSecret": { - "message": "Create a secret" + "message": "צור סוד" }, "createProject": { - "message": "Create a project" + "message": "צור פרויקט" }, "createServiceAccount": { - "message": "Create a service account" + "message": "צור חשבון שירות" }, "downloadThe": { - "message": "Download the", + "message": "הורד את", "description": "Link to a downloadable resource. This will be used as part of a larger phrase. Example: Download the Secrets Manager CLI" }, "smCLI": { - "message": "Secrets Manager CLI" + "message": "מנהל הסודות CLI" }, "importSecrets": { - "message": "Import secrets" + "message": "ייבא סודות" }, "getStarted": { - "message": "Get started" + "message": "התחל" }, "complete": { - "message": "$COMPLETED$/$TOTAL$ Complete", + "message": "$COMPLETED$ מתוך $TOTAL$ הושלמו", "placeholders": { "COMPLETED": { "content": "$1", @@ -8275,64 +8270,64 @@ } }, "restoreSecret": { - "message": "Restore secret" + "message": "שחזר סוד" }, "restoreSecrets": { - "message": "Restore secrets" + "message": "שחזר סודות" }, "restoreSecretPrompt": { - "message": "Are you sure you want to restore this secret?" + "message": "האם אתה בטוח שברצונך לשחזר את הסוד הזה?" }, "restoreSecretsPrompt": { - "message": "Are you sure you want to restore these secrets?" + "message": "האם אתה בטוח שברצונך לשחזר את הסודות האלה?" }, "secretRestoredSuccessToast": { - "message": "Secret restored" + "message": "הסוד שוחזר" }, "secretsRestoredSuccessToast": { - "message": "Secrets restored" + "message": "הסודות שוחזרו" }, "selectionIsRequired": { - "message": "Selection is required." + "message": "נדרשת בחירה." }, "saPeopleWarningTitle": { - "message": "Access tokens still available" + "message": "אסימוני גישה עדיין זמינים" }, "saPeopleWarningMessage": { - "message": "Removing people from a service account does not remove the access tokens they created. For security best practice, it is recommended to revoke access tokens created by people removed from a service account." + "message": "הסרת אנשים מחשבון שירות אינה מסירה את אסימוני הגישה שהם יצרו. עבור גישת האבטחה הטובה ביותר, מומלץ לבטל אסימוני גישה שנוצרו על ידי אנשים שהוסרו מחשבון שירות." }, "smAccessRemovalWarningProjectTitle": { - "message": "Remove access to this project" + "message": "הסר גישה לפרויקט זה" }, "smAccessRemovalWarningProjectMessage": { - "message": "This action will remove your access to the project." + "message": "פעולה זו תסיר את הגישה שלך לפרויקט זה." }, "smAccessRemovalWarningSaTitle": { - "message": "Remove access to this service account" + "message": "הסר גישה לחשבון שירות זה" }, "smAccessRemovalWarningSaMessage": { - "message": "This action will remove your access to the service account." + "message": "פעולה זו תסיר את הגישה שלך לחשבון השירות." }, "removeAccess": { - "message": "Remove access" + "message": "הסר גישה" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "בדוק פרצות נתונים ידועות עבור סיסמה זו" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "סיסמה ראשית חשופה" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "הסיסמה נמצאה בפרצת נתונים. השתמש בסיסמה ייחודית כדי להגן על חשבונך. האם אתה בטוח שברצונך להשתמש בסיסמה חשופה?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "סיסמה ראשית חלשה וחשופה" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "סיסמה חלשה זוהתה ונמצאה בפרצת נתונים. השתמש בסיסמה חזקה וייחודית כדי להגן על חשבונך. האם אתה בטוח שאתה רוצה להשתמש בסיסמה זו?" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ תווים לכל הפחות", "placeholders": { "length": { "content": "$1", @@ -8341,7 +8336,7 @@ } }, "masterPasswordMinimumlength": { - "message": "Master password must be at least $LENGTH$ characters long.", + "message": "סיסמה ראשית חייבת להיות לפחות באורך $LENGTH$ תווים.", "placeholders": { "length": { "content": "$1", @@ -8350,107 +8345,104 @@ } }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "אסור שקלט יכיל רק רווח לבן.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "dismiss": { - "message": "Dismiss" + "message": "התעלם" }, "notAvailableForFreeOrganization": { - "message": "This feature is not available for free organizations. Contact your organization owner to upgrade." + "message": "תכונה זו אינה זמינה עבור ארגונים חינמיים. צור קשר עם בעלי הארגון שלך כדי לשדרג." }, "smProjectSecretsNoItemsNoAccess": { - "message": "Contact your organization's admin to manage secrets for this project.", + "message": "צור קשר עם מנהל הארגון שלך כדי לנהל סודות עבור פרויקט זה.", "description": "The message shown to the user under a project's secrets tab when the user only has read access to the project." }, "enforceOnLoginDesc": { - "message": "Require existing members to change their passwords" + "message": "דרוש מחברים קיימים לשנות את הסיסמאות שלהם" }, "smProjectDeleteAccessRestricted": { - "message": "You don't have permissions to delete this project", + "message": "אין לך הרשאות למחוק את הפרויקט הזה", "description": "The individual description shown to the user when the user doesn't have access to delete a project." }, "smProjectsDeleteBulkConfirmation": { - "message": "The following projects can not be deleted. Would you like to continue?", + "message": "הפרויקטים הבאים אינם ניתנים למחיקה. האם ברצונך להמשיך?", "description": "The message shown to the user when bulk deleting projects and the user doesn't have access to some projects." }, "updateKdfSettings": { - "message": "Update KDF settings" + "message": "עדכן הגדרות KDF" }, "loginInitiated": { - "message": "Login initiated" + "message": "הכניסה החלה" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "זכור מכשיר זה כדי להפוך כניסות עתידיות לחלקות" }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "נדרש אישור מכשיר. בחר אפשרות אישור למטה:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "נדרש אישור מכשיר" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "בחר אפשרות אישור למטה" }, "rememberThisDevice": { - "message": "Remember this device" + "message": "זכור מכשיר זה" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "בטל את הסימון אם אתה משתמש במכשיר ציבורי" }, "approveFromYourOtherDevice": { - "message": "Approve from your other device" + "message": "אשר מהמכשיר האחר שלך" }, "requestAdminApproval": { - "message": "Request admin approval" - }, - "approveWithMasterPassword": { - "message": "Approve with master password" + "message": "בקש אישור מנהל" }, "trustedDeviceEncryption": { - "message": "Trusted device encryption" + "message": "הצפנת מכשיר מהימן" }, "trustedDevices": { - "message": "Trusted devices" + "message": "מכשירים מהימנים" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The", + "message": "חברים לא יצטרכו סיסמה ראשית בעת כניסה עם SSO. סיסמה ראשית מוחלפת עם מפתח הצפנה המאוחסן במכשיר, מה שהופך את המכשיר הזה למהימן. המכשיר הראשון בו חבר יוצר את החשבון שלו ונכנס אליו יהיה מהימן. מכשירים חדשים יצטרכו להיות מאושרים על ידי מכשיר מהימן קיים או על ידי מנהל.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "מדיניות הארגון היחיד", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "מדיניות דרוש SSO", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": ", ו", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "מדיניות ניהול שחזור חשבון", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "יופעלו כאשר נעשה שימוש באפשרות זו.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "Your organization permissions were updated, requiring you to set a master password.", + "message": "הרשאות הארגון שלך עודכנו, מה שמאלץ אותך להגדיר סיסמה ראשית.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Your organization requires you to set a master password.", + "message": "הארגון שלך דורש ממך להגדיר סיסמה ראשית.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "מתוך $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8459,7 +8451,7 @@ } }, "notFound": { - "message": "$RESOURCE$ not found", + "message": "$RESOURCE$ לא נמצא", "placeholders": { "resource": { "content": "$1", @@ -8468,86 +8460,86 @@ } }, "verificationRequired": { - "message": "Verification required", + "message": "נדרש אימות", "description": "Default title for the user verification dialog." }, "recoverAccount": { - "message": "Recover account" + "message": "שחזר חשבון" }, "updatedTempPassword": { - "message": "User updated a password issued through account recovery." + "message": "משתמש עדכן סיסמה שהונפקה באמצעות שחזור חשבון." }, "activatedAccessToSecretsManager": { - "message": "Activated access to Secrets Manager", + "message": "הופעלה גישה למנהל הסודות", "description": "Confirmation message that one or more users gained access to Secrets Manager" }, "activateAccess": { - "message": "Activate access" + "message": "הפעל גישה" }, "bulkEnableSecretsManagerDescription": { - "message": "Grant the following members access to Secrets Manager. The role granted in the Password Manager will apply to Secrets Manager.", + "message": "הענק לחברים הבאים גישה למנהל הסודות. התפקיד שהוענק במנהל הסיסמאות יחול על מנהל הסודות.", "description": "This description is shown to an admin when they are attempting to add more users to Secrets Manager." }, "activateSecretsManager": { - "message": "Activate Secrets Manager" + "message": "הפעל את מנהל הסודות" }, "yourOrganizationsFingerprint": { - "message": "Your organization's fingerprint phrase", + "message": "ביטוי טביעת האצבע של ארגונך", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their organization's public key with another user, for the purposes of sharing." }, "deviceApprovals": { - "message": "Device approvals" + "message": "אישורי מכשירים" }, "deviceApprovalsDesc": { - "message": "Approve login requests below to allow the requesting member to finish logging in. Unapproved requests expire after 1 week. Verify the member’s information before approving." + "message": "אשר בקשות כניסה למטה כדי לאפשר לחבר המבקש לסיים להיכנס. בקשות לא מאושרות יפוגו לאחר שבוע אחד. אמת את המידע של החבר לפני שתאשר." }, "deviceInfo": { - "message": "Device info" + "message": "מידע על המכשיר" }, "time": { - "message": "Time" + "message": "זמן" }, "denyAllRequests": { - "message": "Deny all requests" + "message": "דחה את כל הבקשות" }, "denyRequest": { - "message": "Deny request" + "message": "דחה בקשה" }, "approveRequest": { - "message": "Approve request" + "message": "אשר בקשה" }, "deviceApproved": { - "message": "Device approved" + "message": "המכשיר אושר" }, "deviceRemoved": { - "message": "Device removed" + "message": "המכשיר הוסר" }, "removeDevice": { - "message": "Remove device" + "message": "הסר מכשיר" }, "removeDeviceConfirmation": { - "message": "Are you sure you want to remove this device?" + "message": "האם אתה בטוח שברצונך להסיר מכשיר זה?" }, "noDeviceRequests": { - "message": "No device requests" + "message": "אין בקשות של מכשירים" }, "noDeviceRequestsDesc": { - "message": "Member device approval requests will appear here" + "message": "בקשות לאישור מכשיר של חבר יופיעו כאן" }, "loginRequestDenied": { - "message": "Login request denied" + "message": "בקשת כניסה נדחתה" }, "allLoginRequestsDenied": { - "message": "All login requests denied" + "message": "כל בקשות הכניסה נדחו" }, "loginRequestApproved": { - "message": "Login request approved" + "message": "בקשת כניסה אושרה" }, "removeOrgUserNoMasterPasswordTitle": { - "message": "Account does not have master password" + "message": "לחשבון אין סיסמה ראשית" }, "removeOrgUserNoMasterPasswordDesc": { - "message": "Removing $USER$ without setting a master password for them may restrict access to their full account. Are you sure you want to continue?", + "message": "הסרת $USER$ מבלי להגדיר סיסמה ראשית עבורו עשויה להגביל גישה לחשבון המלא שלו. האם אתה בטוח שברצונך להמשיך?", "placeholders": { "user": { "content": "$1", @@ -8556,13 +8548,13 @@ } }, "noMasterPassword": { - "message": "No master password" + "message": "אין סיסמה ראשית" }, "removeMembersWithoutMasterPasswordWarning": { - "message": "Removing members who do not have master passwords without setting one for them may restrict access to their full account." + "message": "הסרת חברים שאין להם סיסמאות ראשיות מבלי להגדיר אחת עבורם עשויה להגביל גישה לחשבון המלא שלהם." }, "approvedAuthRequest": { - "message": "Approved device for $ID$.", + "message": "מכשיר אושר עבור $ID$.", "placeholders": { "id": { "content": "$1", @@ -8571,7 +8563,7 @@ } }, "rejectedAuthRequest": { - "message": "Denied device for $ID$.", + "message": "מכשיר נדחה עבור $ID$.", "placeholders": { "id": { "content": "$1", @@ -8580,13 +8572,13 @@ } }, "requestedDeviceApproval": { - "message": "Requested device approval." + "message": "התבקש אישור מכשיר." }, "tdeOffboardingPasswordSet": { - "message": "User set a master password during TDE offboarding." + "message": "המשתמש הגדיר סיסמה ראשית במהלך תהליך יציאת TDE." }, "startYour7DayFreeTrialOfBitwardenFor": { - "message": "Start your 7-Day free trial of Bitwarden for $ORG$", + "message": "התחל את תקופת הניסיון בחינם למשך 7 יום של Bitwarden עבור $ORG$", "placeholders": { "org": { "content": "$1", @@ -8595,7 +8587,7 @@ } }, "startYour7DayFreeTrialOfBitwardenSecretsManagerFor": { - "message": "Start your 7-Day free trial of Bitwarden Secrets Manager for $ORG$", + "message": "התחל את תקופת הניסיון בחינם למשך 7 יום של מנהל הסודות של Bitwarden עבור $ORG$", "placeholders": { "org": { "content": "$1", @@ -8604,54 +8596,51 @@ } }, "next": { - "message": "Next" + "message": "הבא" }, "ssoLoginIsRequired": { - "message": "SSO login is required" + "message": "נדרשת כניסת SSO" }, "selectedRegionFlag": { - "message": "Selected region flag" + "message": "דגל האזור שנבחר" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "החשבון נוצר בהצלחה!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "התבקש אישור מנהל" }, "adminApprovalRequestSentToAdmins": { - "message": "Your request has been sent to your admin." - }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." + "message": "הבקשה שלך נשלחה למנהל שלך." }, "troubleLoggingIn": { - "message": "Trouble logging in?" + "message": "בעיות בכניסה?" }, "loginApproved": { - "message": "Login approved" + "message": "כניסה אושרה" }, "userEmailMissing": { - "message": "User email missing" + "message": "חסר דוא\"ל משתמש" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "דוא\"ל משתמש פעיל לא נמצא. מוציא אותך." }, "deviceTrusted": { - "message": "Device trusted" + "message": "מכשיר מהימן" }, "sendsNoItemsTitle": { - "message": "No active Sends", + "message": "אין סֵנְדים פעילים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", + "message": "השתמש בסֵנְד כדי לשתף באופן מאובטח מידע מוצפן עם כל אחד.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inviteUsers": { - "message": "Invite Users" + "message": "הזמן משתמשים" }, "secretsManagerForPlan": { - "message": "Secrets Manager for $PLAN$", + "message": "מנהל הסודות עבור $PLAN$", "placeholders": { "plan": { "content": "$1", @@ -8660,19 +8649,19 @@ } }, "secretsManagerForPlanDesc": { - "message": "For engineering and DevOps teams to manage secrets throughout the software development lifecycle." + "message": "עבור צוותי הנדסה ו-DevOps כדי שיוכלו לנהל סודות לאורך כל מחזור החיים של פיתוח התוכנה." }, "free2PersonOrganization": { - "message": "Free 2-person Organizations" + "message": "ארגונים של 2 אנשים בחינם" }, "unlimitedSecrets": { - "message": "Unlimited secrets" + "message": "סודות ללא הגבלה" }, "unlimitedProjects": { - "message": "Unlimited projects" + "message": "פרויקטים ללא הגבלה" }, "projectsIncluded": { - "message": "$COUNT$ projects included", + "message": "$COUNT$ פרויקטים כלולים", "placeholders": { "count": { "content": "$1", @@ -8681,7 +8670,7 @@ } }, "serviceAccountsIncluded": { - "message": "$COUNT$ service accounts included", + "message": "$COUNT$ חשבונות שירות כלולים", "placeholders": { "count": { "content": "$1", @@ -8690,7 +8679,7 @@ } }, "additionalServiceAccountCost": { - "message": "$COST$ per month for additional service accounts", + "message": "$COST$ לחודש עבור חשבונות שירות נוספים", "placeholders": { "cost": { "content": "$1", @@ -8699,16 +8688,16 @@ } }, "subscribeToSecretsManager": { - "message": "Subscribe to Secrets Manager" + "message": "הירשם כמנוי למנהל הסודות" }, "addSecretsManagerUpgradeDesc": { - "message": "Add Secrets Manager to your upgraded plan to maintain access to any secrets created with your previous plan." + "message": "הוסף את מנהל הסודות לתוכנית המשודרגת שלך כדי לשמור על גישה לכל הסודות שנוצרו עם התוכנית הקודמת שלך." }, "additionalServiceAccounts": { - "message": "Additional service accounts" + "message": "חשבונות שירות נוספים" }, "includedServiceAccounts": { - "message": "Your plan comes with $COUNT$ service accounts.", + "message": "התוכנית שלך מגיעה עם $COUNT$ חשבונות שירות.", "placeholders": { "count": { "content": "$1", @@ -8717,7 +8706,7 @@ } }, "addAdditionalServiceAccounts": { - "message": "You can add additional service accounts for $COST$ per month.", + "message": "אתה יכול להוסיף חשבונות שירות נוספים עבור $COST$ לחודש.", "placeholders": { "cost": { "content": "$1", @@ -8726,92 +8715,92 @@ } }, "collectionManagement": { - "message": "Collection management" + "message": "ניהול אוספים" }, "collectionManagementDesc": { - "message": "Manage the collection behavior for the organization" + "message": "נהל את התנהגות האוספים עבור הארגון" }, "limitCollectionCreationDesc": { - "message": "Limit collection creation to owners and admins" + "message": "הגבל יצירת אוספים לבעלים ומנהלים" }, "limitCollectionDeletionDesc": { - "message": "Limit collection deletion to owners and admins" + "message": "הגבל מחיקת אוספים לבעלים ומנהלים" }, "limitItemDeletionDesc": { - "message": "Limit item deletion to members with the Can manage permission" + "message": "הגבל מחיקת פריטים לחברים עם הרשאת יכולת ניהול" }, "allowAdminAccessToAllCollectionItemsDesc": { - "message": "Owners and admins can manage all collections and items" + "message": "בעלים ומנהלים יכולים לנהל את כל האוספים והפריטים" }, "updatedCollectionManagement": { - "message": "Updated collection management setting" + "message": "הגדרת ניהול אוספים עודכנה" }, "passwordManagerPlanPrice": { - "message": "Password Manager plan price" + "message": "מחיר תוכנית מנהל הסיסמאות" }, "secretsManagerPlanPrice": { - "message": "Secrets Manager plan price" + "message": "מחיר תוכנית מנהל הסודות" }, "passwordManager": { - "message": "Password Manager" + "message": "מנהל הסיסמאות" }, "freeOrganization": { - "message": "Free Organization" + "message": "ארגון חינמי" }, "limitServiceAccounts": { - "message": "Limit service accounts (optional)" + "message": "הגבל חשבונות שירות (אופציונלי)" }, "limitServiceAccountsDesc": { - "message": "Set a limit for your service accounts. Once this limit is reached, you will not be able to create new service accounts." + "message": "הגדר מגבלה עבור חשבונות השירות שלך. ברגע שתגיע למגבלה זו, לא תוכל ליצור חשבונות שירות חדשים." }, "serviceAccountLimit": { - "message": "Service account limit (optional)" + "message": "מגבלת חשבונות שירות (אופציונלי)" }, "maxServiceAccountCost": { - "message": "Max potential service account cost" + "message": "עלות מרבית פוטנציאלית של חשבון שירות" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "נכנסת!" }, "beta": { - "message": "Beta" + "message": "בטא" }, "assignCollectionAccess": { - "message": "Assign collection access" + "message": "הקצה גישה לאוסף" }, "editedCollections": { - "message": "Edited collections" + "message": "אוספים שנערכו" }, "baseUrl": { - "message": "Server URL" + "message": "URL של שרת" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL של שרת אירוח עצמי", "description": "Label for field requesting a self-hosted integration service URL" }, "alreadyHaveAccount": { - "message": "Already have an account?" + "message": "כבר יש לך חשבון?" }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "החלף מצב ניווט צדדי" }, "skipToContent": { - "message": "Skip to content" + "message": "דלג לתוכן" }, "managePermissionRequired": { - "message": "At least one member or group must have can manage permission." + "message": "לפחות חבר אחד או קבוצה אחת חייבים להיות בעלי הרשאת יכולת ניהול." }, "typePasskey": { - "message": "Passkey" + "message": "מפתח גישה" }, "passkeyNotCopied": { - "message": "Passkey will not be copied" + "message": "מפתח גישה לא יועתק" }, "passkeyNotCopiedAlert": { - "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + "message": "מפתח הגישה לא יועתק לפריט המשוכפל. האם אתה רוצה להמשיך לשכפל פריט זה?" }, "modifiedCollectionManagement": { - "message": "Modified collection management setting $ID$.", + "message": "שונתה הגדרת ניהול אוספים $ID$.", "placeholders": { "id": { "content": "$1", @@ -8820,60 +8809,60 @@ } }, "seeDetailedInstructions": { - "message": "See detailed instructions on our help site at", + "message": "ראה הוראות מפורטות באתר העזרה שלנו ב-", "description": "This is followed a by a hyperlink to the help website." }, "installBrowserExtension": { - "message": "Install browser extension" + "message": "התקן הרחבת דפדפן" }, "installBrowserExtensionDetails": { - "message": "Use the extension to quickly save logins and auto-fill forms without opening the web app." + "message": "השתמש בהרחבה כדי לשמור כניסות ולמלא אוטומטית טפסים במהירות מבלי לפתוח את יישום הרשת." }, "projectAccessUpdated": { - "message": "Project access updated" + "message": "גישת פרויקט עודכנה" }, "unexpectedErrorSend": { - "message": "An unexpected error has occurred while loading this Send. Try again later." + "message": "אירעה שגיאה בלתי צפויה בעת טעינת סֵנְד זה. נסה שוב מאוחר יותר." }, "seatLimitReached": { - "message": "Seat limit has been reached" + "message": "מגבלת מקום הושגה" }, "contactYourProvider": { - "message": "Contact your provider to purchase additional seats." + "message": "צור קשר עם הספק שלך כדי לרכוש מקומות נוספים." }, "seatLimitReachedContactYourProvider": { - "message": "Seat limit has been reached. Contact your provider to purchase additional seats." + "message": "מגבלת מקום הושגה. צור קשר עם הספק שלך כדי לרכוש מקומות נוספים." }, "collectionAccessRestricted": { - "message": "Collection access is restricted" + "message": "הגישה לאוסף מוגבלת" }, "readOnlyCollectionAccess": { - "message": "You do not have access to manage this collection." + "message": "אין לך גישה לנהל את האוסף הזה." }, "grantManageCollectionWarningTitle": { - "message": "Missing Manage Collection Permissions" + "message": "חסרות הרשאות ניהול אוסף" }, "grantManageCollectionWarning": { - "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." + "message": "הענק הרשאות ניהול אוסף כדי לאפשר ניהול אוסף מלא כולל מחיקה של אוסף." }, "grantCollectionAccess": { - "message": "Grant groups or members access to this collection." + "message": "הענק לקבוצות או חברים גישה לאוסף זה." }, "grantCollectionAccessMembersOnly": { - "message": "Grant members access to this collection." + "message": "הענק לחברים גישה לאוסף זה." }, "adminCollectionAccess": { - "message": "Administrators can access and manage collections." + "message": "מנהלים יכולים לגשת ולנהל אוספים." }, "serviceAccountAccessUpdated": { - "message": "Service account access updated" + "message": "גישת חשבון השירות עודכנה" }, "commonImportFormats": { - "message": "Common formats", + "message": "פורמטים נפוצים", "description": "Label indicating the most common import formats" }, "maintainYourSubscription": { - "message": "To maintain your subscription for $ORG$, ", + "message": "כדי לשמור על המנוי שלך עבור$ORG$, ", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method.'", "placeholders": { "org": { @@ -8883,103 +8872,103 @@ } }, "addAPaymentMethod": { - "message": "add a payment method", + "message": "הוסף אמצעי תשלום", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To maintain your subscription for $ORG$, add a payment method'" }, "organizationInformation": { - "message": "Organization information" + "message": "מידע על הארגון" }, "confirmationDetails": { - "message": "Confirmation details" + "message": "פרטי אישור" }, "smFreeTrialThankYou": { - "message": "Thank you for signing up for Bitwarden Secrets Manager!" + "message": "תודה לך שנרשמת למנהל הסודות של Bitwarden!" }, "smFreeTrialConfirmationEmail": { - "message": "We've sent a confirmation email to your email at " + "message": "שלחנו דוא\"ל אימות לדוא\"ל שלך ב־" }, "sorryToSeeYouGo": { - "message": "Sorry to see you go! Help improve Bitwarden by sharing why you're canceling.", + "message": "מצטערים לראות אותך הולך! עזור לשפר את Bitwarden על ידי שיתוף הסיבה לביטול.", "description": "A message shown to users as part of an offboarding survey asking them to provide more information on their subscription cancelation." }, "selectCancellationReason": { - "message": "Select a reason for canceling", + "message": "בחר סיבה לביטול", "description": "Used as a form field label for a select input on the offboarding survey." }, "anyOtherFeedback": { - "message": "Is there any other feedback you'd like to share?", + "message": "האם יש משוב אחר כלשהו שתרצה לשתף?", "description": "Used as a form field label for a textarea input on the offboarding survey." }, "missingFeatures": { - "message": "Missing features", + "message": "תכונות חסרות", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "movingToAnotherTool": { - "message": "Moving to another tool", + "message": "עובר לכלי אחר", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "tooDifficultToUse": { - "message": "Too difficult to use", + "message": "קשה מדי לשימוש", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "notUsingEnough": { - "message": "Not using enough", + "message": "לא משתמש מספיק", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "tooExpensive": { - "message": "Too expensive", + "message": "יקר מדי", "description": "An option for the offboarding survey shown when a user cancels their subscription." }, "freeForOneYear": { - "message": "Free for 1 year" + "message": "חינם לשנה אחת" }, "newWebApp": { - "message": "Welcome to the new and improved web app. Learn more about what’s changed." + "message": "ברוך הבא ליישום הרשת החדש והמשופר. למד עוד על מה שהשתנה." }, "releaseBlog": { - "message": "Read release blog" + "message": "קרא בלוג שחרור" }, "adminConsole": { - "message": "Admin Console" + "message": "מסוף מנהל" }, "providerPortal": { - "message": "Provider Portal" + "message": "פורטל ספקים" }, "success": { - "message": "Success" + "message": "הצלחה" }, "restrictedGroupAccess": { - "message": "You cannot add yourself to groups." + "message": "אתה לא יכול להוסיף את עצמך לקבוצות." }, "cannotAddYourselfToCollections": { - "message": "You cannot add yourself to collections." + "message": "אתה לא יכול להוסיף את עצמך לאוספים." }, "assign": { - "message": "Assign" + "message": "הקצה" }, "assignToCollections": { - "message": "Assign to collections" + "message": "הקצה לאוספים" }, "assignToTheseCollections": { - "message": "Assign to these collections" + "message": "הקצה לאוספים אלה" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "רק חברי ארגון עם גישה לאוספים אלה יוכלו לראות את הפריט." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "רק חברי ארגון עם גישה לאוספים אלה יוכלו לראות את הפריטים." }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "בחר אוספים להקצות" }, "noCollectionsAssigned": { - "message": "No collections have been assigned" + "message": "לא הוקצו אוספים" }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "אוספים הוקצו בהצלחה" }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "בחרת ב־$TOTAL_COUNT$ פריטים. אינך יכול לעדכן $READONLY_COUNT$ מהפריטים בגלל שאין לך הרשאות עריכה.", "placeholders": { "total_count": { "content": "$1", @@ -8992,61 +8981,61 @@ } }, "addField": { - "message": "Add field" + "message": "הוסף שדה" }, "editField": { - "message": "Edit field" + "message": "ערוך שדה" }, "items": { - "message": "Items" + "message": " פריטים " }, "assignedSeats": { - "message": "Assigned seats" + "message": "מקומות שהוקצו" }, "assigned": { - "message": "Assigned" + "message": "הוקצו" }, "used": { - "message": "Used" + "message": "בשימוש" }, "remaining": { - "message": "Remaining" + "message": "נותרו" }, "unlinkOrganization": { - "message": "Unlink organization" + "message": "בטל קישור לארגון" }, "manageSeats": { - "message": "MANAGE SEATS" + "message": "נהל מקומות" }, "manageSeatsDescription": { - "message": "Adjustments to seats will be reflected in the next billing cycle." + "message": "התאמות למקומות ישתקפו במחזור החיוב הבא." }, "unassignedSeatsDescription": { - "message": "Unassigned seats" + "message": "מקומות לא מוקצים" }, "purchaseSeatDescription": { - "message": "Additional seats purchased" + "message": "מקומות נוספים נרכשו" }, "assignedSeatCannotUpdate": { - "message": "Assigned Seats can not be updated. Please contact your organization owner for assistance." + "message": "לא ניתן לעדכן מקומות מוקצים. נא ליצור קשר עם בעלי הארגון שלך עבור סיוע." }, "subscriptionUpdateFailed": { - "message": "Subscription update failed" + "message": "עדכון מנוי נכשל" }, "trial": { - "message": "Trial", + "message": "ניסיון", "description": "A subscription status label." }, "pastDue": { - "message": "Past due", + "message": "עבר את המועד", "description": "A subscription status label" }, "subscriptionExpired": { - "message": "Subscription expired", + "message": "פג תוקף המנוי", "description": "The date header used when a subscription is past due." }, "pastDueWarningForChargeAutomatically": { - "message": "You have a grace period of $DAYS$ days from your subscription expiration date to maintain your subscription. Please resolve the past due invoices by $SUSPENSION_DATE$.", + "message": "יש לך תקופת חסד של $DAYS$ ימים מתאריך תפוגת המנוי שלך כדי לשמור על המנוי שלך. נא ליישב את החשבוניות שמועד פירעונן עבר עד $SUSPENSION_DATE$.", "placeholders": { "days": { "content": "$1", @@ -9060,7 +9049,7 @@ "description": "A warning shown to the user when their subscription is past due and they are charged automatically." }, "pastDueWarningForSendInvoice": { - "message": "You have a grace period of $DAYS$ days from the date your first unpaid invoice is due to maintain your subscription. Please resolve the past due invoices by $SUSPENSION_DATE$.", + "message": "יש לך תקופת חסד של $DAYS$ ימים מתאריך הפירעון של החשבונית הראשונה שלך שלא שולמה כדי לשמור על המנוי שלך. נא ליישב את החשבוניות שמועד פירעונן עבר עד $SUSPENSION_DATE$.", "placeholders": { "days": { "content": "$1", @@ -9074,54 +9063,54 @@ "description": "A warning shown to the user when their subscription is past due and they pay via invoice." }, "unpaidInvoice": { - "message": "Unpaid invoice", + "message": "חשבונית שלא שולמה", "description": "The header of a warning box shown to a user whose subscription is unpaid." }, "toReactivateYourSubscription": { - "message": "To reactivate your subscription, please resolve the past due invoices.", + "message": "כדי להפעיל מחדש את המנוי שלך, נא ליישב את החשבוניות שמועד פירעונן עבר.", "description": "The body of a warning box shown to a user whose subscription is unpaid." }, "cancellationDate": { - "message": "Cancellation date", + "message": "תאריך ביטול", "description": "The date header used when a subscription is cancelled." }, "machineAccountsCannotCreate": { - "message": "Machine accounts cannot be created in suspended organizations. Please contact your organization owner for assistance." + "message": "לא ניתן ליצור חשבונות מכונה בארגונים מושעים. נא ליצור קשר עם בעלי הארגון שלך עבור סיוע." }, "machineAccount": { - "message": "Machine account", + "message": "חשבון מכונה", "description": "A machine user which can be used to automate processes and access secrets in the system." }, "machineAccounts": { - "message": "Machine accounts", + "message": "חשבונות מכונה", "description": "The title for the section that deals with machine accounts." }, "newMachineAccount": { - "message": "New machine account", + "message": "חשבון מכונה חדש", "description": "Title for creating a new machine account." }, "machineAccountsNoItemsMessage": { - "message": "Create a new machine account to get started automating secret access.", + "message": "צור חשבון מכונה חדש כדי להתחיל לאטמט גישת סודות.", "description": "Message to encourage the user to start creating machine accounts." }, "machineAccountsNoItemsTitle": { - "message": "Nothing to show yet", + "message": "אין מה להראות עדיין", "description": "Title to indicate that there are no machine accounts to display." }, "deleteMachineAccounts": { - "message": "Delete machine accounts", + "message": "מחק חשבונות מכונה", "description": "Title for the action to delete one or multiple machine accounts." }, "deleteMachineAccount": { - "message": "Delete machine account", + "message": "מחק חשבון מכונה", "description": "Title for the action to delete a single machine account." }, "viewMachineAccount": { - "message": "View machine account", + "message": "הצג חשבון מכונה", "description": "Action to view the details of a machine account." }, "deleteMachineAccountDialogMessage": { - "message": "Deleting machine account $MACHINE_ACCOUNT$ is permanent and irreversible.", + "message": "מחיקת חשבון מכונה $MACHINE_ACCOUNT$ היא לצמיתות ובלתי הפיכה.", "placeholders": { "machine_account": { "content": "$1", @@ -9130,10 +9119,10 @@ } }, "deleteMachineAccountsDialogMessage": { - "message": "Deleting machine accounts is permanent and irreversible." + "message": "מחיקת חשבונות מכונה היא לצמיתות ובלתי הפיכה." }, "deleteMachineAccountsConfirmMessage": { - "message": "Delete $COUNT$ machine accounts", + "message": "מחק $COUNT$ חשבונות מכונה", "placeholders": { "count": { "content": "$1", @@ -9142,60 +9131,60 @@ } }, "deleteMachineAccountToast": { - "message": "Machine account deleted" + "message": "חשבון מכונה נמחק" }, "deleteMachineAccountsToast": { - "message": "Machine accounts deleted" + "message": "חשבונות מכונה נמחקו" }, "searchMachineAccounts": { - "message": "Search machine accounts", + "message": "חפש חשבונות מכונה", "description": "Placeholder text for searching machine accounts." }, "editMachineAccount": { - "message": "Edit machine account", + "message": "ערוך חשבון מכונה", "description": "Title for editing a machine account." }, "machineAccountName": { - "message": "Machine account name", + "message": "שם חשבון מכונה", "description": "Label for the name of a machine account" }, "machineAccountCreated": { - "message": "Machine account created", + "message": "חשבון מכונה נוצר", "description": "Notifies that a new machine account has been created" }, "machineAccountUpdated": { - "message": "Machine account updated", + "message": "חשבון מכונה עודכן", "description": "Notifies that a machine account has been updated" }, "projectMachineAccountsDescription": { - "message": "Grant machine accounts access to this project." + "message": "הענק לחשבונות מכונה גישה לפרויקט הזה." }, "projectMachineAccountsSelectHint": { - "message": "Type or select machine accounts" + "message": "הקלד או בחר חשבונות מכונה" }, "projectEmptyMachineAccountAccessPolicies": { - "message": "Add machine accounts to grant access" + "message": "הוסף חשבונות מכונה כדי להעניק גישה" }, "machineAccountPeopleDescription": { - "message": "Grant groups or people access to this machine account." + "message": "הענק לקבוצות או אנשים גישה לחשבון מכונה זה." }, "machineAccountProjectsDescription": { - "message": "Assign projects to this machine account. " + "message": "הקצה פרויקטים לחשבון המכונה הזה: " }, "createMachineAccount": { - "message": "Create a machine account" + "message": "צור חשבון מכונה" }, "maPeopleWarningMessage": { - "message": "Removing people from a machine account does not remove the access tokens they created. For security best practice, it is recommended to revoke access tokens created by people removed from a machine account." + "message": "הסרת אנשים מחשבון מכונה אינה מסירה את אסימוני הגישה שהם יצרו. עבור גישת האבטחה הטובה ביותר, מומלץ לבטל אסימוני גישה שנוצרו על ידי אנשים שהוסרו מחשבון מכונה." }, "smAccessRemovalWarningMaTitle": { - "message": "Remove access to this machine account" + "message": "הסר גישה לחשבון מכונה זה" }, "smAccessRemovalWarningMaMessage": { - "message": "This action will remove your access to the machine account." + "message": "פעולה זו תסיר את הגישה שלך לחשבון המכונה." }, "machineAccountsIncluded": { - "message": "$COUNT$ machine accounts included", + "message": "$COUNT$ חשבונות מכונה כלולים", "placeholders": { "count": { "content": "$1", @@ -9204,7 +9193,7 @@ } }, "additionalMachineAccountCost": { - "message": "$COST$ per month for additional machine accounts", + "message": "$COST$ לחודש עבור חשבונות מכונה נוספים", "placeholders": { "cost": { "content": "$1", @@ -9213,10 +9202,10 @@ } }, "additionalMachineAccounts": { - "message": "Additional machine accounts" + "message": "חשבונות מכונה נוספים" }, "includedMachineAccounts": { - "message": "Your plan comes with $COUNT$ machine accounts.", + "message": "התוכנית שלך מגיעה עם $COUNT$ חשבונות מכונה.", "placeholders": { "count": { "content": "$1", @@ -9225,7 +9214,7 @@ } }, "addAdditionalMachineAccounts": { - "message": "You can add additional machine accounts for $COST$ per month.", + "message": "אתה יכול להוסיף חשבונות מכונה נוספים עבור $COST$ לחודש.", "placeholders": { "cost": { "content": "$1", @@ -9234,31 +9223,31 @@ } }, "limitMachineAccounts": { - "message": "Limit machine accounts (optional)" + "message": "הגבל חשבונות מכונה (אופציונלי)" }, "limitMachineAccountsDesc": { - "message": "Set a limit for your machine accounts. Once this limit is reached, you will not be able to create new machine accounts." + "message": "הגדר מגבלה עבור חשבונות המכונה שלך. ברגע שתגיע למגבלה זו, לא תוכל ליצור חשבונות מכונה חדשים." }, "machineAccountLimit": { - "message": "Machine account limit (optional)" + "message": "מגבלת חשבונות מכונה (אופציונלי)" }, "maxMachineAccountCost": { - "message": "Max potential machine account cost" + "message": "עלות מרבית פוטנציאלית של חשבון מכונה" }, "machineAccountAccessUpdated": { - "message": "Machine account access updated" + "message": "גישת חשבון המכונה עודכנה" }, "restrictedGroupAccessDesc": { - "message": "You cannot add yourself to a group." + "message": "אתה לא יכול להוסיף את עצמך לקבוצה." }, "deleteProvider": { - "message": "Delete provider" + "message": "מחק ספק" }, "deleteProviderConfirmation": { - "message": "Deleting a provider is permanent and irreversible. Enter your master password to confirm the deletion of the provider and all associated data." + "message": "מחיקת ספק היא לצמיתות ובלתי הפיכה. הזן את הסיסמה הראשית שלך כדי לאשר את המחיקה של הספק וכל הנתונים המשויכים." }, "deleteProviderName": { - "message": "Cannot delete $ID$", + "message": "לא ניתן למחוק את $ID$", "placeholders": { "id": { "content": "$1", @@ -9267,7 +9256,7 @@ } }, "deleteProviderWarningDescription": { - "message": "You must unlink all clients before you can delete $ID$.", + "message": "אתה מוכרח לבטל קישור של כל הלקוחות לפני שתוכל למחוק את $ID$.", "placeholders": { "id": { "content": "$1", @@ -9276,87 +9265,96 @@ } }, "providerDeleted": { - "message": "Provider deleted" + "message": "הספק נמחק" }, "providerDeletedDesc": { - "message": "The Provider and all associated data has been deleted." + "message": "הספק וכל המידע המשויך נמחק." }, "deleteProviderRecoverConfirmDesc": { - "message": "You have requested to delete this Provider. Use the button below to confirm." + "message": "ביקשת למחוק את הספק הזה. השתמש בלחצן למטה כדי לאשר." }, "deleteProviderWarning": { - "message": "Deleting your provider is permanent. It cannot be undone." + "message": "מחיקת הספק שלך היא לצמיתות. לא ניתן לבטלה." }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "שגיאה בהקצאת אוסף יעד." }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "שגיאה בהקצאת תיקיית יעד." }, "integrationsAndSdks": { - "message": "Integrations & SDKs", + "message": "שילובים & ערכות SDK", "description": "The title for the section that deals with integrations and SDKs." }, "integrations": { - "message": "Integrations" + "message": "שילובים" }, "integrationsDesc": { - "message": "Automatically sync secrets from Bitwarden Secrets Manager to a third-party service." + "message": "סנכרן באופן אוטומטי סודות ממנהל סודות של Bitwarden לשירות צד שלישי." }, "sdks": { - "message": "SDKs" + "message": "ערכות SDK" }, "sdksDesc": { - "message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications." + "message": "השתמש ב־SDK של מנהל הסודות של Bitwarden בשפות התכנות הבאות כדי לבנות את היישומים שלך." }, "ssoDescStart": { - "message": "Configure", + "message": "קבע תצורת", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "for Bitwarden using the implementation guide for your Identity Provider.", + "message": "עבור Bitwarden באמצעות מדריך היישום עבור ספק הזהות שלך.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { - "message": "User provisioning" + "message": "הקצאת משתמשים" }, "scimIntegration": { "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "קבע תצורת ", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", + "message": "(מערכת לניהול זהות חוצה תחומים) כדי להקצות באופן אוטומטי משתמשים וקבוצות אל Bitwarden באמצעות מדריך היישום עבור ספק הזהות שלך.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { - "message": "Bitwarden Directory Connector" + "message": "מחבר הספריות של Bitwarden" }, "bwdcDesc": { - "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." + "message": "קבע תצורת מחבר הספריות של Bitwarden כדי להקצות באופן אוטומטי משתמשים וקבוצות אל Bitwarden באמצעות מדריך היישום עבור ספק הזהות שלך." }, "eventManagement": { - "message": "Event management" + "message": "ניהול אירועים" }, "eventManagementDesc": { - "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." + "message": "שלב את יומני האירועים של Bitwarden עם מערכת ה־SIEM (מידע מערכת וניהול אירועים) שלך על ידי שימוש במדריך היישום עבור הפלטפורמה שלך." }, "deviceManagement": { - "message": "Device management" + "message": "ניהול מכשירים" }, "deviceManagementDesc": { - "message": "Configure device management for Bitwarden using the implementation guide for your platform." + "message": "קבע תצורת ניהול מכשירים עבור Bitwarden באמצעות מדריך היישום עבור הפלטפורמה שלך." + }, + "deviceIdMissing": { + "message": "מזהה המכשיר חסר" + }, + "deviceTypeMissing": { + "message": "סוג המכשיר חסר" + }, + "deviceCreationDateMissing": { + "message": "תאריך יצירת המכשיר חסר" }, "desktopRequired": { - "message": "Desktop required" + "message": "נדרש שולחן עבודה" }, "reopenLinkOnDesktop": { - "message": "Reopen this link from your email on a desktop." + "message": "פתח מחדש קישור זה מהדוא\"ל שלך בשולחן עבודה." }, "integrationCardTooltip": { - "message": "Launch $INTEGRATION$ implementation guide.", + "message": "פתח מדריך יישום $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9365,7 +9363,7 @@ } }, "smIntegrationTooltip": { - "message": "Set up $INTEGRATION$.", + "message": "הגדר את $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9374,7 +9372,7 @@ } }, "smSdkTooltip": { - "message": "View $SDK$ repository", + "message": "הצג מאגר $SDK$", "placeholders": { "sdk": { "content": "$1", @@ -9383,7 +9381,7 @@ } }, "integrationCardAriaLabel": { - "message": "open $INTEGRATION$ implementation guide in a new tab.", + "message": "פתח מדריך מימוש $INTEGRATION$ בכרטיסיה חדשה.", "placeholders": { "integration": { "content": "$1", @@ -9392,7 +9390,7 @@ } }, "smSdkAriaLabel": { - "message": "view $SDK$ repository in a new tab.", + "message": "הצג מאגר $SDK$ בכרטיסיה חדשה.", "placeholders": { "sdk": { "content": "$1", @@ -9401,7 +9399,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "set up $INTEGRATION$ implementation guide in a new tab.", + "message": "הגדר מדריך יישום $INTEGRATION$ בכרטיסיה חדשה.", "placeholders": { "integration": { "content": "$1", @@ -9410,67 +9408,67 @@ } }, "createNewClientToManageAsProvider": { - "message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle." + "message": "צור ארגון לקוחות חדש כדי לנהל כספק. מקומות נוספים ישתקפו במחזור החיוב הבא." }, "selectAPlan": { - "message": "Select a plan" + "message": "בחר תוכנית" }, "thirtyFivePercentDiscount": { - "message": "35% Discount" + "message": "35% הנחה" }, "monthPerMember": { - "message": "month per member" + "message": "חודש לכל חבר" }, "monthPerMemberBilledAnnually": { - "message": "month per member billed annually" + "message": "חודש לכל חבר מחויב מדי שנה" }, "seats": { - "message": "Seats" + "message": "מקומות" }, "addOrganization": { - "message": "Add organization" + "message": "הוסף ארגון" }, "createdNewClient": { - "message": "Successfully created new client" + "message": "יצר בהצלחה לקוח חדש" }, "noAccess": { - "message": "No access" + "message": "אין גישה" }, "collectionAdminConsoleManaged": { - "message": "This collection is only accessible from the admin console" + "message": "אוסף זה זמין רק ממסוף המנהל" }, "organizationOptionsMenu": { - "message": "Toggle Organization Menu" + "message": "שנה מצב תפריט ארגון" }, "vaultItemSelect": { - "message": "Select vault item" + "message": "בחר פריט כספת" }, "collectionItemSelect": { - "message": "Select collection item" + "message": "בחר פריט אוסף" }, "manageBillingFromProviderPortalMessage": { - "message": "Manage billing from the Provider Portal" + "message": "נהל חיובים מפורטל הספקים" }, "continueSettingUpFreeTrial": { - "message": "Continue setting up your free trial of Bitwarden" + "message": "המשך בהגדרת הניסיון החינמי של Bitwarden שלך" }, "continueSettingUpFreeTrialPasswordManager": { - "message": "Continue setting up your free trial of Bitwarden Password Manager" + "message": "המשך בהגדרת הניסיון החינמי של מנהל הסיסמאות Bitwarden שלך" }, "continueSettingUpFreeTrialSecretsManager": { - "message": "Continue setting up your free trial of Bitwarden Secrets Manager" + "message": "המשך בהגדרת הניסיון החינמי של מנהל הסודות Bitwarden שלך" }, "enterTeamsOrgInfo": { - "message": "Enter your Teams organization information" + "message": "הזן את פרטי ארגון הצוותים שלך" }, "enterFamiliesOrgInfo": { - "message": "Enter your Families organization information" + "message": "הזן את פרטי ארגון המשפחות שלך" }, "enterEnterpriseOrgInfo": { - "message": "Enter your Enterprise organization information" + "message": "הזן את פרטי הארגון הארגוני שלך" }, "viewItemsIn": { - "message": "View items in $NAME$", + "message": "הצג פריטים ב־$NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -9480,7 +9478,7 @@ } }, "backTo": { - "message": "Back to $NAME$", + "message": "חזרה אל $NAME$", "description": "Navigate back to a previous folder or collection", "placeholders": { "name": { @@ -9490,11 +9488,11 @@ } }, "back": { - "message": "Back", + "message": "הקודם", "description": "Button text to navigate back" }, "removeItem": { - "message": "Remove $NAME$", + "message": "הסר $NAME$", "description": "Remove a selected option, such as a folder or collection", "placeholders": { "name": { @@ -9504,34 +9502,34 @@ } }, "viewInfo": { - "message": "View info" + "message": "הצג מידע" }, "viewAccess": { - "message": "View access" + "message": "הצג גישה" }, "noCollectionsSelected": { - "message": "You have not selected any collections." + "message": "לא בחרת אוספים כלשהם." }, "updateName": { - "message": "Update name" + "message": "עדכן שם" }, "updatedOrganizationName": { - "message": "Updated organization name" + "message": "שם ארגון מעודכן" }, "providerPlan": { - "message": "Managed Service Provider" + "message": "ספק שירות מנוהל" }, "managedServiceProvider": { - "message": "Managed service provider" + "message": "ספק שירות מנוהל" }, "multiOrganizationEnterprise": { - "message": "Multi-organization enterprise" + "message": "ארגון רב-ארגוני" }, "orgSeats": { - "message": "Organization Seats" + "message": "מקומות ארגון" }, "providerDiscount": { - "message": "$AMOUNT$% Discount", + "message": "$AMOUNT$% הנחה", "placeholders": { "amount": { "content": "$1", @@ -9540,28 +9538,28 @@ } }, "lowKDFIterationsBanner": { - "message": "Low KDF iterations. Increase your iterations to improve the security of your account." + "message": "חזרות KDF נמוכות. הגדל את מספר החזרות שלך כדי לשפר את האבטחה של חשבונך." }, "changeKDFSettings": { - "message": "Change KDF settings" + "message": "שנה הגדרות KDF" }, "secureYourInfrastructure": { - "message": "Secure your infrastructure" + "message": "אבטח את התשתית שלך" }, "protectYourFamilyOrBusiness": { - "message": "Protect your family or business" + "message": "הגן על המשפחה או העסק שלך" }, "upgradeOrganizationCloseSecurityGaps": { - "message": "Close security gaps with monitoring reports" + "message": "צמצם פערי אבטחה עם דוחות ניטור" }, "upgradeOrganizationCloseSecurityGapsDesc": { - "message": "Stay ahead of security vulnerabilities by upgrading to a paid plan for enhanced monitoring." + "message": "היה תמיד לפני פרצות אבטחה על ידי שדרוג לתוכנית בתשלום עבור ניטור משופר." }, "approveAllRequests": { - "message": "Approve all requests" + "message": "אשר את כל הבקשות" }, "allLoginRequestsApproved": { - "message": "All login requests approved" + "message": "כל בקשות הכניסה אושרו" }, "payPal": { "message": "PayPal" @@ -9570,92 +9568,92 @@ "message": "Bitcoin" }, "updatedTaxInformation": { - "message": "Updated tax information" + "message": "פרטי מס מעודכנים" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "מזהה מס לא תקין, אם אתה מאמין שזאת שגיאה, אנא פנה לתמיכה." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "לא הצלחנו לאמת את מזהה המס שלך, אם אתה מאמין שזאת שגיאה, אנא פנה לתמיכה." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "מזהה מס לא תקין, אם אתה מאמין שזאת שגיאה, אנא פנה לתמיכה." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "אירעה שגיאה בזמן הצגת התצוגה המקדימה של החשבונית. נא לנסות שוב מאוחר יותר." }, "unverified": { - "message": "Unverified" + "message": "לא מאומת" }, "verified": { - "message": "Verified" + "message": "מאומת" }, "viewSecret": { - "message": "View secret" + "message": "הצג סוד" }, "noClients": { - "message": "There are no clients to list" + "message": "אין לקוחות להצגה ברשימה" }, "providerBillingEmailHint": { - "message": "This email address will receive all invoices pertaining to this provider", + "message": "כתובת דוא\"ל זו תקבל את כל החשבוניות הנוגעות לספק זה", "description": "A hint that shows up on the Provider setup page to inform the admin the billing email will receive the provider's invoices." }, "upgradeOrganizationEnterprise": { - "message": "Identify security risks by auditing member access" + "message": "זהה סיכוני אבטחה על ידי ביקורת של גישת חברים" }, "onlyAvailableForEnterpriseOrganization": { - "message": "Quickly view member access across the organization by upgrading to an Enterprise plan." + "message": "הצג במהירות גישת חברים ברחבי הארגון על ידי שדרוג לתוכנית ארגונית." }, "date": { - "message": "Date" + "message": "תאריך" }, "exportClientReport": { - "message": "Export client report" + "message": "ייצא דוח לקוח" }, "memberAccessReport": { - "message": "Member access" + "message": "גישת חברים" }, "memberAccessReportDesc": { - "message": "Ensure members have access to the right credentials and their accounts are secure. Use this report to obtain a CSV of member access and account configurations." + "message": "וודא שלחברים יש גישה לתעודות הנכונות ושהחשבונות שלהם מאובטחים. השתמש בדוח הזה כדי לקבל CSV של גישת חברים ותצורות חשבון." }, "memberAccessReportPageDesc": { - "message": "Audit organization member access across groups, collections, and collection items. The CSV export provides a detailed breakdown per member, including information on collection permissions and account configurations." + "message": "ערוך ביקורת של גישת חברי ארגון ברחבי קבוצות, אוספים, ופריטי אוספים. ייצוא ה־CSV מספק פירוט מפורט לכל חבר, כולל מידע על הרשאות של אוספים ותצורות חשבון." }, "memberAccessReportNoCollection": { - "message": "(No Collection)" + "message": "(אין אוסף)" }, "memberAccessReportNoCollectionPermission": { - "message": "(No Collection Permission)" + "message": "(אין הרשאת אוסף)" }, "memberAccessReportNoGroup": { - "message": "(No Group)" + "message": "(אין קבוצה)" }, "memberAccessReportTwoFactorEnabledTrue": { - "message": "On" + "message": "מופעל" }, "memberAccessReportTwoFactorEnabledFalse": { - "message": "Off" + "message": "כבוי" }, "memberAccessReportAuthenticationEnabledTrue": { - "message": "On" + "message": "מופעל" }, "memberAccessReportAuthenticationEnabledFalse": { - "message": "Off" + "message": "כבוי" }, "higherKDFIterations": { - "message": "Higher KDF iterations can help protect your master password from being brute forced by an attacker." + "message": "ערכי חזרות KDF גבוהים יותר יכולים לעזור להגן על הסיסמה הראשית מפני תקיפה כוחנית על ידי תוקף." }, "incrementsOf100,000": { - "message": "increments of 100,000" + "message": "במרווחים של 100,000" }, "smallIncrements": { - "message": "small increments" + "message": "במרווחים קטנים" }, "kdfIterationRecommends": { - "message": "We recommend 600,000 or more" + "message": "אנו ממליצים על 600,000 או יותר" }, "kdfToHighWarningIncreaseInIncrements": { - "message": "For older devices, setting your KDF too high may lead to performance issues. Increase the value in $VALUE$ and test your devices.", + "message": "עבור מכשירים ישנים יותר, הגדרת ה־KDF שלך לערך גבוה מדי עשויה להוביל לבעיות ביצועים. הגדל את הערך ב־$VALUE$ ובדוק את המכשירים שלך.", "placeholders": { "value": { "content": "$1", @@ -9664,31 +9662,31 @@ } }, "providerReinstate": { - "message": " Contact Customer Support to reinstate your subscription." + "message": " צור קשר עם שירות הלקוחות כדי להחזיר את המנוי שלך." }, "secretPeopleDescription": { - "message": "Grant groups or people access to this secret. Permissions set for people will override permissions set by groups." + "message": "הענק לקבוצות או אנשים גישה לסוד הזה. הרשאות שהוגדרו עבור אנשים ידרסו הרשאות שהוגדרו על ידי קבוצות." }, "secretPeopleEmptyMessage": { - "message": "Add people or groups to share access to this secret" + "message": "הוסף אנשים או קבוצות כדי לשתף גישה לסוד הזה" }, "secretMachineAccountsDescription": { - "message": "Grant machine accounts access to this secret." + "message": "הענק לחשבונות מכונה גישה לסוד הזה." }, "secretMachineAccountsEmptyMessage": { - "message": "Add machine accounts to grant access to this secret" + "message": "הוסף חשבונות מכונה כדי להעניק גישה לסוד הזה" }, "smAccessRemovalWarningSecretTitle": { - "message": "Remove access to this secret" + "message": "הסר גישה לסוד הזה" }, "smAccessRemovalSecretMessage": { - "message": "This action will remove your access to this secret." + "message": "פעולה זו תסיר את הגישה שלך לסוד הזה." }, "invoice": { - "message": "Invoice" + "message": "חשבונית" }, "unassignedSeatsAvailable": { - "message": "You have $SEATS$ unassigned seats available.", + "message": "יש לך $SEATS$ מקומות לא מוקצים זמינים.", "placeholders": { "seats": { "content": "$1", @@ -9698,61 +9696,61 @@ "description": "A message showing how many unassigned seats are available for a provider." }, "contactYourProviderForAdditionalSeats": { - "message": "Contact your provider admin to purchase additional seats." + "message": "צור קשר עם מנהל הספק שלך כדי לרכוש מקומות נוספים." }, "open": { - "message": "Open", + "message": "פתח", "description": "The status of an invoice." }, "uncollectible": { - "message": "Uncollectible", + "message": "אינה ניתנת לאיסוף", "description": "The status of an invoice." }, "clientDetails": { - "message": "Client details" + "message": "פרטי לקוח" }, "downloadCSV": { - "message": "Download CSV" + "message": "הורד CSV" }, "monthlySubscriptionUserSeatsMessage": { - "message": "Adjustments to your subscription will result in prorated charges to your billing totals on your next billing period. " + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים לסך כל החיובים שלך במחזור החיוב הבא שלך. " }, "annualSubscriptionUserSeatsMessage": { - "message": "Adjustments to your subscription will result in prorated charges on a monthly billing cycle. " + "message": "התאמות למנוי שלך יגרמו לשינויים יחסיים במחזור חיוב חודשי. " }, "billingHistoryDescription": { - "message": "Download a CSV to obtain client details for each billing date. Prorated charges are not included in the CSV and may vary from the linked invoice. For the most accurate billing details, refer to your monthly invoices.", + "message": "הורד CSV כדי לקבל פרטי לקוח עבור כל תאריך חיוב. חיובים יחסיים אינם כלולים ב־CSV ועשויים להיות שונים מהחשבונית המקושרת. עבור פרטי החיוב המדויקים ביותר, עיין בחשבוניות החודשיות שלך.", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "noInvoicesToList": { - "message": "There are no invoices to list", + "message": "אין חשבוניות להצגה ברשימה", "description": "A paragraph on the Billing History page of the Provider Portal letting users know they can download a CSV report for their invoices that does not include prorations." }, "providerClientVaultPrivacyNotification": { - "message": "Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions,", + "message": "הודעה: מאוחר יותר החודש, הפרטיות של כספת לקוח תשופר וחברי ספק לא יוכלו לגשת ישירות לפריטי כספת לקוח. לשאלות,", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'." }, "contactBitwardenSupport": { - "message": "contact Bitwarden support.", + "message": "פנה לתמיכת Bitwarden.", "description": "This will be displayed as part of a larger sentence. The whole sentence reads: 'Notice: Later this month, client vault privacy will be improved and provider members will no longer have direct access to client vault items. For questions, please contact Bitwarden support'. 'Bitwarden' should not be translated" }, "sponsored": { - "message": "Sponsored" + "message": "ממומן" }, "licenseAndBillingManagementDesc": { - "message": "After making updates in the Bitwarden cloud server, upload your license file to apply the most recent changes." + "message": "לאחר ביצוע עדכונים בשרת הענן של Bitwarden, העלה את קובץ הרישיון שלך כדי להחיל את השינויים הכי אחרונים." }, "addToFolder": { - "message": "Add to folder" + "message": "הוסף לתיקייה" }, "selectFolder": { - "message": "Select folder" + "message": "בחר תיקייה" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "פריט 1 יועבר לצמיתות לארגון הנבחר. לא תהיה יותר הבעלים של הפריט הזה." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ פריטים יועברו לצמיתות לארגון הנבחר. לא תהיה יותר הבעלים של הפריטים האלה.", "placeholders": { "personal_items_count": { "content": "$1", @@ -9761,7 +9759,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "פריט 1 יועבר לצמיתות אל $ORG$. לא תהיה יותר הבעלים של הפריט הזה.", "placeholders": { "org": { "content": "$1", @@ -9770,7 +9768,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ פריטים יועברו לצמיתות אל $ORG$. לא תהיה יותר הבעלים של הפריטים האלה.", "placeholders": { "personal_items_count": { "content": "$1", @@ -9783,79 +9781,85 @@ } }, "data": { - "message": "Data" + "message": "נתונים" }, "purchasedSeatsRemoved": { - "message": "purchased seats removed" + "message": "מקומות שנרכשו הוסרו" }, "environmentVariables": { - "message": "Environment variables" + "message": "משתני סביבה" }, "organizationId": { - "message": "Organization ID" + "message": "מזהה ארגון" }, "projectIds": { - "message": "Project IDs" + "message": "מזהי פרויקט" }, "projectId": { - "message": "Project ID" + "message": "מזהה פרויקט" }, "projectsAccessedByMachineAccount": { - "message": "The following projects can be accessed by this machine account." + "message": "ניתן לגשת לפרויקטים הבאים על ידי חשבון מכונה זה." }, "config": { - "message": "Config" + "message": "תצורה" }, "learnMoreAboutEmergencyAccess": { - "message": "Learn more about emergency access" + "message": "למד עוד על גישת חירום" }, "learnMoreAboutMatchDetection": { - "message": "Learn more about match detection" + "message": "למד עוד על זיהוי התאמה" }, "learnMoreAboutMasterPasswordReprompt": { - "message": "Learn more about master password re-prompt" + "message": "למד עוד על בקשה חוזרת של סיסמה ראשית" }, "learnMoreAboutSearchingYourVault": { - "message": "Learn more about searching your vault" + "message": "למד עוד על חיפוש הכספת שלך" }, "learnMoreAboutYourAccountFingerprintPhrase": { - "message": "Learn about your account fingerprint phrase" + "message": "למד עוד על ביטוי טביעת האצבע של החשבון שלך" }, "impactOfRotatingYourEncryptionKey": { - "message": "Impact of rotating your encryption key" + "message": "השפעת סיבוב מפתח ההצפנה שלך" }, "learnMoreAboutEncryptionAlgorithms": { - "message": "Learn more about encryption algorithms" + "message": "למד עוד על אלגוריתמי הצפנה" }, "learnMoreAboutKDFIterations": { - "message": "Learn more about KDF iterations" + "message": "למד עוד על חזרות KDF" }, "learnMoreAboutLocalization": { - "message": "Learn more about localization" + "message": "למד עוד על לוקליזציה" }, "learnMoreAboutWebsiteIcons": { - "message": "Learn more about using website icons" + "message": "למד עוד על שימוש בסמלי אתרים" }, "learnMoreAboutUserAccess": { - "message": "Learn more about user access" + "message": "למד עוד על גישת משתמש" }, "learnMoreAboutMemberRoles": { - "message": "Learn more about member roles and permissions" + "message": "למד עוד על תפקידים והרשאות של חברים" }, "whatIsACvvNumber": { - "message": "What is a CVV number?" + "message": "מה זה מספר CVV?" }, "learnMoreAboutApi": { - "message": "Learn more about Bitwarden's API" + "message": "למד עוד על ה־API של Bitwarden" + }, + "fileSend": { + "message": "סֵנְד של קובץ" }, "fileSends": { - "message": "File Sends" + "message": "סֵנְדים של קובץ" + }, + "textSend": { + "message": "סֵנְד של טקסט" }, "textSends": { - "message": "Text Sends" + "message": "סֵנְדים של טקסט" }, "includesXMembers": { - "message": "for $COUNT$ member", + "message": "עבור $COUNT$ חברים", "placeholders": { "count": { "content": "$1", @@ -9873,10 +9877,10 @@ } }, "optionalOnPremHosting": { - "message": "Optional on-premises hosting" + "message": "אירוח מקומי אופציונלי" }, "upgradeFreeOrganization": { - "message": "Upgrade your $NAME$ organization ", + "message": "שדרג את ארגון ה$NAME$ שלך ", "placeholders": { "name": { "content": "$1", @@ -9885,10 +9889,10 @@ } }, "includeSsoAuthenticationMessage": { - "message": "SSO Authentication" + "message": "אימות SSO" }, "familiesPlanInvLimitReachedManageBilling": { - "message": "Families organizations may have up to $SEATCOUNT$ members. Upgrade to a paid plan to invite more members.", + "message": "ארגוני משפחות יכולים לכלול עד $SEATCOUNT$ חברים. שדרג לתוכנית בתשלום כדי להזמין עוד חברים.", "placeholders": { "seatcount": { "content": "$1", @@ -9897,7 +9901,7 @@ } }, "familiesPlanInvLimitReachedNoManageBilling": { - "message": "Families organizations may have up to $SEATCOUNT$ members. Contact your organization owner to upgrade.", + "message": "ארגוני משפחות יכולים לכלול עד $SEATCOUNT$ חברים. פנה לבעלי הארגון שלך כדי לשדרג.", "placeholders": { "seatcount": { "content": "$1", @@ -9906,10 +9910,10 @@ } }, "upgradePlans": { - "message": "Upgrade your plan to invite members and experience powerful security features." + "message": "שדרג את התוכנית שלך כדי להזמין חברים ולחוות תכונות אבטחה עוצמתיות." }, "upgradeDiscount": { - "message": "Save $AMOUNT$%", + "message": "חסוך $AMOUNT$%", "placeholders": { "amount": { "content": "$1", @@ -9918,146 +9922,146 @@ } }, "enterprisePlanUpgradeMessage": { - "message": "Advanced capabilities for larger organizations" + "message": "יכולות מתקדמות עבור ארגונים גדולים יותר" }, "teamsPlanUpgradeMessage": { - "message": "Resilient protection for growing teams" + "message": "הגנה עמידה עבור צוותים בצמיחה" }, "teamsInviteMessage": { - "message": "Invite unlimited members" + "message": "הזמן מספר בלתי מוגבל של חברים" }, "accessToCreateGroups": { - "message": "Access to create groups" + "message": "גישה ליצור קבוצות" }, "syncGroupsAndUsersFromDirectory": { - "message": "Sync groups and users from a directory" + "message": "סנכרן קבוצות ומשתמשים מתוך ספריה" }, "familyPlanUpgradeMessage": { - "message": "Secure your family logins" + "message": "אבטח את הכניסות של המשפחה שלך" }, "accessToPremiumFeatures": { - "message": "Access to Premium features" + "message": "גישה לתכונות פרימיום" }, "additionalStorageGbMessage": { - "message": "GB additional storage" + "message": "GB אחסון נוסף" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "אלגוריתם מפתח" }, "sshPrivateKey": { - "message": "Private key" + "message": "מפתח פרטי" }, "sshPublicKey": { - "message": "Public key" + "message": "מפתח ציבורי" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "טביעת אצבע" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "טביעת אצבע" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "מפתח פרטי" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "מפתח ציבורי" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA‏ 2048 סיביות" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA‏ 3072 סיביות" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA‏ 4096 סיביות" }, "premiumAccounts": { - "message": "6 premium accounts" + "message": "6 חשבונות פרימיום" }, "unlimitedSharing": { - "message": "Unlimited sharing" + "message": "שיתוף ללא הגבלה" }, "unlimitedCollections": { - "message": "Unlimited collections" + "message": "אוספים ללא הגבלה" }, "secureDataSharing": { - "message": "Secure data sharing" + "message": "שיתוף נתונים מאובטח" }, "eventLogMonitoring": { - "message": "Event log monitoring" + "message": "ניטור יומן אירועים" }, "directoryIntegration": { - "message": "Directory integration" + "message": "שילוב ספריה" }, "passwordLessSso": { - "message": "Passwordless SSO" + "message": "SSO ללא סיסמה" }, "accountRecovery": { - "message": "Account recovery" + "message": "שחזור חשבון" }, "customRoles": { - "message": "Custom roles" + "message": "תפקידים מותאמים אישית" }, "unlimitedSecretsStorage": { - "message": "Unlimited secrets storage" + "message": "אחסון סודות ללא הגבלה" }, "unlimitedUsers": { - "message": "Unlimited users" + "message": "משתמשים ללא הגבלה" }, "UpTo50MachineAccounts": { - "message": "Up to 50 machine accounts" + "message": "עד 50 חשבונות מכונה" }, "UpTo20MachineAccounts": { - "message": "Up to 20 machine accounts" + "message": "עד 20 חשבונות מכונה" }, "current": { - "message": "Current" + "message": "נוכחי" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "מנוי מנהל הסודות שלך ישודרג בהתאם לתוכנית שנבחרה" }, "bitwardenPasswordManager": { - "message": "Bitwarden Password Manager" + "message": "מנהל הסיסמאות Bitwarden" }, "secretsManagerComplimentaryPasswordManager": { - "message": "Your complimentary one year Password Manager subscription will upgrade to the selected plan. You will not be charged until the complimentary period is over." + "message": "מנוי מנהל הסיסמאות חינמי לשנה אחת שלך ישודרג לתוכנית שנבחרה. לא תחויב עד שהתקופה החינמית תסתיים." }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "הקובץ נשמר למכשיר. נהל מהורדות המכשיר שלך." }, "publicApi": { - "message": "Public API", + "message": "API ציבורי", "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "הצג מונה תווים" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "הסתר מונה תווים" }, "editAccess": { - "message": "Edit access" + "message": "ערוך גישה" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "השתמש בשדות טקסט עבור נתונים כמו שאלות אבטחה" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "השתמש בשדות נסתרים עבור מידע רגיש כמו סיסמה" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "השתמש בתיבות סימון אם תרצה למלא אוטומטית תיבת סימון של טופס, כמו זכור דוא\"ל" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "השתמש בשדה מקושר כאשר אתה חווה בעיות מילוי אוטומטי עם אתר מסוים." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "הזן את מזהה ה־html, שם, תווית aria או מציין מיקום." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "כלול תווי אות גדולה", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -10065,7 +10069,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "כלול תווי אות קטנה", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -10073,7 +10077,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "כלול מספרים", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -10081,40 +10085,36 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "כלול תווים מיוחדים", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { - "message": "Add attachment" + "message": "הוסף צרופה" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "גודל הקובץ המרבי הוא 500MB" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "האם אתה בטוח שברצונך למחוק לצמיתות צרופה זו?" }, "manageSubscriptionFromThe": { - "message": "Manage subscription from the", + "message": "נהל מנוי מתוך", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." + "message": "כדי לארח את Bitwarden בשרת שלך, תצטרך להעלות את קובץ הרישיון שלך. כדי לתמוך בתוכניות למשפחות בחינם וביכולות חיוב מתקדמות עבור הארגון באירוח עצמי שלך, תצטרך להגדיר סנכרון אוטומטי בארגון האירוח העצמי שלך." }, "selfHostingTitleProper": { - "message": "Self-Hosting" + "message": "אירוח עצמי" }, "claim-domain-single-org-warning": { - "message": "Claiming a domain will turn on the single organization policy." + "message": "דרישת דומיין תפעיל את מדיניות הארגון היחיד." }, "single-org-revoked-user-warning": { - "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." + "message": "חברים שאינם עומדים בדרישות יבוטלו. מנהלים יכולים לשחזר חברים ברגע שהם עזבו את כל הארגונים האחרים." }, "deleteOrganizationUser": { - "message": "Delete $NAME$", + "message": "מחק $NAME$", "placeholders": { "name": { "content": "$1", @@ -10124,7 +10124,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "This will permanently delete all items owned by $NAME$. Collection items are not impacted.", + "message": "זה ימחק לצמיתות את כל הפריטים המנוהלים על ידי $NAME$. פריטי אוסף אינם מושפעים.", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -10134,11 +10134,11 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "This will permanently delete all items owned by the following members. Collection items are not impacted.", + "message": "זה ימחק לצמיתות את כל הפריטים המנוהלים על ידי החברים הבאים. פריטי אוסף אינם מושפעים.", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "Deleted $NAME$", + "message": "$NAME$ נמחק", "placeholders": { "name": { "content": "$1", @@ -10147,10 +10147,10 @@ } }, "organizationUserDeletedDesc": { - "message": "The user was removed from the organization and all associated user data has been deleted." + "message": "המשתמש הוסר מהארגון וכל נתוני המשתמש המשויכים נמחקו." }, "deletedUserId": { - "message": "Deleted user $ID$ - an owner / admin deleted the user account", + "message": "משתמש $ID$ נמחק - בעלים / מנהל מחק את חשבון המשתמש", "placeholders": { "id": { "content": "$1", @@ -10159,7 +10159,7 @@ } }, "userLeftOrganization": { - "message": "User $ID$ left organization", + "message": "משתמש $ID$ עזב את הארגון", "placeholders": { "id": { "content": "$1", @@ -10168,7 +10168,7 @@ } }, "suspendedOrganizationTitle": { - "message": "The $ORGANIZATION$ is suspended", + "message": "ה־$ORGANIZATION$ מושעה", "placeholders": { "organization": { "content": "$1", @@ -10177,37 +10177,37 @@ } }, "suspendedUserOrgMessage": { - "message": "Contact your organization owner for assistance." + "message": "צור קשר עם בעלי הארגון שלך עבור סיוע." }, "suspendedOwnerOrgMessage": { - "message": "To regain access to your organization, add a payment method." + "message": "כדי לקבל גישה מחדש לארגון שלך, הוסף אמצעי תשלום." }, "deleteMembers": { - "message": "Delete members" + "message": "מחק חברים" }, "noSelectedMembersApplicable": { - "message": "This action is not applicable to any of the selected members." + "message": "פעולה זו אינה ישימה לאף אחד מהחברים שנבחרו." }, "deletedSuccessfully": { - "message": "Deleted successfully" + "message": "נמחק בהצלחה" }, "freeFamiliesSponsorship": { - "message": "Remove Free Bitwarden Families sponsorship" + "message": "הסר חסות Bitwarden למשפחות בחינם" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Do not allow members to redeem a Families plan through this organization." + "message": "אל תאפשר לחברים לממש תוכנית משפחות דרך ארגון זה." }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the organization's billing page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "תשלום באמצעות חשבון בנק זמינה רק ללקוחות בארצות הברית. אתה תידרש לאמת את חשבון הבנק שלך. אנחנו נבצע מיקרו־הפקדה בתוך 1-2 ימי עסקים. הזן את קוד תיאור ההצהרה מהפקדה זו בדף החיוב של הארגון כדי לאמת את חשבון הבנק. כשל באימות חשבון הבנק יגרום לפספוס תשלום ולהשעיית המנוי שלך." }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "We have made a micro-deposit to your bank account (this may take 1-2 business days). Enter the six-digit code starting with 'SM' found on the deposit description. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "ביצענו מיקרו־הפקדה לחשבון הבנק שלך (זה עשוי לקחת 1-2 ימי עסקים). הזן את הקוד בן שש הספרות המתחיל ב־'SM' הנמצא בתיאור ההפקדה. כשל באימות חשבון הבנק יגרום לפספוס תשלום ולהשעיית המנוי שלך." }, "descriptorCode": { - "message": "Descriptor code" + "message": "קוד מתאר" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "אינך יכול להסיר אוספים עם הרשאות הצגה בלבד: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -10216,22 +10216,22 @@ } }, "importantNotice": { - "message": "Important notice" + "message": "הודעה חשובה" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "הגדר כניסה דו־שלבית" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "אתה יכול להגדיר כניסה דו־שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." }, "remindMeLater": { - "message": "Remind me later" + "message": "הזכר לי מאוחר יותר" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "יש לך גישה מהימנה לדוא\"ל שלך, $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -10240,49 +10240,49 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "לא, אין לי" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "כן, אני יכול לגשת לדוא\"ל שלי באופן מהימן" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "הפעל כניסה דו־שלבית" }, "changeAcctEmail": { - "message": "Change account email" + "message": "שנה דוא\"ל חשבון" }, "removeMembers": { - "message": "Remove members" + "message": "הסר חברים" }, "devices": { - "message": "Devices" + "message": "מכשירים" }, "deviceListDescription": { - "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." + "message": "החשבון שלך היה מחובר לכל אחד מהמכשירים למטה. אם אתה לא מזהה מכשיר, הסר אותו עכשיו." }, "deviceListDescriptionTemp": { - "message": "Your account was logged in to each of the devices below." + "message": "החשבון שלך היה מחובר לכל אחד מהמכשירים למטה." }, "claimedDomains": { - "message": "Claimed domains" + "message": "דומיינים שנדרשו" }, "claimDomain": { - "message": "Claim domain" + "message": "דרוש דומיין" }, "reclaimDomain": { - "message": "Reclaim domain" + "message": "דרוש דומיין מחדש" }, "claimDomainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be claimed." + "message": "דוגמה: mydomain.com. תת-דומיינים דורשים שרשומות נפרדות ידרשו." }, "automaticClaimedDomains": { - "message": "Automatic Claimed Domains" + "message": "דומיינים שנדרשו אוטומטית" }, "automaticDomainClaimProcess": { - "message": "Bitwarden will attempt to claim the domain 3 times during the first 72 hours. If the domain can’t be claimed, check the DNS record in your host and manually claim. The domain will be removed from your organization in 7 days if it is not claimed." + "message": "Bitwarden ינסה לדרוש את הדומיין 3 פעמים במהלך 72 השעות הראשונות. אם לא ניתן לדרוש את הדומיין, בדוק את רשומת ה־DNS במארח שלך ודרוש באופן ידני. הדומיין יוסר מהארגון שלך תוך 7 ימים אם הוא לא נדרש." }, "domainNotClaimed": { - "message": "$DOMAIN$ not claimed. Check your DNS records.", + "message": "$DOMAIN$ אינו נדרש. בדוק את רשומות ה־DNS שלך.", "placeholders": { "DOMAIN": { "content": "$1", @@ -10291,19 +10291,19 @@ } }, "domainStatusClaimed": { - "message": "Claimed" + "message": "נדרש" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "תחת אימות" }, "claimedDomainsDesc": { - "message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts." + "message": "דרוש דומיין כדי להחזיק בכל חשבונות החברים אשר כתובת הדוא\"ל שלהם תואמת את הדומיין. חברים יוכלו לדלג על מזהה ה־SSO בעת כניסה. מנהלים גם יוכלו למחוק חשבונות חברים." }, "invalidDomainNameClaimMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be claimed." + "message": "הקלט אינו בפורמט תקין. פורמט: mydomain.com. תת-דומיינים דורשים שרשומות נפרדות ידרשו." }, "domainClaimedEvent": { - "message": "$DOMAIN$ claimed", + "message": "$DOMAIN$ נדרש", "placeholders": { "DOMAIN": { "content": "$1", @@ -10312,7 +10312,7 @@ } }, "domainNotClaimedEvent": { - "message": "$DOMAIN$ not claimed", + "message": "$DOMAIN$ לא נדרש", "placeholders": { "DOMAIN": { "content": "$1", @@ -10321,7 +10321,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "אם תסיר את $EMAIL$, החסות עבור תוכנית משפחות זו לא תהיה ניתנת למימוש. האם אתה בטוח שברצונך להמשיך?", "placeholders": { "email": { "content": "$1", @@ -10330,7 +10330,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "אם תסיר את $EMAIL$, החסות עבור תוכנית משפחות זו תסתיים ואמצעי התשלום השמור יחויב $40 + מס רלוונטי בתאריך $DATE$. לא תוכל לממש חסות חדשה עד $DATE$. האם אתה בטוח שברצונך להמשיך?", "placeholders": { "email": { "content": "$1", @@ -10343,45 +10343,75 @@ } }, "domainClaimed": { - "message": "Domain claimed" + "message": "דומיין נדרש" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "שם ארגון לא יכול לחרוג מ־50 תווים." + }, + "sshKeyWrongPassword": { + "message": "הסיסמה שהזנת שגויה." + }, + "importSshKey": { + "message": "ייבוא" + }, + "confirmSshKeyPassword": { + "message": "אשר סיסמה" + }, + "enterSshKeyPasswordDesc": { + "message": "הזן את הסיסמה עבור מפתח ה־SSH." + }, + "enterSshKeyPassword": { + "message": "הזן סיסמה" + }, + "invalidSshKey": { + "message": "מפתח ה־SSH אינו תקין" + }, + "sshKeyTypeUnsupported": { + "message": "סוג מפתח ה־SSH אינו נתמך" + }, + "importSshKeyFromClipboard": { + "message": "ייבא מפתח מלוח ההעתקה" + }, + "sshKeyImported": { + "message": "מפתח SSH יובא בהצלחה" + }, + "copySSHPrivateKey": { + "message": "העתק מפתח פרטי" }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "פותח את הרחבת היישום של Bitwarden" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "משהו השתבש..." }, "openingExtensionError": { - "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + "message": "התקשינו לפתוח את הרחבת הדפדפן של Bitwarden. לחץ על הלחצן כדי לפתוח אותה עכשיו." }, "openExtension": { - "message": "Open extension" + "message": "פתח הרחבה" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "אין לך את הרחבת הדפדפן של Bitwarden?" }, "installExtension": { - "message": "Install extension" + "message": "התקן הרחבה" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "פתח את הרחבת הדפדפן" }, "openedExtensionViewAtRiskPasswords": { - "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + "message": "פתח בהצלחה את הרחבת הדפדפן של Bitwarden. אתה יכול לסקור עכשיו את הסיסמאות בסיכון שלך." }, "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "message": "התקשינו לפתוח את הרחבת הדפדפן של Bitwarden. פתח את הסמל של Bitwarden", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "from the toolbar.", + "message": "מסרגל הכלים.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "המנוי שלך יתחדש בקרוב. כדי להבטיח שירות רציף, צור קשר עם $RESELLER$ כדי לאשר את החידוש שלך לפני $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10394,7 +10424,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "חשבונית עבור המנוי שלך הונפקה בתאריך $ISSUED_DATE$. כדי להבטיח שירות רציף, צור קשר עם $RESELLER$ כדי לאשר את החידוש שלך לפני $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10411,7 +10441,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "החשבונית עבור המנוי שלך לא שולמה. כדי להבטיח שירות רציף, צור קשר עם $RESELLER$ כדי לאשר את החידוש שלך לפני $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10424,13 +10454,13 @@ } }, "restartOrganizationSubscription": { - "message": "Organization subscription restarted" + "message": "מנוי ארגון הופעל מחדש" }, "restartSubscription": { - "message": "Restart your subscription" + "message": "הפעל מחדש את המנוי שלך" }, "suspendedManagedOrgMessage": { - "message": "Contact $PROVIDER$ for assistance.", + "message": "פנה אל $PROVIDER$ עבור סיוע.", "placeholders": { "provider": { "content": "$1", @@ -10439,16 +10469,16 @@ } }, "accountDeprovisioningNotification": { - "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + "message": "למנהלים עכשיו יש את היכולת למחוק חשבונות של חברים ששייכים לדומיין שנדרש." }, "deleteManagedUserWarningDesc": { - "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + "message": "פעולה זו תמחק את חשבון החבר כולל כל הפריטים בכספת שלו. זו מחליפה את פעולת ההסרה הקודמת." }, "deleteManagedUserWarning": { - "message": "Delete is a new action!" + "message": "מחיקה היא פעולה חדשה!" }, "seatsRemaining": { - "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "message": "יש לך $REMAINING$ מקומות נותרים מתוך $TOTAL$ מקומות שהוקצו לארגון זה. פנה לספק שלך כדי לנהל את המנוי שלך.", "placeholders": { "remaining": { "content": "$1", @@ -10461,19 +10491,19 @@ } }, "existingOrganization": { - "message": "Existing organization" + "message": "ארגון קיים" }, "selectOrganizationProviderPortal": { - "message": "Select an organization to add to your Provider Portal." + "message": "בחר ארגון להוספה אל פורטל הספקים שלך." }, "noOrganizations": { - "message": "There are no organizations to list" + "message": "אין ארגונים להצגה ברשימה" }, "yourProviderSubscriptionCredit": { - "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + "message": "מנוי הספק שלך יקבל זיכוי עבור כל הזמן שנותר במנוי של הארגון." }, "doYouWantToAddThisOrg": { - "message": "Do you want to add this organization to $PROVIDER$?", + "message": "האם ברצונך להוסיף ארגון זה אל $PROVIDER$?", "placeholders": { "provider": { "content": "$1", @@ -10482,19 +10512,22 @@ } }, "addedExistingOrganization": { - "message": "Added existing organization" + "message": "נוסף ארגון קיים" }, "assignedExceedsAvailable": { - "message": "Assigned seats exceed available seats." + "message": "מקומות מוקצים עולים על מקומות פנויים." + }, + "changeAtRiskPassword": { + "message": "שנה סיסמה בסיכון" }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "הסר ביטול נעילה עם PIN" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "אל תאפשר לחברים לבטל את נעילת החשבון שלהם עם PIN." }, "limitedEventLogs": { - "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "message": "לתוכניות מסוג $PRODUCT_TYPE$ אין גישה ליומני אירועים אמיתיים", "placeholders": { "product_type": { "content": "$1", @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + "message": "קבל גישה מלאה ליומני אירועים של ארגון על ידי שדרוג לתוכנית לצוותים או ארגונים." }, "upgradeEventLogTitle": { - "message": "Upgrade for real event log data" + "message": "שדרג עבור נתוני יומן אירועים אמיתיים" }, "upgradeEventLogMessage": { - "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + "message": "האירועים האלה הם דוגמאות בלבד ולא משקפים אירועים אמיתיים בתוך ארגון ה־Bitwarden שלך." + }, + "cannotCreateCollection": { + "message": "לארגונים חינמיים יכולים להיות עד 2 אוספים. שדרג לתוכנית בתשלום כדי להוסיף עוד אוספים." } } diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 57e7fb45f2d..1cab0dc843b 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "नोट्स" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "सॉर्ट करने के लिए ड्रैग करें" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "शब्द" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "चयनित मिटाएं" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "नहीं" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "सुरक्षित तिजोरी में प्रवेश करने के लिए नया खाता बनाएं या लॉग इन करें।" }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index 2663e056292..eaecafa5c0d 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Bilješke" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Bilješka" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Povuci za sortiranje" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Uredi mapu" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nova mapa" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtriraj" }, - "moveSelectedToOrg": { - "message": "Premjesti odabrano u Organizaciju" - }, "deleteSelected": { "message": "Obriši odabrano" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Odabrane stavke premještene u $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Stavke premještene u $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Prijavi se ili stvori novi račun za pristup svojem sigurnom trezoru." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "Sesija za autentifikaciju je istekla. Ponovi proces prijave." }, - "verifyIdentity": { - "message": "Potvrdi svoj identitet" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Ne prepoznajemo ovaj uređaj. Za potvrdu identiteta unesi kôd poslan e-poštom." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Unesi svoju adresu e-pošte računa i poslat ćemo ti tvoj podsjetnik" }, - "passwordHint": { - "message": "Podsjetnik za lozinku" - }, - "enterEmailToGetHint": { - "message": "Unesi adresu e-pošte svog računa za primitak podsjetnika glavne lozinke." - }, "getMasterPasswordHint": { "message": "Slanje podsjetnika glavne lozinke" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Odaberi organizaciju u koju želiš premjestiti ovu stavku. Premještanje prenosi vlasništvo stavke na organizaciju. Nakon premještanja više nećeš biti izravni vlasnik ove stavke." }, - "moveManyToOrgDesc": { - "message": "Odaberi organizaciju u koju želiš premjestiti ovu stavku. Premještanje prenosi vlasništvo stavke na organizaciju. Nakon premještanja više nećeš biti izravni vlasnik ove stavke." - }, "collectionsDesc": { "message": "Uredi zbirke s kojima se ova stavka koristi. Samo korisnici organizacije s pristupom ovim zbirkama će ih moći vidjeti." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$MOVEABLE_COUNT$ od $COUNT$ odabranih stavki može biti premješteno u Organiziaciju; $NONMOVEABLE_COUNT$ nije moguće premjestiti.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Kôd za provjeru (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Opozovi pristup" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Ovaj pružatelj prijave dvostrukom autentifikacijom je omogućen na tvojem računu." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Prilikom ažuriranja tvojeg ključa za šifriranje, mape se nisu mogle dešifrirati. Za nastavak ažuriranja, tvoje mape moraju biti izbrisane. Nijedna stavka iz trezora neće biti izbrisana ako nastaviš." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Pravilo neće biti primjenjeno na Vlasnike i Administratore." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Datoteka" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Stvori novi Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Izbriši Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Sigurno želiš izbrisati ovaj Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Koja je ovo vrsta Send-a?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Datum brisanja" }, - "deletionDateDesc": { - "message": "Send će biti trajno izbrisan navedenog datuma.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Najveći proj pristupanja" }, - "maxAccessCountDesc": { - "message": "Ako je uključeno, korisnici neće moći pristupiti ovom Sendu nakon što se postigne najveći broj pristupanja.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Trenutni broj pristupanja" - }, - "sendPasswordDesc": { - "message": "Ako želiš, možeš za pristup Sendu zahtijevati lozinku (nije obavezno).", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privatne bilješke o Sendu.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Onemogućeno" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Sigurno želiš ukloniti lozinku?" }, - "hideEmail": { - "message": "Sakrij moju adresu e-pošte od primatelja." - }, - "disableThisSend": { - "message": "Onemogući ovaj Send da mu nitko ne može pristupiti.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Svi Sendovi" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Čeka brisanje" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Isteklo" }, @@ -5415,13 +5441,6 @@ "message": "Ne dopusti skrivanje e-pošte kod stvaranja Senda.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Organizacijska pravila trenutno na snazi:" - }, - "sendDisableHideEmailInEffect": { - "message": "Korisnicima nije dopušteno skrivati adresu e-pošte od primatelja kod stvaranja ili uređivanja Senda.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Izmijenjena polica $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Onemogući osobno vlasnišvo za organizacijske korisnike" }, - "textHiddenByDefault": { - "message": "Zadano sakrij tekst pri pristupanju Sendu", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Nadimak za ovaj Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Tekst kojeg želiš poslati." - }, - "sendFileDesc": { - "message": "Datoteka koju želiš poslati." - }, - "copySendLinkOnSave": { - "message": "Kopiraj vezu za dijeljenje ovog Senda nakon spremanja." - }, - "sendLinkLabel": { - "message": "Veza na Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Došlo je do greške kod spremanja vaših datuma isteka i brisanja." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Za ovjeru tvoje 2FA, odaberi donju tipku." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Broj korisnika" }, - "loggingInAs": { - "message": "Prijava kao" - }, - "notYou": { - "message": "Nisi ti?" - }, "pickAnAvatarColor": { "message": "Odaberi boju avatara" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Zatraži odobrenje administratora" }, - "approveWithMasterPassword": { - "message": "Odobri glavnom lozinkom" - }, "trustedDeviceEncryption": { "message": "Enkripcija pouzdanog uređaja" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Tvoj zahtjev je poslan administratoru." }, - "youWillBeNotifiedOnceApproved": { - "message": "Dobiti ćeš obavijest kada bude odobreno." - }, "troubleLoggingIn": { "message": "Problem s prijavom?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Konfiguriraj upravljanje uređajima za Bitwarden pomoću vodiča za implementaciju za svoju platformu." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Potrebno stolno računalo" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Saznaj više o Bitwarden API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "Send datoteke" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Send tekstovi" }, @@ -10084,10 +10088,6 @@ "message": "Uključi posebne znakove", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "! @ # $ % ^ & *", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Dodaj privitak" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Naziv organizacije ne može biti duži od 50 znakova." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Otvaranje Bitwarden proširenja preglednika" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Dodijeljene licence premašuju dostupne licence." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index c414a82c017..3d6a2e258a4 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Jegyzetek" }, + "privateNote": { + "message": "Személyes jegyzet" + }, "note": { "message": "Jegyzet" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Húzás a rendezéshez" }, + "dragToReorder": { + "message": "Átrendezés áthúzással" + }, "cfTypeText": { "message": "Szöveg" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Mappa szerkesztése" }, + "editWithName": { + "message": "$ITEM$: $NAME$ szerkesztése", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Új mappa" }, @@ -860,9 +879,6 @@ "filter": { "message": "Szűrő" }, - "moveSelectedToOrg": { - "message": "A kiválasztott áthelyezése szervezetbe" - }, "deleteSelected": { "message": "Kiválasztott törlése" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "A kiválasztott elemek átkerültek $ORGNAME$ szervezethez", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Az elemek áthelyezésre kerültek: $ORGNAME$", "placeholders": { @@ -1009,7 +1016,7 @@ "message": "A hivatkozás lejárt" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Kezdd előlről a regisztrációt vagy próbálj belépni." }, "youMayAlreadyHaveAnAccount": { "message": "Lehet hogy már rendelkezel fiókkal" @@ -1029,6 +1036,9 @@ "no": { "message": "Nem" }, + "location": { + "message": "Hely" + }, "loginOrCreateNewAccount": { "message": "Bejelentkezés vagy új fiók létrehozása a biztonsági széf eléréséhez." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "A hitelesítési munkamenet időkifutással lejárt. Indítsuk újra a bejelentkezési folyamatot." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Személyazonosság ellenőrzése" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Adjuk meg fiók email címét és elküldésre kerül a jelszóra vonatkozó tipp." }, - "passwordHint": { - "message": "Jelszó emlékeztető" - }, - "enterEmailToGetHint": { - "message": "A fiók email címének megadása a mesterjelszó emlékeztető fogadásához." - }, "getMasterPasswordHint": { "message": "Mesterjelszó emlékeztető kérése" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Válasszunk egy szervezetet, ahová áthelyezni szeretnénk ezt az elemet. A szervezetbe áthelyezés átruházza az elem tulajdonjogát az adott szervezetre. Az áthelyezés után többé nem leszünk az elem közvetlen tulajdonosa." }, - "moveManyToOrgDesc": { - "message": "Válasszunk egy szervezetet, ahová áthelyezni szeretnénk ezeket az elemeket. A szervezetbe áthelyezés átruházza az elemek tulajdonjogát az adott szervezetre. Az áthelyezés után többé nem leszünk az elemek közvetlen tulajdonosa." - }, "collectionsDesc": { "message": "A megosztásra kerülő elem gyűjteményének szerkesztése. Csak az ezeket a gyűjteményeket elérő szervezeti felhasználók látják ezt az elemet." }, @@ -1583,7 +1584,7 @@ "message": "Biztos folytatni szeretnénk?" }, "moveSelectedItemsDesc": { - "message": "Choose a folder that you would like to add the $COUNT$ selected item(s) to.", + "message": "Válassz ki egy mappát, amihez ezt a(z) $COUNT$ kiválasztott elemet hozzá szeretnéd adni.", "placeholders": { "count": { "content": "$1", @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ elem került kiválasztásra. $MOVEABLE_COUNT$ elem áthelyezhető szervezethezi, $NONMOVEABLE_COUNT$ nem.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification Code (TOTP)" }, @@ -1618,10 +1602,10 @@ "message": "UUID másolása" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "Hozzáférési token frissítés hiba" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "Nem található frissítőtoken vagy API kulcs. Kérlek próbálj kilépni és újra belépni." }, "warning": { "message": "Figyelmeztetés" @@ -1639,7 +1623,7 @@ "message": "Ez az exportálás titkosítatlan formátumban tartalmazza a titkos adatokat. Ne tároljuk vagy ne küldjük el az exportált fájlt nem biztonságos csatornákon (például emailben). A használat befejezése után azonnal töröljük." }, "encExportKeyWarningDesc": { - "message": "Ez az exportálás titkosítja az adatokat a fiók titkosítási kulcsával. Ha valaha a diók forgatási kulcsa más lesz, akkor újra exportálni kell, mert nem lehet visszafejteni ezt az exportálási fájlt." + "message": "Ez az exportálás titkosítja az adatokat a fiók titkosítási kulcsával. Ha valaha a fiók forgatási kulcsa más lesz, akkor újra exportálni kell, mert nem lehet visszafejteni ezt az exportálási fájlt." }, "encExportAccountWarningDesc": { "message": "A fiók titkosítási kulcsai minden Bitwarden felhasználói fiókhoz egyediek, ezért nem importálhatunk titkosított exportálást egy másik fiókba." @@ -1678,7 +1662,7 @@ "message": "Fájl jelszó megerősítés" }, "accountRestrictedOptionDescription": { - "message": "Használjuk a fiókjfelhasználónevéből és a fő jelszóból származó titkosítási kulcsot az exportálás titkosításához és az importálás korlátozásához csak az aktuális Bitwarden fiókra." + "message": "Használjuk a fiók felhasználónevéből és a mesterjelszóból származó titkosítási kulcsot az exportálás titkosításához és az importálás korlátozásához csak az aktuális Bitwarden fiókra." }, "passwordProtectedOptionDescription": { "message": "Hozzunk létre egy felhasználó által generált jelszót az exportálás védelme érdekében. Ezzel más fiókokban is használható exportálást hozhatunk létre." @@ -1901,7 +1885,7 @@ "message": "Munkamenetek hitelesítésének eldobása" }, "deauthorizeSessionsDesc": { - "message": "Aggódunk a egy másik eszközön történő bejelentkezés miatt? Az alábbiakban ismertetett módon dobjuk el az összes hitelesítést az összes számítógépen és eszközön. Ez a biztonsági lépés akkor ajánlott, ha korábban nyilvános helyen levő számítógépet használtunk vagy véletlenül mentettünk jelszót egy olyan eszközön, amely nem a sajátunk. Ez a lépés törli az összes korábban megjegyzett kétlépéses bejelentkezési munkamenetet." + "message": "Aggódunk a egy másik eszközön történő bejelentkezés miatt? Az alábbiakban ismertetett módon dobjuk el az összes hitelesítést az összes számítógépen és eszközön. Ez a biztonsági lépés akkor ajánlott, ha korábban nyilvános helyen levő számítógépet használtunk vagy véletlenül mentettünk jelszót egy olyan eszközön, amely nem a sajátunk. Ez a lépés törli az összes korábban megjegyzett kétfaktoros bejelentkezési munkamenetet." }, "deauthorizeSessionsWarning": { "message": "A folytatásban s felhasználó kiléptetésre kerül az aktuális munkamenetből, szükséges az ismételt bejelentkezés. Ismételten megjelenik a kétlépcsős bejelentkezés, ha az engedélyezett. Más eszközök aktív munkamenetei akár egy óráig is aktívak maradhatnak." @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Hozzáférés visszavonása" }, + "revoke": { + "message": "Visszavonás" + }, "twoStepLoginProviderEnabled": { "message": "Ez a kétlépéses bejelentkezés szolgáltató már engedélyezett a fiókon." }, @@ -4501,7 +4488,7 @@ } }, "encryptionKeyUpdateCannotProceed": { - "message": "Encryption key update cannot proceed" + "message": "A titkosítókulcs frissítése nem végrehajtható" }, "editFieldLabel": { "message": "$LABEL$ szerkesztése", @@ -4521,8 +4508,42 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ feljebb került, $INDEX$/$LENGTH$ pozícióba", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ lejjebb került, $INDEX$/$LENGTH$ pozícióba", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { - "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." + "message": "A titkosítókulcs frissítésekor a mappáid nem fejthetőek vissza. A frissítés folytatásához a mappáidat törölni kell. Semmi nem fog törlődni, ha folytatod." }, "keyUpdated": { "message": "A kulcs frissítésre került." @@ -4567,7 +4588,7 @@ "message": "Nincs kiválasztva semmi." }, "receiveMarketingEmailsV2": { - "message": "Get advice, announcements, and research opportunities from Bitwarden in your inbox." + "message": "Kapj tanácsokat, bejelentéseket és közvélemény-kutatásokat a Bitwardentől a postaládádba." }, "unsubscribe": { "message": "Leiratkozás" @@ -4700,10 +4721,10 @@ "message": "A választott mesterjelszó gyenge. Erős jelszót kell használni a Bitwarden fiók megfelelő védelme érdekében. Biztosan ezt a mesterjelszót szeretnénk használni?" }, "rotateAccountEncKey": { - "message": "A fiók titkosító kulcs forgatása is" + "message": "A felhasználói fiókom titkosítókódját is cseréljük le" }, "rotateEncKeyTitle": { - "message": "Titkosító kulcs forgatása" + "message": "Titkosító kulcs cseréje" }, "rotateEncKeyConfirmation": { "message": "Biztosan fordításra kerüljön a fiók titkosító kulcsa?" @@ -4753,7 +4774,7 @@ "message": "Az API kulcs használható a Bitwarden nyilvános API hitelesítéséhez." }, "apiKeyRotateDesc": { - "message": "Az API kulcs forgatása érvényteleníti a korábbi kulcsot. Az API kulcs forgatható, ha a jelenlegi kulcs már nem tűnik biztonságosnak." + "message": "Az API kulcs cseréje érvényteleníti a korábbi kulcsot. Ha azt gondolod, hogy a jelenlegi kulcs nem biztonságos akkor lecserélheted az API kulcsot." }, "apiKeyWarning": { "message": "Az API kulcs teljes hozzáférést biztosít a szervezethez. Célszerű titokban tartani." @@ -4772,7 +4793,7 @@ "message": "API kulcs megtekintése" }, "rotateApiKey": { - "message": "API kulcs forgatása" + "message": "API kulcs cseréje" }, "selectOneCollection": { "message": "Legalább egy gyűjteményt ki kell választani." @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "A szervezet tulajdonosai és adminisztrátorai mentesülnek az irányelv végrehajtása alól." }, + "limitSendViews": { + "message": "Megtekintések korlátozása" + }, + "limitSendViewsHint": { + "message": "Senki sem tudja megtekinteni ezt a Send elemet a korlát elérése után.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ megtekintés maradt.", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send részletek", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Megosztandó szöveg" + }, "sendTypeFile": { "message": "Fájl" }, "sendTypeText": { "message": "Szöveg" }, + "sendPasswordDescV3": { + "message": "Adjunk meg egy opcionális jelszót a címzetteknek a Send eléréséhez.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Új Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Küldés törlése", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Biztosan törlésre kerüljön ez a küldés?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Milyen típusú ez a küldés?", + "deleteSendPermanentConfirmation": { + "message": "Biztosan véglegesen törlésre kerüljön ez a Send elem?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Törlési dátum" }, - "deletionDateDesc": { - "message": "A Send véglegesen törölve lesz a meghatározott időpontban.", + "deletionDateDescV2": { + "message": "A Send véglegesen törölve lesz ebben az időpontban.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximális elérési szám" }, - "maxAccessCountDesc": { - "message": "Amennyiben be van állítva, a Send elérhetetlen lesz, amint elérik a meghatározott hozzáférések számát.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Aktuális elérési szám" - }, - "sendPasswordDesc": { - "message": "Opcionálissan egy jelszó kérhető a felhasználóktól a Küldés eléréséhez.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Személyes megjegyzések erről a Küldésről.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Letiltva" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Biztosan eltávolításra kerüljön ez a jelszó?" }, - "hideEmail": { - "message": "Saját email cím elrejtése a címzettek elől." - }, - "disableThisSend": { - "message": "A Send letiltásával mindenki hozzáférése megvonható.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Összes küldés" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Függőben lévő törlés" }, + "hideTextByDefault": { + "message": "Szöveg elrejtése alapértelmezetten" + }, "expired": { "message": "Lejárt" }, @@ -5415,13 +5441,6 @@ "message": "Ne engedjük, hogy a felhasználók elrejtsék email címüket a címzettek elől a Send elem létrehozása vagy szerkesztése során.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "A következő szervezeti irányelvek vannak érvényben:" - }, - "sendDisableHideEmailInEffect": { - "message": "A felhasználók nem rejthetik el email címüket a címzettek elől egy Send elem létrehozásakor vagy szerkesztésekor.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "$ID$ szabály módosításra került.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "A szervezeti felhasználók személyes tulajdon letiltása" }, - "textHiddenByDefault": { - "message": "A Küldés elérésekor alapértelmezés szerint a szöveg elrejtése", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Barátságos név a Küldés leírására.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "A küldendő szöveg." - }, - "sendFileDesc": { - "message": "A küldendő fájl." - }, - "copySendLinkOnSave": { - "message": "A hivatkozás másolása a Küldés megosztásához a vágólapra mentéskor." - }, - "sendLinkLabel": { - "message": "Hivatkozás küldése", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Küldés", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5574,10 +5572,10 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Learn more, see how it works, **or** try it now.'" }, "developmentDevOpsAndITTeamsChooseBWSecret": { - "message": "Development, DevOps, and IT teams choose Bitwarden Secrets Manager to securely manage and deploy their infrastructure and machine secrets." + "message": "Fejlesztők, DevOps és informatikai csapatok választják a Bitwarden Secret Managert hogy biztonságosan tudják telepíteni az infrastruktúra és eszköztitkokat." }, "centralizeSecretsManagement": { - "message": "Centralize secrets management." + "message": "Központosítsd a titkosított adattárolást." }, "centralizeSecretsManagementDescription": { "message": "Securely store and manage secrets in one location to prevent secret sprawl across your organization." @@ -5616,7 +5614,7 @@ "message": "További Bitwarden termékek" }, "requestAccessToSecretsManager": { - "message": "Request access to Secrets Manager" + "message": "Igényelj hozzáférést a Secrets Managerhez" }, "youNeedApprovalFromYourAdminToTrySecretsManager": { "message": "You need approval from your administrator to try Secrets Manager." @@ -5637,10 +5635,10 @@ "message": "Open your organization's" }, "usingTheMenuSelect": { - "message": "Using the menu, select" + "message": "A menü segítségével válassz az alábbiakból" }, "toGrantAccessToSelectedMembers": { - "message": "to grant access to selected members." + "message": "hogy kiválasztott tagoknak hozzáférést biztosíts." }, "sendVaultCardTryItNow": { "message": "próbáljuk ki most", @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Hiba történt a törlés és a lejárati dátum mentésekor." }, + "hideYourEmail": { + "message": "Saját email cím elrejtése a megtekintések elől." + }, "webAuthnFallbackMsg": { "message": "A 2FA ellenőrzéséhez kattintsunk az alábbi gombra." }, @@ -7129,11 +7130,11 @@ "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateScimKeyWarning": { - "message": "Biztosan forgatni akarjuk a SCIM API kulcsot? A jelenlegi kulcs már nem működik egyik meglévő integrációhoz sem.", + "message": "Biztosan szeretnénk lecserélni a SCIM API kulcsot? A jelenlegi kulcs már nem működik egyik meglévő integrációhoz sem.", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "rotateKey": { - "message": "Kulcs forgatása" + "message": "Kulcs cseréje" }, "scimApiKey": { "message": "SCIM API kulcs", @@ -7148,7 +7149,7 @@ "description": "the text, 'SCIM' and 'URL', are acronyms and should not be translated." }, "scimApiKeyRotated": { - "message": "A SCIM API kulcs sikeresen forgatásra került.", + "message": "A SCIM API kulcs sikeresen lecserélésre került.", "description": "the text, 'SCIM' and 'API', are acronyms and should not be translated." }, "scimSettingsSaved": { @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Felhasználók száma" }, - "loggingInAs": { - "message": "Bejelentkezve mint" - }, - "notYou": { - "message": "Ez tévedés?" - }, "pickAnAvatarColor": { "message": "Avatar szín választás" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Adminisztrátori jóváhagyás kérés" }, - "approveWithMasterPassword": { - "message": "Jóváhagyás mesterjelszóval" - }, "trustedDeviceEncryption": { "message": "Megbízható eszköztitkosítás" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "A kérés elküldésre került az adminisztrátornak." }, - "youWillBeNotifiedOnceApproved": { - "message": "A jóváhagyás után értesítés érkezik." - }, "troubleLoggingIn": { "message": "Probléma van a bejelentkezéssel?" }, @@ -8899,15 +8888,15 @@ "message": "A megerősítő email elküldésre került az email címre:" }, "sorryToSeeYouGo": { - "message": "Sorry to see you go! Help improve Bitwarden by sharing why you're canceling.", + "message": "Sajnáljuk, hogy itt hagysz minket! Segíts fejlődnünk azzal, hogy megosztod, hogy miért mondod fel a szolgáltatást.", "description": "A message shown to users as part of an offboarding survey asking them to provide more information on their subscription cancelation." }, "selectCancellationReason": { - "message": "Select a reason for canceling", + "message": "Válaszd ki a felmondás okát", "description": "Used as a form field label for a select input on the offboarding survey." }, "anyOtherFeedback": { - "message": "Is there any other feedback you'd like to share?", + "message": "Van még bármi visszajelzés, amit meg szeretnél osztani?", "description": "Used as a form field label for a textarea input on the offboarding survey." }, "missingFeatures": { @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Az eszközkezelés konfigurálása a Bitwarden számára a platform megvalósítási útmutatója segítségével." }, + "deviceIdMissing": { + "message": "Az eszköz AZ hiányzik." + }, + "deviceTypeMissing": { + "message": "Az eszköz típus hiányzik." + }, + "deviceCreationDateMissing": { + "message": "Az eszköz létrehozás dátuma hiányzik." + }, "desktopRequired": { "message": "Asztali gép szükséges" }, @@ -9431,7 +9429,7 @@ "message": "Szervezet hozzáadása" }, "createdNewClient": { - "message": "Successfully created new client" + "message": "Az új ügyfél sikeresen létrejött" }, "noAccess": { "message": "Nincs hozzáférés." @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "További információ a Bitwarden API-járól" }, + "fileSend": { + "message": "Fájl típusú Send" + }, "fileSends": { "message": "Fájl küldés" }, + "textSend": { + "message": "Szöveg típusú Send" + }, "textSends": { "message": "Szöveg küldés" }, @@ -10084,10 +10088,6 @@ "message": "Speciális karakterek bevonása", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Melléklet hozzáadása" }, @@ -10219,7 +10219,7 @@ "message": "Fontos megjegyzés" }, "setupTwoStepLogin": { - "message": "Kétlépéses bejelentkezés szükséges" + "message": "Kétfaktoros bejelentkezés beállítása" }, "newDeviceVerificationNoticeContentPage1": { "message": "A Bitwarden 2025 februárjától kódot küld a fiókhoz tartozó email-címre, amellyel ellenőrizhetők az új eszközökről történő bejelentkezések." @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "A szervezet neve nem haladhatja meg az 50 karaktert." }, + "sshKeyWrongPassword": { + "message": "A megadott jelszó helytelen." + }, + "importSshKey": { + "message": "Importálás" + }, + "confirmSshKeyPassword": { + "message": "Jelszó megerősítése" + }, + "enterSshKeyPasswordDesc": { + "message": "Adjuk meg az SSH kulcs jelszót." + }, + "enterSshKeyPassword": { + "message": "Jelszó megadása" + }, + "invalidSshKey": { + "message": "Az SSH kulcs érvénytelen." + }, + "sshKeyTypeUnsupported": { + "message": "Az SSH kulcstípus nem támogatott." + }, + "importSshKeyFromClipboard": { + "message": "Kulcs importálása vágólapból" + }, + "sshKeyImported": { + "message": "Az SSH kulcs sikeresen importálásra került." + }, + "copySSHPrivateKey": { + "message": "Személyes kulcs másolása" + }, "openingExtension": { "message": "A Bitwarden böngésző bővítmény megnyitása" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "A hozzárendelt helyek száma meghaladja a rendelkezésre álló helyek számát." }, + "changeAtRiskPassword": { + "message": "Kockázatos jelszó megváltoztatása" + }, "removeUnlockWithPinPolicyTitle": { "message": "Feloldás eltávolítása PIN kóddal" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Ezek az események csak példák és nem tükröznek valós eseményeket a Bitwarden szervezetén belül." + }, + "cannotCreateCollection": { + "message": "Az ingyenes szervezeteknek legfeljebb 2 gyűjteményük lehet. Térjünk át egy fizetett csomagra további gyűjtemények hozzáadásához." } } diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index c839b0f295a..22b4e3a6132 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -1,6 +1,6 @@ { "allApplications": { - "message": "All applications" + "message": "Semua aplikasi" }, "criticalApplications": { "message": "Critical applications" @@ -15,7 +15,7 @@ "message": "Risk Insights" }, "passwordRisk": { - "message": "Password Risk" + "message": "Petunjuk Sandi" }, "reviewAtRiskPasswords": { "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." @@ -33,16 +33,16 @@ "message": "Notified members" }, "revokeMembers": { - "message": "Revoke members" + "message": "Cabut Pengguna" }, "restoreMembers": { - "message": "Restore members" + "message": "Pulihkan pengguna" }, "cannotRestoreAccessError": { "message": "Cannot restore organization access" }, "allApplicationsWithCount": { - "message": "All applications ($COUNT$)", + "message": "Semua aplikasi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -54,7 +54,7 @@ "message": "Create new login item" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Semua aplikasi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -72,7 +72,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Tidak menemukan aplikasi di $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -99,19 +99,19 @@ "message": "Apps marked as critical" }, "application": { - "message": "Application" + "message": "Aplikasi" }, "atRiskPasswords": { "message": "At-risk passwords" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Minta petunjuk kata sandi" }, "totalPasswords": { - "message": "Total passwords" + "message": "Jumlah Kata Sandi" }, "searchApps": { - "message": "Search applications" + "message": "Cari aplikasi" }, "atRiskMembers": { "message": "At-risk members" @@ -126,7 +126,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "Semua aplikasi ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -150,13 +150,13 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Jumlah Anggota" }, "atRiskApplications": { "message": "At-risk applications" }, "totalApplications": { - "message": "Total applications" + "message": "Semua aplikasi" }, "unmarkAsCriticalApp": { "message": "Unmark as critical app" @@ -201,8 +201,11 @@ "notes": { "message": "Catatan" }, + "privateNote": { + "message": "Catatan pribadi" + }, "note": { - "message": "Note" + "message": "Catatan" }, "customFields": { "message": "Kolom Ubahsuai" @@ -214,19 +217,19 @@ "message": "Login credentials" }, "personalDetails": { - "message": "Personal details" + "message": "Rincian pribadi" }, "identification": { - "message": "Identification" + "message": "Identifikasi" }, "contactInfo": { - "message": "Contact info" + "message": "Info kontak" }, "cardDetails": { - "message": "Card details" + "message": "Rincian kartu" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "Rincian $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -235,19 +238,19 @@ } }, "itemHistory": { - "message": "Item history" + "message": "Riwayat benda" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Kunci Autentikator" }, "autofillOptions": { - "message": "Autofill options" + "message": "Pilihan isi otomatis" }, "websiteUri": { - "message": "Website (URI)" + "message": "Situs web (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "$COUNT$ Situs web (URI)", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -425,6 +428,9 @@ "dragToSort": { "message": "Tarik untuk mengurutkan" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Teks" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit Folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -477,7 +496,7 @@ "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Apakah Anda yakin akan menghapus keranjang ini selamanya?" }, "baseDomain": { "message": "Domain dasar", @@ -523,7 +542,7 @@ "message": "Buat Kata Sandi" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Buat frasa sandi" }, "checkPassword": { "message": "Periksa apakah kata sandi telah terekspos." @@ -578,11 +597,11 @@ "description": "Search Login type" }, "searchCard": { - "message": "Search cards", + "message": "Cari kode", "description": "Search Card type" }, "searchIdentity": { - "message": "Search identities", + "message": "Cari identitas", "description": "Search Identity type" }, "searchSecureNote": { @@ -593,10 +612,10 @@ "message": "Cari Brankas" }, "searchMyVault": { - "message": "Search my vault" + "message": "Cari brankas" }, "searchOrganization": { - "message": "Search organization" + "message": "Cari organisasi" }, "searchMembers": { "message": "Search members" @@ -813,31 +832,31 @@ "message": "Copy website" }, "copyNotes": { - "message": "Copy notes" + "message": "Salin catatan" }, "copyAddress": { "message": "Copy address" }, "copyPhone": { - "message": "Copy phone" + "message": "Salin nomor telepon" }, "copyEmail": { - "message": "Copy email" + "message": "Salin alamat surat elektronik" }, "copyCompany": { - "message": "Copy company" + "message": "Salin perusahaan" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Salin nomor Keamanan Sosial" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Salin nomor paspor" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Salin nomor lisensi" }, "copyName": { - "message": "Copy name" + "message": "Salin nama" }, "me": { "message": "Saya" @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Pindahkan terpilih ke Organisasi" - }, "deleteSelected": { "message": "Hapus yang Dipilih" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Item terpilih dipindah ke $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -985,34 +992,34 @@ "message": "Edit info" }, "access": { - "message": "Access" + "message": "Akses" }, "accessLevel": { - "message": "Access level" + "message": "Tingkat akses" }, "accessing": { - "message": "Accessing" + "message": "Sedang mengakses" }, "loggedOut": { "message": "Keluar" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Anda telah keluar dari akun Anda." }, "loginExpired": { "message": "Sesi masuk Anda telah berakhir." }, "restartRegistration": { - "message": "Restart registration" + "message": "Mulai ulang pendaftaran" }, "expiredLink": { - "message": "Expired link" + "message": "Tautan telah kadaluwarsa" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Please restart registration or try logging in." + "message": "Mohon mulai ulang pendaftaran atau coba masuk." }, "youMayAlreadyHaveAnAccount": { - "message": "You may already have an account" + "message": "Anda mungkin telah memiliki sebuah akun" }, "logOutConfirmation": { "message": "Anda yakin ingin keluar?" @@ -1029,6 +1036,9 @@ "no": { "message": "Tidak" }, + "location": { + "message": "Lokasi" + }, "loginOrCreateNewAccount": { "message": "Masuk atau buat akun baru untuk mengakses brankas Anda." }, @@ -1036,10 +1046,10 @@ "message": "Masuk dengan perangkat" }, "loginWithDeviceEnabledNote": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Masuk dengan perangkat harus diatur di pengaturan aplikasi ini. Perlu pilihan lainnya?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Perlu pilihan lainnya?" }, "loginWithMasterPassword": { "message": "Masuk dengan kata sandi utama" @@ -1054,13 +1064,13 @@ "message": "Use a different log in method" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Masuk dengan kunci sandi" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Gunakan masuk tunggal" }, "welcomeBack": { - "message": "Welcome back" + "message": "Selamat datang kembali" }, "invalidPasskeyPleaseTryAgain": { "message": "Invalid Passkey. Please try again." @@ -1087,10 +1097,10 @@ "message": "Error creating passkey" }, "errorCreatingPasskeyInfo": { - "message": "There was a problem creating your passkey." + "message": "Terdapat masalah mengimpor kuncimu." }, "passkeySuccessfullyCreated": { - "message": "Passkey successfully created!" + "message": "Akun berhasil dibuat!" }, "customPasskeyNameInfo": { "message": "Name your passkey to help you identify it." @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Petunjuk Kata Sandi" - }, - "enterEmailToGetHint": { - "message": "Masukkan email akun Anda untuk menerima pentunjuk sandi utama Anda." - }, "getMasterPasswordHint": { "message": "Dapatkan petunjuk sandi utama" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Pilihlah sebuah organisasi yang Anda ingin memindahkan item ini. Memindahkan berarti memberikan kepemilikan kepada organisasi tersebut. Anda tidak akan lagi menjadi pemilik item ini." }, - "moveManyToOrgDesc": { - "message": "Pilihlah sebuah organisasi yang Anda ingin memindahkan item ini. Memindahkan berarti memberikan kepemilikan kepada organisasi tersebut. Anda tidak akan lagi menjadi pemilik item ini." - }, "collectionsDesc": { "message": "Edit koleksi tempat item ini dibagikan. Hanya pengguna organisasi dengan akses ke koleksi ini yang dapat melihat item ini." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Anda telah memilih $COUNT$ item. $MOVEABLE_COUNT$ item bisa dipindahkan ke sebuah organisasi, $NONMOVEABLE_COUNT$ tidak bisa.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Kode Verifikasi (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Cabut Akses" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Penyedia proses masuk dua langkah ini diaktifkan di akun Anda." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Pemilik dan Administrator Organisasi dibebaskan dari penegakan kebijakan ini." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Berkas" }, "sendTypeText": { "message": "Teks" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Buat Pengiriman Baru", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Hapus Kirim", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Anda yakin ingin menghapus Kirim ini?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Jenis Pengiriman apakah ini?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Tanggal Penghapusan" }, - "deletionDateDesc": { - "message": "Pengiriman akan dihapus secara permanen pada tanggal dan waktu yang ditentukan.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Hitungan Akses Maksimum" }, - "maxAccessCountDesc": { - "message": "Jika disetel, pengguna tidak dapat lagi mengakses pengiriman ini setelah jumlah akses maksimum tercapai.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Hitungan Akses Saat Ini" - }, - "sendPasswordDesc": { - "message": "Secara opsional, minta kata sandi bagi pengguna untuk mengakses Kirim ini.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Catatan pribadi tentang Send ini.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Dinonaktifkan" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Anda yakin ingin menghapus kata sandi?" }, - "hideEmail": { - "message": "Sembunyikan alamat email dari penerima." - }, - "disableThisSend": { - "message": "Nonaktifkan Pengiriman ini sehingga tidak ada yang dapat mengaksesnya.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Semua Dikirim" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Penghapusan menunggu keputusan" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Kedaluwarsa" }, @@ -5415,13 +5441,6 @@ "message": "Pengguna tidak boleh menyembunyikan alamat email dari penerima ketika membuat atau mengubah Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Ketentuan organization berikut ini sedang berlaku:" - }, - "sendDisableHideEmailInEffect": { - "message": "Pengguna tidak boleh menyembunyikan alamat email dari penerima ketika membuat atau mengubah Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Kebijakan yang diubah $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Nonaktifkan kepemilikan pribadi untuk pengguna organisasi" }, - "textHiddenByDefault": { - "message": "Saat mengakses Send, sembunyikan teks secara default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Nama yang ramah untuk menggambarkan kirim ini.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Teks yang ingin Anda kirim." - }, - "sendFileDesc": { - "message": "File yang ingin Anda kirim." - }, - "copySendLinkOnSave": { - "message": "Salin tautan untuk membagikan kirim ini ke clipboard saya saat menyimpan." - }, - "sendLinkLabel": { - "message": "Kirim tautan", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Kirim", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Ada kesalahan menyimpan penghapusan dan tanggal kedaluwarsa Anda." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Untuk mengverifikasi dua-langkat autentikasi anda, silahkan click tombol dibawah." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Jumplah pengguna" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Bukan Anda?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index f8d45738fde..0cbc425d588 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -3,25 +3,25 @@ "message": "Tutte le applicazioni" }, "criticalApplications": { - "message": "Critical applications" + "message": "Applicazioni critiche" }, "noCriticalAppsAtRisk": { "message": "Nessuna applicazione critica a rischio" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "Intelligence sugli accessi" }, "riskInsights": { - "message": "Risk Insights" + "message": "Approfondimento rischi" }, "passwordRisk": { - "message": "Password Risk" + "message": "Rischio password" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords." + "message": "Controlla le password a rischio (deboli, esposte o riutilizzate). Seleziona le applicazioni critiche per determinare la priorità delle azioni di sicurezza." }, "dataLastUpdated": { - "message": "Data last updated: $DATE$", + "message": "Ultimo aggiornamento: $DATE$", "placeholders": { "date": { "content": "$1", @@ -33,13 +33,13 @@ "message": "Membri notificati" }, "revokeMembers": { - "message": "Revoke members" + "message": "Revoca membri" }, "restoreMembers": { - "message": "Restore members" + "message": "Ripristina membri" }, "cannotRestoreAccessError": { - "message": "Cannot restore organization access" + "message": "Impossibile ripristinare l'accesso all'organizzazione" }, "allApplicationsWithCount": { "message": "Tutte le applicazioni ($COUNT$)", @@ -51,10 +51,10 @@ } }, "createNewLoginItem": { - "message": "Create new login item" + "message": "Crea nuovo elemento di login" }, "criticalApplicationsWithCount": { - "message": "Critical applications ($COUNT$)", + "message": "Applicazioni critiche ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -72,7 +72,7 @@ } }, "noAppsInOrgTitle": { - "message": "No applications found in $ORG NAME$", + "message": "Nessuna applicazione trovata in $ORG NAME$", "placeholders": { "org name": { "content": "$1", @@ -81,40 +81,40 @@ } }, "noAppsInOrgDescription": { - "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords." + "message": "Quando gli utenti salvano i login, i relativi dati e le password a rischio sono mostrati qui. Contrassegna le applicazioni critiche e notifica agli utenti di aggiornare le password." }, "noCriticalAppsTitle": { - "message": "You haven't marked any applications as a Critical" + "message": "Non hai contrassegnato nessuna applicazione come critica" }, "noCriticalAppsDescription": { - "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords." + "message": "Seleziona le applicazioni critiche per scoprire le password a rischio e invitare gli utenti a modificarle." }, "markCriticalApps": { - "message": "Mark critical apps" + "message": "Seleziona le applicazioni critiche" }, "markAppAsCritical": { - "message": "Mark app as critical" + "message": "Contrassegna l'applicazione come critica" }, "appsMarkedAsCritical": { - "message": "Apps marked as critical" + "message": "Contrassegna le applicazioni selezionate come critiche" }, "application": { - "message": "Application" + "message": "Applicazione" }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Password a rischio" }, "requestPasswordChange": { - "message": "Request password change" + "message": "Richiedi modifica password" }, "totalPasswords": { - "message": "Total passwords" + "message": "Password totali" }, "searchApps": { - "message": "Search applications" + "message": "Cerca applicazioni" }, "atRiskMembers": { - "message": "At-risk members" + "message": "Membri a rischio" }, "atRiskMembersWithCount": { "message": "Membri a rischio ($COUNT$)", @@ -150,19 +150,19 @@ } }, "totalMembers": { - "message": "Total members" + "message": "Membri totali" }, "atRiskApplications": { - "message": "At-risk applications" + "message": "Applicazioni a rischio" }, "totalApplications": { - "message": "Total applications" + "message": "Applicazioni totali" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "Contrassegna l'applicazione come non critica" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "Applicazione contrassegnata come non critica" }, "whatTypeOfItem": { "message": "Che tipo di elemento è questo?" @@ -201,6 +201,9 @@ "notes": { "message": "Note" }, + "privateNote": { + "message": "Nota privata" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Trascina per ordinare" }, + "dragToReorder": { + "message": "Trascina per riordinare" + }, "cfTypeText": { "message": "Testo" }, @@ -435,17 +441,17 @@ "message": "Booleano" }, "cfTypeCheckbox": { - "message": "Checkbox" + "message": "Caselle di controllo" }, "cfTypeLinked": { "message": "Collegato", "description": "This describes a field that is 'linked' (related) to another field." }, "fieldType": { - "message": "Field type" + "message": "Tipo di campo" }, "fieldLabel": { - "message": "Field label" + "message": "Etichetta campo" }, "remove": { "message": "Rimuovi" @@ -467,6 +473,19 @@ "editFolder": { "message": "Modifica cartella" }, + "editWithName": { + "message": "Modifica $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nuova cartella" }, @@ -523,7 +542,7 @@ "message": "Genera password" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Genera passphrase" }, "checkPassword": { "message": "Verifica se la password è stata esposta." @@ -626,7 +645,7 @@ "message": "Nota sicura" }, "typeSshKey": { - "message": "SSH key" + "message": "Chiave SSH" }, "typeLoginPlural": { "message": "Login" @@ -704,7 +723,7 @@ "message": "Visualizza elemento" }, "newItemHeader": { - "message": "New $TYPE$", + "message": "Nuovo $TYPE$", "placeholders": { "type": { "content": "$1", @@ -713,7 +732,7 @@ } }, "editItemHeader": { - "message": "Edit $TYPE$", + "message": "Modifica $TYPE$", "placeholders": { "type": { "content": "$1", @@ -767,7 +786,7 @@ } }, "copySuccessful": { - "message": "Copy Successful" + "message": "Copia riuscita" }, "copyValue": { "message": "Copia valore", @@ -778,11 +797,11 @@ "description": "Copy password to clipboard" }, "copyPassphrase": { - "message": "Copy passphrase", + "message": "Copia passphrase", "description": "Copy passphrase to clipboard" }, "passwordCopied": { - "message": "Password copied" + "message": "Password copiata" }, "copyUsername": { "message": "Copia nome utente", @@ -801,7 +820,7 @@ "description": "Copy URI to clipboard" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Copia $FIELD$", "placeholders": { "field": { "content": "$1", @@ -810,34 +829,34 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Copia sito Web" }, "copyNotes": { - "message": "Copy notes" + "message": "Copia note" }, "copyAddress": { - "message": "Copy address" + "message": "Copia indirizzo" }, "copyPhone": { - "message": "Copy phone" + "message": "Copia telefono" }, "copyEmail": { - "message": "Copy email" + "message": "Copia email" }, "copyCompany": { - "message": "Copy company" + "message": "Copia azienda" }, "copySSN": { - "message": "Copy Social Security number" + "message": "Copia codice fiscale" }, "copyPassportNumber": { - "message": "Copy passport number" + "message": "Copia numero passaporto" }, "copyLicenseNumber": { - "message": "Copy license number" + "message": "Copia numero patente" }, "copyName": { - "message": "Copy name" + "message": "Copia nome" }, "me": { "message": "Io" @@ -860,9 +879,6 @@ "filter": { "message": "Filtra" }, - "moveSelectedToOrg": { - "message": "Sposta selezionati in organizzazione" - }, "deleteSelected": { "message": "Elimina selezionati" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Elementi selezionati spostati in $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Elementi spostati su $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Luogo" + }, "loginOrCreateNewAccount": { "message": "Entra o crea un nuovo account per accedere alla tua cassaforte." }, @@ -1039,7 +1049,7 @@ "message": "L'accesso con dispositivo deve essere abilitato nelle impostazioni dell'app Bitwarden. Ti serve un'altra opzione?" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Ti serve un'alternativa?" }, "loginWithMasterPassword": { "message": "Accedi con password principale" @@ -1054,13 +1064,13 @@ "message": "Usa un altro metodo di accesso" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Accedi con passkey" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Usa login unificato (SSO)" }, "welcomeBack": { - "message": "Welcome back" + "message": "Bentornat*" }, "invalidPasskeyPleaseTryAgain": { "message": "Passkey non valida. Riprova." @@ -1144,7 +1154,7 @@ "message": "Crea account" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Hai appena iniziato ad usare Bitwarden?" }, "setAStrongPassword": { "message": "Imposta una password robusta" @@ -1162,31 +1172,31 @@ "message": "Accedi" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Accedi a Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Inserisci il codice che hai ricevuto via email" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Inserisci il codice generato dalla tua app di autenticazione" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Conferma con la tua chiave YubiKey" }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Tempo per l'autenticazione scaduto" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "La sessione di autenticazione è scaduta. Accedi di nuovo." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifica la tua identità" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Inserisci il codice che hai ricevuto via email per confermare la tua identità." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Continua l'accesso" }, "whatIsADevice": { "message": "Cos'è un dispositivo?" @@ -1256,19 +1266,13 @@ "message": "Account email" }, "requestHint": { - "message": "Request hint" + "message": "Richiedi suggerimento" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Richiedi suggerimento per la password" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" - }, - "passwordHint": { - "message": "Suggerimento per la password" - }, - "enterEmailToGetHint": { - "message": "Inserisci l'indirizzo email del tuo account per ricevere il suggerimento per la password principale." + "message": "Inserisci l'indirizzo email del tuo account Bitwarden per ricevere il suggerimento" }, "getMasterPasswordHint": { "message": "Ottieni suggerimento per la password principale" @@ -1326,7 +1330,7 @@ "message": "La cassaforte è bloccata" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Il tuo account è bloccato" }, "uuid": { "message": "UUID" @@ -1363,7 +1367,7 @@ "message": "Non hai i permessi necessari per visualizzare tutti gli elementi in questa raccolta." }, "youDoNotHavePermissions": { - "message": "You do not have permissions to this collection" + "message": "Non hai l'autorizzazione per l'accesso a questa raccolta" }, "noCollectionsInList": { "message": "Nessuna raccolta da mostrare." @@ -1420,7 +1424,7 @@ "message": "Sblocca Bitwarden sul tuo dispositivo. Assicurati che la frase di impronta digitale corrisponda a quella sottostante prima di approvare." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Una notifica è stata inviata al tuo dispositivo" }, "versionNumber": { "message": "Versione $VERSION_NUMBER$", @@ -1456,7 +1460,7 @@ "message": "Ricordami" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Non chiedere più per 30 giorni su questo dispositivo" }, "sendVerificationCodeEmailAgain": { "message": "Invia di nuovo l'email con codice di verifica" @@ -1465,11 +1469,11 @@ "message": "Usa un altro metodo di verifica in due passaggi" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Scegli un altro metodo", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Usa un codice di recupero" }, "insertYubiKey": { "message": "Inserisci la tua YubiKey nella porta USB del computer e premi il suo pulsante." @@ -1490,7 +1494,7 @@ "message": "Opzioni verifica in due passaggi" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Scegli il metodo di accesso in due passaggi" }, "recoveryCodeDesc": { "message": "Hai perso l'accesso a tutti i tuoi metodi di verifica in due passaggi? Usa il tuo codice di recupero per disattivarli tutti dal tuo account." @@ -1535,7 +1539,7 @@ "message": "(Trasferito da FIDO)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Apri in una nuova scheda del browser" }, "emailTitle": { "message": "Email" @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Scegli un'organizzazione in cui vuoi spostare questo elemento. Spostarlo in un'organizzazione trasferisce la proprietà dell'elemento all'organizzazione. Una volta spostato, non sarai più il proprietario diretto di questo elemento." }, - "moveManyToOrgDesc": { - "message": "Scegli un'organizzazione in cui vuoi spostare questi elementi. Spostarli in un'organizzazione trasferisce la proprietà degli elementi all'organizzazione. Una volta spostati, non sarai più il proprietario diretto di questi elementi." - }, "collectionsDesc": { "message": "Modifica le raccolte con cui questo elemento è condiviso. Solo gli utenti di organizzazioni che hanno accesso a queste raccolte potranno visualizzare questo elemento." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Hai selezionato $COUNT$ elementi. $MOVEABLE_COUNT$ elementi possono essere spostati in un'organizzazione, $NONMOVEABLE_COUNT$ no.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Codice di verifica (TOTP)" }, @@ -1722,7 +1706,7 @@ "description": "deprecated. Use avoidAmbiguous instead." }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Evita caratteri ambigui", "description": "Label for the avoid ambiguous characters checkbox." }, "length": { @@ -1760,32 +1744,32 @@ "message": "Includi numero" }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "I requisiti della politica aziendale sono stati applicati alle opzioni del generatore.", "description": "Indicates that a policy limits the credential generator screen." }, "passwordHistory": { "message": "Cronologia delle password" }, "generatorHistory": { - "message": "Generator history" + "message": "Cronologia generazione" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Cancella cronologia" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Vuoi davvero eliminare definitivamente tutti gli elementi della cronologia?" }, "noPasswordsInList": { "message": "Non ci sono password da mostrare." }, "clearHistory": { - "message": "Clear history" + "message": "Cancella cronologia" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Nessun elemento" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Nessuna generazione recente" }, "clear": { "message": "Cancella", @@ -1931,7 +1915,7 @@ "message": "Tutte le sessioni revocate" }, "accountIsOwnedMessage": { - "message": "This account is owned by $ORGANIZATIONNAME$", + "message": "Questo account è gestito da $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -2191,7 +2175,7 @@ "message": "Impostare la verifica in due passaggi potrebbe bloccarti permanentemente fuori dal tuo account Bitwarden. Un codice di recupero ti permette di accedere al tuo account il caso non potessi più usare il tuo solito metodo di verifica in due passaggi (per esempio se perdi il telefono). L'assistenza clienti di Bitwarden non sarà in grado di aiutarti se perdi l'accesso al tuo account. Scrivi o stampa il tuo codice di recupero e conservalo in un luogo sicuro." }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "Puoi usare il codice di recupero monouso se non hai accesso a nessuno dei metodi impostati per l'accesso in due passaggi. Se accedi con un codice, l'accesso in due passaggi sarà disattivato. Conserva il codice in un luogo sicuro e accessibile solo a te." }, "viewRecoveryCode": { "message": "Visualizza codice di recupero" @@ -2232,7 +2216,7 @@ "message": "Gestisci" }, "manageCollection": { - "message": "Gestisci collezione" + "message": "Gestisci raccolta" }, "viewItems": { "message": "Vedi voci" @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoca accesso" }, + "revoke": { + "message": "Revoca" + }, "twoStepLoginProviderEnabled": { "message": "Questo metodo di verifica in due passaggi è attivo sul tuo account." }, @@ -2547,7 +2534,7 @@ "message": "Controlla password esposte" }, "timesExposed": { - "message": "Times exposed" + "message": "Quante volte vittima o a rischio di data breach" }, "exposedXTimes": { "message": "Esposta $COUNT$ volte", @@ -2584,7 +2571,7 @@ "message": "Nessun elemento nella tua cassaforte ha password deboli." }, "weakness": { - "message": "Weakness" + "message": "Debolezza" }, "reusedPasswordsReport": { "message": "Password riutilizzate" @@ -2612,7 +2599,7 @@ "message": "Nessun login nella tua cassaforte ha password riutilizzate." }, "timesReused": { - "message": "Times reused" + "message": "Quante volte riutilizzata" }, "reusedXTimes": { "message": "Riutilizzata $COUNT$ volte", @@ -2912,7 +2899,7 @@ "message": "Scarica licenza" }, "viewBillingToken": { - "message": "View Billing Token" + "message": "Visualizza token di fatturazione" }, "updateLicense": { "message": "Aggiorna licenza" @@ -2961,10 +2948,10 @@ "message": "Fatture" }, "noUnpaidInvoices": { - "message": "No unpaid invoices." + "message": "Nessuna fattura non pagata." }, "noPaidInvoices": { - "message": "No paid invoices." + "message": "Nessuna fattura pagata." }, "paid": { "message": "Pagata", @@ -3578,7 +3565,7 @@ } }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Visualizza tutte le opzioni di accesso" }, "viewAllLoginOptions": { "message": "Visualizza tutte le opzioni di accesso" @@ -4104,7 +4091,7 @@ "message": "Aggiorna browser" }, "generatingRiskInsights": { - "message": "Generating your risk insights..." + "message": "Generazione delle tue informazioni sui rischi..." }, "updateBrowserDesc": { "message": "Stai utilizzando un browser non supportato. La cassaforte web potrebbe non funzionare correttamente." @@ -4116,7 +4103,7 @@ "message": "Rivedi richiesta di accesso" }, "freeTrialEndPromptCount": { - "message": "Your free trial ends in $COUNT$ days.", + "message": "Il tuo periodo di prova scade tra $COUNT$ giorni.", "placeholders": { "count": { "content": "$1", @@ -4125,7 +4112,7 @@ } }, "freeTrialEndPromptMultipleDays": { - "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.", + "message": "$ORGANIZATION$, la tua prova gratuita termina tra $COUNT$ giorni.", "placeholders": { "count": { "content": "$2", @@ -4138,7 +4125,7 @@ } }, "freeTrialEndPromptTomorrow": { - "message": "$ORGANIZATION$, your free trial ends tomorrow.", + "message": "$ORGANIZATION$, la tua prova gratuita termina domani.", "placeholders": { "organization": { "content": "$1", @@ -4147,10 +4134,10 @@ } }, "freeTrialEndPromptTomorrowNoOrgName": { - "message": "Your free trial ends tomorrow." + "message": "La tua prova gratuita termina domani." }, "freeTrialEndPromptToday": { - "message": "$ORGANIZATION$, your free trial ends today.", + "message": "$ORGANIZATION$, la tua prova gratuita termina domani.", "placeholders": { "organization": { "content": "$1", @@ -4159,16 +4146,16 @@ } }, "freeTrialEndingTodayWithoutOrgName": { - "message": "Your free trial ends today." + "message": "La tua prova gratuita termina oggi." }, "clickHereToAddPaymentMethod": { - "message": "Click here to add a payment method." + "message": "Clicca qui per aggiungere un metodo di pagamento." }, "joinOrganization": { "message": "Unisciti all'organizzazione" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "Unisciti a $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -4210,7 +4197,7 @@ "message": "Se non puoi accedere al tuo account usando i normali metodi di verifica in due passaggi, usa il tuo codice di recupero per disattivarli tutti dal tuo account." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "Accedi utilizzando il tuo codice di recupero monouso. Tutti i metodi di accesso in due passaggi saranno disattivati sul tuo account." }, "recoverAccountTwoStep": { "message": "Ripristina verifica in due passaggi dell'account" @@ -4504,7 +4491,7 @@ "message": "Non è possibile procedere con l'aggiornamento della chiave di cifratura" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Modifica $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4513,7 +4500,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Riordina $LABEL$. Utilizza i tasti freccia per spostare l'elemento verso l'alto o verso il basso.", "placeholders": { "label": { "content": "$1", @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ spostato su, in posizione $INDEX$ di $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ spostato giù, in posizione $INDEX$ di $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Quando si aggiorna la chiave di cifratura, le cartelle non possono essere decifrate. Per continuare con l'aggiornamento, le cartelle devono essere eliminate. Nessun elemento della cassaforte verrà eliminato se si procede." }, @@ -4740,7 +4761,7 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Riceverai una notifica quando la richiesta sarà approvata" }, "free": { "message": "Gratis", @@ -4979,10 +5000,10 @@ "message": "Accedi usando il portale di accesso (SSO) della tua organizzazione. Inserisci l'identificativo della tua organizzazione per iniziare." }, "singleSignOnEnterOrgIdentifier": { - "message": "Enter your organization's SSO identifier to begin" + "message": "Inserisci l'identificatore SSO della tua organizzazione per iniziare" }, "singleSignOnEnterOrgIdentifierText": { - "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device." + "message": "Per accedere con il tuo provider SSO, inserisci l'identificatore SSO della tua organizzazione. Potrebbe essere necessario inserirlo di nuovo quando si accede da un nuovo dispositivo." }, "enterpriseSingleSignOn": { "message": "Single Sign-On aziendale" @@ -5052,7 +5073,7 @@ "message": "Impedisci ai membri di unirsi ad altre organizzazioni." }, "singleOrgPolicyDesc": { - "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification." + "message": "Impedisci ai membri di entrare in altre organizzazioni. Questa politica è richiesta per le organizzazioni che hanno abilitato la verifica del dominio." }, "singleOrgBlockCreateMessage": { "message": "La tua organizzazione corrente ha una politica che non ti consente di unirti ad altre organizzazioni. Contatta gli amministratori della tua organizzazione o registrati da un altro account Bitwarden." @@ -5061,7 +5082,7 @@ "message": "I membri dell'organizzazione che non sono proprietari o amministratori e sono membri di un'altra organizzazione saranno rimossi dalla tua organizzazione." }, "singleOrgPolicyMemberWarning": { - "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met." + "message": "I membri non conformi entreranno in stato 'revocato' finché non lasceranno tutte le altre organizzazioni. Gli amministratori sono esenti e possono ripristinare i membri una volta soddisfatta la conformità." }, "requireSso": { "message": "Richiedi autenticazione Single Sign-On" @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "I proprietari e gli amministratori dell'organizzazione sono esonerati dall'applicazione di questa politica." }, + "limitSendViews": { + "message": "Limita visualizzazioni" + }, + "limitSendViewsHint": { + "message": "Nessuno potrà vedere questo Send al raggiungimento del limite.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ visualizzazioni rimaste", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Dettagli Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Testo da condividere" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Testo" }, + "sendPasswordDescV3": { + "message": "Richiedi ai destinatari una parola d'accesso opzionale per aprire questo Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nuovo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Elimina Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Sei sicuro di voler eliminare questo Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Che tipo di Send è questo?", + "deleteSendPermanentConfirmation": { + "message": "Sicuro di voler eliminare definitivamente questo Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data di eliminazione" }, - "deletionDateDesc": { - "message": "Il Send sarà eliminato definitivamente alla data e all'ora specificate.", + "deletionDateDescV2": { + "message": "Il Send sarà eliminato definitivamente in questa data.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Numero massimo di accessi" }, - "maxAccessCountDesc": { - "message": "Se impostata, gli utenti non potranno più accedere a questo Send una volta raggiunto il numero massimo di accessi.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Numero di accessi correnti" - }, - "sendPasswordDesc": { - "message": "Richiedi una password agli utenti per accedere a questo Send (facoltativo).", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Note private sul Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabilitato" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Sei sicuro di voler rimuovere la password?" }, - "hideEmail": { - "message": "Nascondi il mio indirizzo email dai destinatari." - }, - "disableThisSend": { - "message": "Disattiva il Send per renderlo inaccessibile.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Tutti i Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "In attesa di eliminazione" }, + "hideTextByDefault": { + "message": "Nascondi testo come default" + }, "expired": { "message": "Scaduto" }, @@ -5415,13 +5441,6 @@ "message": "Mostra sempre l'indirizzo email del membro ai destinatari durante la creazione o la modifica di un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Queste politiche dell'organizzazione sono attualmente in vigore:" - }, - "sendDisableHideEmailInEffect": { - "message": "Gli utenti non possono nascondere il loro indirizzo email dai destinatari quando creano o modificano un Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Politica $ID$ modificata.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Rimuovi la proprietà individuale per gli utenti dell'organizzazione" }, - "textHiddenByDefault": { - "message": "Quando si accede al Send, nascondi il testo per impostazione predefinita", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Un nome intuitivo per descrivere il Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Il testo che vuoi inviare." - }, - "sendFileDesc": { - "message": "Il file che vuoi inviare." - }, - "copySendLinkOnSave": { - "message": "Copia il link al Send negli appunti dopo averlo salvato." - }, - "sendLinkLabel": { - "message": "Link del Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Si è verificato un errore durante il salvataggio delle date di eliminazione e scadenza." }, + "hideYourEmail": { + "message": "Nascondi il tuo indirizzo e-mail ai visualizzatori." + }, "webAuthnFallbackMsg": { "message": "Per verificare la tua 2FA clicca il pulsante qui sotto." }, @@ -5697,10 +5698,10 @@ "message": "Autenticazione WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Leggi chiave di sicurezza" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "In attesa di interazione con la chiave di sicurezza..." }, "webAuthnNotSupported": { "message": "WebAuthn non è supportato da questo browser." @@ -5895,10 +5896,10 @@ "message": "Escluso, non applicabile per questa azione" }, "nonCompliantMembersTitle": { - "message": "Non-compliant members" + "message": "Membri non conformi" }, "nonCompliantMembersError": { - "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements" + "message": "I membri non conformi alla politica di accesso dell'organizzazione non possono essere ripristinati finché non aderiscono ai requisiti di policy" }, "fingerprint": { "message": "Impronta" @@ -6122,7 +6123,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "Max $HOURS$ ora/e e $MINUTES$ minuto/i.", "placeholders": { "hours": { "content": "$1", @@ -6566,7 +6567,7 @@ "message": "Visualizza token di sincronizzazione della fatturazione" }, "generateBillingToken": { - "message": "Generate billing token" + "message": "Genera token di fatturazione" }, "copyPasteBillingSync": { "message": "Copia e incolla questo token nelle impostazioni di sincronizzazione della fatturazione della tua organizzazione self-hosted." @@ -6575,7 +6576,7 @@ "message": "Il token di sincronizzazione della fatturazione può accedere e modificare le impostazioni di abbonamento di questa organizzazione." }, "manageBillingTokenSync": { - "message": "Manage Billing Token" + "message": "Gestisci token di fatturazione" }, "setUpBillingSync": { "message": "Configura sincronizzazione della fatturazione" @@ -6641,7 +6642,7 @@ "message": "Token di sincronizzazione della fatturazione" }, "automaticBillingSyncDesc": { - "message": "Automatic sync unlocks Families sponsorships and allows you to sync your license without uploading a file. After making updates in the Bitwarden cloud server, select Sync License to apply changes." + "message": "La sincronizzazione automatica sblocca le sponsorizzazioni delle famiglie e consente di sincronizzare la licenza senza caricare un file. Dopo aver effettuato gli aggiornamenti nel server cloud Bitwarden, seleziona 'Sincronizza licenza' per applicare le modifiche." }, "active": { "message": "Attivo" @@ -6711,7 +6712,7 @@ "message": "Obbligatorio se l'ID dell'entità non è un URL." }, "offerNoLongerValid": { - "message": "This offer is no longer valid. Contact your organization administrators for more information." + "message": "Questa offerta non è più valida. Contatta gli amministratori dell'organizzazione per maggiori informazioni." }, "openIdOptionalCustomizations": { "message": "Personalizzazioni facoltative" @@ -6794,10 +6795,10 @@ "message": "Genera nome utente" }, "generateEmail": { - "message": "Generate email" + "message": "Genera email" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Il valore deve essere compreso tra $MIN$ e $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -6811,7 +6812,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Usa $RECOMMENDED$ o più caratteri per generare una password forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6821,7 +6822,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Usa $RECOMMENDED$ o più parole per generare una passphrase forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -6936,11 +6937,11 @@ "message": "Genera un alias email con un servizio di inoltro esterno." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Dominio email", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Scegli un dominio supportato dal servizio selezionato", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -7106,7 +7107,7 @@ "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimIntegrationDescription": { - "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations", + "message": "Fornisci automaticamente a utenti e gruppi il tuo provider di identità preferito tramite il provisioning SCIM. Trova integrazioni supportate", "description": "the text, 'SCIM', is an acronym and should not be translated." }, "scimEnabledCheckboxDesc": { @@ -7228,10 +7229,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 campo richiede tua attenzione." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ campi richiedono la tua attenzione.", "placeholders": { "count": { "content": "$1", @@ -7249,10 +7250,10 @@ "message": "Per il tuo account è richiesta la verifica in due passaggi DUO." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "L'accesso Duo in due passaggi è richiesto per il tuo account. Segui i passaggi qui sotto per proseguire." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Segui i passaggi qui sotto per completare l'accesso." }, "launchDuo": { "message": "Avvia DUO" @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Numero di utenti" }, - "loggingInAs": { - "message": "Accedendo come" - }, - "notYou": { - "message": "Non sei tu?" - }, "pickAnAvatarColor": { "message": "Scegli un colore dell'avatar" }, @@ -8082,7 +8077,7 @@ "message": "Carica file" }, "upload": { - "message": "Upload" + "message": "Carica" }, "acceptedFormats": { "message": "Formati accettati:" @@ -8094,13 +8089,13 @@ "message": "o" }, "unlockWithBiometrics": { - "message": "Unlock with biometrics" + "message": "Sblocca con i dati biometrici" }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "Sblocca con PIN" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Sblocca con password principale" }, "licenseAndBillingManagement": { "message": "Licenza e gestione della fatturazione" @@ -8112,7 +8107,7 @@ "message": "Caricamento manuale" }, "manualBillingTokenUploadDesc": { - "message": "If you do not want to opt into billing sync, manually upload your license here. This will not automatically unlock Families sponsorships." + "message": "Se non vuoi usare la sincronizzazione di fatturazione, carica manualmente la licenza qui. Le sponsorizzazioni delle famiglie non saranno sbloccate automaticamente." }, "syncLicense": { "message": "Sincronizza licenza" @@ -8381,16 +8376,16 @@ "message": "Accesso avviato" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Ricorda questo dispositivo per rendere immediati i prossimi accessi" }, "deviceApprovalRequired": { "message": "Approvazione del dispositivo obbligatoria. Seleziona un'opzione di approvazione:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Approvazione dispositivo richiesta" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Seleziona un'opzione di approvazione" }, "rememberThisDevice": { "message": "Ricorda questo dispositivo" @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Richiedi approvazione dell'amministratore" }, - "approveWithMasterPassword": { - "message": "Approva con password principale" - }, "trustedDeviceEncryption": { "message": "Crittografia dispositivo fidato" }, @@ -8418,27 +8410,27 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { - "message": "single organization", + "message": "organizzazione singola", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart2": { - "message": "policy,", + "message": "politica,", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink2": { - "message": "SSO required", + "message": "SSO obbligatorio", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart3": { - "message": "policy, and", + "message": "politica, e", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "Recupero account", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "la politica si attiverà quando questa opzione sarà utilizzata.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8450,7 +8442,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "di $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "La tua richiesta è stata inviata al tuo amministratore." }, - "youWillBeNotifiedOnceApproved": { - "message": "Riceverai una notifica una volta approvato." - }, "troubleLoggingIn": { "message": "Problemi ad accedere?" }, @@ -8634,7 +8623,7 @@ "message": "Email utente mancante" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Nessuna email attiva trovata per l'utente. Disconnessione in corso." }, "deviceTrusted": { "message": "Dispositivo fidato" @@ -8732,10 +8721,10 @@ "message": "Gestisci il comportamento delle raccolte per l'organizzazione" }, "limitCollectionCreationDesc": { - "message": "Limit collection creation to owners and admins" + "message": "Limita la creazione di raccolte ai proprietari e agli amministratori" }, "limitCollectionDeletionDesc": { - "message": "Limit collection deletion to owners and admins" + "message": "Limita l'eliminazione delle raccolte ai proprietari e agli amministratori" }, "limitItemDeletionDesc": { "message": "Limita l'eliminazione di elementi ai membri con il permesso di gestione" @@ -8786,7 +8775,7 @@ "message": "URL del server" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL server self-hosted", "description": "Label for field requesting a self-hosted integration service URL" }, "alreadyHaveAccount": { @@ -8854,7 +8843,7 @@ "message": "Permessi di gestione raccolte mancanti" }, "grantManageCollectionWarning": { - "message": "Concedi i permessi di gestione della collezione per consentire la gestione completa della raccolta, inclusa l'eliminazione della raccolta." + "message": "Concedi i permessi per la gestione completa della raccolta, inclusa l'eliminazione." }, "grantCollectionAccess": { "message": "Consenti a gruppi o membri di accedere a questa raccolta." @@ -8995,7 +8984,7 @@ "message": "Aggiungi campo" }, "editField": { - "message": "Edit field" + "message": "Campo 'Modifica'" }, "items": { "message": "Elementi" @@ -9310,53 +9299,62 @@ "message": "Usa l'SDK di Bitwarden Secrets Manager nei seguenti linguaggi di programmazione per creare le tue applicazioni." }, "ssoDescStart": { - "message": "Configure", + "message": "Configura", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "ssoDescEnd": { - "message": "for Bitwarden using the implementation guide for your Identity Provider.", + "message": "per Bitwarden consultando la guida del tuo gestore di identità.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider." }, "userProvisioning": { - "message": "User provisioning" + "message": "Provisioning utenti" }, "scimIntegration": { "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Configura ", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { - "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.", + "message": "(System for Cross-domain Identity Management) per configurare automaticamente utenti e gruppi in Bitwarden consultando la guida del tuo gestore di identità.", "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "bwdc": { "message": "Bitwarden Directory Connector" }, "bwdcDesc": { - "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider." + "message": "Configura Bitwarden Directory Connector per configurare automaticamente utenti e gruppi in Bitwarden consultando la guida del tuo gestore di identità." }, "eventManagement": { - "message": "Event management" + "message": "Gestione eventi" }, "eventManagementDesc": { - "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform." + "message": "Integra i log degli eventi Bitwarden con il tuo sistema SIEM (informazioni di sistema e gestione degli eventi) consultando la guida della tua piattaforma." }, "deviceManagement": { - "message": "Device management" + "message": "Gestione dispositivi" }, "deviceManagementDesc": { - "message": "Configure device management for Bitwarden using the implementation guide for your platform." + "message": "Configura la gestione dispositivi consultando la guida per la tua piattaforma." + }, + "deviceIdMissing": { + "message": "ID dispositivo mancante" + }, + "deviceTypeMissing": { + "message": "Tipo di dispositivo mancante" + }, + "deviceCreationDateMissing": { + "message": "Data di creazione del dispositivo mancante" }, "desktopRequired": { - "message": "Desktop required" + "message": "Desktop richiesto" }, "reopenLinkOnDesktop": { - "message": "Reopen this link from your email on a desktop." + "message": "Riapri questo link dalla tua email su un computer portatile o fisso." }, "integrationCardTooltip": { - "message": "Launch $INTEGRATION$ implementation guide.", + "message": "Avvia la guida di $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9365,7 +9363,7 @@ } }, "smIntegrationTooltip": { - "message": "Set up $INTEGRATION$.", + "message": "Configura $INTEGRATION$.", "placeholders": { "integration": { "content": "$1", @@ -9374,7 +9372,7 @@ } }, "smSdkTooltip": { - "message": "View $SDK$ repository", + "message": "Visualizza repository $SDK$", "placeholders": { "sdk": { "content": "$1", @@ -9383,7 +9381,7 @@ } }, "integrationCardAriaLabel": { - "message": "open $INTEGRATION$ implementation guide in a new tab.", + "message": "apri la guida di $INTEGRATION$ in una nuova scheda.", "placeholders": { "integration": { "content": "$1", @@ -9392,7 +9390,7 @@ } }, "smSdkAriaLabel": { - "message": "view $SDK$ repository in a new tab.", + "message": "visualizza il repository $SDK$ in una nuova scheda.", "placeholders": { "sdk": { "content": "$1", @@ -9401,7 +9399,7 @@ } }, "smIntegrationCardAriaLabel": { - "message": "set up $INTEGRATION$ implementation guide in a new tab.", + "message": "apri la guida di $INTEGRATION$ in una nuova scheda.", "placeholders": { "integration": { "content": "$1", @@ -9452,13 +9450,13 @@ "message": "Gestisci la fatturazione dal Portale del Fornitore" }, "continueSettingUpFreeTrial": { - "message": "Continue setting up your free trial of Bitwarden" + "message": "Continua a configurare la tua prova gratuita di Bitwarden" }, "continueSettingUpFreeTrialPasswordManager": { - "message": "Continue setting up your free trial of Bitwarden Password Manager" + "message": "Continua a configurare la tua prova gratuita di Bitwarden Password Manager" }, "continueSettingUpFreeTrialSecretsManager": { - "message": "Continue setting up your free trial of Bitwarden Secrets Manager" + "message": "Continua a configurare la tua prova gratuita di Bitwarden Secrets Manager" }, "enterTeamsOrgInfo": { "message": "Inserisci le informazioni dell'organizzazione del tuo team" @@ -9522,10 +9520,10 @@ "message": "Fornitore di servizi gestiti" }, "managedServiceProvider": { - "message": "Managed service provider" + "message": "Fornitore di servizi gestiti" }, "multiOrganizationEnterprise": { - "message": "Multi-organization enterprise" + "message": "Azienda multi-organizzazione" }, "orgSeats": { "message": "Slot dell'organizzazione" @@ -9573,16 +9571,16 @@ "message": "Informazioni fiscali aggiornate" }, "billingInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Codice fiscale non valido. Se credi che si tratti di un errore, contatta il supporto." }, "billingTaxIdTypeInferenceError": { - "message": "We were unable to validate your tax ID, if you believe this is an error please contact support." + "message": "Non è stato possibile convalidare il tuo codice fiscale. Se credi che si tratti di un errore, contatta il supporto." }, "billingPreviewInvalidTaxIdError": { - "message": "Invalid tax ID, if you believe this is an error please contact support." + "message": "Codice fiscale non valido. Se credi che si tratti di un errore, contatta il supporto." }, "billingPreviewInvoiceError": { - "message": "An error occurred while previewing the invoice. Please try again later." + "message": "Errore nella generazione dell'anteprima della ricevuta. Prova di nuovo." }, "unverified": { "message": "Non verificato" @@ -9789,68 +9787,74 @@ "message": "slot acquistati rimossi" }, "environmentVariables": { - "message": "Environment variables" + "message": "Variabili d'ambiente" }, "organizationId": { - "message": "Organization ID" + "message": "ID organizzazione" }, "projectIds": { - "message": "Project IDs" + "message": "ID progetto" }, "projectId": { - "message": "Project ID" + "message": "ID Progetto" }, "projectsAccessedByMachineAccount": { - "message": "The following projects can be accessed by this machine account." + "message": "I seguenti progetti possono essere accessibili da questo account macchina." }, "config": { - "message": "Config" + "message": "Configurazione" }, "learnMoreAboutEmergencyAccess": { - "message": "Learn more about emergency access" + "message": "Ulteriori informazioni sull'accesso d'emergenza" }, "learnMoreAboutMatchDetection": { - "message": "Learn more about match detection" + "message": "Maggiori informazioni sulla rilevazione di corrispondenza" }, "learnMoreAboutMasterPasswordReprompt": { - "message": "Learn more about master password re-prompt" + "message": "Informazioni sulla richiesta aggiuntiva di inserimento della password principale" }, "learnMoreAboutSearchingYourVault": { - "message": "Learn more about searching your vault" + "message": "Informazioni sulla ricerca nella cassaforte" }, "learnMoreAboutYourAccountFingerprintPhrase": { - "message": "Learn about your account fingerprint phrase" + "message": "Impara la frase di autenticazione del tuo account" }, "impactOfRotatingYourEncryptionKey": { - "message": "Impact of rotating your encryption key" + "message": "Impatto della modifica periodica della chiave crittografica" }, "learnMoreAboutEncryptionAlgorithms": { - "message": "Learn more about encryption algorithms" + "message": "Informazioni sugli algoritmi di crittografia" }, "learnMoreAboutKDFIterations": { - "message": "Learn more about KDF iterations" + "message": "Informazioni sulle iterazioni KDF" }, "learnMoreAboutLocalization": { - "message": "Learn more about localization" + "message": "Informazioni sulla localizzazione" }, "learnMoreAboutWebsiteIcons": { - "message": "Learn more about using website icons" + "message": "Ulteriori informazioni sull'utilizzo delle favicon dei siti Web" }, "learnMoreAboutUserAccess": { - "message": "Learn more about user access" + "message": "Informazioni sull'accesso utente" }, "learnMoreAboutMemberRoles": { - "message": "Learn more about member roles and permissions" + "message": "Ulteriori informazioni sui ruoli e i permessi dei membri" }, "whatIsACvvNumber": { - "message": "What is a CVV number?" + "message": "Cos'è un numero CVV?" }, "learnMoreAboutApi": { - "message": "Learn more about Bitwarden's API" + "message": "Info sulle API di Bitwarden" + }, + "fileSend": { + "message": "File Send" }, "fileSends": { "message": "Send File" }, + "textSend": { + "message": "Testo Send" + }, "textSends": { "message": "Send Testo" }, @@ -9942,7 +9946,7 @@ "message": "GB di spazio aggiuntivo" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "Algoritmo chiave" }, "sshPrivateKey": { "message": "Chiave privata" @@ -9954,25 +9958,25 @@ "message": "Impronta digitale" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "Impronta" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "Chiave privata" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "Chiave pubblica" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA a 2048 bit" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA a 3072 bit" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA a 4096 bit" }, "premiumAccounts": { "message": "6 account premium" @@ -10017,7 +10021,7 @@ "message": "Attuale" }, "secretsManagerSubscriptionInfo": { - "message": "Your Secrets Manager subscription will upgrade based on the plan selected" + "message": "Il tuo abbonamento Secrets Manager sarà aggiornato in base al piano selezionato" }, "bitwardenPasswordManager": { "message": "Bitwarden Password Manager" @@ -10033,19 +10037,19 @@ "description": "The text, 'API', is an acronym and should not be translated." }, "showCharacterCount": { - "message": "Show character count" + "message": "Mostra conteggio caratteri" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Nascondi conteggio caratteri" }, "editAccess": { "message": "Modifica accesso" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Usa campi di testo per dati come domande di sicurezza" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Usa campi nascosti per dati sensibili come le password" }, "checkBoxHelpText": { "message": "Usa le caselle di controllo se vuoi riempire automaticamente una casella di controllo, come \"Rimani connesso\"" @@ -10054,10 +10058,10 @@ "message": "Usa un campo collegato quando si verificano problemi di riempimento automatico per un sito web specifico." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "Inserisci l'ID HTML, il nome, l'aria-label o il segnaposto del campo." }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Includi caratteri maiuscoli", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -10065,7 +10069,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Includi caratteri minuscoli", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -10073,7 +10077,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Includi cifre", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -10081,40 +10085,36 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Includi caratteri speciali", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { - "message": "Add attachment" + "message": "Aggiungi allegato" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "La dimensione massima del file è 500 MB" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "Vuoi davvero eliminare definitivamente questo allegato?" }, "manageSubscriptionFromThe": { - "message": "Manage subscription from the", + "message": "Gestisci l'abbonamento dal", "description": "This represents the beginning of a sentence. The full sentence will be 'Manage subscription from the Provider Portal', but 'Provider Portal' will be a link and thus cannot be included in the translation file." }, "toHostBitwardenOnYourOwnServer": { - "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." + "message": "Per ospitare Bitwarden sul tuo server, dovrai caricare il tuo file di licenza. Per supportare i piani Famiglie Libere e le funzionalità avanzate di fatturazione per la tua organizzazione self-hosted, dovrai impostare la sincronizzazione automatica." }, "selfHostingTitleProper": { - "message": "Self-Hosting" + "message": "Self-hosting" }, "claim-domain-single-org-warning": { - "message": "Claiming a domain will turn on the single organization policy." + "message": "La rivendicazione di un dominio attiverà la politica di organizzazione unica." }, "single-org-revoked-user-warning": { - "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." + "message": "I membri non conformi saranno revocati. Gli amministratori possono ripristinare i membri una volta che lasciano tutte le altre organizzazioni." }, "deleteOrganizationUser": { - "message": "Delete $NAME$", + "message": "Elimina $NAME$", "placeholders": { "name": { "content": "$1", @@ -10124,7 +10124,7 @@ } }, "deleteOrganizationUserWarningDesc": { - "message": "This will permanently delete all items owned by $NAME$. Collection items are not impacted.", + "message": "Tutti gli elementi di proprietà di $NAME$ saranno eliminati. Gli elementi delle raccolte non subiranno modifiche.", "description": "Warning description for the delete organization user dialog", "placeholders": { "name": { @@ -10134,11 +10134,11 @@ } }, "deleteManyOrganizationUsersWarningDesc": { - "message": "This will permanently delete all items owned by the following members. Collection items are not impacted.", + "message": "Tutti gli elementi di proprietà dei seguenti membri saranno eliminati. Gli elementi delle raccolte non subiranno modifiche.", "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "Deleted $NAME$", + "message": "$NAME$ eliminato", "placeholders": { "name": { "content": "$1", @@ -10147,10 +10147,10 @@ } }, "organizationUserDeletedDesc": { - "message": "The user was removed from the organization and all associated user data has been deleted." + "message": "L'utente è stato rimosso dall'organizzazione e tutti i dati utente associati sono stati eliminati." }, "deletedUserId": { - "message": "Deleted user $ID$ - an owner / admin deleted the user account", + "message": "Utente $ID$ eliminato da un proprietario o da un amministratore", "placeholders": { "id": { "content": "$1", @@ -10159,7 +10159,7 @@ } }, "userLeftOrganization": { - "message": "User $ID$ left organization", + "message": "L'utente $ID$ ha lasciato l'organizzazione", "placeholders": { "id": { "content": "$1", @@ -10168,7 +10168,7 @@ } }, "suspendedOrganizationTitle": { - "message": "The $ORGANIZATION$ is suspended", + "message": "L'organizzazione $ORGANIZATION$ è sospesa", "placeholders": { "organization": { "content": "$1", @@ -10177,34 +10177,34 @@ } }, "suspendedUserOrgMessage": { - "message": "Contact your organization owner for assistance." + "message": "Contatta il proprietario dell'organizzazione per ricevere assistenza." }, "suspendedOwnerOrgMessage": { - "message": "To regain access to your organization, add a payment method." + "message": "Per recuperare l'accesso alla tua organizzazione, aggiungi un metodo di pagamento." }, "deleteMembers": { - "message": "Delete members" + "message": "Elimina membri" }, "noSelectedMembersApplicable": { - "message": "This action is not applicable to any of the selected members." + "message": "Questa azione non è applicabile a nessuno dei membri selezionati." }, "deletedSuccessfully": { - "message": "Deleted successfully" + "message": "Eliminazione completata" }, "freeFamiliesSponsorship": { - "message": "Remove Free Bitwarden Families sponsorship" + "message": "Rimuovi la sponsorizzazione famiglie gratuita" }, "freeFamiliesSponsorshipPolicyDesc": { - "message": "Do not allow members to redeem a Families plan through this organization." + "message": "Non consentire ai membri di riscattare un piano Famiglia attraverso questa organizzazione." }, "verifyBankAccountWithStatementDescriptorWarning": { - "message": "Payment with a bank account is only available to customers in the United States. You will be required to verify your bank account. We will make a micro-deposit within the next 1-2 business days. Enter the statement descriptor code from this deposit on the organization's billing page to verify the bank account. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Il pagamento con un conto bancario è disponibile solo per i clienti negli Stati Uniti. Ti sarà richiesto di verificare il tuo conto corrente. Effettueremo un micro-deposito entro i prossimi 1-2 giorni lavorativi. Inserisci il codice descrittore di questo deposito (si trova sull'estratto conto) nella pagina di fatturazione dell'organizzazione per verificare il conto bancario. La mancata verifica del conto bancario comporterà una perdita di pagamento e la sospensione dell'abbonamento." }, "verifyBankAccountWithStatementDescriptorInstructions": { - "message": "We have made a micro-deposit to your bank account (this may take 1-2 business days). Enter the six-digit code starting with 'SM' found on the deposit description. Failure to verify the bank account will result in a missed payment and your subscription being suspended." + "message": "Abbiamo effettuato un micro-deposito sul tuo conto bancario (potrebbe richiedere 1-2 giorni lavorativi). Inserisci il codice a sei cifre che inizia con 'SM' trovato nella descrizione del movimento. La mancata verifica del conto bancario comporterà una perdita di pagamento e la sospensione dell'abbonamento." }, "descriptorCode": { - "message": "Descriptor code" + "message": "Codice descrittore" }, "cannotRemoveViewOnlyCollections": { "message": "Non puoi rimuovere raccolte con i soli permessi di visualizzazione: $COLLECTIONS$", @@ -10216,22 +10216,22 @@ } }, "importantNotice": { - "message": "Important notice" + "message": "Avviso importante" }, "setupTwoStepLogin": { - "message": "Set up two-step login" + "message": "Imposta l'accesso in due passaggi" }, "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025." + "message": "Bitwarden invierà un codice all'email del tuo account per verificare gli accessi da nuovi dispositivi." }, "newDeviceVerificationNoticeContentPage2": { - "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access." + "message": "Puoi impostare l'accesso in due passaggi per proteggere il tuo account, oppure scegliere una email alla quale puoi accedere." }, "remindMeLater": { - "message": "Remind me later" + "message": "Ricordamelo più tardi" }, "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", + "message": "Confermi di poter accedere all'email $EMAIL$?", "placeholders": { "email": { "content": "$1", @@ -10240,19 +10240,19 @@ } }, "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" + "message": "No" }, "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" + "message": "Sì, ho accesso all'email" }, "turnOnTwoStepLogin": { - "message": "Turn on two-step login" + "message": "Attiva l'accesso in due passaggi" }, "changeAcctEmail": { - "message": "Change account email" + "message": "Cambia l'email dell'account" }, "removeMembers": { - "message": "Remove members" + "message": "Rimuovi membri" }, "devices": { "message": "Dispositivi" @@ -10264,25 +10264,25 @@ "message": "Il tuo account è stato connesso a ciascuno dei dispositivi qui sotto." }, "claimedDomains": { - "message": "Claimed domains" + "message": "Domini verificati" }, "claimDomain": { - "message": "Claim domain" + "message": "Verifica dominio" }, "reclaimDomain": { - "message": "Reclaim domain" + "message": "Rivendica dominio" }, "claimDomainNameInputHint": { - "message": "Example: mydomain.com. Subdomains require separate entries to be claimed." + "message": "Esempio: ilmiodominio.com. I sotto-domini richiedono voci separate." }, "automaticClaimedDomains": { - "message": "Automatic Claimed Domains" + "message": "Domini verificati automatici" }, "automaticDomainClaimProcess": { - "message": "Bitwarden will attempt to claim the domain 3 times during the first 72 hours. If the domain can’t be claimed, check the DNS record in your host and manually claim. The domain will be removed from your organization in 7 days if it is not claimed." + "message": "Bitwarden tenterà di verificare il dominio 3 volte durante le prossime 72 ore. Se il dominio non può essere acquisito, controlla il record DNS del tuo servizio di hosting e procedi manualmente. Il dominio sarà rimosso dall'organizzazione dopo 7 giorni se la procedura non andrà a buon fine." }, "domainNotClaimed": { - "message": "$DOMAIN$ not claimed. Check your DNS records.", + "message": "$DOMAIN$ non verificato. Controlla il record DNS.", "placeholders": { "DOMAIN": { "content": "$1", @@ -10291,19 +10291,19 @@ } }, "domainStatusClaimed": { - "message": "Claimed" + "message": "Verificato" }, "domainStatusUnderVerification": { - "message": "Under verification" + "message": "In attesa di verifica" }, "claimedDomainsDesc": { - "message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts." + "message": "Richiedi un dominio per acquisire la proprietà di tutti gli account membri il cui indirizzo email corrisponde al dominio. I membri saranno in grado di saltare l'identificatore SSO durante l'accesso. Gli amministratori potranno anche eliminare gli account membri." }, "invalidDomainNameClaimMessage": { - "message": "Input is not a valid format. Format: mydomain.com. Subdomains require separate entries to be claimed." + "message": "L'input non è in un formato valido. Formato: ilmiodominio.com. I sotto-domini richiedono voci separate." }, "domainClaimedEvent": { - "message": "$DOMAIN$ claimed", + "message": "$DOMAIN$ verificato", "placeholders": { "DOMAIN": { "content": "$1", @@ -10312,7 +10312,7 @@ } }, "domainNotClaimedEvent": { - "message": "$DOMAIN$ not claimed", + "message": "$DOMAIN$ non verificato", "placeholders": { "DOMAIN": { "content": "$1", @@ -10321,7 +10321,7 @@ } }, "updatedRevokeSponsorshipConfirmationForSentSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan cannot be redeemed. Are you sure you want to continue?", + "message": "Se rimuovi $EMAIL$, la sponsorizzazione per questo piano Famiglia non potrà essere riscattata. Vuoi davvero procedere?", "placeholders": { "email": { "content": "$1", @@ -10330,7 +10330,7 @@ } }, "updatedRevokeSponsorshipConfirmationForAcceptedSponsorship": { - "message": "If you remove $EMAIL$, the sponsorship for this Family plan will end and the saved payment method will be charged $40 + applicable tax on $DATE$. You will not be able to redeem a new sponsorship until $DATE$. Are you sure you want to continue?", + "message": "Se rimuovi $EMAIL$, la sponsorizzazione per questo piano Famiglia finirà e sul metodo di pagamento impostato saranno addebitati 40 $ + imposte applicabile su $DATE$. Non sarai in grado di riscattare una nuova sponsorizzazione fino a $DATE$. Vuoi comunque procedere?", "placeholders": { "email": { "content": "$1", @@ -10343,45 +10343,75 @@ } }, "domainClaimed": { - "message": "Domain claimed" + "message": "Dominio verificato" }, "organizationNameMaxLength": { - "message": "Organization name cannot exceed 50 characters." + "message": "Il nome dell'organizzazione non può superare i 50 caratteri." + }, + "sshKeyWrongPassword": { + "message": "La parola d'accesso inserita non è corretta." + }, + "importSshKey": { + "message": "Importa" + }, + "confirmSshKeyPassword": { + "message": "Conferma parola d'accesso" + }, + "enterSshKeyPasswordDesc": { + "message": "Inserisci la parola d'accesso per la chiave SSH." + }, + "enterSshKeyPassword": { + "message": "Inserisci parola d'accesso" + }, + "invalidSshKey": { + "message": "La chiave SSH non è valida" + }, + "sshKeyTypeUnsupported": { + "message": "Il tipo di chiave SSH non è supportato" + }, + "importSshKeyFromClipboard": { + "message": "Importa chiave dagli Appunti" + }, + "sshKeyImported": { + "message": "Chiave SSH importata correttamente" + }, + "copySSHPrivateKey": { + "message": "Copia chiave privata" }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "Apertura dell'estensione del browser Bitwarden" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "Si è verificato un problema..." }, "openingExtensionError": { - "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + "message": "Non è stato possibile aprire l'estensione di Bitwarden. Riprova cliccando sul pulsante." }, "openExtension": { - "message": "Open extension" + "message": "Apri estensione" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "Non hai l'estensione di Bitwarden installata nel tuo browser?" }, "installExtension": { - "message": "Install extension" + "message": "Installa estensione" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "Estensione avviata" }, "openedExtensionViewAtRiskPasswords": { - "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + "message": "L'estensione di Bitwarden è installata e funzionante. Ora è possibile avere una panoramica delle password a rischio." }, "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "message": "Non è stato possibile aprire l'estensione di Bitwarden. Clicca sull'icona di Bitwarden", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "from the toolbar.", + "message": "dalla barra degli strumenti.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { - "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.", + "message": "Il tuo abbonamento sarà rinnovato a breve. Per assicurarti un servizio continuativo, contatta $RESELLER$ e conferma il tuo rinnovo prima del $RENEWAL_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10394,7 +10424,7 @@ } }, "resellerOpenInvoiceWarningMgs": { - "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.", + "message": "La ricevuta per l'abbonamento è stata emessa il $ISSUED_DATE$. Per assicurarti un servizio continuativo, contatta $RESELLER$ e conferma il tuo rinnovo prima del $DUE_DATE$.", "placeholders": { "reseller": { "content": "$1", @@ -10411,7 +10441,7 @@ } }, "resellerPastDueWarningMsg": { - "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.", + "message": "Non abbiamo ricevuto il pagamento per il tuo abbonamento. Per assicurarti un servizio continuativo, contatta $RESELLER$ e conferma il tuo rinnovo prima del $GRACE_PERIOD_END$.", "placeholders": { "reseller": { "content": "$1", @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "I posti assegnati superano i posti disponibili." }, + "changeAtRiskPassword": { + "message": "Cambia parola d'accesso a rischio" + }, "removeUnlockWithPinPolicyTitle": { "message": "Rimuovi sblocco con PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Questi eventi sono solo esempi e non riflettono eventi reali all'interno della tua organizzazione Bitwarden." + }, + "cannotCreateCollection": { + "message": "Le organizzazioni gratuite possono avere fino a 2 raccolte. Aggiorna ad un piano a pagamento per crearne di più." } } diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index cbc34ccee17..6860b30b360 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -6,7 +6,7 @@ "message": "きわめて重要なアプリ" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "危険にさらされた重要なアプリケーションはありません" }, "accessIntelligence": { "message": "アクセス インテリジェンス" @@ -117,7 +117,7 @@ "message": "リスクがあるメンバー" }, "atRiskMembersWithCount": { - "message": "At-risk members ($COUNT$)", + "message": "危険な状態のメンバー ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -126,7 +126,7 @@ } }, "atRiskApplicationsWithCount": { - "message": "At-risk applications ($COUNT$)", + "message": "危険な状態のアプリ ($COUNT$)", "placeholders": { "count": { "content": "$1", @@ -135,13 +135,13 @@ } }, "atRiskMembersDescription": { - "message": "These members are logging into applications with weak, exposed, or reused passwords." + "message": "これらのメンバーは、脆弱な、または流出したか再利用されたパスワードでアプリにログインしています。" }, "atRiskApplicationsDescription": { - "message": "These applications have weak, exposed, or reused passwords." + "message": "これらのアプリで、脆弱な、または流出したか再利用されたパスワードを使用しています。" }, "atRiskMembersDescriptionWithApp": { - "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.", + "message": "これらのメンバーは、脆弱な、または流出したか再利用されたパスワードで $APPNAME$ にログインしています。", "placeholders": { "appname": { "content": "$1", @@ -159,10 +159,10 @@ "message": "合計アプリ数" }, "unmarkAsCriticalApp": { - "message": "Unmark as critical app" + "message": "重要なアプリとしてのマークを解除" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Critical application successfully unmarked" + "message": "重要なアプリケーションのマークを解除しました" }, "whatTypeOfItem": { "message": "このアイテムのタイプは何ですか?" @@ -201,6 +201,9 @@ "notes": { "message": "メモ" }, + "privateNote": { + "message": "非公開メモ" + }, "note": { "message": "メモ" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "ドラッグして並べ替え" }, + "dragToReorder": { + "message": "ドラッグして並べ替え" + }, "cfTypeText": { "message": "テキスト" }, @@ -467,17 +473,30 @@ "editFolder": { "message": "フォルダーを編集" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { - "message": "New folder" + "message": "新しいフォルダー" }, "folderName": { - "message": "Folder name" + "message": "フォルダー名" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "親フォルダーの名前の後に「/」を追加するとフォルダをネストします。例: ソーシャル/フォーラム" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "このフォルダーを完全に削除しますか?" }, "baseDomain": { "message": "ベースドメイン", @@ -860,9 +879,6 @@ "filter": { "message": "フィルター" }, - "moveSelectedToOrg": { - "message": "選択したものを組織に移動" - }, "deleteSelected": { "message": "選択したものを削除" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "選択したアイテムを $ORGNAME$ に移動しました", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "アイテムを $ORGNAME$ に移動しました", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "いいえ" }, + "location": { + "message": "場所" + }, "loginOrCreateNewAccount": { "message": "安全なデータ保管庫へアクセスするためにログインまたはアカウントを作成してください。" }, @@ -1165,13 +1175,13 @@ "message": "Bitwarden にログイン" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "メールアドレスに送信されたコードを入力してください" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "認証アプリに表示されているコードを入力してください" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "YubiKey を押して認証してください" }, "authenticationTimeout": { "message": "認証のタイムアウト" @@ -1179,17 +1189,17 @@ "authenticationSessionTimedOut": { "message": "認証セッションの有効期限が切れました。ログイン操作を最初からやり直してください。" }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "本人確認" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "このデバイスは未確認です。本人確認のため、メールアドレスに送信されたコードを入力してください。" }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "ログインを続ける" }, "whatIsADevice": { - "message": "What is a device?" + "message": "デバイスとは何ですか?" }, "aDeviceIs": { "message": "A device is a unique installation of the Bitwarden app where you have logged in. Reinstalling, clearing app data, or clearing your cookies could result in a device appearing multiple times." @@ -1198,7 +1208,7 @@ "message": "ログイン開始" }, "logInRequestSent": { - "message": "Request sent" + "message": "リクエストが送信されました" }, "submit": { "message": "送信" @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "アカウントのメールアドレスを入力すると、パスワードのヒントが送信されます" }, - "passwordHint": { - "message": "パスワードのヒント" - }, - "enterEmailToGetHint": { - "message": "マスターパスワードのヒントを受信するアカウントのメールアドレスを入力してください。" - }, "getMasterPasswordHint": { "message": "マスターパスワードのヒントを取得する" }, @@ -1390,13 +1394,13 @@ "message": "デバイスに通知を送信しました。" }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "デバイスまたは" }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "アカウントにアクセスしようとしていますか?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "$EMAIL$ によるログインの試行", "placeholders": { "email": { "content": "$1", @@ -1405,19 +1409,19 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "アクセスの確認" }, "denyAccess": { - "message": "Deny access" + "message": "アクセスを拒否" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "ウェブアプリ" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "上で、Bitwarden をロック解除してください。承認する前に、フィンガープリントフレーズが以下と一致していることを確認してください。" }, "notificationSentDeviceComplete": { - "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + "message": "デバイス上で Bitwarden のロックを解除してください。フィンガープリントフレーズが下記のものと一致していることを確認してから承認してください。" }, "aNotificationWasSentToYourDevice": { "message": "お使いのデバイスに通知が送信されました" @@ -1456,7 +1460,7 @@ "message": "情報を保存する" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "このデバイスで30日間再表示しない" }, "sendVerificationCodeEmailAgain": { "message": "確認コードをメールで再送" @@ -1465,11 +1469,11 @@ "message": "他の2段階認証方法を使用" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "別の方法を選択", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "リカバリーコードを使用する" }, "insertYubiKey": { "message": "YubiKey を USB ポートに挿入し、ボタンをタッチしてください。" @@ -1490,7 +1494,7 @@ "message": "2段階認証オプション" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "2段階認証の方法を選択" }, "recoveryCodeDesc": { "message": "すべての2段階認証プロパイダにアクセスできなくなったときは、リカバリーコードを使用するとアカウントの2段階認証を無効化できます。" @@ -1535,7 +1539,7 @@ "message": "(FIDOから移行)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "新しいタブで開く" }, "emailTitle": { "message": "メールアドレス" @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "このアイテムを移動する組織を選択してください。組織に移動すると、アイテムの所有権はその組織に移ります。移動した後、あなたはこのアイテムの直接の所有者ではなくなります。" }, - "moveManyToOrgDesc": { - "message": "このアイテムを移動する組織を選択してください。組織に移動すると、アイテムの所有権がその組織に移行します。 このアイテムが移動された後、あなたはこのアイテムの直接の所有者にはなりません。" - }, "collectionsDesc": { "message": "このアイテムを共有するコレクションを編集します。共有したアイテムは、当該コレクションにアクセスできる組織ユーザーにのみ表示されます。" }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ アイテムを選択しました。 $MOVEABLE_COUNT$ アイテムは組織に移動できます。 $NONMOVEABLE_COUNT$ アイテムはできません。", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "認証コード (TOTP)" }, @@ -1825,10 +1809,10 @@ "message": "ログインし直してください" }, "currentSession": { - "message": "Current session" + "message": "現在のセッション" }, "requestPending": { - "message": "Request pending" + "message": "保留中のリクエスト" }, "logBackInOthersToo": { "message": "ログインし直してください。他のBitwardenのアプリを使用している場合、同様にログインし直してください。" @@ -1907,7 +1891,7 @@ "message": "次に進むと現在のセッションからログアウトし二段階認証を含め再度ログインが必要になります。他のデバイスでのセッションは1時間程度維持されます。" }, "newDeviceLoginProtection": { - "message": "New device login" + "message": "新しいデバイスからのログイン" }, "turnOffNewDeviceLoginProtection": { "message": "Turn off new device login protection" @@ -2235,13 +2219,13 @@ "message": "Manage collection" }, "viewItems": { - "message": "View items" + "message": "アイテムを表示" }, "viewItemsHidePass": { "message": "View items, hidden passwords" }, "editItems": { - "message": "Edit items" + "message": "アイテムを編集" }, "editItemsHidePass": { "message": "Edit items, hidden passwords" @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "アクセスを取り消す" }, + "revoke": { + "message": "取り消し" + }, "twoStepLoginProviderEnabled": { "message": "この二段階認証プロバイダは、あなたのアカウントで有効になっています。" }, @@ -3944,19 +3931,19 @@ "message": "Device Type" }, "ipAddress": { - "message": "IP Address" + "message": "IP アドレス" }, "confirmLogIn": { - "message": "Confirm login" + "message": "ログインを確認" }, "denyLogIn": { - "message": "Deny login" + "message": "ログインを拒否" }, "thisRequestIsNoLongerValid": { - "message": "This request is no longer valid." + "message": "このリクエストは無効になりました。" }, "logInConfirmedForEmailOnDevice": { - "message": "Login confirmed for $EMAIL$ on $DEVICE$", + "message": "$EMAIL$ に $DEVICE$ でのログインを承認しました", "placeholders": { "email": { "content": "$1", @@ -3969,13 +3956,13 @@ } }, "youDeniedALogInAttemptFromAnotherDevice": { - "message": "You denied a login attempt from another device. If this really was you, try to log in with the device again." + "message": "別のデバイスからのログイン試行を拒否しました。本当にあなたであった場合は、もう一度デバイスでログインしてみてください。" }, "loginRequestHasAlreadyExpired": { - "message": "Login request has already expired." + "message": "ログインリクエストの有効期限が切れています。" }, "justNow": { - "message": "Just now" + "message": "たった今" }, "requestedXMinutesAgo": { "message": "Requested $MINUTES$ minutes ago", @@ -4504,7 +4491,7 @@ "message": "暗号化キーの更新を続行できません" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "$LABEL$ を編集", "placeholders": { "label": { "content": "$1", @@ -4513,7 +4500,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "$LABEL$ の順序を変更します。矢印キーを押すとアイテムを上下に移動します。", "placeholders": { "label": { "content": "$1", @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "暗号化キーを更新する際、フォルダーを復号できませんでした。 アップデートを続行するには、フォルダーを削除する必要があります。続行しても保管庫のアイテムは削除されません。" }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "組織の所有者および管理者は、このポリシーの執行から除外されます。" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ファイル" }, "sendTypeText": { "message": "テキスト" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "新しい Send を作成", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send を削除", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "この Send を削除してもよろしいですか?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "この Send の種類は何ですか?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "削除日時" }, - "deletionDateDesc": { - "message": "Send は指定された日時に完全に削除されます。", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "最大アクセス数" }, - "maxAccessCountDesc": { - "message": "設定されている場合、最大アクセス数に達するとユーザーはこの Send にアクセスできなくなります。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "現在のアクセス数" - }, - "sendPasswordDesc": { - "message": "必要に応じて、ユーザーがこの Send にアクセスするためのパスワードを要求します。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "この Send に関するプライベートメモ", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "無効" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "パスワードを削除してもよろしいですか?" }, - "hideEmail": { - "message": "受信者に自分のメールアドレスを表示しない" - }, - "disableThisSend": { - "message": "誰もアクセスできないように、この Send を無効にします。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "すべての Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "保留中の削除" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "期限切れ" }, @@ -5415,13 +5441,6 @@ "message": "Send を作成または編集するとき、常にメンバーのメールアドレスを受信者と一緒に表示します。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "現在、以下の組織ポリシーが適用されています。" - }, - "sendDisableHideEmailInEffect": { - "message": "Send を作成または編集する際に、ユーザーのメールアドレスを受信者に非表示にすることはできません。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "変更されたポリシー $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "組織ユーザーの個人所有権を無効にする" }, - "textHiddenByDefault": { - "message": "Send へのアクセス時に既定でテキストを非表示にする", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "この Send を説明するわかりやすい名前", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "送信したいテキスト" - }, - "sendFileDesc": { - "message": "送信するファイル" - }, - "copySendLinkOnSave": { - "message": "Send の保存時にクリップボードへリンクをコピーします。" - }, - "sendLinkLabel": { - "message": "Send リンク", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "削除と有効期限の保存中にエラーが発生しました。" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "二段階認証を確認するには、下のボタンをクリックしてください。" }, @@ -7252,7 +7253,7 @@ "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "以下の手順に従ってログインを完了してください。" }, "launchDuo": { "message": "DUO を起動" @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "ユーザー数" }, - "loggingInAs": { - "message": "ログイン中:" - }, - "notYou": { - "message": "あなたではないですか?" - }, "pickAnAvatarColor": { "message": "アバターの色を選択" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "管理者の承認を要求する" }, - "approveWithMasterPassword": { - "message": "マスターパスワードで承認する" - }, "trustedDeviceEncryption": { "message": "信頼できるデバイスでの暗号化" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "要求を管理者に送信しました。" }, - "youWillBeNotifiedOnceApproved": { - "message": "承認されると通知されます。 " - }, "troubleLoggingIn": { "message": "ログインできない場合" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Bitwarden API の詳細" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "ファイル Send" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "テキスト Send" }, @@ -9942,25 +9946,25 @@ "message": "GB の追加ストレージ" }, "sshKeyAlgorithm": { - "message": "Key algorithm" + "message": "鍵アルゴリズム" }, "sshPrivateKey": { - "message": "Private key" + "message": "秘密鍵" }, "sshPublicKey": { - "message": "Public key" + "message": "公開鍵" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "フィンガープリント" }, "sshKeyFingerprint": { - "message": "Fingerprint" + "message": "フィンガープリント" }, "sshKeyPrivateKey": { - "message": "Private key" + "message": "秘密鍵" }, "sshKeyPublicKey": { - "message": "Public key" + "message": "公開鍵" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -10042,7 +10046,7 @@ "message": "編集権限" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "セキュリティに関する質問などのデータにはテキストフィールドを使用します" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -10084,10 +10088,6 @@ "message": "特殊記号を含める", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "添付ファイルを追加" }, @@ -10105,7 +10105,7 @@ "message": "To host Bitwarden on your own server, you will need to upload your license file. To support Free Families plans and advanced billing capabilities for your self-hosted organization, you will need to set up automatic sync in your self-hosted organization." }, "selfHostingTitleProper": { - "message": "Self-Hosting" + "message": "セルフホスティング" }, "claim-domain-single-org-warning": { "message": "Claiming a domain will turn on the single organization policy." @@ -10114,7 +10114,7 @@ "message": "Non-compliant members will be revoked. Administrators can restore members once they leave all other organizations." }, "deleteOrganizationUser": { - "message": "Delete $NAME$", + "message": "$NAME$ を削除", "placeholders": { "name": { "content": "$1", @@ -10138,7 +10138,7 @@ "description": "Warning description for the bulk delete organization users dialog" }, "organizationUserDeleted": { - "message": "Deleted $NAME$", + "message": "$NAME$ を削除しました", "placeholders": { "name": { "content": "$1", @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "入力されたパスワードが間違っています。" + }, + "importSshKey": { + "message": "インポート" + }, + "confirmSshKeyPassword": { + "message": "パスワードを確認" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH キーのパスワードを入力します。" + }, + "enterSshKeyPassword": { + "message": "パスワードを入力" + }, + "invalidSshKey": { + "message": "SSH キーが無効です" + }, + "sshKeyTypeUnsupported": { + "message": "サポートされていない種類の SSH キーです" + }, + "importSshKeyFromClipboard": { + "message": "クリップボードからキーをインポート" + }, + "sshKeyImported": { + "message": "SSH キーのインポートに成功しました" + }, + "copySSHPrivateKey": { + "message": "秘密鍵をコピー" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,11 +10517,14 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "危険なパスワードの変更" + }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "PINによるロック解除を削除" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "PINによるアカウントのロック解除をメンバーに許可しません。" }, "limitedEventLogs": { "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index 121adac3ad4..f5f4bfb3ae1 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "ჩანაწერები" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "გადაადგილე დასახარისხებლად" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ტექსტი" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "საქაღალდის ჩასწორება" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "ფილტრი" }, - "moveSelectedToOrg": { - "message": "გადაყვანა შერჩეულის ორგანიზაციაში" - }, "deleteSelected": { "message": "წაშლა შერჩეულის" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "მონიშნული საგანები გადაყვანილია $ORGNAME$-ში", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "არა" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "სისტემაში შედით ან შექმენით ახალი ანგარიში თქვენს დაცულ საცავთან საწვდომად." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "პაროლის მინიშნება" - }, - "enterEmailToGetHint": { - "message": "შეიყვანეთ თქვენი ანგარიშის ელ-ფოსტა რომ მიიღოთ თქვენი მთავარი პაროლის მინიშნება." - }, "getMasterPasswordHint": { "message": "მიიღეთ მთავარი პაროლის მინიშნება" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "თქვენ მონიშნეთ $COUNT$ საგანი(ები). $MOVEABLE_COUNT$ საგან(ები)-ს გადატანა შესაძლებელია ორგანიზაციაში, $NONMOVEABLE_COUNT$ ვერა", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "ერთჯერადი კოდი (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index aed10e3ad71..f334131b69b 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 9330589ce76..dbf2cab3bb5 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "ಟಿಪ್ಪಣಿಗಳು" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "ವಿಂಗಡಿಸಲು ಎಳೆಯಿರಿ" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ಪಠ್ಯ" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "ಆಯ್ದ ಸಂಸ್ಥೆಗೆ ಸರಿಸಿ" - }, "deleteSelected": { "message": "ಆಯ್ಕೆಮಾಡಿದ ಅಳಿಸಿ" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "ಆಯ್ದ ವಸ್ತುಗಳನ್ನು $ORGNAME$ ಗೆ ಸರಿಸಲಾಗಿದೆ", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "ಇಲ್ಲ" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "ನಿಮ್ಮ ಸುರಕ್ಷಿತ ವಾಲ್ಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಲಾಗ್ ಇನ್ ಮಾಡಿ ಅಥವಾ ಹೊಸ ಖಾತೆಯನ್ನು ರಚಿಸಿ." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "ಪಾಸ್ವರ್ಡ್ ಸುಳಿವು" - }, - "enterEmailToGetHint": { - "message": "ವಿಸ್ತರಣೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಮೆನುವಿನಲ್ಲಿರುವ ಬಿಟ್‌ವಾರ್ಡೆನ್ ಐಕಾನ್ ಟ್ಯಾಪ್ ಮಾಡಿ." - }, "getMasterPasswordHint": { "message": "ಮಾಸ್ಟರ್ ಪಾಸ್ವರ್ಡ್ ಸುಳಿವನ್ನು ಪಡೆಯಿರಿ" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "ಈ ಐಟಂ ಅನ್ನು ಸರಿಸಲು ನೀವು ಬಯಸುವ ಸಂಸ್ಥೆಯನ್ನು ಆರಿಸಿ. ಸಂಸ್ಥೆಗೆ ಹೋಗುವುದರಿಂದ ವಸ್ತುವಿನ ಮಾಲೀಕತ್ವವನ್ನು ಆ ಸಂಸ್ಥೆಗೆ ವರ್ಗಾಯಿಸುತ್ತದೆ. ಈ ಐಟಂ ಅನ್ನು ಸರಿಸಿದ ನಂತರ ನೀವು ಇನ್ನು ಮುಂದೆ ಅದರ ನೇರ ಮಾಲೀಕರಾಗಿರುವುದಿಲ್ಲ." }, - "moveManyToOrgDesc": { - "message": "ಈ ವಸ್ತುಗಳನ್ನು ಸರಿಸಲು ನೀವು ಬಯಸುವ ಸಂಸ್ಥೆಯನ್ನು ಆರಿಸಿ. ಸಂಸ್ಥೆಗೆ ಹೋಗುವುದರಿಂದ ವಸ್ತುಗಳ ಮಾಲೀಕತ್ವವನ್ನು ಆ ಸಂಸ್ಥೆಗೆ ವರ್ಗಾಯಿಸುತ್ತದೆ. ಈ ವಸ್ತುಗಳನ್ನು ಸರಿಸಿದ ನಂತರ ನೀವು ಇನ್ನು ಮುಂದೆ ಅವರ ನೇರ ಮಾಲೀಕರಾಗಿರುವುದಿಲ್ಲ." - }, "collectionsDesc": { "message": "ಈ ಐಟಂ ಹಂಚಿಕೊಳ್ಳುತ್ತಿರುವ ಸಂಗ್ರಹಗಳನ್ನು ಸಂಪಾದಿಸಿ. ಈ ಸಂಗ್ರಹಣೆಗಳಿಗೆ ಪ್ರವೇಶ ಹೊಂದಿರುವ ಸಂಸ್ಥೆಯ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ ಈ ಐಟಂ ಅನ್ನು ನೋಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "ನೀವು $COUNT$ ಐಟಂ (ಗಳನ್ನು) ಆಯ್ಕೆ ಮಾಡಿದ್ದೀರಿ. $MOVEABLE_COUNT$ ಐಟಂ (ಗಳನ್ನು) ಸಂಸ್ಥೆಗೆ ಸರಿಸಬಹುದು, $NONMOVEABLE_COUNT$ ಸಾಧ್ಯವಿಲ್ಲ.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "ಪರಿಶೀಲನಾ ಕೋಡ್‌ಗಳು (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "ಈ ಎರಡು ಹಂತದ ಲಾಗಿನ್ ಒದಗಿಸುವವರನ್ನು ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "ಸಂಸ್ಥೆಯ ಮಾಲೀಕರು ಮತ್ತು ನಿರ್ವಾಹಕರು ಈ ನೀತಿಯ ಜಾರಿಯಿಂದ ವಿನಾಯಿತಿ ಪಡೆದಿದ್ದಾರೆ." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ಫೈಲ್" }, "sendTypeText": { "message": "ಪಠ್ಯ" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "ಹೊಸ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ರಚಿಸಿ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "ಅಳಿಸಿ ಕಳುಹಿಸಿ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "ಇದು ಯಾವ ರೀತಿಯ ಕಳುಹಿಸುತ್ತದೆ?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "ಅಳಿಸುವ ದಿನಾಂಕ" }, - "deletionDateDesc": { - "message": "ಕಳುಹಿಸಿದ ದಿನಾಂಕ ಮತ್ತು ಸಮಯದ ಮೇಲೆ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ" }, - "maxAccessCountDesc": { - "message": "ಹೊಂದಿಸಿದ್ದರೆ, ಗರಿಷ್ಠ ಪ್ರವೇಶ ಎಣಿಕೆ ತಲುಪಿದ ನಂತರ ಬಳಕೆದಾರರಿಗೆ ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "ಪ್ರಸ್ತುತ ಪ್ರವೇಶ ಎಣಿಕೆ" - }, - "sendPasswordDesc": { - "message": "ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಪಾಸ್‌ವರ್ಡ್ ಐಚ್ ಗತ್ಯವಿದೆ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "ಈ ಕಳುಹಿಸುವ ಬಗ್ಗೆ ಖಾಸಗಿ ಟಿಪ್ಪಣಿಗಳು.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?" }, - "hideEmail": { - "message": "ಸ್ವೀಕರಿಸುವವರಿಂದ ನನ್ನ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಮರೆಮಾಡಿ." - }, - "disableThisSend": { - "message": "ಇದನ್ನು ಕಳುಹಿಸುವುದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಇದರಿಂದ ಯಾರೂ ಅದನ್ನು ಪ್ರವೇಶಿಸಲಾಗುವುದಿಲ್ಲ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "ಎಲ್ಲಾ ಕಳುಹಿಸುತ್ತದೆ" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "ಅಳಿಸುವಿಕೆ ಬಾಕಿ ಉಳಿದಿದೆ" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "ಅವಧಿ ಮೀರಿದೆ" }, @@ -5415,13 +5441,6 @@ "message": "ಕಳುಹಿಸುವಿಕೆಯನ್ನು ರಚಿಸುವಾಗ ಅಥವಾ ಸಂಪಾದಿಸುವಾಗ ಬಳಕೆದಾರರು ತಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಸ್ವೀಕರಿಸುವವರಿಂದ ಮರೆಮಾಡಲು ಅನುಮತಿಸಬೇಡಿ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "ಕೆಳಗಿನ ಸಂಸ್ಥೆಯ ನೀತಿಗಳು ಪ್ರಸ್ತುತ ಜಾರಿಯಲ್ಲಿವೆ:" - }, - "sendDisableHideEmailInEffect": { - "message": "ಕಳುಹಿಸುವಿಕೆಯನ್ನು ರಚಿಸುವಾಗ ಅಥವಾ ಸಂಪಾದಿಸುವಾಗ ಬಳಕೆದಾರರು ತಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಸ್ವೀಕರಿಸುವವರಿಂದ ಮರೆಮಾಡಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "ಮಾರ್ಪಡಿಸಿದ ನೀತಿ $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "ಸಂಸ್ಥೆ ಬಳಕೆದಾರರಿಗಾಗಿ ವೈಯಕ್ತಿಕ ಮಾಲೀಕತ್ವವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" }, - "textHiddenByDefault": { - "message": "ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಪ್ರವೇಶಿಸುವಾಗ, ಪಠ್ಯವನ್ನು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಮರೆಮಾಡಿ", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "ಇದನ್ನು ಕಳುಹಿಸಲು ವಿವರಿಸಲು ಸ್ನೇಹಪರ ಹೆಸರು.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "ನೀವು ಕಳುಹಿಸಲು ಬಯಸುವ ಪಠ್ಯ." - }, - "sendFileDesc": { - "message": "ನೀವು ಕಳುಹಿಸಲು ಬಯಸುವ ಫೈಲ್." - }, - "copySendLinkOnSave": { - "message": "ಇದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಲಿಂಕ್ ಅನ್ನು ನಕಲಿಸಿ ಉಳಿಸಿದ ನಂತರ ನನ್ನ ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ಕಳುಹಿಸಿ." - }, - "sendLinkLabel": { - "message": "ಲಿಂಕ್ ಕಳುಹಿಸಿ", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "ಕಳುಹಿಸಿ", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "ನಿಮ್ಮ ಅಳಿಸುವಿಕೆ ಮತ್ತು ಮುಕ್ತಾಯ ದಿನಾಂಕಗಳನ್ನು ಉಳಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "ನಿಮ್ಮ 2FA ಅನ್ನು ಪರಿಶೀಲಿಸಲು ದಯವಿಟ್ಟು ಕೆಳಗಿನ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index 3aa0eac1a64..1f3bbda3736 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "메모" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "드래그하여 정렬" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "텍스트" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "폴더 편집" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "필터" }, - "moveSelectedToOrg": { - "message": "선택한 항목을 조직으로 이동함" - }, "deleteSelected": { "message": "선택 항목 삭제" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "선택한 항목이 $ORGNAME$(으)로 이동됨", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "아니오" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "안전 보관함에 접근하려면 로그인하거나 새 계정을 만드세요." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "비밀번호 힌트" - }, - "enterEmailToGetHint": { - "message": "마스터 비밀번호 힌트를 받으려면 계정의 이메일 주소를 입력하세요." - }, "getMasterPasswordHint": { "message": "마스터 비밀번호 힌트 얻기" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "이 항목을 이동할 조직을 선택하십시오. 항목이 조직으로 이동되면 소유권이 조직으로 이전됩니다. 일단 이동되면, 더는 이동된 항목의 직접적인 소유자가 아니게 됩니다." }, - "moveManyToOrgDesc": { - "message": "이 항목을 이동할 조직을 선택하십시오. 항목이 조직으로 이동되면 소유권이 조직으로 이전됩니다. 일단 이동되면, 더는 이동된 항목의 직접적인 소유자가 아니게 됩니다." - }, "collectionsDesc": { "message": "이 항목이 공유될 콜렉션을 수정하십시오. 이 콜렉션에 접근할 수 있는 조직 사용자만 이 항목을 볼 수 있습니다." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$개의 항목을 선택하셨습니다. $MOVEABLE_COUNT$개의 항목은 조직으로 이동시킬 수 있지만 나머지 $NONMOVEABLE_COUNT$개의 항목은 이동시킬 수 없습니다.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "인증 코드 (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "이 2단계 로그인 제공자는 귀하의 계정에 사용 가능합니다." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "조직 소유자와 관리자는 이 정책을 적용받지 않습니다." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "파일" }, "sendTypeText": { "message": "텍스트" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "새 Send 생성", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send 삭제", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "정말 이 Send를 삭제하시겠습니까?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "어떤 유형의 Send인가요?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "삭제 날짜" }, - "deletionDateDesc": { - "message": "이 Send가 정해진 일시에 영구적으로 삭제됩니다.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "최대 접근 횟수" }, - "maxAccessCountDesc": { - "message": "설정할 경우, 최대 접근 횟수에 도달할 때 이 Send에 접근할 수 없게 됩니다.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "현재 접근 횟수" - }, - "sendPasswordDesc": { - "message": "이 Send에 접근하기 위해 암호를 입력하도록 선택적으로 요구합니다.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "이 Send에 대한 비공개 메모", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "비활성화됨" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "비밀번호를 제거하시겠습니까?" }, - "hideEmail": { - "message": "받는 사람으로부터 나의 이메일 주소 숨기기" - }, - "disableThisSend": { - "message": "이 Send를 비활성화하여 아무도 접근할 수 없게 합니다.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "모든 Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "삭제 대기 중" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "만료됨" }, @@ -5415,13 +5441,6 @@ "message": "사용자가 Send를 생성하거나 수정할 때 받는 사람으로부터 자신의 이메일 주소를 숨기지 못하게 합니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "다음 단체 정책이 현재 영향을 미치고 있습니다:" - }, - "sendDisableHideEmailInEffect": { - "message": "사용자는 Send를 생성하거나 수정할 때 받는 사람으로부터 자신의 이메일 주소를 숨기지 못하게 됩니다.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "$ID$ 정책을 편집했습니다.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "조직 사용자의 개인 소유권 비활성화" }, - "textHiddenByDefault": { - "message": "Send에 접근할 때 기본적으로 텍스트를 숨김", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "이 Send의 이름", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "전송하려는 텍스트" - }, - "sendFileDesc": { - "message": "전송하려는 파일" - }, - "copySendLinkOnSave": { - "message": "저장할 때 이 Send를 공유하기 위한 링크를 클립보드에 복사합니다." - }, - "sendLinkLabel": { - "message": "Send 링크", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "삭제 날짜와 만료 날짜를 저장하는 도중 오류가 발생했습니다." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "2단계 인증을 확인하려면 아래의 버튼을 클릭하십시오." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 2dceab3f691..7c8c3b2831e 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Piezīmes" }, + "privateNote": { + "message": "Personiska piezīme" + }, "note": { "message": "Piezīme" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Vilkt, lai kārtotu" }, + "dragToReorder": { + "message": "Vilkt, lai pārkārtotu" + }, "cfTypeText": { "message": "Teksts" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Labot mapi" }, + "editWithName": { + "message": "Labot $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Jauna mape" }, @@ -860,9 +879,6 @@ "filter": { "message": "Atlase" }, - "moveSelectedToOrg": { - "message": "Pārvietot atzīmēto uz apvienību" - }, "deleteSelected": { "message": "Izdzēst atlasītos" }, @@ -918,15 +934,6 @@ } } }, - "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": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nē" }, + "location": { + "message": "Atrašanās vieta" + }, "loginOrCreateNewAccount": { "message": "Jāpiesakās vai jāizveido jauns konts, lai piekļūtu drošajai glabātavai." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "Iestājās autentificēšanās sesijas noildze. Lūgums sākt pieteikšanos no jauna." }, - "verifyIdentity": { - "message": "Jāapliecina sava identitāte" + "verifyYourIdentity": { + "message": "Apliecināt savu identitāti" }, "weDontRecognizeThisDevice": { "message": "Mēs neatpazīstam šo ierīci. Jāievada kods, kas tika nosūtīts e-pastā, lai apliecinātu savu identitāti." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Jāievada sava konta e-pasta adrese, un paroles norāde tiks nosūtīta" }, - "passwordHint": { - "message": "Paroles norāde" - }, - "enterEmailToGetHint": { - "message": "Norādīt konta e-pasta adresi, lai saņemtu galvenās paroles norādi." - }, "getMasterPasswordHint": { "message": "Saņemt galvenās paroles norādi" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Jāizvēlas apvienība, uz kuru pārvietot šo vienumu. Pārvietošana nodod šī vienuma piederību apvienībai. Pēc šī vienuma pārvietošanas Tu vairs nebūsi tā tiešais īpašnieks." }, - "moveManyToOrgDesc": { - "message": "Jāizvēlas apvienība, uz kuru pārvietot šos vienumus. Pārvietošana nodod šo vienumu piederību apvienībai. Pēc šo vienumu pārvietošanas Tu vairs nebūsi to tiešais īpašnieks." - }, "collectionsDesc": { "message": "Labot krājumus, ar kuriem šis vienums ir kopīgots. Tikai apvienības lietotāji, kam ir piekļuve šiem krājumiem, redzēs šo vienumu." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Ir atzīmēts(i) $COUNT$ vienums(i). $MOVEABLE_COUNT$ vienums(i) var tikt pārvietoti uz apvienību, bet $NONMOVEABLE_COUNT$ nē.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Apstiprinājuma kods (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Atsaukt piekļuvi" }, + "revoke": { + "message": "Atsaukt" + }, "twoStepLoginProviderEnabled": { "message": "Kontā ir iespējots šis divpakāpju pieteikšanās nodrošinātājs." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ pārvietots augšup, $INDEX$. no $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ pārvietots lejup, $INDEX$. no $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Šifrēšanas atslēgas atjaunināšanas laikā mapes nevarēja atšifrēt. Lai turpinātu atjaunināšanu, mapes ir jāizdzēš. Glabātavas vienumi netiks izdzēsti, ja turpināsi." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Uz apvienības īpašniekiem un pārvaldītājiem neattiecas šīs nosacījumu kopas piemērošana." }, + "limitSendViews": { + "message": "Ierobežot skatījumus" + }, + "limitSendViewsHint": { + "message": "Neviens nevar apskatīt šo Send pēc tam, kad ir sasniegts ierobežojums.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Atlikuši $ACCESSCOUNT$ skatījumi", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Informācija par Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Kopīgojamais teksts" + }, "sendTypeFile": { "message": "Datne" }, "sendTypeText": { "message": "Teksts" }, + "sendPasswordDescV3": { + "message": "Pēc izvēles var pievienot paroli saņēmējiem, lai varētu piekļūt šim Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Jauns Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Izdzēst Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Vai tiešām izdzēst šo Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Kāds ir šī Send veids?", + "deleteSendPermanentConfirmation": { + "message": "Vai tiešām neatgriezeniski izdzēst šo Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Dzēšanas datums" }, - "deletionDateDesc": { - "message": "Send tiks neatgriezeniski izdzēsts norādītajā datumā un laikā.", + "deletionDateDescV2": { + "message": "Send šajā datumā tiks neatgriezeniski izdzēsts.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Lielākais pieļaujamais piekļuves reižu skaits" }, - "maxAccessCountDesc": { - "message": "Ja iestatīts, lietotāji nevarēs piekļūt šim Send, kad tiks sasniegts lielākais pieļaujamais piekļūšanas reižu skaits.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Pašreizējais piekļuvju skaits" - }, - "sendPasswordDesc": { - "message": "Pēc izvēles pieprasīt paroli, lai lietotāji varētu piekļūt šim Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Personīgas piezīmes par šo Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Atspējots" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Vai tiešām noņemt paroli?" }, - "hideEmail": { - "message": "Slēpt e-pasta adresi no saņēmējiem." - }, - "disableThisSend": { - "message": "Izslēgt šo Send, lai neviens tam nevarētu piekļūt.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Visi Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Gaida dzēšanu" }, + "hideTextByDefault": { + "message": "Pēc noklusējuma paslēpt tekstu" + }, "expired": { "message": "Beidzies izmantošanas laiks" }, @@ -5415,13 +5441,6 @@ "message": "Vienmēr rādīt dalībnieka e-pasta adresi saņēmējiem, kad tiek izveidots vai labots Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Ir spēkā zemāk uzskaitītie apvienības nosacījumi:" - }, - "sendDisableHideEmailInEffect": { - "message": "Lietotājiem nav ļauts slēpt e-pasta adresi no saņēmējiem, kad tiek izveidots vai labots Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Nosacījums $ID$ izmainīts.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Atspējot personīgās īpašumtiesības apvienības lietotājiem" }, - "textHiddenByDefault": { - "message": "Pēc noklusējuma paslēpt tekstu, kad piekļūst Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Lasāms nosaukums, kas apraksta šo Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Teksts, kuru ir vēlme nosūtīt." - }, - "sendFileDesc": { - "message": "Datne, kuru ir vēlme nosūtīt." - }, - "copySendLinkOnSave": { - "message": "Saglabāšanas brīdī ievietot saiti starpliktuvē, lai kopīgotu šo Send." - }, - "sendLinkLabel": { - "message": "Send saite", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Atgadījās kļūda, saglabājot dzēšanas un derīguma beigu datumus." }, + "hideYourEmail": { + "message": "Paslēpt e-pasta adresi no apskatītājiem." + }, "webAuthnFallbackMsg": { "message": "Lai apstiprinātu 2FA, lūgums klikšķināt uz zemāk esošās pogas." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Lietotāju skaits" }, - "loggingInAs": { - "message": "Piesakās kā" - }, - "notYou": { - "message": "Tas neesi Tu?" - }, "pickAnAvatarColor": { "message": "Izvēlēties iemiesojuma krāsu" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Pieprasīt pārvaldītāja apstiprinājumu" }, - "approveWithMasterPassword": { - "message": "Apstiprināt ar galveno paroli" - }, "trustedDeviceEncryption": { "message": "Uzticamo ierīču šifrēšana" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Pieprasījums tika nosūtīts pārvaldītājam." }, - "youWillBeNotifiedOnceApproved": { - "message": "Tiks saņemts paziņojums, tiklīdz būs apstiprināts." - }, "troubleLoggingIn": { "message": "Neizdodas pieteikties?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Konfigurēt ierīču pārvaldību Bitwarden, izmantojot operētājsistēmai atbilstošas ieviešanas norādes." }, + "deviceIdMissing": { + "message": "Trūkst ierīces Id" + }, + "deviceTypeMissing": { + "message": "Trūkst ierīces veids" + }, + "deviceCreationDateMissing": { + "message": "Trūkst ierīces izveidošanas datums" + }, "desktopRequired": { "message": "Nepieciešams dators" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Uzzināt vairāk par Bitwarden API" }, + "fileSend": { + "message": "Datņu Send" + }, "fileSends": { "message": "Datņu Send" }, + "textSend": { + "message": "Teksta Send" + }, "textSends": { "message": "Teksta Send" }, @@ -10084,10 +10088,6 @@ "message": "Iekļaut īpašās rakstzīmes", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Pievienot pielikumu" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Apvienības nosaukums nevar pārsniegt 50 rakstzīmes." }, + "sshKeyWrongPassword": { + "message": "Ievadītā parole ir nepareiza." + }, + "importSshKey": { + "message": "Ievietot" + }, + "confirmSshKeyPassword": { + "message": "Apstiprināt paroli" + }, + "enterSshKeyPasswordDesc": { + "message": "Ievadīt SSH atslēgas paroli." + }, + "enterSshKeyPassword": { + "message": "Ievadīt paroli" + }, + "invalidSshKey": { + "message": "SSH atslēga ir nederīga" + }, + "sshKeyTypeUnsupported": { + "message": "SSH atslēgas veids netiek atbalstīts" + }, + "importSshKeyFromClipboard": { + "message": "Ievietot atslēgu no starpliktuves" + }, + "sshKeyImported": { + "message": "SSH atslēga tika sekmīgi ievietota" + }, + "copySSHPrivateKey": { + "message": "Ievietot privāto atslēgu starpliktuvē" + }, "openingExtension": { "message": "Atver Bitwarden pārlūka paplašinājumu" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Piešķirtās vietas pārsniedz pieejamās vietas." }, + "changeAtRiskPassword": { + "message": "Mainīt riskam pakļautu paroli" + }, "removeUnlockWithPinPolicyTitle": { "message": "Noņemt atslēgšanu ar PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Šie notikumu ir tikai piemēri, un tie neatspoguļo īstus notikumus Bitwarden apvienībā." + }, + "cannotCreateCollection": { + "message": "Apvienībās, kuras izmanto Bitwarden bez maksas, var būt līdz 2 krājumiem. Jāpāriet uz maksas plānu, lai pievienotu vairāk krājumu." } } diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 3b5edb91838..46ce3b62533 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "കുറിപ്പുകൾ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "അടുക്കാൻ വലിച്ചിടുക" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "വാചകം" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "ഫോൾഡർ തിരുത്തുക" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "തിരഞ്ഞെടുത്തത് ഇല്ലാതാക്കുക" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "അല്ല" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "നിങ്ങളുടെ സുരക്ഷിത വാൾട്ടിലേക്ക് പ്രവേശിക്കാൻ ലോഗിൻ ചെയ്യുക അല്ലെങ്കിൽ ഒരു പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "പാസ്‌വേഡ് സൂചനാ" - }, - "enterEmailToGetHint": { - "message": "നിങ്ങളുടെ പ്രാഥമിക പാസ്‌വേഡ് സൂചന ലഭിക്കുന്നതിന് നിങ്ങളുടെ അക്കൗണ്ട് ഇമെയിൽ വിലാസം നൽകുക." - }, "getMasterPasswordHint": { "message": "പ്രാഥമിക പാസ്‌വേഡ് സൂചന നേടുക" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "സ്ഥിരീകരണ കോഡ് (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is enabled on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "ഓർ‌ഗനൈസേഷൻ‌ ഉടമകളെയും രക്ഷാധികാരികളെയും ഈ നയം നടപ്പിലാക്കുന്നതിൽ‌ നിന്നും ഒഴിവാക്കിയിരിക്കുന്നു." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "ഫയൽ" }, "sendTypeText": { "message": "വാചകം" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "പുതിയ Send സൃഷ്‌ടിക്കുക", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send ഇല്ലാതാക്കുക", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "ഈ Send ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "ഇത് ഏത് തരം അയയ്ക്കലാണ്?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "ഇല്ലാതാക്കൽ തീയതി" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "പരമാവധി ആക്സസ് എണ്ണം" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "നിലവിലെ ആക്‌സസ്സ് എണ്ണം" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "അപ്രാപ്‌തമാക്കി" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "പാസ്‌വേഡ് നീക്കംചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "എല്ലാം Send-കൾ" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index aed10e3ad71..f334131b69b 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index aed10e3ad71..f334131b69b 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index a457deb1cb8..24285b8cb9f 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notater" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Dra for å sortere" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Rediger mappen" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Ny mappe" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Flytt valgte til organisasjon" - }, "deleteSelected": { "message": "Slett de valgte" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Valgte elementer flyttet til $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Gjenstandene ble flyttet til $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nei" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Logg på eller opprett en ny konto for å få tilgang til ditt sikre hvelv." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Passordhint" - }, - "enterEmailToGetHint": { - "message": "Skriv inn e-postadressen til kontoen din for å motta hintet til ditt hovedpassord." - }, "getMasterPasswordHint": { "message": "Få et hint om hovedpassordet" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Velg en organisasjon som du ønsker å flytte dette elementet til. Flytting til en organisasjon overfører eierskap til den aktuelle organisasjonen. Du vil ikke lenger være den direkte eieren av dette elementet når det er flyttet." }, - "moveManyToOrgDesc": { - "message": "Velg en organisasjon som du ønsker å flytte dette elementet til. Flytting til en organisasjon overfører eierskap til den aktuelle organisasjonen. Du vil ikke lenger være den direkte eieren av dette elementet når det er flyttet." - }, "collectionsDesc": { "message": "Rediger samlingene som dette elementet blir delt med. Kun organisasjonsbrukere med tilgang til disse samlingene vil kunne se dette elementet." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Du har valgt $COUNT$ element(er). $MOVEABLE_COUNT$ element(er) kan flyttes til en organisasjon, $NONMOVEABLE_COUNT$ kan ikke.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verifiseringskode (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Opphev tilgang" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Denne 2-trinnsleverandøren er aktivert på din konto." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisasjonens eiere og administratorer er unntatt fra denne policyens håndheving." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Lag ny Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Slett Send-en", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Er du sikker på at du vil slette denne Send-en?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Hvilken type Send er dette?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Dato for sletting" }, - "deletionDateDesc": { - "message": "Send-en vil bli permanent slettet på angitt dato og klokkeslett.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimal antall tilganger" }, - "maxAccessCountDesc": { - "message": "Hvis satt, vil ikke brukere lenger ha tilgang til denne Send-en når maksimalt antall aksesseringer er nådd.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Antall nåværende tilganger" - }, - "sendPasswordDesc": { - "message": "Valgfritt passordkrav for å få tilgang til denne Send-en.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notater om denne Send-en.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Deaktivert" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Er du sikker på at du vil fjerne passordet?" }, - "hideEmail": { - "message": "Skjul min e-postadresse fra mottakere." - }, - "disableThisSend": { - "message": "Deaktiver denne Send-en slik at ingen får tilgang til den.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alle Send-er" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Venter på sletting" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Utløpt" }, @@ -5415,13 +5441,6 @@ "message": "Ikke tillat brukere å skjule sin e-postadresse fra mottakere når de oppretter eller endrer en Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Følgende organisasjonspolicyer er for tiden i virkning:" - }, - "sendDisableHideEmailInEffect": { - "message": "Brukere kan ikke skjule sin e-postadresse fra mottakere når de oppretter eller endrer en Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modifisert policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Deaktiver personlig eierskap for organisasjonsbrukere" }, - "textHiddenByDefault": { - "message": "Når du åpner Send-en, er teksten skjult som standard", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Beskrivende navn for denne Send-en.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Teksten du ønsker å sende." - }, - "sendFileDesc": { - "message": "Filen du vil sende." - }, - "copySendLinkOnSave": { - "message": "Kopier lenken for å dele denne Send-en til utklippstavlen min ved lagring." - }, - "sendLinkLabel": { - "message": "Send lenke", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Det oppstod en feil ved lagring av slettingen og utløpsdatoene." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "For å verifisere din 2FA vennligst klikk knappen nedenfor." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Antall brukere" }, - "loggingInAs": { - "message": "Logger på som" - }, - "notYou": { - "message": "Ikke deg?" - }, "pickAnAvatarColor": { "message": "Velg en avatarfarge" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Be om administratorgodkjennelse" }, - "approveWithMasterPassword": { - "message": "Godkjenn med hovedpassord" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Forespørselen din har blitt sendt til administratoren din." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du vil bli varslet når det er godkjent." - }, "troubleLoggingIn": { "message": "Har du problemer med å logge inn?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Inkluder spesialtegn", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Legg til vedlegg" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 484164fdfad..8183efd5f9b 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "नोटहरू" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "क्रमबद्ध गर्न तान्नुहोस्" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "पाठ" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 4f69a15d49e..d193b2496f3 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notities" }, + "privateNote": { + "message": "Privénotitie" + }, "note": { "message": "Notitie" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Slepen om te sorteren" }, + "dragToReorder": { + "message": "Sleep om te herschikken" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Map bewerken" }, + "editWithName": { + "message": "$ITEM$: $NAME$ bewerken", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nieuwe map" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Selectie naar organisatie verplaatsen" - }, "deleteSelected": { "message": "Selectie verwijderen" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Geselecteerde items verplaatst naar $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items verplaatst naar $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nee" }, + "location": { + "message": "Locatie" + }, "loginOrCreateNewAccount": { "message": "Log in of maak een nieuw account aan om toegang te krijgen tot je beveiligde kluis." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "De verificatiesessie is verlopen. Start het inlogproces opnieuw op." }, - "verifyIdentity": { - "message": "Controleer je identiteit" + "verifyYourIdentity": { + "message": "Verifieer je identiteit" }, "weDontRecognizeThisDevice": { "message": "We herkennen dit apparaat niet. Voer de code in die naar je e-mail is verzonden om je identiteit te verifiëren." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Als je het e-mailadres van je account invult, versturen we je je wachtwoordhint" }, - "passwordHint": { - "message": "Wachtwoordhint" - }, - "enterEmailToGetHint": { - "message": "Voer het e-mailadres van je account in om je hoofdwachtwoordhint te ontvangen." - }, "getMasterPasswordHint": { "message": "Hoofdwachtwoordhint opvragen" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Kies een organisatie waarnaar je dit item wilt verplaatsen. Door het verplaatsen krijgt de organisatie de eigendomsrechten van het item. Je bent niet langer de directe eigenaar meer van het item als het is verplaatst." }, - "moveManyToOrgDesc": { - "message": "Kies een organisatie waarnaar je deze items wilt verplaatsen. Door het verplaatsen krijgt de organisatie de eigendomsrechten van deze items. Je bent niet langer de directe eigenaar meer van deze items als ze zijn verplaatst." - }, "collectionsDesc": { "message": "Wijzig de verzamelingen waarmee dit item gedeeld is. Alleen organisatiegebruikers met toegang tot deze verzamelingen kunnen dit item inzien." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Je hebt $COUNT$ item(s) geselecteerd. Je kunt $MOVEABLE_COUNT$ verplaatsen naar een organisatie, $NONMOVEABLE_COUNT$ niet.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verificatiecode (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Toegang intrekken" }, + "revoke": { + "message": "Intrekken" + }, "twoStepLoginProviderEnabled": { "message": "Deze tweestapsaanmeldingsaanbieder is geactiveerd voor je account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ is naar boven verplaatst, positie $INDEX$ van $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ is naar boven verplaatst, positie $INDEX$ van $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Bij het bijwerken van je encryptiesleutel konden we je mappen niet decoderen. Om door te gaan met de update, moeten je mappen worden verwijderd. Geen kluisitems worden verwijderd als je doorgaat." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Eigenaren en beheerders van de organisatie zijn vrijgesteld van de handhaving van dit beleid." }, + "limitSendViews": { + "message": "Weergaven limiteren" + }, + "limitSendViewsHint": { + "message": "Niemand kan deze Send weergeven als de limiet is bereikt.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ weergaven over", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send-details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Te delen tekst" + }, "sendTypeFile": { "message": "Bestand" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Voeg een optioneel wachtwoord toe voor ontvangers om toegang te krijgen tot deze Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nieuwe Send aanmaken", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send verwijderen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Weet je zeker dat je deze Send wilt verwijderen?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Wat voor soort Send is dit?", + "deleteSendPermanentConfirmation": { + "message": "Weet je zeker dat je deze Send permanent wil verwijderen?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Verwijderingsdatum" }, - "deletionDateDesc": { - "message": "Deze Send wordt definitief verwijderd op de aangegeven datum en tijd.", + "deletionDateDescV2": { + "message": "Op deze datum wordt de Send definitief verwijderd.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum toegangsaantal" }, - "maxAccessCountDesc": { - "message": "Als dit is ingesteld kunnen gebruikers deze Send niet meer benaderen zodra het maximale aantal toegang is bereikt.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Huidige toegangsaantal" - }, - "sendPasswordDesc": { - "message": "Vereis optioneel een wachtwoord voor gebruikers om toegang te krijgen tot deze Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privénotities over deze Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Uitgeschakeld" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Weet je zeker dat je dit wachtwoord wilt verwijderen?" }, - "hideEmail": { - "message": "Verberg mijn e-mailadres voor ontvangers." - }, - "disableThisSend": { - "message": "Schakel deze Send uit zodat niemand hem kan benaderen.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alle Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Wordt verwijderd" }, + "hideTextByDefault": { + "message": "Tekst standaard verbergen" + }, "expired": { "message": "Verlopen" }, @@ -5415,13 +5441,6 @@ "message": "Gebruikers mogen hun e-mailadres niet verbergen voor ontvangers bij het aanmaken of bewerken van een Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Het volgende organisatiebeleid is momenteel van toepassing:" - }, - "sendDisableHideEmailInEffect": { - "message": "Gebruikers mogen hun e-mailadres niet verbergen voor ontvangers bij het aanmaken of bewerken van een Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Bewerkt beleid $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Schakel persoonlijke eigendom uit voor organisatiegebruikers" }, - "textHiddenByDefault": { - "message": "Verberg de tekst standaard bij het gebruiken van de Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Een vriendelijke naam om deze Send te beschrijven.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "De tekst die je wilt versturen." - }, - "sendFileDesc": { - "message": "Het bestand dat je wilt versturen." - }, - "copySendLinkOnSave": { - "message": "Kopieer de link om deze Send te delen bij opslaan naar mijn klembord." - }, - "sendLinkLabel": { - "message": "Send-link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Er is een fout opgetreden bij het opslaan van je verwijder- en vervaldatum." }, + "hideYourEmail": { + "message": "Je e-mailadres voor ontvangers verbergen." + }, "webAuthnFallbackMsg": { "message": "Klik op onderstaande knop om je 2FA te verifiëren." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Aantal gebruikers" }, - "loggingInAs": { - "message": "Inloggen als" - }, - "notYou": { - "message": "Ben jij dit niet?" - }, "pickAnAvatarColor": { "message": "Kies een kleur voor je avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Goedkeuring van beheerder vragen" }, - "approveWithMasterPassword": { - "message": "Goedkeuren met hoofdwachtwoord" - }, "trustedDeviceEncryption": { "message": "Vertrouwde apparaat encryptie" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Je verzoek is naar je beheerder verstuurd." }, - "youWillBeNotifiedOnceApproved": { - "message": "Je krijgt een melding zodra je bent goedgekeurd." - }, "troubleLoggingIn": { "message": "Problemen met inloggen?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Apparaatbeheer voor Bitwarden configureren met behulp van de implementatiehandleiding voor jouw platform." }, + "deviceIdMissing": { + "message": "Apparaat-ID ontbreekt" + }, + "deviceTypeMissing": { + "message": "Apparaat-type ontbreekt" + }, + "deviceCreationDateMissing": { + "message": "Aanmaakdatum apparaat ontbreekt" + }, "desktopRequired": { "message": "Desktop vereist" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Lees meer over Bitwarden's API" }, + "fileSend": { + "message": "Bestand verzenden" + }, "fileSends": { "message": "Bestand-Sends" }, + "textSend": { + "message": "Tekst-Sends" + }, "textSends": { "message": "Tekst-Sends" }, @@ -10084,10 +10088,6 @@ "message": "Speciale tekens toevoegen", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Bijlage toevoegen" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organisatienaam mag niet langer zijn dan 50 tekens." }, + "sshKeyWrongPassword": { + "message": "Het door jou ingevoerde wachtwoord is onjuist." + }, + "importSshKey": { + "message": "Importeren" + }, + "confirmSshKeyPassword": { + "message": "Wachtwoord bevestigen" + }, + "enterSshKeyPasswordDesc": { + "message": "Voer het wachtwoord voor de SSH sleutel in." + }, + "enterSshKeyPassword": { + "message": "Wachtwoord invoeren" + }, + "invalidSshKey": { + "message": "De SSH-sleutel is ongeldig" + }, + "sshKeyTypeUnsupported": { + "message": "Het type SSH-sleutel is niet ondersteund" + }, + "importSshKeyFromClipboard": { + "message": "Sleutel van klembord importeren" + }, + "sshKeyImported": { + "message": "SSH-sleutel succesvol geïmporteerd" + }, + "copySSHPrivateKey": { + "message": "Privésleutel kopiëren" + }, "openingExtension": { "message": "Bitwarden-browserextensie openen" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Meer toegewezen dan beschikbare plaatsen." }, + "changeAtRiskPassword": { + "message": "Risicovol wachtwoord wijzigen" + }, "removeUnlockWithPinPolicyTitle": { "message": "Ontgrendelen met PIN verwijderen" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Deze events zijn voorbeelden en weerspiegelen geen echte evenementen binnen je Bitwarden-organisatie." + }, + "cannotCreateCollection": { + "message": "Gratis organisaties kunnen maximaal twee collecties hebben. Upgrade naar een betaald abonnement voor het toevoegen van meer collecties." } } diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 1694768fd79..23d4d3b3089 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notat" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Dra for å sortera" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Rediger mappe" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Flytt markerte til organisasjon" - }, "deleteSelected": { "message": "Slett markerte" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Dei valde oppføringane vart flytta til $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Passordvink" - }, - "enterEmailToGetHint": { - "message": "Skriv inn e-postadressa til kontoen din for å få vinket til hovudpassordet ditt." - }, "getMasterPasswordHint": { "message": "Få vink om hovudpassordet ditt" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index aed10e3ad71..f334131b69b 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index 3fdc4d1f281..9ef5c95bf86 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notatki" }, + "privateNote": { + "message": "Prywatna notatka" + }, "note": { "message": "Notatka" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Przeciągnij, aby posortować" }, + "dragToReorder": { + "message": "Przeciągnij, aby zmienić kolejność" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edytuj folder" }, + "editWithName": { + "message": "Edytuj $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nowy folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtr" }, - "moveSelectedToOrg": { - "message": "Przenieś zaznaczone do organizacji" - }, "deleteSelected": { "message": "Usuń zaznaczone" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Zaznaczone elementy zostały przeniesione do organizacji $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Elementy przeniesione do $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Lokalizacja" + }, "loginOrCreateNewAccount": { "message": "Zaloguj się lub utwórz nowe konto, aby uzyskać dostęp do Twojego bezpiecznego sejfu." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." }, - "verifyIdentity": { - "message": "Zweryfikuj swoją tożsamość" + "verifyYourIdentity": { + "message": "Potwierdź swoją tożsamość" }, "weDontRecognizeThisDevice": { "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Wprowadź adres e-mail swojego konta, a podpowiedź hasła zostanie wysłana do Ciebie" }, - "passwordHint": { - "message": "Podpowiedź do hasła" - }, - "enterEmailToGetHint": { - "message": "Wpisz adres e-mail powiązany z kontem, aby otrzymać podpowiedź do hasła głównego." - }, "getMasterPasswordHint": { "message": "Uzyskaj podpowiedź do hasła głównego" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Wybierz organizację, do której chcesz przenieść ten element. Ta czynność spowoduje utratę własności elementu i przenosi te uprawnienia do organizacji." }, - "moveManyToOrgDesc": { - "message": "Wybierz organizację, do której chcesz przenieść te elementy. Ta czynność spowoduje utratę własności elementów i przenosi te uprawnienia do organizacji." - }, "collectionsDesc": { "message": "Edytuj kolekcje zawierające ten element. Tylko użytkownicy organizacji posiadający dostęp do tych kolekcji będą mogli zobaczyć ten element." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Zaznaczone elementy: $COUNT$\nElementy możliwe do przeniesienia: $MOVEABLE_COUNT$\nElementy niemożliwe do przeniesienia: $NONMOVEABLE_COUNT$", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Kod weryfikacyjny (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Unieważnij dostęp" }, + "revoke": { + "message": "Unieważnij" + }, "twoStepLoginProviderEnabled": { "message": "Ten dostawca logowania dwustopniowego jest już włączony na koncie." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ przesunięto w górę, pozycja $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ przesunięto w dół, pozycja $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Podczas aktualizacji klucza szyfrowania, folderów nie można odszyfrować. Aby kontynuować aktualizację, foldery muszą zostać usunięte. Żadne elementy sejfu nie zostaną usunięte." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Właściciele i administratorzy organizacji są zwolnieni z przestrzegania wymagań zasad." }, + "limitSendViews": { + "message": "Limit wyświetleń" + }, + "limitSendViewsHint": { + "message": "Nikt nie może wyświetlić Wysyłki po przekroczeniu limitu.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Pozostało wyświetleń: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Szczegóły Wysyłki", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Tekst do udostępnienia" + }, "sendTypeFile": { "message": "Plik" }, "sendTypeText": { "message": "Tekst" }, + "sendPasswordDescV3": { + "message": "Zabezpiecz tę Wysyłkę hasłem, które będzie wymagane, aby uzyskać do niej dostęp.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nowa wysyłka", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Usuń wysyłkę", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Czy na pewno chcesz usunąć tę wysyłkę?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Jakiego typu jest to wysyłka?", + "deleteSendPermanentConfirmation": { + "message": "Czy na pewno chcesz trwale usunąć tę Wysyłkę?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data usunięcia" }, - "deletionDateDesc": { - "message": "Wysyłka zostanie trwale usunięta w określonym czasie.", + "deletionDateDescV2": { + "message": "Wysyłka zostanie trwale usunięte w tej dacie.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksymalna liczba dostępów" }, - "maxAccessCountDesc": { - "message": "Jeśli funkcja jest włączona, po osiągnięciu maksymalnej liczby dostępów, użytkownicy nie będą mieli dostępu do tej wysyłki.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Obecna liczba dostępów" - }, - "sendPasswordDesc": { - "message": "Opcjonalne hasło dla użytkownika, aby uzyskać dostęp do wysyłki.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Prywatne notatki o tej wysyłce.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Wyłączone" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Czy na pewno chcesz usunąć hasło?" }, - "hideEmail": { - "message": "Ukryj mój adres e-mail przed odbiorcami." - }, - "disableThisSend": { - "message": "Wyłącz wysyłkę, aby nikt nie miał do niej dostępu.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Wszystkie wysyłki" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Oczekiwanie na usunięcie" }, + "hideTextByDefault": { + "message": "Domyślnie ukryj tekst" + }, "expired": { "message": "Wygasła" }, @@ -5415,13 +5441,6 @@ "message": "Nie zezwalaj użytkownikom na ukrywanie ich adresów e-mail przed odbiorcami, podczas tworzenia lub edytowania wysyłek.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Obecnie obowiązujące zasady organizacji:" - }, - "sendDisableHideEmailInEffect": { - "message": "Użytkownicy nie mogą ukrywać swoich adresów e-mail przed odbiorcami, podczas tworzenia lub edytowania wysyłek.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Zasada $ID$ została zaktualizowana.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Wyłącz opcję własności osobistej dla użytkowników organizacji" }, - "textHiddenByDefault": { - "message": "Ukryj domyślnie tekst wysyłki", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Nazwa wysyłki.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Tekst, który chcesz wysłać." - }, - "sendFileDesc": { - "message": "Plik, który chcesz wysłać." - }, - "copySendLinkOnSave": { - "message": "Po zapisaniu wysyłki, skopiuj link do schowka." - }, - "sendLinkLabel": { - "message": "Link wysyłki", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Wyślij", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Wystąpił błąd podczas zapisywania dat usunięcia i wygaśnięcia." }, + "hideYourEmail": { + "message": "Ukryj mój adres e-mail przed oglądającymi." + }, "webAuthnFallbackMsg": { "message": "Aby zweryfikować logowanie dwustopniowe, kliknij przycisk poniżej." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Liczba użytkowników" }, - "loggingInAs": { - "message": "Logowanie jako" - }, - "notYou": { - "message": "To nie Ty?" - }, "pickAnAvatarColor": { "message": "Wybierz kolor awatara" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Poproś administratora o zatwierdzenie" }, - "approveWithMasterPassword": { - "message": "Zatwierdź przy użyciu hasła głównego" - }, "trustedDeviceEncryption": { "message": "Szyfrowanie zaufanego urządzenia" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Twoja prośba została wysłana do Twojego administratora." }, - "youWillBeNotifiedOnceApproved": { - "message": "Zostaniesz powiadomiony po zatwierdzeniu." - }, "troubleLoggingIn": { "message": "Problem z zalogowaniem?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Skonfiguruj zarządzanie urządzeniem Bitwarden za pomocą instrukcji implementacyjnych dla Twojej platformy." }, + "deviceIdMissing": { + "message": "Brakuje identyfikatora urządzenia" + }, + "deviceTypeMissing": { + "message": "Brak typu urządzenia" + }, + "deviceCreationDateMissing": { + "message": "Brak daty utworzenia urządzenia" + }, "desktopRequired": { "message": "Wymagany komputer" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Dowiedz się więcej o API Bitwarden" }, + "fileSend": { + "message": "Wysyłka pliku" + }, "fileSends": { "message": "Wysyłki plików" }, + "textSend": { + "message": "Wysyłka tekstu" + }, "textSends": { "message": "Wysyłki tekstów" }, @@ -10084,10 +10088,6 @@ "message": "Dołącz znaki specjalne", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Dodaj załącznik" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Nazwa organizacji nie może przekraczać 50 znaków." }, + "sshKeyWrongPassword": { + "message": "Wprowadzone hasło jest nieprawidłowe." + }, + "importSshKey": { + "message": "Importuj" + }, + "confirmSshKeyPassword": { + "message": "Potwierdź hasło" + }, + "enterSshKeyPasswordDesc": { + "message": "Wprowadź hasło dla klucza SSH." + }, + "enterSshKeyPassword": { + "message": "Wprowadź hasło" + }, + "invalidSshKey": { + "message": "Klucz SSH jest nieprawidłowy" + }, + "sshKeyTypeUnsupported": { + "message": "Typ klucza SSH nie jest obsługiwany" + }, + "importSshKeyFromClipboard": { + "message": "Importuj klucz ze schowka" + }, + "sshKeyImported": { + "message": "Klucz SSH zaimportowano pomyślnie" + }, + "copySSHPrivateKey": { + "message": "Skopiuj klucz prywatny" + }, "openingExtension": { "message": "Otwieranie rozszerzenia przeglądarki Bitwarden" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Przydzielone miejsca przekraczają dostępne miejsca." }, + "changeAtRiskPassword": { + "message": "Zmień hasło zagrożone" + }, "removeUnlockWithPinPolicyTitle": { "message": "Usuń odblokowanie kodem PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Te wydarzenia są tylko przykładami i nie odzwierciedlają rzeczywistych wydarzeń w Twojej organizacji Bitwarden." + }, + "cannotCreateCollection": { + "message": "Darmowe organizacje mogą posiadać maksymalnie 2 kolekcje. Aby dodać więcej kolekcji, przejdź na plan płatny." } } diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 2bc5ac479fa..ea43fd4eae6 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Arrastar para ordenar" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Texto" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Editar Pasta" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtro" }, - "moveSelectedToOrg": { - "message": "Mover Selecionados para a Organização" - }, "deleteSelected": { "message": "Excluir Selecionados" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Itens selecionados movidos para $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Itens movidos para $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Inicie a sessão ou crie uma nova conta para acessar seu cofre seguro." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de “login”." }, - "verifyIdentity": { - "message": "Verifique sua identidade" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Digite o endereço de e-mail da sua conta e sua dica da senha será enviada para você" }, - "passwordHint": { - "message": "Dica da senha" - }, - "enterEmailToGetHint": { - "message": "Insira o seu endereço de e-mail para receber a dica da sua senha mestra." - }, "getMasterPasswordHint": { "message": "Obter dica da senha mestra" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Escolha uma organização para a qual deseja mover este item. Mudar para uma organização transfere a propriedade do item para essa organização. Você não será mais o proprietário direto deste item depois que ele for movido." }, - "moveManyToOrgDesc": { - "message": "Escolha uma organização para a qual deseja mover esses itens. Mudar para uma organização transfere a propriedade dos itens para essa organização. Você não será mais o proprietário direto desses itens depois que eles forem movidos." - }, "collectionsDesc": { "message": "Edite as coleções com as quais este item está sendo compartilhado. Somente usuários da organização com acesso a estas coleções poderão ver esse item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Você selecionou $COUNT$ item(ns). $MOVEABLE_COUNT$ item(ns) podem ser movidos para uma organização, mas, $NONMOVEABLE_COUNT$ não pode.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Código de verificação (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revogar acesso" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Este provedor de login em duas etapas está ativado em sua conta." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Ao atualizar sua chave de criptografia, suas pastas não puderam ser descriptografadas. Para continuar com a atualização, suas pastas devem ser excluídas. Nenhum item de cofre será excluído se você prosseguir." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Os Proprietários e Administradores da Organização estão isentos da aplicação desta política." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Arquivo" }, "sendTypeText": { "message": "Texto" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Criar Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Excluir Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Você tem certeza que deseja excluir este Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Que tipo de Send é este?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data de Exclusão" }, - "deletionDateDesc": { - "message": "O Send será eliminado permanentemente na data e hora especificadas.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Contagem Máxima de Acessos" }, - "maxAccessCountDesc": { - "message": "Se atribuído, usuários não poderão mais acessar este Send assim que o número máximo de acessos for atingido.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Contagem Atual de Acessos" - }, - "sendPasswordDesc": { - "message": "Opcionalmente exigir uma senha para os usuários acessarem este Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Notas privadas sobre esse Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Desativado" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Você tem certeza que deseja remover a senha?" }, - "hideEmail": { - "message": "Ocultar meu endereço de e-mail dos destinatários." - }, - "disableThisSend": { - "message": "Desabilite este Send para que ninguém possa acessá-lo.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Todos os Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Exclusão pendente" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expirado" }, @@ -5415,13 +5441,6 @@ "message": "Não permitir que os usuários ocultem seus endereços de e-mail dos destinatários ao criar ou editar um Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "As seguintes políticas da organização estão em vigor atualmente:" - }, - "sendDisableHideEmailInEffect": { - "message": "Os usuários não têm permissão para ocultar seus endereços de e-mail dos destinatários ao criar ou editar um Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Política modificada $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Desativar propriedade pessoal para usuários da organização" }, - "textHiddenByDefault": { - "message": "Ao acessar o Send, ocultar o texto por padrão", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Um nome amigável para descrever este Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "O texto que você deseja enviar." - }, - "sendFileDesc": { - "message": "O arquivo que você deseja enviar." - }, - "copySendLinkOnSave": { - "message": "Copie o link para compartilhar este Send para minha área de transferência depois de salvar." - }, - "sendLinkLabel": { - "message": "Link do Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Ocorreu um erro ao salvar as suas datas de exclusão e validade." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Para verificar seu 2FA, por favor, clique no botão abaixo." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Número de usuários" }, - "loggingInAs": { - "message": "Entrando como" - }, - "notYou": { - "message": "Não é você?" - }, "pickAnAvatarColor": { "message": "Escolha uma cor de avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Solicitar aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com a senha mestre" - }, "trustedDeviceEncryption": { "message": "Criptografia de dispositivo confiável" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Seu pedido foi enviado para seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado assim que for aprovado." - }, "troubleLoggingIn": { "message": "Problemas em efetuar login?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure o gerenciamento de dispositivos para o Bitwarden usando o guia de implementação da sua plataforma." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Saiba mais sobre a API do Bitwarden" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "Arquivos enviados" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Texto enviado" }, @@ -10084,10 +10088,6 @@ "message": "Incluir caracteres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Adicionar anexo" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 543729c956c..9bbda05c93f 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notas" }, + "privateNote": { + "message": "Nota privada" + }, "note": { "message": "Nota" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Arraste para ordenar" }, + "dragToReorder": { + "message": "Arraste para reordenar" + }, "cfTypeText": { "message": "Texto" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Editar pasta" }, + "editWithName": { + "message": "Editar $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nova pasta" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtrar" }, - "moveSelectedToOrg": { - "message": "Mover selecionados para a organização" - }, "deleteSelected": { "message": "Eliminar selecionados" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Itens selecionados movidos para $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Itens movidos para $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Não" }, + "location": { + "message": "Localização" + }, "loginOrCreateNewAccount": { "message": "Inicie sessão ou crie uma nova conta para aceder ao seu cofre seguro." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Por favor, reinicie o processo de início de sessão." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verifique a sua identidade" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Introduza o endereço de e-mail da sua conta e ser-lhe-á enviada a sua dica da palavra-passe" }, - "passwordHint": { - "message": "Dica da palavra-passe" - }, - "enterEmailToGetHint": { - "message": "Introduza o endereço de e-mail da sua conta para receber a dica da sua palavra-passe mestra." - }, "getMasterPasswordHint": { "message": "Obter a dica da palavra-passe mestra" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Escolha uma organização para a qual pretende mover este item. Mover para uma organização transfere a propriedade do item para essa organização. Deixará de ser o proprietário direto deste item depois de este ter sido movido." }, - "moveManyToOrgDesc": { - "message": "Escolha uma organização para a qual pretende mover estes itens. Mover para uma organização transfere a propriedade dos itens para essa organização. Deixará de ser o proprietário direto destes itens depois de terem sido movidos." - }, "collectionsDesc": { "message": "Edite as coleções com as quais este item está a ser partilhado. Apenas os utilizadores da organização com acesso a estas coleções poderão ver este item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Selecionou $COUNT$ item(ns). $MOVEABLE_COUNT$ item(ns) podem ser movidos para uma organização, $NONMOVEABLE_COUNT$ não podem.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Código de verificação (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revogar o acesso" }, + "revoke": { + "message": "Revogar" + }, "twoStepLoginProviderEnabled": { "message": "Este fornecedor de verificação de dois passos está ativado na sua conta." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ movido para cima, posição $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ movido para baixo, posição $INDEX$ de $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Ao atualizar a sua chave de encriptação, as suas pastas não puderam ser desencriptadas. Para continuar com a atualização, as suas pastas têm de ser eliminadas. Nenhum item do cofre será eliminado se prosseguir." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Os proprietários e administradores da organização estão isentos da aplicação desta política." }, + "limitSendViews": { + "message": "Limitar visualizações" + }, + "limitSendViewsHint": { + "message": "Ninguém poderá ver este Send depois de o limite ser atingido.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ visualizações restantes", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Detalhes do Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Texto a partilhar" + }, "sendTypeFile": { "message": "Ficheiro" }, "sendTypeText": { "message": "Texto" }, + "sendPasswordDescV3": { + "message": "Adicione uma palavra-passe opcional para os destinatários acederem a este Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Eliminar Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Tem a certeza de que pretende eliminar este Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Que tipo de Send é este?", + "deleteSendPermanentConfirmation": { + "message": "Tem a certeza de que pretende eliminar permanentemente este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data de eliminação" }, - "deletionDateDesc": { - "message": "O Send será permanentemente eliminado na data e hora especificadas.", + "deletionDateDescV2": { + "message": "O Send será permanentemente eliminado nesta data.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Número máximo de acessos" }, - "maxAccessCountDesc": { - "message": "Se definido, os utilizadores deixarão de poder aceder a este Send quando a contagem máxima de acessos for atingida.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Número de acessos atual" - }, - "sendPasswordDesc": { - "message": "Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Notas privadas sobre este Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Desativado" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Tem a certeza de que pretende remover a palavra-passe?" }, - "hideEmail": { - "message": "Ocultar o meu endereço de e-mail dos destinatários." - }, - "disableThisSend": { - "message": "Desative este Send para que ninguém possa aceder ao mesmo.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Todos os Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Eliminação pendente" }, + "hideTextByDefault": { + "message": "Ocultar texto por predefinição" + }, "expired": { "message": "Expirado" }, @@ -5415,13 +5441,6 @@ "message": "Mostrar sempre o endereço de e-mail do membro com os destinatários ao criar ou editar um Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "As seguintes políticas da organização estão atualmente em vigor:" - }, - "sendDisableHideEmailInEffect": { - "message": "Os utilizadores não estão autorizados a ocultar o seu endereço de e-mail dos destinatários quando criam ou editam um Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Política $ID$ modificada.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remover a propriedade individual dos utilizadores da organização" }, - "textHiddenByDefault": { - "message": "Ao aceder ao Send, ocultar o texto por defeito", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Um nome simpático para descrever este Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "O texto que deseja enviar." - }, - "sendFileDesc": { - "message": "O ficheiro que deseja enviar." - }, - "copySendLinkOnSave": { - "message": "Copiar o link para partilhar este Send para a minha área de transferência ao guardar." - }, - "sendLinkLabel": { - "message": "Link do Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Ocorreu um erro ao guardar as suas datas de eliminação e validade." }, + "hideYourEmail": { + "message": "Oculte o seu endereço de e-mail dos visualizadores." + }, "webAuthnFallbackMsg": { "message": "Para verificar a sua 2FA, por favor, clique no botão abaixo." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Número de utilizadores" }, - "loggingInAs": { - "message": "A iniciar sessão como" - }, - "notYou": { - "message": "Utilizador incorreto?" - }, "pickAnAvatarColor": { "message": "Escolha uma cor para o avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Pedir aprovação do administrador" }, - "approveWithMasterPassword": { - "message": "Aprovar com a palavra-passe mestra" - }, "trustedDeviceEncryption": { "message": "Encriptação de dispositivo de confiança" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "O seu pedido foi enviado ao seu administrador." }, - "youWillBeNotifiedOnceApproved": { - "message": "Será notificado quando for aprovado." - }, "troubleLoggingIn": { "message": "Problemas a iniciar sessão?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure a gestão de dispositivos do Bitwarden utilizando o guia de implementação da sua plataforma." }, + "deviceIdMissing": { + "message": "ID do dispositivo em falta" + }, + "deviceTypeMissing": { + "message": "Tipo de dispositivo em falta" + }, + "deviceCreationDateMissing": { + "message": "Data de criação do dispositivo em falta" + }, "desktopRequired": { "message": "É necessário um computador" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Saiba mais sobre a API do Bitwarden" }, + "fileSend": { + "message": "Send de ficheiro" + }, "fileSends": { "message": "Sends de ficheiros" }, + "textSend": { + "message": "Send de texto" + }, "textSends": { "message": "Sends de texto" }, @@ -10084,10 +10088,6 @@ "message": "Incluir carateres especiais", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Adicionar anexo" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "O nome da organização não pode exceder 50 carateres." }, + "sshKeyWrongPassword": { + "message": "A palavra-passe que introduziu está incorreta." + }, + "importSshKey": { + "message": "Importar" + }, + "confirmSshKeyPassword": { + "message": "Confirmar palavra-passe" + }, + "enterSshKeyPasswordDesc": { + "message": "Introduza a palavra-passe para a chave SSH." + }, + "enterSshKeyPassword": { + "message": "Introduzir palavra-passe" + }, + "invalidSshKey": { + "message": "A chave SSH é inválida" + }, + "sshKeyTypeUnsupported": { + "message": "O tipo de chave SSH não é suportado" + }, + "importSshKeyFromClipboard": { + "message": "Importar chave da área de transferência" + }, + "sshKeyImported": { + "message": "Chave SSH importada com sucesso" + }, + "copySSHPrivateKey": { + "message": "Copiar chave privada" + }, "openingExtension": { "message": "A abrir a extensão de navegador Bitwarden" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Os lugares atribuídos excedem os lugares disponíveis." }, + "changeAtRiskPassword": { + "message": "Alterar palavra-passe em risco" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remover o desbloqueio com PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "Estes eventos são apenas exemplos e não refletem eventos reais na sua organização Bitwarden." + }, + "cannotCreateCollection": { + "message": "As organizações gratuitas podem ter até 2 coleções. Atualize para um plano pago para adicionar mais coleções." } } diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index bf23ee549e8..c57ad26d251 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Note" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Tragere pentru sortare" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Editare dosar" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Mutați cele selectate în organizație" - }, "deleteSelected": { "message": "Ștergere selecție" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Articolele selectate au fost mutate în $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nu" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Autentificați-vă sau creați un cont nou pentru a accesa seiful dvs. securizat." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Indiciu parolă" - }, - "enterEmailToGetHint": { - "message": "Adresa de e-mail a contului pentru primirea indiciului parolei principale." - }, "getMasterPasswordHint": { "message": "Obținere indiciu parolă principală" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Alegeți o organizație la care doriți să mutați acest articol. Mutarea într-o organizație, transferă proprietatea asupra articolului către organizația respectivă. Nu veți mai fi proprietarul direct al acestui articol odată ce a fost mutat." }, - "moveManyToOrgDesc": { - "message": "Alegeți o organizație la care doriți să mutați aceste articole. Mutarea într-o organizație, transferă proprietatea asupra articolelor către organizația respectivă. Nu veți mai fi proprietarul direct al acestor articole odată ce au fost mutate." - }, "collectionsDesc": { "message": "Editați colecțiile cu care este partajat acest articol. Numai utilizatorii organizației cu acces la aceste colecții vor putea vedea acest articol." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Ați selectat $COUNT$ articol(e). $MOVEABLE_COUNT$ articol(e) poate/pot fi mutat(e) într-o organizație, $NONMOVEABLE_COUNT$ nu.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Cod de verificare (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revocare acces" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Acest furnizor de autentificare în două etape este activ în contul dvs." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Proprietarii și administratorii de organizații sunt exceptați de la aplicarea acestei politici." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fișier" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nou Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Ștergere Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Sigur doriți să ștergeți acest Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Ce fel de Send este acesta?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Data ștergerii" }, - "deletionDateDesc": { - "message": "Send-ul va fi șters definitiv la data și ora specificate.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Numărul maxim de accesări" }, - "maxAccessCountDesc": { - "message": "Dacă este configurat, utilizatorii nu vor mai putea accesa acest Send când a fost atins numărul maxim de accesări.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Numărul actual de accesări" - }, - "sendPasswordDesc": { - "message": "Opțional, este necesară o parolă pentru ca utilizatorii să acceseze acest Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Note private despre acest Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Dezactivat" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Sigur doriți să eliminați parola?" }, - "hideEmail": { - "message": "Ascundeți adresa mea de e-mail de la destinatari." - }, - "disableThisSend": { - "message": "Dezactivare Send pentru ca nimeni să nu-l poată accesa.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Toate Send-urile" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Ștergere în așteptare" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expirat" }, @@ -5415,13 +5441,6 @@ "message": "Afișați întotdeauna adresa de e-mail a membrului împreună cu destinatarii atunci când creați sau editați un Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "În prezent, sunt în vigoare următoarele politici de organizare:" - }, - "sendDisableHideEmailInEffect": { - "message": "Utilizatorii nu au voie să-și ascundă adresa de e-mail de la destinatari atunci când creează sau editează un Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Politica $ID$ a fost editată.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Eliminați proprietatea individuală pentru utilizatorii organizației" }, - "textHiddenByDefault": { - "message": "Când Send-ul este accesat, ascundeți textul în mod implicit", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Un nume prietenos pentru a descrie acest Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Textul pe care doriți să-l trimiteți." - }, - "sendFileDesc": { - "message": "Fișierul pe care doriți să-l trimiteți." - }, - "copySendLinkOnSave": { - "message": "Copiați linkul pentru a partaja acest Send în clipboard-ul meu la salvare." - }, - "sendLinkLabel": { - "message": "Link Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "A survenit o eroare la salvarea datelor de ștergere și de expirare." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Pentru a verifica 2FA, vă rugăm să faceți clic pe butonul de mai jos." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Număr de utilizatori" }, - "loggingInAs": { - "message": "Autentificare ca" - }, - "notYou": { - "message": "Nu sunteți dvs.?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index fb1e5b1a09d..a31d13d227e 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -159,10 +159,10 @@ "message": "Всего приложений" }, "unmarkAsCriticalApp": { - "message": "Снять пометку критического приложения" + "message": "Снять отметку критического приложения" }, "criticalApplicationSuccessfullyUnmarked": { - "message": "Критическое приложение успешно снято" + "message": "Отметка критического приложения успешно снята" }, "whatTypeOfItem": { "message": "Выберите тип элемента" @@ -201,6 +201,9 @@ "notes": { "message": "Заметки" }, + "privateNote": { + "message": "Приватная заметка" + }, "note": { "message": "Заметка" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Перетащите для сортировки" }, + "dragToReorder": { + "message": "Перетащите для изменения порядка" + }, "cfTypeText": { "message": "Текстовое" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Изменить папку" }, + "editWithName": { + "message": "Изменить $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Новая папка" }, @@ -860,9 +879,6 @@ "filter": { "message": "Фильтр" }, - "moveSelectedToOrg": { - "message": "Переместить выбранное в организацию" - }, "deleteSelected": { "message": "Удалить выбранное" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Выбранные элементы перемещены в $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Элементы перемещены в $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Нет" }, + "location": { + "message": "Местоположение" + }, "loginOrCreateNewAccount": { "message": "Войдите или создайте новый аккаунт для доступа к вашему защищенному хранилищу." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Сеанс аутентификации завершился по времени. Пожалуйста, попробуйте войти еще раз." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Подтвердите вашу личность" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введите email вашего аккаунта, и вам будет отправлена подсказка для пароля" }, - "passwordHint": { - "message": "Подсказка к паролю" - }, - "enterEmailToGetHint": { - "message": "Введите email учетной записи для получения подсказки к мастер-паролю." - }, "getMasterPasswordHint": { "message": "Получить подсказку к мастер-паролю" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Выберите организацию, в которую вы хотите переместить этот элемент. При перемещении в организацию право собственности на элемент переходит к этой организации. Вы больше не будете прямым владельцем этого элемента после его перемещения." }, - "moveManyToOrgDesc": { - "message": "Выберите организацию, в которую вы хотите переместить эти элементы. При перемещении в организацию право собственности на элементы переходит к этой организации. Вы больше не будете прямым владельцем этих элементов после их перемещения." - }, "collectionsDesc": { "message": "Отредактируйте коллекции, с которыми совместно используется этот элемент. Данный элемент смогут видеть только пользователи организации, имеющие доступ к этим коллекциям." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Вы выбрали $COUNT$ элемента(-ов). $MOVEABLE_COUNT$ элемента(-ов) могут быть перемещены в организацию, $NONMOVEABLE_COUNT$ не могут.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Код подтверждения (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Отозвать доступ" }, + "revoke": { + "message": "Отозвать" + }, "twoStepLoginProviderEnabled": { "message": "Этот провайдер двухэтапной аутентификации включен для вашего аккаунта." }, @@ -3917,7 +3904,7 @@ "message": "Устройство" }, "loginStatus": { - "message": "Статус входа" + "message": "Статус авторизации" }, "firstLogin": { "message": "Первый вход" @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ перемещено вверх, позиция $INDEX$ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ перемещено вниз, позиция $INDEX$ $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "При обновлении ключа шифрования не удалось расшифровать папки. Чтобы продолжить обновление, папки необходимо удалить. При продолжении обновления элементы хранилища удалены не будут." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Владельцы и администраторы организаций освобождены от применения этой политики." }, + "limitSendViews": { + "message": "Лимит просмотров" + }, + "limitSendViewsHint": { + "message": "Никто не сможет просмотреть эту Send после лимита просмотров.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Осталось просмотров: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Информация о Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Текст для отправки" + }, "sendTypeFile": { "message": "Файл" }, "sendTypeText": { "message": "Текст" }, + "sendPasswordDescV3": { + "message": "Добавьте опциональный пароль для доступа получателей к этой Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Новая Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Удалить Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Вы действительно хотите удалить эту Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Какой это тип Send?", + "deleteSendPermanentConfirmation": { + "message": "Вы уверены, что хотите безвозвратно удалить эту Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Дата удаления" }, - "deletionDateDesc": { - "message": "Эта Send будет окончательно удалена в указанные дату и время.", + "deletionDateDescV2": { + "message": "С этой даты Send будет удалена навсегда.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Максимум обращений" }, - "maxAccessCountDesc": { - "message": "Если задано, пользователи больше не смогут получить доступ к этой Send, как только будет достигнуто максимальное количество обращений.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Текущих обращений" - }, - "sendPasswordDesc": { - "message": "По возможности запрашивать у пользователей пароль для доступа к этой Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Личные заметки об этой Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Отключено" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Вы уверены, что хотите удалить пароль?" }, - "hideEmail": { - "message": "Скрыть мой адрес email от получателей." - }, - "disableThisSend": { - "message": "Деактивировать эту Send, чтобы никто не мог получить к ней доступ.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Все Send’ы" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Ожидание удаления" }, + "hideTextByDefault": { + "message": "Скрыть текст по умолчанию" + }, "expired": { "message": "Срок истек" }, @@ -5415,13 +5441,6 @@ "message": "Всегда показывать email пользователя получателям при создании или редактировании Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "На данный момент действуют следующие политики организации:" - }, - "sendDisableHideEmailInEffect": { - "message": "Пользователям не разрешается скрывать свой адрес email от получателей при создании или редактировании Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Изменена политика $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Отключить личное владение для пользователей организации" }, - "textHiddenByDefault": { - "message": "При доступе к Send скрывать текст по умолчанию", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Понятное имя для описания этой Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Текст, который отправится вместе с Send." - }, - "sendFileDesc": { - "message": "Файл, который отправится вместе с Send." - }, - "copySendLinkOnSave": { - "message": "Скопировать ссылку в буфер обмена после сохранения, чтобы поделиться этой Send." - }, - "sendLinkLabel": { - "message": "Ссылка на Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Произошла ошибка при сохранении данных о сроках удаления и истечения." }, + "hideYourEmail": { + "message": "Скрыть ваш email от просматривающих." + }, "webAuthnFallbackMsg": { "message": "Для подтверждения 2ЭА нажмите кнопку ниже." }, @@ -7249,7 +7250,7 @@ "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Для вашего аккаунта требуется двухэтапная аутентификация Duo. Выполните следующие действия, чтобы завершить авторизацию." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Следуйте указаниям ниже, чтобы завершить авторизацию." @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Количество пользователей" }, - "loggingInAs": { - "message": "Войти как" - }, - "notYou": { - "message": "Не вы?" - }, "pickAnAvatarColor": { "message": "Выбрать цвет аватара" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Запросить одобрение администратора" }, - "approveWithMasterPassword": { - "message": "Одобрить с мастер-паролем" - }, "trustedDeviceEncryption": { "message": "Шифрование доверенного устройства" }, @@ -8414,7 +8406,7 @@ "message": "Доверенные устройства" }, "memberDecryptionOptionTdeDescPart1": { - "message": "Пользователям не понадобится мастер-пароль при входе в систему с SSO. Мастер-пароль заменяется ключом шифрования, хранящимся на устройстве, который делает его надёжным. Первое устройство, в которое участник создаёт свой аккаунт и входит в первый раз, будет доверенным. Новые устройства должны быть утверждены существующим доверенным устройством или администратором.", + "message": "Пользователям не нужен мастер-пароль при авторизации с помощью SSO. Мастер-пароль будет заменен ключом шифрования, хранящимся на устройстве, что сделает это устройство доверенным. Первое устройство, на котором участник создает аккаунт и авторизуется, будет доверенным. Новые устройства должны быть одобрены существующим доверенным устройством или администратором.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink1": { @@ -8434,11 +8426,11 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescLink3": { - "message": "account recovery administration", + "message": "политика администрирования восстановления аккаунтов", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "memberDecryptionOptionTdeDescPart4": { - "message": "policy will turn on when this option is used.", + "message": "будет включена при использовании этой опции.", "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Members will not need a master password when logging in with SSO. Master password is replaced with an encryption key stored on the device, making that device trusted. The first device a member creates their account and logs into will be trusted. New devices will need to be approved by an existing trusted device or by an administrator. The single organization policy, SSO required policy, and account recovery administration policy will turn on when this option is used.'" }, "orgPermissionsUpdatedMustSetPassword": { @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запрос был отправлен администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Вас уведомят об одобрении." - }, "troubleLoggingIn": { "message": "Не удалось войти?" }, @@ -8738,7 +8727,7 @@ "message": "Ограничить удаление коллекций владельцам и администраторам" }, "limitItemDeletionDesc": { - "message": "Ограничить удаление элементов для пользователей с разрешением «Может управлять»" + "message": "Ограничить удаление элементов для пользователей с разрешением 'Может управлять'" }, "allowAdminAccessToAllCollectionItemsDesc": { "message": "Владельцы и администраторы могут управлять всеми коллекциями и элементами" @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Настройте управление устройствами для Bitwarden, используя руководство по внедрению для вашей платформы." }, + "deviceIdMissing": { + "message": "ID устройства отсутствует" + }, + "deviceTypeMissing": { + "message": "Тип устройства отсутствует" + }, + "deviceCreationDateMissing": { + "message": "Дата создания устройства отсутствует" + }, "desktopRequired": { "message": "Требуется компьютер" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Узнайте больше об API Bitwarden" }, + "fileSend": { + "message": "Файловая Send" + }, "fileSends": { "message": "Файловая Send" }, + "textSend": { + "message": "Текстовая Send" + }, "textSends": { "message": "Текстовая Send" }, @@ -10084,10 +10088,6 @@ "message": "Включить специальные символы", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Добавить вложение" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Название организации не может превышать 50 символов." }, + "sshKeyWrongPassword": { + "message": "Введенный пароль неверен." + }, + "importSshKey": { + "message": "Импорт" + }, + "confirmSshKeyPassword": { + "message": "Подтвердите пароль" + }, + "enterSshKeyPasswordDesc": { + "message": "Введите пароль для ключа SSH." + }, + "enterSshKeyPassword": { + "message": "Введите пароль" + }, + "invalidSshKey": { + "message": "Ключ SSH недействителен" + }, + "sshKeyTypeUnsupported": { + "message": "Тип ключа SSH не поддерживается" + }, + "importSshKeyFromClipboard": { + "message": "Импорт ключа из буфера обмена" + }, + "sshKeyImported": { + "message": "Ключ SSH успешно импортирован" + }, + "copySSHPrivateKey": { + "message": "Скопировать приватный ключ" + }, "openingExtension": { "message": "Открытие расширения для браузера Bitwarden" }, @@ -10439,7 +10469,7 @@ } }, "accountDeprovisioningNotification": { - "message": "Администраторы теперь могут удалять аккаунты пользователей, принадлежащие заявленному домену." + "message": "Администраторы теперь могут удалять аккаунты пользователей, принадлежащие зарегистрированному домену." }, "deleteManagedUserWarningDesc": { "message": "Это действие удалит аккаунт пользователя, включая все элементы в его хранилище. Это действие заменяет предыдущее действие Удалить." @@ -10470,7 +10500,7 @@ "message": "Нет организаций для отображения" }, "yourProviderSubscriptionCredit": { - "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + "message": "Ваш провайдер получит кредит на любое время, оставшееся в подписке организации." }, "doYouWantToAddThisOrg": { "message": "Вы хотите добавить эту организацию в $PROVIDER$?", @@ -10485,7 +10515,10 @@ "message": "Добавлена ​​существующая организация" }, "assignedExceedsAvailable": { - "message": "Assigned seats exceed available seats." + "message": "Количество назначенных мест превышает количество доступных." + }, + "changeAtRiskPassword": { + "message": "Изменить пароль, подверженный риску" }, "removeUnlockWithPinPolicyTitle": { "message": "Отключить разблокировку PIN-кодом" @@ -10494,7 +10527,7 @@ "message": "Не разрешать пользователям разблокировать свои аккаунты с помощью PIN-кода." }, "limitedEventLogs": { - "message": "Планы $PRODUCT_TYPE$ не имеют доступа к реальным журналам событий", + "message": "Планы $PRODUCT_TYPE$ не имеют доступа к журналам текущих событий", "placeholders": { "product_type": { "content": "$1", @@ -10506,9 +10539,12 @@ "message": "Получите полный доступ к журналам событий организации, перейдя на план Teams или Enterprise." }, "upgradeEventLogTitle": { - "message": "Upgrade for real event log data" + "message": "Переудите на более высокий тариф для просмотра журнала реальных событий" }, "upgradeEventLogMessage": { - "message": "Эти события являются лишь примерами и не отражают реальных событий в вашей организации Bitwarden." + "message": "Эти события являются лишь примерами и не отражают текущих событий вашей организации Bitwarden." + }, + "cannotCreateCollection": { + "message": "В бесплатных организациях может быть до 2 коллекций. Перейдите на платный план, чтобы добавить больше коллекций." } } diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index fff2413cf4d..fc79da1352b 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "සටහන්" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "බහාලුම සංස්කරණය" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "නැහැ" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 61390245659..fdf57456a4c 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -6,7 +6,7 @@ "message": "Kritické aplikácie" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "Nie sú ohrozené žiadne kritické aplikácie" }, "accessIntelligence": { "message": "Prehľad o prístupe" @@ -201,6 +201,9 @@ "notes": { "message": "Poznámky" }, + "privateNote": { + "message": "Súkromná poznámka" + }, "note": { "message": "Poznámka" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Zoradiť presúvaním" }, + "dragToReorder": { + "message": "Potiahnutím zmeníte poradie" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Upraviť priečinok" }, + "editWithName": { + "message": "Upraviť $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Nový priečinok" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Presunúť vybraté do organizácie" - }, "deleteSelected": { "message": "Odstrániť vybrané" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Vybraté položky boli presunuté do $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Položky presunuté do $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nie" }, + "location": { + "message": "Poloha" + }, "loginOrCreateNewAccount": { "message": "Prihláste sa, alebo vytvorte nový účet pre prístup k vášmu bezpečnému trezoru." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Relácia overovania skončila. Znovu spustite proces prihlásenia." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Overte svoju totožnosť" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Zadajte e-mailovú adresu účtu a zašleme vám nápoveď k heslu" }, - "passwordHint": { - "message": "Nápoveď k heslu" - }, - "enterEmailToGetHint": { - "message": "Zadajte emailovú adresu na zaslanie nápovede pre vaše hlavné heslo." - }, "getMasterPasswordHint": { "message": "Získať nápoveď k hlavnému heslu" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Vyberte organizáciu, do ktorej chcete presunúť túto položku. Presunom do organizácie sa vlastníctvo položky prenáša na túto organizáciu. Po presunutí už nebudete priamym vlastníkom danej položky." }, - "moveManyToOrgDesc": { - "message": "Vyberte organizáciu, do ktorej chcete presunúť tieto položky. Presunom do organizácie sa vlastníctvo položky prenáša na túto organizáciu. Po presunutí už nebudete priamym vlastníkom daných položiek." - }, "collectionsDesc": { "message": "Upravte zbierky s ktorými bude táto položka zdieľaná. Iba členovia organizácie s prístupom k vybraným zbierkam budú vidieť túto položku." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Vybrali ste $COUNT$ položku(iek). $MOVEABLE_COUNT$ položka(iek) môže(u) byť presunuté do organizácie, $NONMOVEABLE_COUNT$ nemôže(u).", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Overovací kód (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Zrušiť prístup" }, + "revoke": { + "message": "Odvolať" + }, "twoStepLoginProviderEnabled": { "message": "Tento poskytovateľ overenia je povolený pre váš účet." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ presunuté vyššie, pozícia $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ presunuté nižšie, pozícia $INDEX$ z $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Pri aktualizácii šifrovacieho kľúča nebolo možné dešifrovať vaše priečinky. Ak chcete pokračovať v aktualizácii, vaše priečinky sa musia odstrániť. Ak budete pokračovať, nebudú odstránené žiadne položky trezora." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Vlastníci a administrátori organizácie sú vyňatí z uplatnenia tohto pravidla." }, + "limitSendViews": { + "message": "Obmedziť zobrazenia" + }, + "limitSendViewsHint": { + "message": "Po dosiahnutí limitu si tento Send nemôže nikto zobraziť.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Zostáva $ACCESSCOUNT$ zobrazení", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Podrobnosti o Sende", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text, ktorý chcete zdieľať" + }, "sendTypeFile": { "message": "Súbor" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Pridajte voliteľné heslo pre príjemcov na prístup k tomuto Sendu.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Vytvoriť nový Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Zmazať Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Naozaj chcete odstrániť tento Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Aký typ Send to je?", + "deleteSendPermanentConfirmation": { + "message": "Naozaj chcete natrvalo odstrániť tento Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Dátum vymazania" }, - "deletionDateDesc": { - "message": "Odoslanie bude natrvalo odstránené v zadaný dátum a čas.", + "deletionDateDescV2": { + "message": "Send bude natrvalo odstránený v tento deň.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximálny počet prístupov" }, - "maxAccessCountDesc": { - "message": "Ak je nastavené, používatelia už nebudú mať prístup k tomuto Sendu po dosiahnutí maximálneho počtu prístupov.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Súčasný počet prístupov" - }, - "sendPasswordDesc": { - "message": "Voliteľne môžete vyžadovať heslo pre používateľov na prístup k tomuto odoslaniu.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Zabezpečená poznámka o tomto Odoslaní.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Vypnuté" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Naozaj chcete odstrániť heslo?" }, - "hideEmail": { - "message": "Skryť moju emailovú adresu pred príjemcami." - }, - "disableThisSend": { - "message": "Vypnúť tento Send, aby k nemu nikto nemal prístup.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Všetky Sendy" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Čakajúce odstránenie" }, + "hideTextByDefault": { + "message": "V predvolenom nastavení skryť text" + }, "expired": { "message": "Expirované" }, @@ -5415,13 +5441,6 @@ "message": "Nedovoľte používateľom skryť svoju e-mailovú adresu pred príjemcami pri vytváraní alebo úpravách Sendu.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "V súčasnosti platia nasledujúce pravidlá organizácie:" - }, - "sendDisableHideEmailInEffect": { - "message": "Používatelia nemajú povolené skryť svoju e-mailovú adresu pred príjemcami pri vytváraní alebo úpravách Sendu.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Upravená politika $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Zakázať osobné vlastníctvo pre používateľov organizácie" }, - "textHiddenByDefault": { - "message": "Pri prístupe k Odoslaniu, predvolene skryť text", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Priateľský názov pre popísanie tohto Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Text, ktorý chcete odoslať." - }, - "sendFileDesc": { - "message": "Súbor, ktorý chcete odoslať." - }, - "copySendLinkOnSave": { - "message": "Kopírovať odkaz na zdieľanie tohto Send do schránky počas ukladania." - }, - "sendLinkLabel": { - "message": "Odkaz na Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Pri ukladaní dátumov odstránenia a vypršania platnosti sa vyskytla chyba." }, + "hideYourEmail": { + "message": "Skryť moju e-mailovú adresu pri zobrazení." + }, "webAuthnFallbackMsg": { "message": "Na overenie 2FA, prosím, kliknite na tlačidlo nižšie." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Počet používateľov" }, - "loggingInAs": { - "message": "Prihlasujete sa ako" - }, - "notYou": { - "message": "Nie ste to vy?" - }, "pickAnAvatarColor": { "message": "Výber farby avatara" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Žiadosť o schválenie správcom" }, - "approveWithMasterPassword": { - "message": "Schváliť pomocou hlavného hesla" - }, "trustedDeviceEncryption": { "message": "Šifrovanie dôveryhodného zariadenia" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Vaša žiadosť bola odoslaná správcovi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Po schválení budete informovaný." - }, "troubleLoggingIn": { "message": "Máte problémy s prihlásením?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Chýba ID zariadenia" + }, + "deviceTypeMissing": { + "message": "Chýba typ zariadenia" + }, + "deviceCreationDateMissing": { + "message": "Chýba dátum vytvorenia zaradenia" + }, "desktopRequired": { "message": "Vyžaduje sa desktop" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Dozvedieť sa viac o Bitwarden API" }, + "fileSend": { + "message": "Send so súborom" + }, "fileSends": { "message": "Sendy so súborom" }, + "textSend": { + "message": "Textový Send" + }, "textSends": { "message": "Textové Sendy" }, @@ -10084,10 +10088,6 @@ "message": "Zahrnúť špeciálne znaky", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Priložiť prílohu" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Meno organizácie nemôže mať viac ako 50 znakov." }, + "sshKeyWrongPassword": { + "message": "Zadané heslo je nesprávne." + }, + "importSshKey": { + "message": "Importovať" + }, + "confirmSshKeyPassword": { + "message": "Potvrdiť heslo" + }, + "enterSshKeyPasswordDesc": { + "message": "Zadajte heslo pre kľúč SSH." + }, + "enterSshKeyPassword": { + "message": "Zadať heslo" + }, + "invalidSshKey": { + "message": "Kľúč SSH je neplatný" + }, + "sshKeyTypeUnsupported": { + "message": "Tento typ kľúča SSH nie je podporovaný" + }, + "importSshKeyFromClipboard": { + "message": "Importovať kľúč zo schránky" + }, + "sshKeyImported": { + "message": "Kľúč SSH bol úspešne importovaný" + }, + "copySSHPrivateKey": { + "message": "Kopírovať súkromný kľúč" + }, "openingExtension": { "message": "Otvára sa rozšírenie Bitwarden pre prehliadač" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Počet pridelených sedení presahuje počet dostupných sedení." }, + "changeAtRiskPassword": { + "message": "Zmeniť ohrozené heslo" + }, "removeUnlockWithPinPolicyTitle": { "message": "Odstrániť odomknutie PIN kódom" }, @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + "message": "Prechodom na plán Teams alebo Enterprise získate úplný prístup k denníku udalostí organizácie." }, "upgradeEventLogTitle": { "message": "Upgrade for real event log data" }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Bezplatné organizácie môžu mat maximálne dve zbierky. Ak chcete pridať viac zbierok povýšte na platené predplatné." } } diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index a0358d28ee9..1652841b650 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Zapisek" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Povleci za sortiranje" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Besedilo" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Uredi mapo" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Premakni označeno v organizacijo" - }, "deleteSelected": { "message": "Izbriši izbrano" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Izbrani elementi premaknjeni v $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Prijavite se ali ustvarite nov račun za dostop do svojega zavarovanega trezorja." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Namig za geslo" - }, - "enterEmailToGetHint": { - "message": "Vnesite e-poštni naslov svojega računa in poslali vam bomo namig za vaše glavno geslo." - }, "getMasterPasswordHint": { "message": "Pokaži namig za glavno geslo" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Izberite organizacijo, v katero želite premakniti ta element. To bo preneslo lasništvo elementa na to organizacijo. Potem ne boste več neposredni lastnik tega elementa." }, - "moveManyToOrgDesc": { - "message": "Izberite organizacijo, v katero želite premakniti te elemente. To bo preneslo lasništvo elementov na to organizacijo. Potem ne boste več neposredni lastnik teh elementov." - }, "collectionsDesc": { "message": "Uredite zbirke s katerimi želite deliti ta predmet. Predmet bodo lahko videli le uporabniki orgnanizacije, ki bodo imajo dostop do teh zbirk." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Izbrali ste toliko elementov: $COUNT$. Toliko jih je mogoče premakniti v organizacijo: $MOVEABLE_COUNT$, toliko pa ne: $NONMOVEABLE_COUNT$.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verifikacijska koda (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Odvzemi dostop" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Datoteka" }, "sendTypeText": { "message": "Besedilo" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Nova pošiljka", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Izbriši pošiljko", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Ste prepričani, da želite izbrisati to pošiljko?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Katere vrste pošiljka je to?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Vse pošiljke" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "Datoteka, ki jo želite poslati kot pošiljko." - }, - "copySendLinkOnSave": { - "message": "Ko shranim, skopiraj povezavo za deljenje te pošiljke v odložišče." - }, - "sendLinkLabel": { - "message": "Povezava pošiljke", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Pošiljka", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Prijavljate se kot" - }, - "notYou": { - "message": "To niste vi?" - }, "pickAnAvatarColor": { "message": "Izberite barvo za avatar" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json index f261fe8c90b..005fa7602b5 100644 --- a/apps/web/src/locales/sr/messages.json +++ b/apps/web/src/locales/sr/messages.json @@ -6,7 +6,7 @@ "message": "Критичне апликације" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "Нема критичних апликација у ризику" }, "accessIntelligence": { "message": "Приступи интелигенцији" @@ -201,6 +201,9 @@ "notes": { "message": "Напомене" }, + "privateNote": { + "message": "Приватна белешка" + }, "note": { "message": "Белешка" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Превуците за сортирање" }, + "dragToReorder": { + "message": "Превуците да бисте организовали" + }, "cfTypeText": { "message": "Текст" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Уреди фасциклу" }, + "editWithName": { + "message": "Уредити $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Нова фасцикла" }, @@ -860,9 +879,6 @@ "filter": { "message": "Филтер" }, - "moveSelectedToOrg": { - "message": "Премести одабрано у организацију" - }, "deleteSelected": { "message": "Избриши изабрано" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Одабране ставке премештене у $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Ставке премештене у $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Не" }, + "location": { + "message": "Локација" + }, "loginOrCreateNewAccount": { "message": "Пријавите се или креирајте нови налог за приступ Сефу." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Истекло је време сесије за аутентификацију. Молим вас покрените процес пријаве поново." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Потврдите идентитет" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Унеси адресу Е-поште свог налога и биће ти послат савет за лозинку" }, - "passwordHint": { - "message": "Помоћ за лозинку" - }, - "enterEmailToGetHint": { - "message": "Унеси твоју Е-пошту да би добио савет за твоју Главну Лозинку." - }, "getMasterPasswordHint": { "message": "Добити савет за Главну Лозинку" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Изаберите организацију коју желите да преместите овај предмет. Прелазак на организацију преноси власништво над ставком у ту организацију. Више нећете бити директни власник ове ставке након што је премештена." }, - "moveManyToOrgDesc": { - "message": "Изаберите организацију коју желите да преместите ове ставке. Прелазак на организацију преноси власништво над ставкама у ту организацију. Више нећете бити директни власник ове ставки након што су премештене." - }, "collectionsDesc": { "message": "Уредите колекције са којима се ова ставка дели. Само корисници организације који имају приступ овим колекцијама моћи ће да виде ову ставку." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Одабрали сте $COUNT$ ставку(и). $MOVEABLE_COUNT$ ставка(и) може да се преместе у организацију, $NONMOVEABLE_COUNT$ не.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Једнократни код" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Опозови Приступ" }, + "revoke": { + "message": "Опозови" + }, "twoStepLoginProviderEnabled": { "message": "Овај добављач услуге пријављивања у два корака је омогућен на вашем налогу." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ премештено на горе, позиција $INDEX$ од $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ премештено на доле, позиција $INDEX$ од $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Приликом ажурирања кључа за шифровање, ваше фасцикле нису могле да се дешифрују. Да бисте наставили са ажурирањем, ваше фасцикле морају бити избрисане. Ниједна ставка у сефу неће бити избрисана ако наставите." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Власници и администратори организација изузети су ове политике." }, + "limitSendViews": { + "message": "Ограничити приказе" + }, + "limitSendViewsHint": { + "message": "Нико не може да види ово Send након што се достигне ограничење.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Осталих прегледа: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Детаљи Send-а", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Текст за дељење" + }, "sendTypeFile": { "message": "Датотека" }, "sendTypeText": { "message": "Текст" }, + "sendPasswordDescV3": { + "message": "Додајте опционалну лозинку за примаоце да приступе овом Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Креирај ново „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Избриши „Send“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Сигурно избрисати овај „Send“?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Који је ово тип „Send“-a?", + "deleteSendPermanentConfirmation": { + "message": "Да ли сте сигурни да желите да трајно избришете овај Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Брисање после" }, - "deletionDateDesc": { - "message": "„The Send“ ће бити трајно избрисан наведеног датума и времена.", + "deletionDateDescV2": { + "message": "Send ће бити трајно обрисано у наведени датум.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Максималан број приступа" }, - "maxAccessCountDesc": { - "message": "Ако је постављено, корисници више неће моћи да приступе овом „send“ када се достигне максимални број приступа.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Тренутни број приступа" - }, - "sendPasswordDesc": { - "message": "Опционално захтевајте лозинку за приступ корисницима „Send“-у.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Приватне белешке о овом „Send“.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Онемогућено" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Да ли сте сигурни да желите уклонити лозинку?" }, - "hideEmail": { - "message": "Сакриј моју е-адресу од примаоца." - }, - "disableThisSend": { - "message": "Онемогућите овај „Send“ да нико не би могао да му приступи.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Све „Send“" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Брисање на чекању" }, + "hideTextByDefault": { + "message": "Сакриј текст подразумевано" + }, "expired": { "message": "Истекло" }, @@ -5415,13 +5441,6 @@ "message": "Не дозволите корисницима да сакрију своју е-пошту од примаоца приликом креирања или уређивања „Send“-а.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Следеће организационе политике су тренутно на снази:" - }, - "sendDisableHideEmailInEffect": { - "message": "Корисници не могу да сакрију своју е-пошту од примаоца приликом креирања или уређивања „Send“-а.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Политика $ID$ промењена.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Онемогућите лично власништво за кориснике организације" }, - "textHiddenByDefault": { - "message": "На притуп „Send“-а, сакриј текст по дефаулту", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Име да се опише ово слање.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Текст који желиш да пошаљеш." - }, - "sendFileDesc": { - "message": "Датотека коју желиш да пошаљеш." - }, - "copySendLinkOnSave": { - "message": "Копирај везу да би поделио слање на бележницу након снимања." - }, - "sendLinkLabel": { - "message": "Пошаљи везу", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Пошаљи", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Појавила се грешка при снимању датума брисања и истицања." }, + "hideYourEmail": { + "message": "Сакријте свој имејл од гледалаца." + }, "webAuthnFallbackMsg": { "message": "Да би проверили Ваш 2FA Кликните на дугме испод." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Број корисника" }, - "loggingInAs": { - "message": "Пријављивање као" - }, - "notYou": { - "message": "Нисте Ви?" - }, "pickAnAvatarColor": { "message": "Изабрати боју аватара" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Затражити одобрење администратора" }, - "approveWithMasterPassword": { - "message": "Одобрити са главном лозинком" - }, "trustedDeviceEncryption": { "message": "Шифровање поузданог уређаја" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш захтев је послат вашем администратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Бићете обавештени када буде одобрено." - }, "troubleLoggingIn": { "message": "Имате проблема са пријављивањем?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Конфигуришите управљање уређајима за Bitwarden помоћу водича за имплементацију за своју платформу." }, + "deviceIdMissing": { + "message": "Недостаје ИД уређаја" + }, + "deviceTypeMissing": { + "message": "Недостаје тип уређаја" + }, + "deviceCreationDateMissing": { + "message": "Недостаје датум креације уређаја" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Сазнајте више о API Bitwarden-а" }, + "fileSend": { + "message": "Датотека „Send“" + }, "fileSends": { "message": "Датотека „Send“" }, + "textSend": { + "message": "Текст „Send“" + }, "textSends": { "message": "Текст „Send“" }, @@ -10084,10 +10088,6 @@ "message": "Укључити специјална слова", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Додај прилог" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Име организације не може прећи 50 знакова." }, + "sshKeyWrongPassword": { + "message": "Лозинка коју сте унели није тачна." + }, + "importSshKey": { + "message": "Увоз" + }, + "confirmSshKeyPassword": { + "message": "Потврда лозинке" + }, + "enterSshKeyPasswordDesc": { + "message": "Унети лозинку за SSH кључ." + }, + "enterSshKeyPassword": { + "message": "Унесите лозинку" + }, + "invalidSshKey": { + "message": "SSH кључ је неважећи" + }, + "sshKeyTypeUnsupported": { + "message": "Тип SSH кључа није подржан" + }, + "importSshKeyFromClipboard": { + "message": "Увезите кључ из оставе" + }, + "sshKeyImported": { + "message": "SSH кључ је успешно увезен" + }, + "copySSHPrivateKey": { + "message": "Копирај приватни кључ" + }, "openingExtension": { "message": "Отварање Bitwarden додатка прегледача" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Променити ризичну лозинку" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10494,7 +10527,7 @@ "message": "Do not allow members to unlock their account with a PIN." }, "limitedEventLogs": { - "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "message": "$PRODUCT_TYPE$ планови немају приступ стварним извештајима догађаја", "placeholders": { "product_type": { "content": "$1", @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + "message": "Добијте потпуни приступ извештајима о догађајима организације надоградњом на Teams или Enterprise." }, "upgradeEventLogTitle": { - "message": "Upgrade for real event log data" + "message": "Надоградите за извештај о реалним догађајима" }, "upgradeEventLogMessage": { - "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + "message": "Ови догађаји су само примери и не одражавају стварне догађаје у вашем Bitwarden отганизацији." + }, + "cannotCreateCollection": { + "message": "Бесплатне организације могу имати до 2 колекције. Надоградите на плаћени план за додавање више колекција." } } diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index ffad2e5525d..d141d8301fc 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Beleške" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Sortiraj prevlačenjem" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Tekst" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Urеdi fasciklu" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Obriši izabrane stavke" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ne" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Ulogujte se ili napravite novi nalog kako biste pristupili Vašem trezoru." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Napravi novo slanje", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Obriši slanje", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Sva slanja" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Pošalji vezu", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Slanje", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index bbcf4b6fa7e..f7d6414c36c 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Anteckningar" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Anteckning" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Dra för att sortera" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Redigera mapp" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Flytta valda till organisation" - }, "deleteSelected": { "message": "Radera markerade" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "De valda objekten flyttades till $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Nej" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Logga in eller skapa ett nytt konto för att komma åt ditt valv." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Lösenordsledtråd" - }, - "enterEmailToGetHint": { - "message": "Ange din e-postadress för att få din huvudlösenordsledtråd." - }, "getMasterPasswordHint": { "message": "Hämta huvudlösenordsledtråd" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Välj en organisation som du vill flytta detta objektet till. Flytt till en organisation överför ägandet av objektet till den organisationen. Du kommer inte längre att vara direkt ägare till detta objekt när det har flyttats." }, - "moveManyToOrgDesc": { - "message": "Välj en organisation som du vill flytta dessa objekt till. Flytt till en organisation överför ägandet av objekten till den organisationen. Du kommer inte längre att vara direkt ägare till dessa objekt när de har flyttats." - }, "collectionsDesc": { "message": "Redigera de samlingar som detta objekt delas med. Endast organisationsanvändare med tillgång till dessa samlingar kommer att kunna se detta objekt." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Du har valt $COUNT$ objekt. $MOVEABLE_COUNT$ objekt kan flyttas till en organisation, $NONMOVEABLE_COUNT$ kan det inte.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verifieringskod (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Återkalla åtkomst" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "Denna metod för tvåstegsverifiering är aktiverad på ditt konto." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organisationens ägare och administratörer är undantagna från denna policy." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Fil" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Ny Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Radera Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Är du säker på att du vill radera denna Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Vilken typ av Send är detta?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Raderingsdatum" }, - "deletionDateDesc": { - "message": "Denna Send kommer att raderas permanent på angivet datum och klockslag.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximalt antal åtkomster" }, - "maxAccessCountDesc": { - "message": "Om angivet kommer användare inte längre kunna komma åt denna Send när det maximala antalet åtkomster har uppnåtts.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Nuvarande antal åtkomster" - }, - "sendPasswordDesc": { - "message": "Kräv valfritt ett lösenord för att användare ska komma åt denna Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Privata anteckningar om denna Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Inaktiverad" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Är du säker på att du vill ta bort lösenordet?" }, - "hideEmail": { - "message": "Dölj min e-postadress för mottagare." - }, - "disableThisSend": { - "message": "Inaktivera denna Send så att ingen kan komma åt den.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Alla Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Väntar på radering" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Utgången" }, @@ -5415,13 +5441,6 @@ "message": "Tillåt inte användare att dölja sin e-postadress från mottagare när de skapar eller redigerar en Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Följande organisationspolicyer är aktiva just nu:" - }, - "sendDisableHideEmailInEffect": { - "message": "Användare tillåts inte dölja sin e-postadress för mottagare när de skapar eller redigerar en Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Ändrade policyn $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Inaktivera personligt ägarskap för organisationens användare" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Texten du vill skicka." - }, - "sendFileDesc": { - "message": "Filen du vill skicka." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send-länk", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Det gick inte att spara raderings- och utgångsdatum." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "Klicka på knappen nedan för att verifiera din 2FA." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Antal användare" }, - "loggingInAs": { - "message": "Loggar in som" - }, - "notYou": { - "message": "Är det inte du?" - }, "pickAnAvatarColor": { "message": "Välj en avatarfärg" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Godkänn med huvudlösenord" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "Du kommer att meddelas vid godkännande." - }, "troubleLoggingIn": { "message": "Problem med att logga in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Läs mer om Bitwardens API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Inkludera specialtecken", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Lägg till bilaga" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index aed10e3ad71..f334131b69b 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notes" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Drag to sort" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Text" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Edit folder" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "Delete selected" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "No" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Log in or create a new account to access your secure vault." }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Password hint" - }, - "enterEmailToGetHint": { - "message": "Enter your account email address to receive your master password hint." - }, "getMasterPasswordHint": { "message": "Get master password hint" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index f6bb3f7005a..7d2685807b3 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "หมายเหตุ" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Note" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "ลากเพื่อเรียงลำดับ" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "ข้อความ" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "แก้​ไข​โฟลเดอร์" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filter" }, - "moveSelectedToOrg": { - "message": "Move selected to organization" - }, "deleteSelected": { "message": "ลบรายการที่เลือก" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Selected items moved to $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "ไม่ใช่" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "ล็อกอิน หรือ สร้างบัญชีใหม่ เพื่อใช้งานตู้นิรภัยของคุณ" }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "คำใบ้รหัสผ่าน" - }, - "enterEmailToGetHint": { - "message": "กรอกอีเมลของบัญชีของคุณ เพื่อรับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" - }, "getMasterPasswordHint": { "message": "รับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "เลือกองค์กรที่คุณต้องการย้ายรายการนี้ไป การย้ายไปยังองค์กรจะโอนความเป็นเจ้าของรายการไปยังองค์กรนั้น คุณจะไม่ได้เป็นเจ้าของโดยตรงของรายการนี้อีกต่อไปเมื่อมีการย้ายแล้ว" }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Edit the collections that this item is being shared with. Only organization users with access to these collections will be able to see this item." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Verification code (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Revoke access" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "File" }, "sendTypeText": { "message": "Text" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "New Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Delete Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Are you sure you want to delete this Send?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "What type of Send is this?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "The Send will be permanently deleted on the specified date and time.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Current access count" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Disabled" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "All Sends" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "A friendly name to describe this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "The text you want to Send." - }, - "sendFileDesc": { - "message": "The file you want to Send." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Number of users" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index 3502742bc02..030fd0dd9b2 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Notlar" }, + "privateNote": { + "message": "Özel not" + }, "note": { "message": "Not" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Sıralamak için sürükleyin" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Metin" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Klasörü düzenle" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "Yeni klasör" }, @@ -860,9 +879,6 @@ "filter": { "message": "Filtre" }, - "moveSelectedToOrg": { - "message": "Seçilenleri kuruluşa taşı" - }, "deleteSelected": { "message": "Seçilenleri sil" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Seçilen kayıtlar $ORGNAME$ kuruluşuna taşındı", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Kayıtlar $ORGNAME$ kuruluşuna taşındı", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Hayır" }, + "location": { + "message": "Konum" + }, "loginOrCreateNewAccount": { "message": "Güvenli kasanıza ulaşmak için giriş yapın veya yeni bir hesap oluşturun." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "Kimliğinizi doğrulayın" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "Bu cihazı tanıyamadık. Kimliğinizi doğrulamak için e-postanıza gönderilen kodu girin." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Hesabınızın e-posta adresini girdiğinizde parola ipucunuz size gönderilecektir" }, - "passwordHint": { - "message": "Parola ipucu" - }, - "enterEmailToGetHint": { - "message": "Ana parola ipucunu almak için hesabınızın e-posta adresini girin." - }, "getMasterPasswordHint": { "message": "Ana parola ipucunu al" }, @@ -1411,7 +1415,7 @@ "message": "Erişimi reddet" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "web uygulaması" }, "notificationSentDevicePart2": { "message": "Make sure the Fingerprint phrase matches the one below before approving." @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Bu kaydı taşımak istediğiniz kuruluşu seçin. Taşıdığınız kaydın sahipliği seçtiğiniz kuruluşa aktarılacak. Artık bu kaydın doğrudan sahibi olmayacaksınız." }, - "moveManyToOrgDesc": { - "message": "Bu kayıtları taşımak istediğiniz kuruluşu seçin. Taşıdığınız kayıtların sahipliği seçtiğiniz kuruluşa aktarılacak. Artık bu kayıtların doğrudan sahibi olmayacaksınız." - }, "collectionsDesc": { "message": "Bu kaydın şu anda paylaşıldığı koleksiyonları düzenler. Kuruluştaki kullanıcılardan yalnızca bu koleksiyonlara erişimi olanlar bu kaydı görebilir." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "$COUNT$ kayıt seçtiniz. $MOVEABLE_COUNT$ kayıt bir kuruluşa taşınabilir, $NONMOVEABLE_COUNT$ kayıt taşınamaz.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Doğrulama kodu (TOTP)" }, @@ -1825,7 +1809,7 @@ "message": "Lütfen yeniden giriş yapın." }, "currentSession": { - "message": "Current session" + "message": "Geçerli oturum" }, "requestPending": { "message": "Request pending" @@ -2232,7 +2216,7 @@ "message": "Yönet" }, "manageCollection": { - "message": "Manage collection" + "message": "Koleksiyonu yönet" }, "viewItems": { "message": "View items" @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Erişimi iptal et" }, + "revoke": { + "message": "İptal et" + }, "twoStepLoginProviderEnabled": { "message": "Bu iki aşamalı giriş sağlayıcısı hesabınızda etkin durumda." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Kuruluş sahipleri ve yöneticileri bu ilkenin uygulanmasından muaf tutulur." }, + "limitSendViews": { + "message": "Gösterimi sınırla" + }, + "limitSendViewsHint": { + "message": "Bu sınıra ulaşıldıktan sonra bu Send'i kimse göremez.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ gösterim kaldı", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send ayrıntıları", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Paylaşılacak metin" + }, "sendTypeFile": { "message": "Dosya" }, "sendTypeText": { "message": "Metin" }, + "sendPasswordDescV3": { + "message": "Alıcıların bu Send'e erişmesi için isterseniz parola ekleyebilirsiniz.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Yeni Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Send'i sil", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Bu Send'i silmek istediğinizden emin misiniz?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Bu ne tür bir Send?", + "deleteSendPermanentConfirmation": { + "message": "Bu Send'i kalıcı olarak silmek istediğinizden emin misiniz?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Silinme tarihi" }, - "deletionDateDesc": { - "message": "Bu Send belirtilen tarih ve saatte kalıcı olacak silinecek.", + "deletionDateDescV2": { + "message": "Bu Send belirtilen tarihte kalıcı olacak silinecek.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maksimum erişim sayısı" }, - "maxAccessCountDesc": { - "message": "Bunu ayarlarsanız maksimum erişim sayısına ulaşıldıktan sonra bu Send'e erişilemeyecektir.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Mevcut erişim sayısı" - }, - "sendPasswordDesc": { - "message": "Kullanıcıların bu Send'e erişmek için parola girmelerini isteyebilirsiniz.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Bu Send ile ilgili özel notlar.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Devre dışı" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Parolayı kaldırmak istediğinizden emin misiniz?" }, - "hideEmail": { - "message": "E-posta adresimi alıcılardan gizle." - }, - "disableThisSend": { - "message": "Kimsenin erişememesi için bu Send'i devre dışı bırak.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Tüm Send'ler" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Silinmesi bekleniyor" }, + "hideTextByDefault": { + "message": "Metni varsayılan olarak gizle" + }, "expired": { "message": "Süresi dolmuş" }, @@ -5415,13 +5441,6 @@ "message": "Send oluştururken veya düzenlerken üyelerin e-posta adreslerini her zaman alıcılara göster.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Şu anda yürüklükte olan kuruluş ilkeleri:" - }, - "sendDisableHideEmailInEffect": { - "message": "Kullanıcıların Send oluştururken veya düzenlerken alıcılardan e-posta adreslerini gizlemelerine izin verilmiyor.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "$ID$ ilkesi düzenlendi.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Kuruluş kullanıcıları için kişisel sahipliği kapat" }, - "textHiddenByDefault": { - "message": "Send'e erişirken varsayılan olarak metni gizle", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Bu Send'i açıklayan anlaşılır bir ad.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Göndermek istediğiniz metin." - }, - "sendFileDesc": { - "message": "Göndermek istediğiniz dosya." - }, - "copySendLinkOnSave": { - "message": "Kaydettikten sonra bu Send'i paylaşma linkini panoya kopyala." - }, - "sendLinkLabel": { - "message": "Send bağlantısı", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "Silinme ve son kullanma tarihleriniz kaydedilirken bir hata oluştu." }, + "hideYourEmail": { + "message": "E-posta adresimi Send'i görüntüleyenlerden gizle." + }, "webAuthnFallbackMsg": { "message": "İki aşamalı doğrulamanızı onaylamak için aşağıdaki düğmeye tıklayın." }, @@ -5697,7 +5698,7 @@ "message": "WebAutn ile doğrula" }, "readSecurityKey": { - "message": "Read security key" + "message": "Güvenlik anahtarını oku" }, "awaitingSecurityKeyInteraction": { "message": "Awaiting security key interaction..." @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Kullanıcı sayısı" }, - "loggingInAs": { - "message": "Giriş yapılan kullanıcı:" - }, - "notYou": { - "message": "Siz değil misiniz?" - }, "pickAnAvatarColor": { "message": "Bir avatar rengi seçin" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Yönetici onayı iste" }, - "approveWithMasterPassword": { - "message": "Ana parola ile onayla" - }, "trustedDeviceEncryption": { "message": "Güvenilir cihaz şifrelemesi" }, @@ -8523,7 +8515,7 @@ "message": "Device removed" }, "removeDevice": { - "message": "Remove device" + "message": "Cihazı kaldır" }, "removeDeviceConfirmation": { "message": "Are you sure you want to remove this device?" @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "İsteğiniz yöneticinize gönderildi." }, - "youWillBeNotifiedOnceApproved": { - "message": "Onaylandıktan sonra bilgilendirileceksiniz." - }, "troubleLoggingIn": { "message": "Giriş yaparken sorun mu yaşıyorsunuz?" }, @@ -9324,7 +9313,7 @@ "message": "SCIM" }, "scimIntegrationDescStart": { - "message": "Configure ", + "message": "Yapılandır ", "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider" }, "scimIntegrationDescEnd": { @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9613,7 +9611,7 @@ "message": "Export client report" }, "memberAccessReport": { - "message": "Member access" + "message": "Üye erişimi" }, "memberAccessReportDesc": { "message": "Ensure members have access to the right credentials and their accounts are secure. Use this report to obtain a CSV of member access and account configurations." @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "Dosya Send'i" + }, "fileSends": { "message": "Dosya Send'leri" }, + "textSend": { + "message": "Metin Send'i" + }, "textSends": { "message": "Metin Send'leri" }, @@ -9939,7 +9943,7 @@ "message": "Access to Premium features" }, "additionalStorageGbMessage": { - "message": "GB additional storage" + "message": "GB ek depolama" }, "sshKeyAlgorithm": { "message": "Key algorithm" @@ -9966,13 +9970,13 @@ "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-Bit" + "message": "RSA 2048 bit" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-Bit" + "message": "RSA 3072 bit" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-Bit" + "message": "RSA 4096 bit" }, "premiumAccounts": { "message": "6 premium hesap" @@ -10014,7 +10018,7 @@ "message": "20 makine hesabı" }, "current": { - "message": "Current" + "message": "Geçerli" }, "secretsManagerSubscriptionInfo": { "message": "Secrets Manager aboneliğiniz seçtiğiniz plana göre yükseltilecektir" @@ -10084,10 +10088,6 @@ "message": "Özel karakterleri dahil et", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Dosya ekle" }, @@ -10255,7 +10255,7 @@ "message": "Remove members" }, "devices": { - "message": "Devices" + "message": "Cihazlar" }, "deviceListDescription": { "message": "Your account was logged in to each of the devices below. If you do not recognize a device, remove it now." @@ -10348,23 +10348,53 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "Girdiğiniz parola yanlış." + }, + "importSshKey": { + "message": "İçe aktar" + }, + "confirmSshKeyPassword": { + "message": "Parolayı onaylayın" + }, + "enterSshKeyPasswordDesc": { + "message": "SSH anahtarının parolasını girin." + }, + "enterSshKeyPassword": { + "message": "Parolayı girin" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "Bir şeyler ters gitti..." }, "openingExtensionError": { "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." }, "openExtension": { - "message": "Open extension" + "message": "Uzantıyı aç" }, "doNotHaveExtension": { "message": "Don't have the Bitwarden browser extension?" }, "installExtension": { - "message": "Install extension" + "message": "Uzantıyı yükle" }, "openedExtension": { "message": "Opened the browser extension" @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Ücretsiz kuruluşların en fazla 2 koleksiyonu olabilir. Daha fazla koleksiyon eklemek için ücretli bir plana geçin." } } diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index c963b69547c..7d9eb316821 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -6,7 +6,7 @@ "message": "Критичні програми" }, "noCriticalAppsAtRisk": { - "message": "No critical applications at risk" + "message": "Немає критичних програм із ризиком" }, "accessIntelligence": { "message": "Управління доступом" @@ -201,6 +201,9 @@ "notes": { "message": "Нотатки" }, + "privateNote": { + "message": "Приватна нотатка" + }, "note": { "message": "Нотатка" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Перетягніть, щоб відсортувати" }, + "dragToReorder": { + "message": "Потягніть, щоб упорядкувати" + }, "cfTypeText": { "message": "Текст" }, @@ -467,17 +473,30 @@ "editFolder": { "message": "Редагування" }, + "editWithName": { + "message": "Редагувати $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { - "message": "New folder" + "message": "Нова тека" }, "folderName": { - "message": "Folder name" + "message": "Назва теки" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Зробіть теку вкладеною, вказавши після основної теки \"/\". Наприклад: Обговорення/Форуми" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Ви дійсно хочете остаточно видалити цю теку?" }, "baseDomain": { "message": "Основний домен", @@ -860,9 +879,6 @@ "filter": { "message": "Фільтр" }, - "moveSelectedToOrg": { - "message": "Перемістити вибране до організації" - }, "deleteSelected": { "message": "Видалити вибране" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Вибрані записи переміщено до $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Записи переміщено до $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Ні" }, + "location": { + "message": "Розташування" + }, "loginOrCreateNewAccount": { "message": "Для доступу до сховища увійдіть в обліковий запис, або створіть новий." }, @@ -1165,13 +1175,13 @@ "message": "Увійти в Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Введіть код, надісланий вам електронною поштою" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Введіть код з програми автентифікації" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Натисніть свій YubiKey для автентифікації" }, "authenticationTimeout": { "message": "Час очікування автентифікації" @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "Час очікування сеансу автентифікації завершився. Перезапустіть процес входу в систему." }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "Підтвердьте свою особу" }, "weDontRecognizeThisDevice": { @@ -1198,7 +1208,7 @@ "message": "Ініційовано вхід" }, "logInRequestSent": { - "message": "Request sent" + "message": "Запит надіслано" }, "submit": { "message": "Відправити" @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Введіть адресу е-пошти свого облікового запису і вам буде надіслано підказку для пароля" }, - "passwordHint": { - "message": "Підказка для пароля" - }, - "enterEmailToGetHint": { - "message": "Введіть свою адресу е-пошти, щоб отримати підказку для головного пароля." - }, "getMasterPasswordHint": { "message": "Отримати підказку для головного пароля" }, @@ -1390,13 +1394,13 @@ "message": "Сповіщення було надіслано на ваш пристрій." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the " + "message": "Розблокуйте Bitwarden на своєму пристрої або у " }, "areYouTryingToAccessYourAccount": { - "message": "Are you trying to access your account?" + "message": "Ви намагаєтесь отримати доступ до свого облікового запису?" }, "accessAttemptBy": { - "message": "Access attempt by $EMAIL$", + "message": "Спроба доступу з $EMAIL$", "placeholders": { "email": { "content": "$1", @@ -1405,19 +1409,19 @@ } }, "confirmAccess": { - "message": "Confirm access" + "message": "Підтвердити доступ" }, "denyAccess": { - "message": "Deny access" + "message": "Заборонити доступ" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "вебпрограмі" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Перш ніж підтверджувати, обов'язково перевірте відповідність зазначеної нижче фрази відбитка." }, "notificationSentDeviceComplete": { - "message": "Unlock Bitwarden on your device. Make sure the Fingerprint phrase matches the one below before approving." + "message": "Розблокуйте Bitwarden на своєму пристрої. Перш ніж підтверджувати переконайтеся, що фраза відбитка збігається з наведеною нижче." }, "aNotificationWasSentToYourDevice": { "message": "Сповіщення надіслано на ваш пристрій" @@ -1456,7 +1460,7 @@ "message": "Запам'ятати мене" }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Більше не запитувати на цьому пристрої протягом 30 днів" }, "sendVerificationCodeEmailAgain": { "message": "Надіслати код підтвердження ще раз" @@ -1465,11 +1469,11 @@ "message": "Інший спосіб двоетапної перевірки" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Обрати інший спосіб", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Скористайтеся своїм кодом відновлення" }, "insertYubiKey": { "message": "Вставте свій YubiKey в USB порт комп'ютера, потім торкніться цієї кнопки." @@ -1490,7 +1494,7 @@ "message": "Налаштування двоетапної перевірки" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Виберіть спосіб двоетапної перевірки" }, "recoveryCodeDesc": { "message": "Втратили доступ до всіх провайдерів двоетапної перевірки? Скористайтеся кодом відновлення, щоб вимкнути двоетапну перевірку для свого облікового запису." @@ -1535,7 +1539,7 @@ "message": "(Перенесено з FIDO)" }, "openInNewTab": { - "message": "Open in new tab" + "message": "Відкрити в новій вкладці" }, "emailTitle": { "message": "Е-пошта" @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Виберіть організацію, до якої ви бажаєте перемістити цей запис. Переміщуючи до організації, власність запису передається тій організації. Ви більше не будете єдиним власником цього запису після переміщення." }, - "moveManyToOrgDesc": { - "message": "Виберіть організацію, до якої ви бажаєте перемістити ці записи. Переміщуючи до організації, власність записів передається тій організації. Ви більше не будете єдиним власником цих записів після переміщення." - }, "collectionsDesc": { "message": "Редагуйте збірки, з якими цей запис знаходиться в спільному доступі. Лише учасники організацій з доступом до цих збірок матимуть можливість бачити цей запис." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "Ви вибрали $COUNT$ запис(ів). $MOVEABLE_COUNT$ запис(ів) можна перемістити до організації, $NONMOVEABLE_COUNT$ не можна.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Код підтвердження (TOTP)" }, @@ -2191,7 +2175,7 @@ "message": "Увімкнення двоетапної перевірки може цілком заблокувати доступ до облікового запису Bitwarden. Код відновлення дає вам змогу отримати доступ до свого облікового запису у випадку, якщо ви не можете скористатися провайдером двоетапної перевірки (наприклад, якщо втрачено пристрій). Служба підтримки Bitwarden не зможе допомогти відновити доступ до вашого облікового запису. Ми радимо вам записати чи надрукувати цей код відновлення і зберігати його в надійному місці." }, "yourSingleUseRecoveryCode": { - "message": "Your single-use recovery code can be used to turn off two-step login in the event that you lose access to your two-step login provider. Bitwarden recommends you write down the recovery code and keep it in a safe place." + "message": "Одноразовий код відновлення можна використати для вимкнення двоетапної перевірки у випадку, якщо ви втратите доступ до вашого провайдера двоетапної перевірки. Bitwarden рекомендує вам записати код відновлення і зберігати його в надійному місці." }, "viewRecoveryCode": { "message": "Переглянути код відновлення" @@ -2232,19 +2216,19 @@ "message": "Керувати" }, "manageCollection": { - "message": "Manage collection" + "message": "Керувати збіркою" }, "viewItems": { - "message": "View items" + "message": "Переглянути записи" }, "viewItemsHidePass": { - "message": "View items, hidden passwords" + "message": "Перегляд записів, прихованих паролів" }, "editItems": { - "message": "Edit items" + "message": "Редагувати записи" }, "editItemsHidePass": { - "message": "Edit items, hidden passwords" + "message": "Редагування записів, прихованих паролів" }, "disable": { "message": "Вимкнути" @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Відкликати доступ" }, + "revoke": { + "message": "Відкликати" + }, "twoStepLoginProviderEnabled": { "message": "Для вашого облікового запису увімкнено цей спосіб двоетапної перевірки." }, @@ -2442,7 +2429,7 @@ "message": "Сталася проблема при читанні ключа безпеки. Спробуйте знову." }, "twoFactorWebAuthnWarning1": { - "message": "Due to platform limitations, WebAuthn cannot be used on all Bitwarden applications. You should set up another two-step login provider so that you can access your account when WebAuthn cannot be used." + "message": "У зв'язку з обмеженнями платформи, WebAuthn не можна використовувати в усіх програмах Bitwarden. Вам слід активувати іншого провайдера двоетапної перевірки, щоб мати змогу отримати доступ до свого облікового запису, коли неможливо скористатися WebAuthn." }, "twoFactorRecoveryYourCode": { "message": "Ваш код відновлення двоетапної перевірки Bitwarden" @@ -4110,10 +4097,10 @@ "message": "Ви використовуєте непідтримуваний браузер. Вебсховище може працювати неправильно." }, "youHaveAPendingLoginRequest": { - "message": "You have a pending login request from another device." + "message": "Ви маєте запит на вхід до системи з іншого пристрою." }, "reviewLoginRequest": { - "message": "Review login request" + "message": "Переглянути запит входу" }, "freeTrialEndPromptCount": { "message": "Ваш безплатний пробний період завершується через $COUNT$ днів.", @@ -4210,7 +4197,7 @@ "message": "Якщо вам не вдається отримати доступ до свого облікового запису з використанням звичайної двоетапної перевірки, ви можете скористатися своїм кодом відновлення, щоб вимкнути всіх провайдерів двоетапної перевірки для вашого облікового запису." }, "logInBelowUsingYourSingleUseRecoveryCode": { - "message": "Log in below using your single-use recovery code. This will turn off all two-step providers on your account." + "message": "Увійдіть в систему нижче, використовуючи одноразовий код відновлення. Ця дія вимкне всіх провайдерів двоетапної перевірки для вашого облікового запису." }, "recoverAccountTwoStep": { "message": "Відновити вхід з використанням двоетапної перевірки" @@ -4504,7 +4491,7 @@ "message": "Неможливо продовжити оновлення ключа шифрування" }, "editFieldLabel": { - "message": "Edit $LABEL$", + "message": "Редагувати $LABEL$", "placeholders": { "label": { "content": "$1", @@ -4513,7 +4500,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Перевпорядкувати $LABEL$. Використовуйте клавіші зі стрілками для переміщення.", "placeholders": { "label": { "content": "$1", @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ переміщено вгору, позиція $INDEX$ з $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ переміщено вниз, позиція $INDEX$ з $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Не вдалося розшифрувати ваші теки під час оновлення ключа шифрування. Щоб продовжити оновлення, необхідно видалити теки. Якщо ви продовжите, записи у сховищі не будуть видалені." }, @@ -4793,7 +4814,7 @@ "message": "Встановіть вимоги надійності головного пароля." }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Рейтинг надійності пароля $SCORE$", "placeholders": { "score": { "content": "$1", @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Власники організації та адміністратори звільняються від дотримання цієї політики." }, + "limitSendViews": { + "message": "Ліміт переглядів" + }, + "limitSendViewsHint": { + "message": "Ніхто не може переглянути це відправлення після досягнення ліміту.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "Залишок переглядів: $ACCESSCOUNT$", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Подробиці відправлення", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Текст для поширення" + }, "sendTypeFile": { "message": "Файл" }, "sendTypeText": { "message": "Текст" }, + "sendPasswordDescV3": { + "message": "За бажання додайте пароль для отримувачів цього відправлення.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Нове відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Видалити відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Ви дійсно хочете видалити це відправлення?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Який це тип відправлення?", + "deleteSendPermanentConfirmation": { + "message": "Ви дійсно хочете остаточно видалити це відправлення?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Термін дії" }, - "deletionDateDesc": { - "message": "Відправлення буде остаточно видалено у вказаний час.", + "deletionDateDescV2": { + "message": "Відправлення буде остаточно видалено у вказану дату.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Максимальна кількість доступів" }, - "maxAccessCountDesc": { - "message": "Якщо встановлено, користувачі більше не зможуть отримати доступ до цього відправлення після досягнення максимальної кількості доступів.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Поточна кількість доступів" - }, - "sendPasswordDesc": { - "message": "Ви можете встановити пароль для доступу до цього відправлення.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Особисті нотатки про це відправлення.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Вимкнено" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Ви дійсно хочете вилучити пароль?" }, - "hideEmail": { - "message": "Приховувати мою адресу електронної пошти від отримувачів." - }, - "disableThisSend": { - "message": "Деактивувати це відправлення для скасування доступу до нього.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Усі відправлення" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Очікується видалення" }, + "hideTextByDefault": { + "message": "Типово приховувати текст" + }, "expired": { "message": "Термін дії завершився" }, @@ -5415,13 +5441,6 @@ "message": "Завжди показувати отримувачам адресу е-пошти учасників під час створення чи редагування відправлень.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "Наразі діють такі політики організації:" - }, - "sendDisableHideEmailInEffect": { - "message": "Користувачам не дозволяється приховувати свою адресу електронної пошти від отримувачів під час створення чи редагування відправлень.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Змінено політику $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Вилучити особисту власність для учасників організації" }, - "textHiddenByDefault": { - "message": "При доступі до відправлення типово приховувати текст", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Опис цього відправлення.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Текст, який ви хочете відправити." - }, - "sendFileDesc": { - "message": "Файл, який ви хочете відправити." - }, - "copySendLinkOnSave": { - "message": "Копіювати посилання, щоб поділитися відправленням після збереження." - }, - "sendLinkLabel": { - "message": "Посилання на відправлення", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Відправлення", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "При збереженні дат видалення і терміну дії виникла помилка." }, + "hideYourEmail": { + "message": "Приховати адресу е-пошти від отримувачів." + }, "webAuthnFallbackMsg": { "message": "Щоб засвідчити ваш 2FA, натисніть кнопку внизу." }, @@ -5697,10 +5698,10 @@ "message": "Автентифікація WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Зчитати ключ безпеки" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Очікується взаємодія з ключем безпеки..." }, "webAuthnNotSupported": { "message": "WebAuthn не підтримується в цьому браузері." @@ -6996,7 +6997,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ відхилив ваш запит. Зверніться до провайдера послуг по допомогу.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -7006,7 +7007,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ відхилив ваш запит: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -7249,10 +7250,10 @@ "message": "Для вашого облікового запису необхідна двоетапна перевірка з Duo." }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Для вашого облікового запису необхідно пройти двоетапну перевірку з Duo. Виконайте наведені нижче кроки, щоб завершити вхід." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Виконайте наведені нижче кроки, щоб завершити вхід." }, "launchDuo": { "message": "Запустити Duo" @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Кількість користувачів" }, - "loggingInAs": { - "message": "Вхід у систему як" - }, - "notYou": { - "message": "Не ви?" - }, "pickAnAvatarColor": { "message": "Оберіть колір аватара" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Запит підтвердження адміністратора" }, - "approveWithMasterPassword": { - "message": "Затвердити з головним паролем" - }, "trustedDeviceEncryption": { "message": "Шифрування довіреного пристрою" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Ваш запит відправлено адміністратору." }, - "youWillBeNotifiedOnceApproved": { - "message": "Ви отримаєте сповіщення після затвердження." - }, "troubleLoggingIn": { "message": "Проблема під час входу?" }, @@ -8851,10 +8840,10 @@ "message": "У вас немає доступу до керування цією збіркою." }, "grantManageCollectionWarningTitle": { - "message": "Missing Manage Collection Permissions" + "message": "Відсутній дозвіл на керування збіркою" }, "grantManageCollectionWarning": { - "message": "Grant Manage collection permissions to allow full collection management including deletion of collection." + "message": "Надайте дозвіл для можливості повного керування збіркою, включно з видаленням збірки." }, "grantCollectionAccess": { "message": "Надайте групам або учасникам доступ до цієї збірки." @@ -9349,11 +9338,20 @@ "deviceManagementDesc": { "message": "Налаштуйте керування пристроями для Bitwarden, використовуючи посібник із впровадження для вашої платформи." }, + "deviceIdMissing": { + "message": "Відсутній ID пристрою" + }, + "deviceTypeMissing": { + "message": "Відсутній тип пристрою" + }, + "deviceCreationDateMissing": { + "message": "Відсутня дата створення пристрою" + }, "desktopRequired": { - "message": "Desktop required" + "message": "Потрібен комп'ютер" }, "reopenLinkOnDesktop": { - "message": "Reopen this link from your email on a desktop." + "message": "Відкрийте це посилання з електронної пошти на комп'ютері." }, "integrationCardTooltip": { "message": "Відкрити посібник із впровадження $INTEGRATION$.", @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Докладніше про Bitwarden API" }, + "fileSend": { + "message": "Відправлення файлу" + }, "fileSends": { "message": "Відправлення файлів" }, + "textSend": { + "message": "Відправлення тексту" + }, "textSends": { "message": "Відправлення тексту" }, @@ -10084,10 +10088,6 @@ "message": "Спеціальні символи", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Додати вкладення" }, @@ -10348,36 +10348,66 @@ "organizationNameMaxLength": { "message": "Назва організації не може перевищувати 50 символів." }, + "sshKeyWrongPassword": { + "message": "Ви ввели неправильний пароль." + }, + "importSshKey": { + "message": "Імпорт" + }, + "confirmSshKeyPassword": { + "message": "Підтвердити пароль" + }, + "enterSshKeyPasswordDesc": { + "message": "Введіть пароль для ключа SSH." + }, + "enterSshKeyPassword": { + "message": "Введіть пароль" + }, + "invalidSshKey": { + "message": "Ключ SSH недійсний" + }, + "sshKeyTypeUnsupported": { + "message": "Тип ключа SSH не підтримується" + }, + "importSshKeyFromClipboard": { + "message": "Імпортувати ключ із буфера обміну" + }, + "sshKeyImported": { + "message": "Ключ SSH успішно імпортовано" + }, + "copySSHPrivateKey": { + "message": "Копіювати закритий ключ" + }, "openingExtension": { - "message": "Opening the Bitwarden browser extension" + "message": "Відкриття розширення браузера Bitwarden" }, "somethingWentWrong": { - "message": "Something went wrong..." + "message": "Щось пішло не так..." }, "openingExtensionError": { - "message": "We had trouble opening the Bitwarden browser extension. Click the button to open it now." + "message": "Виникли проблеми з відкриттям розширення браузера Bitwarden. Натисніть кнопку, щоб відкрити його зараз." }, "openExtension": { - "message": "Open extension" + "message": "Відкрити розширення" }, "doNotHaveExtension": { - "message": "Don't have the Bitwarden browser extension?" + "message": "Не встановлено розширення браузера Bitwarden?" }, "installExtension": { - "message": "Install extension" + "message": "Встановити розширення" }, "openedExtension": { - "message": "Opened the browser extension" + "message": "Відкрито розширення браузера" }, "openedExtensionViewAtRiskPasswords": { - "message": "Successfully opened the Bitwarden browser extension. You can now review your at-risk passwords." + "message": "Розширення браузера Bitwarden успішно відкрито. Тепер ви можете переглянути свої ризиковані паролі." }, "openExtensionManuallyPart1": { - "message": "We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon", + "message": "Виникли проблеми з відкриттям розширення браузера Bitwarden. Відкрийте піктограму Bitwarden", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "from the toolbar.", + "message": "з панелі інструментів.", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { @@ -10439,16 +10469,16 @@ } }, "accountDeprovisioningNotification": { - "message": "Administrators now have the ability to delete member accounts that belong to a claimed domain." + "message": "Адміністратори тепер мають можливість видаляти облікові записи учасників, що належать до заявленого домену." }, "deleteManagedUserWarningDesc": { - "message": "This action will delete the member account including all items in their vault. This replaces the previous Remove action." + "message": "Ця дія видалить обліковий запис учасника, включно з усіма записами в сховищі. Ця функція замінює попередню дію вилучення." }, "deleteManagedUserWarning": { - "message": "Delete is a new action!" + "message": "Видалення – нова дія!" }, "seatsRemaining": { - "message": "You have $REMAINING$ seats remaining out of $TOTAL$ seats assigned to this organization. Contact your provider to manage your subscription.", + "message": "У вас залишилося $REMAINING$ місць із загальної кількості ($TOTAL$) місць, призначених цій організації. Зверніться до свого провайдера, щоб керувати передплатою.", "placeholders": { "remaining": { "content": "$1", @@ -10461,19 +10491,19 @@ } }, "existingOrganization": { - "message": "Existing organization" + "message": "Наявна організація" }, "selectOrganizationProviderPortal": { - "message": "Select an organization to add to your Provider Portal." + "message": "Виберіть організацію, щоб додати до вашого порталу провайдера." }, "noOrganizations": { - "message": "There are no organizations to list" + "message": "Немає організацій для показу" }, "yourProviderSubscriptionCredit": { - "message": "Your provider subscription will receive a credit for any remaining time in the organization's subscription." + "message": "Ваш провайдер отримає кредит за будь-який час, що залишився у передплаті організації." }, "doYouWantToAddThisOrg": { - "message": "Do you want to add this organization to $PROVIDER$?", + "message": "Ви хочете додати цю організацію до $PROVIDER$?", "placeholders": { "provider": { "content": "$1", @@ -10482,19 +10512,22 @@ } }, "addedExistingOrganization": { - "message": "Added existing organization" + "message": "Додано наявну організацію" }, "assignedExceedsAvailable": { - "message": "Assigned seats exceed available seats." + "message": "Призначені місця перевищують доступні місця." + }, + "changeAtRiskPassword": { + "message": "Змінити ризикований пароль" }, "removeUnlockWithPinPolicyTitle": { - "message": "Remove Unlock with PIN" + "message": "Вилучити розблокування з PIN-кодом" }, "removeUnlockWithPinPolicyDesc": { - "message": "Do not allow members to unlock their account with a PIN." + "message": "Не дозволяти учасникам розблокувати свій обліковий запис за допомогою PIN-коду." }, "limitedEventLogs": { - "message": "$PRODUCT_TYPE$ plans do not have access to real event logs", + "message": "Тарифні плани $PRODUCT_TYPE$ не мають доступу до реальних журналів подій", "placeholders": { "product_type": { "content": "$1", @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "Get full access to organization event logs by upgrading to a Teams or Enterprise plan." + "message": "Отримайте повний доступ до журналу подій організації, передплативши тарифний план Teams або Enterprise." }, "upgradeEventLogTitle": { - "message": "Upgrade for real event log data" + "message": "Оновіть тарифний план, щоб переглядати реальні дані журналу подій" }, "upgradeEventLogMessage": { - "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + "message": "Ці події є лише зразками. Вони не відображають реальних подій у вашій організації Bitwarden." + }, + "cannotCreateCollection": { + "message": "Безплатні організації можуть мати до 2 збірок. Передплатіть тарифний план, щоб додати більше збірок." } } diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index 53a215d2ded..f0a0215f823 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "Ghi chú" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "Ghi chú" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "Kéo để sắp xếp" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "Văn bản" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "Chỉnh sửa thư mục" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "Bộ lọc" }, - "moveSelectedToOrg": { - "message": "Chuyển mục đã chọn tới Tổ chức" - }, "deleteSelected": { "message": "Xóa mục đã chọn" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "Đã di chuyển các mục đã chọn đến $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "Không" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "Đăng nhập hoặc tạo tài khoản mới để truy cập kho mật khẩu của bạn." }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." }, - "verifyIdentity": { - "message": "Xác minh danh tính của bạn" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "Gợi ý mật khẩu" - }, - "enterEmailToGetHint": { - "message": "Nhập địa chỉ email của tài khoản bạn để nhận gợi ý mật khẩu." - }, "getMasterPasswordHint": { "message": "Nhận gợi ý mật khẩu chính" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, - "moveManyToOrgDesc": { - "message": "Choose an organization that you wish to move these items to. Moving to an organization transfers ownership of the items to that organization. You will no longer be the direct owner of these items once they have been moved." - }, "collectionsDesc": { "message": "Chỉnh sửa những bộ sưu tập mà bạn có chia sẻ mục này. Chỉ những thành viên của tổ chức có quyền quản lý những bộ sưu tập đó mới có thể xem được mục này." }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "You have selected $COUNT$ item(s). $MOVEABLE_COUNT$ item(s) can be moved to an organization, $NONMOVEABLE_COUNT$ cannot.", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "Mã xác thực (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "Thu hồi quyền truy cập" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "This two-step login provider is active on your account." }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "Khi cập nhật khóa mã hóa, các thư mục của bạn không thể được giải mã. Để tiếp tục cập nhật, các thư mục của bạn phải bị xóa. Sẽ không có mục nào bị xóa nếu bạn tiếp tục." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "Organization owners and admins are exempt from this policy's enforcement." }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "Tập tin" }, "sendTypeText": { "message": "Văn bản" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "Mục Gửi mới", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "Xóa mục Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "Bạn có chắc muốn xóa mục Gửi này?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "Đây là kiểu Gửi gì?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "Deletion date" }, - "deletionDateDesc": { - "message": "Mục Gửi sẽ được xóa vĩnh viễn vào ngày và giờ được chỉ định.", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "Maximum access count" }, - "maxAccessCountDesc": { - "message": "Nếu được thiết lập, khi đã đạt tới số lượng truy cập tối đa, người dùng sẽ không thể truy cập mục Gửi này nữa.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "Số lần truy cập hiện tại" - }, - "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "Private notes about this Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "Đã tắt" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "Are you sure you want to remove the password?" }, - "hideEmail": { - "message": "Hide my email address from recipients." - }, - "disableThisSend": { - "message": "Deactivate this Send so that no one can access it.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "Tất cả mục Gửi" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "Pending deletion" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "Expired" }, @@ -5415,13 +5441,6 @@ "message": "Always show member’s email address with recipients when creating or editing a Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "The following organization policies are currently in effect:" - }, - "sendDisableHideEmailInEffect": { - "message": "Users are not allowed to hide their email address from recipients when creating or editing a Send.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "Modified policy $ID$.", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "Remove individual ownership for organization users" }, - "textHiddenByDefault": { - "message": "When accessing the Send, hide the text by default", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "Một tên gợi nhớ để mô tả mục Gửi này.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "Văn bản bạn muốn gửi." - }, - "sendFileDesc": { - "message": "Tập tin bạn muốn gửi." - }, - "copySendLinkOnSave": { - "message": "Copy the link to share this Send to my clipboard upon save." - }, - "sendLinkLabel": { - "message": "Send link", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Gửi", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "To verify your 2FA please click the button below." }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "Số lượng người dùng" }, - "loggingInAs": { - "message": "Logging in as" - }, - "notYou": { - "message": "Not you?" - }, "pickAnAvatarColor": { "message": "Pick an avatar color" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "Request admin approval" }, - "approveWithMasterPassword": { - "message": "Approve with master password" - }, "trustedDeviceEncryption": { "message": "Trusted device encryption" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "Your request has been sent to your admin." }, - "youWillBeNotifiedOnceApproved": { - "message": "You will be notified once approved." - }, "troubleLoggingIn": { "message": "Trouble logging in?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "Learn more about Bitwarden's API" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "Include special characters", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "Add attachment" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index 8d73dbd72e6..08a610c47ce 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -9,7 +9,7 @@ "message": "没有关键应用程序存在风险" }, "accessIntelligence": { - "message": "Access Intelligence" + "message": "智慧访问" }, "riskInsights": { "message": "风险洞察" @@ -201,6 +201,9 @@ "notes": { "message": "备注" }, + "privateNote": { + "message": "私密备注" + }, "note": { "message": "笔记" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "拖动排序" }, + "dragToReorder": { + "message": "拖动以重新排序" + }, "cfTypeText": { "message": "文本型" }, @@ -454,7 +460,7 @@ "message": "未分配" }, "noneFolder": { - "message": "无文件夹", + "message": "默认文件夹", "description": "This is the folder for uncategorized items" }, "selfOwnershipLabel": { @@ -467,6 +473,19 @@ "editFolder": { "message": "编辑文件夹" }, + "editWithName": { + "message": "编辑 $ITEM$:$NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "新增文件夹" }, @@ -860,9 +879,6 @@ "filter": { "message": "筛选" }, - "moveSelectedToOrg": { - "message": "移动所选到组织" - }, "deleteSelected": { "message": "删除所选" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "所选项目已移动到 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "项目已移动到 $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "否" }, + "location": { + "message": "位置" + }, "loginOrCreateNewAccount": { "message": "登录或创建一个新账户以访问您的安全密码库。" }, @@ -1179,7 +1189,7 @@ "authenticationSessionTimedOut": { "message": "身份验证会话超时。请重新启动登录过程。" }, - "verifyIdentity": { + "verifyYourIdentity": { "message": "验证您的身份" }, "weDontRecognizeThisDevice": { @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "输入您的账户电子邮箱地址,您的密码提示将发送给您" }, - "passwordHint": { - "message": "密码提示" - }, - "enterEmailToGetHint": { - "message": "请输入您的账户电子邮箱地址来接收主密码提示。" - }, "getMasterPasswordHint": { "message": "获取主密码提示" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "选择一个您想将此项目移至的组织。移动到组织会将该项目的所有权转让给该组织。移动后,您将不再是此项目的直接所有者。" }, - "moveManyToOrgDesc": { - "message": "选择一个您想将这些项目移至的组织。移动到组织会将这些项目的所有权转让给该组织。移动后,您将不再是这些项目的直接所有者。" - }, "collectionsDesc": { "message": "编辑与其共享此项目的集合。只有具有这些集合访问权限的组织用户才能看到此项目。" }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "您选择了 $COUNT$ 个项目。$MOVEABLE_COUNT$ 个项目可以移动到组织,$NONMOVEABLE_COUNT$ 不能。", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "验证码 (TOTP)" }, @@ -2103,7 +2087,7 @@ "message": "偏好设置" }, "preferencesDesc": { - "message": "自定义您的网页版密码库。" + "message": "自定义您的网页密码库。" }, "preferencesUpdated": { "message": "偏好设置已保存" @@ -2148,7 +2132,7 @@ "message": "新增自定义域名" }, "newCustomDomainDesc": { - "message": "输入用逗号分隔的域名列表。只能输入「基础」域名,不要输入子域名。例如,输入「google.com」而不是「www.google.com」。您也可以输入「androidapp://package.name」以将 Android App 与其他网站域名关联。" + "message": "输入用逗号分隔的域名列表。只支持「基础」域名,不要输入子域名。例如,输入「google.com」而不是「www.google.com」。您也可以输入「androidapp://package.name」以将 Android App 与其他网站域名关联。" }, "customDomainX": { "message": "自定义域名 $INDEX$", @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "撤销访问权限" }, + "revoke": { + "message": "撤销" + }, "twoStepLoginProviderEnabled": { "message": "您的账户已启用此两步登录提供程序。" }, @@ -2328,7 +2315,7 @@ "message": "由于平台限制,YubiKey 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 YubiKey 时可以访问您的账户。支持的平台:" }, "twoFactorYubikeySupportUsb": { - "message": "具有可使用 YubiKey 的 USB 端口的设备上的网页版密码库、桌面应用程序、CLI 以及浏览器扩展。" + "message": "具有可使用 YubiKey 的 USB 端口的设备上的网页密码库、桌面应用程序、CLI 以及浏览器扩展。" }, "twoFactorYubikeySupportMobile": { "message": "具有 NFC 功能或可使用 YubiKey 的数据端口的设备上的移动 App。" @@ -2430,7 +2417,7 @@ "message": "由于平台限制,FIDO U2F 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 FIDO U2F 时可以访问您的账户。支持的平台:" }, "twoFactorU2fSupportWeb": { - "message": "桌面/笔记本电脑上支持 U2F 的浏览器(开启了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页版密码库和浏览器扩展。" + "message": "桌面/笔记本电脑上支持 U2F 的浏览器(开启了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页密码库和浏览器扩展。" }, "twoFactorU2fWaiting": { "message": "等待您触摸安全密钥上的按钮" @@ -2704,7 +2691,7 @@ "description": "Add more credit to your account's balance." }, "amount": { - "message": "合计", + "message": "金额", "description": "Dollar amount, or quantity." }, "creditDelayed": { @@ -2748,7 +2735,7 @@ "message": "未来的更多高级功能。敬请期待!" }, "premiumPrice": { - "message": "全部仅需 $PRICE$ /年!", + "message": "所有功能仅需 $PRICE$ /年!", "placeholders": { "price": { "content": "$1", @@ -2757,7 +2744,7 @@ } }, "premiumPriceWithFamilyPlan": { - "message": "升级高级会员仅需 $PRICE$/年,或成为具有 $FAMILYPLANUSERCOUNT$ 位用户以及无限制的家庭共享的高级账户,通过 ", + "message": "升级高级会员仅需 $PRICE$ /年,或成为具有 $FAMILYPLANUSERCOUNT$ 位用户以及无限制的家庭共享的高级账户,通过 ", "placeholders": { "price": { "content": "$1", @@ -2773,7 +2760,7 @@ "message": "Bitwarden 家庭版计划。" }, "addons": { - "message": "插件" + "message": "附加项目" }, "premiumAccess": { "message": "高级会员" @@ -3011,7 +2998,7 @@ "message": "移除存储空间将会调整计费总金额,这笔调整费用将按比例作为信用额度抵扣您的下一笔账单费用。" }, "adjustedStorage": { - "message": "已调整 $AMOUNT$ GB 的存储空间。", + "message": "调整了 $AMOUNT$ GB 存储空间。", "placeholders": { "amount": { "content": "$1", @@ -3121,7 +3108,7 @@ "message": "适用于个人使用,与家人和朋友共享。" }, "planNameTeams": { - "message": "团队" + "message": "团队版" }, "planDescTeams": { "message": "适用于企业和其他团队组织。" @@ -3130,7 +3117,7 @@ "message": "团队入门版" }, "planNameEnterprise": { - "message": "企业" + "message": "企业版" }, "planDescEnterprise": { "message": "适用于企业和其他大型组织。" @@ -3232,7 +3219,7 @@ } }, "trialThankYou": { - "message": "感谢您注册 Bitwarden $PLAN$!", + "message": "感谢您注册适用于 $PLAN$ 的 Bitwarden!", "placeholders": { "plan": { "content": "$1", @@ -3259,7 +3246,7 @@ } }, "trialConfirmationEmail": { - "message": "我们已经发送了一封确认邮件到您的团队的计费电子邮箱 " + "message": "我们已经发送了一封确认邮件到您团队的计费电子邮箱 " }, "monthly": { "message": "每月" @@ -4107,7 +4094,7 @@ "message": "正在生成风险洞察..." }, "updateBrowserDesc": { - "message": "您使用的是不受支持的 Web 浏览器。网页密码库可能无法正常运行。" + "message": "您使用的是不受支持的网页浏览器。网页密码库可能无法正常运行。" }, "youHaveAPendingLoginRequest": { "message": "您有一个来自其他设备的待处理登录请求。" @@ -4378,7 +4365,7 @@ "description": "Seat = User Seat" }, "subscriptionDesc": { - "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的用户超过了您的订阅席位,您将立即收到按比例的额外用户费用。" + "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的用户超过了您的订阅席位,您将立即收到按比例的附加用户费用。" }, "subscriptionUserSeats": { "message": "您的订阅一共允许 $COUNT$ 位成员。", @@ -4405,10 +4392,10 @@ "message": "附加选项" }, "additionalOptionsDesc": { - "message": "如需更多订阅管理的帮助,请联系客服支持。" + "message": "如需更多管理您的订阅的帮助,请联系客服支持。" }, "subscriptionUserSeatsUnlimitedAutoscale": { - "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的成员超过了您的订阅席位,您将立即收到按比例的额外成员费用。" + "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的成员超过了您的订阅席位,您将立即收到按比例的附加成员费用。" }, "smStandaloneTrialSeatCountUpdateMessageFragment1": { "message": "如果您想要添加额外的" @@ -4417,7 +4404,7 @@ "message": "无捆绑优惠的席位,请联系" }, "subscriptionUserSeatsLimitedAutoscale": { - "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的成员超过了您的订阅席位,您将立即收到按比例的额外成员费用,直到达到您的 $MAX$ 席位限制。", + "message": "调整订阅将导致按比例调整您的计费总金额。如果新邀请的成员超过了您的订阅席位,您将立即收到按比例的附加成员费用,直到达到您的 $MAX$ 席位限制。", "placeholders": { "max": { "content": "$1", @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ 已上移,位置 $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ 已下移,位置 $INDEX$ / $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "更新加密密钥时,无法解密您的文件夹。要继续更新,必须删除文件夹。继续操作不会删除任何密码库项目。" }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "组织的所有者和管理员不受此策略的约束。" }, + "limitSendViews": { + "message": "查看次数限制" + }, + "limitSendViewsHint": { + "message": "达到限额后,任何人无法查看此 Send。", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "剩余 $ACCESSCOUNT$ 次查看次数", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send 详细信息", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "要分享的文本" + }, "sendTypeFile": { "message": "文件" }, "sendTypeText": { "message": "文本" }, + "sendPasswordDescV3": { + "message": "添加一个用于接收者访问此 Send 的可选密码。", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "新增 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "删除 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "确定要删除此 Send 吗?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "这是什么类型的 Send?", + "deleteSendPermanentConfirmation": { + "message": "您确定要永久删除这个 Send 吗?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "删除日期" }, - "deletionDateDesc": { - "message": "此 Send 将在指定的日期和时间后被永久删除。", + "deletionDateDescV2": { + "message": "此 Send 将在此日期后被永久删除。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "最大访问次数" }, - "maxAccessCountDesc": { - "message": "设置后,当达到最大访问次数时用户将不再能够访问此 Send。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "当前访问次数" - }, - "sendPasswordDesc": { - "message": "可选。用户需要提供密码才能访问此 Send。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "关于此 Send 的私密备注。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "已禁用" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "确定要移除此密码吗?" }, - "hideEmail": { - "message": "对接收者隐藏我的电子邮箱地址。" - }, - "disableThisSend": { - "message": "停用此 Send 确保无人能访问它。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "所有 Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "待删除" }, + "hideTextByDefault": { + "message": "默认隐藏文本" + }, "expired": { "message": "已过期" }, @@ -5380,7 +5406,7 @@ "message": "组织的所有者和管理员不受此策略的约束。" }, "personalOwnershipSubmitError": { - "message": "由于某个企业策略,您不能将项目保存到您的个人密码库。将所有权选项更改为组织,并从可用的集合中选择。" + "message": "由于某个企业策略,您不能将项目保存到您的个人密码库。请将所有权选项更改为组织,然后选择可用的集合。" }, "disableSend": { "message": "禁用 Send" @@ -5415,13 +5441,6 @@ "message": "创建或编辑 Send 时,始终向接收者显示成员的电子邮箱地址。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "以下组织策略目前正起作用:" - }, - "sendDisableHideEmailInEffect": { - "message": "创建或编辑 Send 时,不允许用户对接收者隐藏他们的电子邮箱地址。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "修改了策略 $ID$。", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "移除组织用户的个人所有权" }, - "textHiddenByDefault": { - "message": "访问此 Send 时,默认隐藏文本内容", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "用于描述此 Send 的友好名称。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "您想在此 Send 中附加的文本。" - }, - "sendFileDesc": { - "message": "您想在此 Send 中附加的文件。" - }, - "copySendLinkOnSave": { - "message": "保存时复制链接到剪贴板以便分享此 Send。" - }, - "sendLinkLabel": { - "message": "Send 链接", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "保存您的删除和过期日期时出错。" }, + "hideYourEmail": { + "message": "对查看者隐藏您的电子邮箱地址。" + }, "webAuthnFallbackMsg": { "message": "要验证您的 2FA,请点击下面的按钮。" }, @@ -5976,7 +5977,7 @@ "message": "您已被邀请加入上面列出的提供商。要接受邀请,您需要登录或创建一个新的 Bitwarden 账户。" }, "providerInviteAcceptFailed": { - "message": "无法接受邀请。请联系提供商管理员发送新的邀请。" + "message": "无法接受邀请。请向提供商管理员请求发送新的邀请。" }, "providerInviteAcceptedDesc": { "message": "管理员确认您的成员资格后,您就可以访问此提供商了。届时我们会向您发送一封电子邮件。" @@ -6079,7 +6080,7 @@ "message": "为允许的应用程序自动登录用户" }, "automaticAppLoginDesc": { - "message": "从您配置的身份提供程序启动的 App 的登录表单将自动填写并提交。" + "message": "从您配置的身份提供程序启动的 App 的登录表单将自动填充并提交。" }, "automaticAppLoginIdpHostLabel": { "message": "身份提供程序主机" @@ -6188,7 +6189,7 @@ "message": "为所有现有成员和新成员激活浏览器扩展上的页面加载时的自动填充设置。" }, "experimentalFeature": { - "message": "不完整或不信任的网站可以使用页面加载时自动填充。" + "message": "被入侵或不受信任的网站可以利用页面加载时的自动填充功能。" }, "learnMoreAboutAutofill": { "message": "进一步了解自动填充" @@ -7162,7 +7163,7 @@ "message": "输入的不是电子邮箱地址。" }, "inputMinLength": { - "message": "至少输入 $COUNT$ 个字符。", + "message": "输入长度不能低于 $COUNT$ 个字符。", "placeholders": { "count": { "content": "$1", @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "用户数量" }, - "loggingInAs": { - "message": "正登录为" - }, - "notYou": { - "message": "不是您吗?" - }, "pickAnAvatarColor": { "message": "选择头像颜色" }, @@ -7836,7 +7831,7 @@ "message": "自动域名验证" }, "automaticDomainVerificationProcess": { - "message": "Bitwarden 将尝试在 72 小时内验证此域名 3 次。如果此域名无法验证,请检查您的主机中的 DNS 记录并手动验证。如果此域名未通过验证,7 天内将从您的组织中移除。" + "message": "Bitwarden 将在最初的 72 小时内尝试验证域名 3 次。如果此域名无法验证,请检查您主机中的 DNS 记录并手动验证。如果此域名在 7 天内未验证,它将被从您的组织中移除。" }, "invalidDomainNameMessage": { "message": "输入的格式无效。格式:mydomain.com。子域名需要单独的条目进行验证。" @@ -7926,7 +7921,7 @@ } }, "domainNotVerifiedEvent": { - "message": "$DOMAIN$ 无法验证", + "message": "$DOMAIN$ 未验证", "placeholders": { "DOMAIN": { "content": "$1", @@ -8034,7 +8029,7 @@ } }, "teamsStarterPlanInvLimitReachedNoManageBilling": { - "message": "团队入门版计划最多拥有 $SEATCOUNT$ 位成员。要升级您的计划及邀请更多成员,请联系您的组织所有者。", + "message": "团队入门版计划最多拥有 $SEATCOUNT$ 位成员。要升级您的计划并邀请更多成员,请联系您的组织所有者。", "placeholders": { "seatcount": { "content": "$1", @@ -8043,7 +8038,7 @@ } }, "freeOrgMaxCollectionReachedManageBilling": { - "message": "免费组织最多拥有 $COLLECTIONCOUNT$ 个集合。升级到付费计划以添加更多集合。", + "message": "免费组织最多拥有 $COLLECTIONCOUNT$ 个集合。要添加更多集合,请升级到付费计划。", "placeholders": { "COLLECTIONCOUNT": { "content": "$1", @@ -8357,7 +8352,7 @@ "message": "忽略" }, "notAvailableForFreeOrganization": { - "message": "此功能不适用于免费组织。请联系您的组织所有者寻求升级。" + "message": "此功能不适用于免费组织。请联系您的组织所有者升级。" }, "smProjectSecretsNoItemsNoAccess": { "message": "请联系您的组织的管理员来管理此工程的机密。", @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "请求管理员批准" }, - "approveWithMasterPassword": { - "message": "使用主密码批准" - }, "trustedDeviceEncryption": { "message": "受信任设备加密" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的请求已发送给您的管理员。" }, - "youWillBeNotifiedOnceApproved": { - "message": "批准后,您将收到通知。" - }, "troubleLoggingIn": { "message": "登录遇到问题吗?" }, @@ -8839,10 +8828,10 @@ "message": "已达到席位限制" }, "contactYourProvider": { - "message": "请联系您的提供商购买更多席位。" + "message": "请联系您的提供商购买附加席位。" }, "seatLimitReachedContactYourProvider": { - "message": "已达到席位限制。请联系您的提供商购买更多席位。" + "message": "已达到席位限制。请联系您的提供商购买附加席位。" }, "collectionAccessRestricted": { "message": "集合访问权限受限" @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "使用适合您平台的实施指南为 Bitwarden 配置设备管理。" }, + "deviceIdMissing": { + "message": "缺少设备 ID" + }, + "deviceTypeMissing": { + "message": "缺少设备类型" + }, + "deviceCreationDateMissing": { + "message": "缺少设备创建日期" + }, "desktopRequired": { "message": "需要桌面端" }, @@ -9604,7 +9602,7 @@ "message": "通过审计成员访问权限来识别安全风险" }, "onlyAvailableForEnterpriseOrganization": { - "message": "通过升级为企业计划,快速查看整个组织的成员访问权限。" + "message": "通过升级为企业版计划,快速查看整个组织的成员访问权限。" }, "date": { "message": "日期" @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "进一步了解 Bitwarden API" }, + "fileSend": { + "message": "文件 Send" + }, "fileSends": { "message": "文件 Send" }, + "textSend": { + "message": "文本 Send" + }, "textSends": { "message": "文本 Send" }, @@ -9897,7 +9901,7 @@ } }, "familiesPlanInvLimitReachedNoManageBilling": { - "message": "家庭组织最多拥有 $SEATCOUNT$ 位成员。要升级,请联系您的组织所有者。", + "message": "家庭组织最多拥有 $SEATCOUNT$ 位成员。请联系您的组织所有者升级。", "placeholders": { "seatcount": { "content": "$1", @@ -10017,7 +10021,7 @@ "message": "当前" }, "secretsManagerSubscriptionInfo": { - "message": "您的机密管理器订阅将根据选定的计划升级" + "message": "您的机密管理器订阅将基于选择的计划升级" }, "bitwardenPasswordManager": { "message": "Bitwarden 密码管理器" @@ -10084,10 +10088,6 @@ "message": "包含特殊字符", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "添加附件" }, @@ -10192,7 +10192,7 @@ "message": "删除成功" }, "freeFamiliesSponsorship": { - "message": "移除免费的 Bitwarden 家庭赞助" + "message": "禁用免费 Bitwarden 家庭赞助" }, "freeFamiliesSponsorshipPolicyDesc": { "message": "不允许成员通过此组织兑换家庭计划。" @@ -10273,16 +10273,16 @@ "message": "重新声明域名" }, "claimDomainNameInputHint": { - "message": "示例:mydomain.com。子域名需要单独的条目才能声明。" + "message": "示例:mydomain.com。子域名需要单独的条目进行声明。" }, "automaticClaimedDomains": { "message": "自动声明域名" }, "automaticDomainClaimProcess": { - "message": "Bitwarden 将在前 72 小时内尝试声明域名 3 次。如果无法声明此域名,请检查主机中的 DNS 记录并手动声明。如果未声明,该域名将在 7 天内从您的组织中移除。" + "message": "Bitwarden 将在最初的 72 小时内尝试声明域名 3 次。如果此域名无法声明,请检查您主机中的 DNS 记录并手动声明。如果此域名在 7 天内未声明,它将被从您的组织中移除。" }, "domainNotClaimed": { - "message": "$DOMAIN$ 未声明。请检查 DNS 记录。", + "message": "$DOMAIN$ 无法声明。请检查您的 DNS 记录。", "placeholders": { "DOMAIN": { "content": "$1", @@ -10300,7 +10300,7 @@ "message": "声明一个域名,以拥有电子邮箱地址与该域名匹配的所有成员账户。成员登录时将可以跳过 SSO 标识符。管理员也可以删除成员账户。" }, "invalidDomainNameClaimMessage": { - "message": "输入的格式无效。格式:mydomain.com。子域名需要单独的条目才能声明。" + "message": "输入的格式无效。格式:mydomain.com。子域名需要单独的条目进行声明。" }, "domainClaimedEvent": { "message": "$DOMAIN$ 已声明", @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "组织名称不能超过 50 个字符。" }, + "sshKeyWrongPassword": { + "message": "您输入的密码不正确。" + }, + "importSshKey": { + "message": "导入" + }, + "confirmSshKeyPassword": { + "message": "确认密码" + }, + "enterSshKeyPasswordDesc": { + "message": "输入 SSH 密钥的密码。" + }, + "enterSshKeyPassword": { + "message": "输入密码" + }, + "invalidSshKey": { + "message": "此 SSH 密钥无效" + }, + "sshKeyTypeUnsupported": { + "message": "不支持此 SSH 密钥类型" + }, + "importSshKeyFromClipboard": { + "message": "从剪贴板导入密钥" + }, + "sshKeyImported": { + "message": "SSH 密钥导入成功" + }, + "copySSHPrivateKey": { + "message": "复制私钥" + }, "openingExtension": { "message": "正在打开 Bitwarden 浏览器扩展" }, @@ -10373,11 +10403,11 @@ "message": "成功打开 Bitwarden 浏览器扩展。您现在可以审查存在风险的密码了。" }, "openExtensionManuallyPart1": { - "message": "我们无法打开 Bitwarden 浏览器扩展。请从工具栏打开 Bitwarden 图标", + "message": "我们无法打开 Bitwarden 浏览器扩展。请从工具栏中点击 Bitwarden 图标", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "openExtensionManuallyPart2": { - "message": "。", + "message": "来打开它。", "description": "This will be used as part of a larger sentence, broken up to include the Bitwarden icon. The full sentence will read 'We had trouble opening the Bitwarden browser extension. Open the Bitwarden icon [Bitwarden Icon] from the toolbar.'" }, "resellerRenewalWarningMsg": { @@ -10487,8 +10517,11 @@ "assignedExceedsAvailable": { "message": "分配的席位超过可用席位。" }, + "changeAtRiskPassword": { + "message": "更改有风险的密码" + }, "removeUnlockWithPinPolicyTitle": { - "message": "移除使用 PIN 码解锁" + "message": "禁用 PIN 码解锁" }, "removeUnlockWithPinPolicyDesc": { "message": "不允许成员使用 PIN 码解锁他们的账户。" @@ -10503,12 +10536,15 @@ } }, "upgradeForFullEvents": { - "message": "升级到团队或企业计划,即可获得对组织事件日志的完整访问权限。" + "message": "升级到团队版或企业版计划,即可获得对组织事件日志的完整访问权限。" }, "upgradeEventLogTitle": { "message": "升级以访问真实的事件日志数据" }, "upgradeEventLogMessage": { "message": "这些事件仅为示例,并不反映您 Bitwarden 组织内的真实事件。" + }, + "cannotCreateCollection": { + "message": "免费组织最多拥有 2 个集合。要添加更多集合,请升级到付费计划。" } } diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index caae6aebce6..beca8f74485 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -201,6 +201,9 @@ "notes": { "message": "備註" }, + "privateNote": { + "message": "Private note" + }, "note": { "message": "備註" }, @@ -425,6 +428,9 @@ "dragToSort": { "message": "透過拖曳來排序" }, + "dragToReorder": { + "message": "Drag to reorder" + }, "cfTypeText": { "message": "文字型" }, @@ -467,6 +473,19 @@ "editFolder": { "message": "編輯資料夾" }, + "editWithName": { + "message": "Edit $ITEM$: $NAME$", + "placeholders": { + "item": { + "content": "$1", + "example": "login" + }, + "name": { + "content": "$2", + "example": "Social" + } + } + }, "newFolder": { "message": "New folder" }, @@ -860,9 +879,6 @@ "filter": { "message": "篩選" }, - "moveSelectedToOrg": { - "message": "移動所選至組織" - }, "deleteSelected": { "message": "刪除所選" }, @@ -918,15 +934,6 @@ } } }, - "movedItemsToOrg": { - "message": "將已選取項目移動至 $ORGNAME$", - "placeholders": { - "orgname": { - "content": "$1", - "example": "Company Name" - } - } - }, "itemsMovedToOrg": { "message": "Items moved to $ORGNAME$", "placeholders": { @@ -1029,6 +1036,9 @@ "no": { "message": "否" }, + "location": { + "message": "Location" + }, "loginOrCreateNewAccount": { "message": "登入或建立帳戶以存取您的安全密碼庫。" }, @@ -1179,8 +1189,8 @@ "authenticationSessionTimedOut": { "message": "此驗證工作階段已逾時。請重試登入。" }, - "verifyIdentity": { - "message": "核實你的身份" + "verifyYourIdentity": { + "message": "Verify your Identity" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -1264,12 +1274,6 @@ "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { "message": "Enter your account email address and your password hint will be sent to you" }, - "passwordHint": { - "message": "密碼提示" - }, - "enterEmailToGetHint": { - "message": "請輸入您的帳户電子郵件地址以接收主密碼提示。" - }, "getMasterPasswordHint": { "message": "取得主密碼提示" }, @@ -1555,9 +1559,6 @@ "moveToOrgDesc": { "message": "選擇您希望將這個項目移動至哪個組織。項目的擁有權將會轉移至該組織。轉移之後,您將不再是此項目的直接擁有者。" }, - "moveManyToOrgDesc": { - "message": "選擇您希望將這些項目移動至哪個組織。項目的擁有權將會轉移至該組織。轉移之後,您將不再是這些項目的直接擁有者。" - }, "collectionsDesc": { "message": "編輯與此項目共享的集合。只有具有這些集合存取權限的組織使用者才能夠看到此項目。" }, @@ -1591,23 +1592,6 @@ } } }, - "moveSelectedItemsCountDesc": { - "message": "你選擇了 $COUNT$ 個項目。當中有 $MOVEABLE_COUNT$ 個項目可移動到組織當中,而有 $NONMOVEABLE_COUNT$ 個無法移動。", - "placeholders": { - "count": { - "content": "$1", - "example": "10" - }, - "moveable_count": { - "content": "$2", - "example": "8" - }, - "nonmoveable_count": { - "content": "$3", - "example": "2" - } - } - }, "verificationCodeTotp": { "message": "驗證碼 (TOTP)" }, @@ -2252,6 +2236,9 @@ "revokeAccess": { "message": "撤銷存取權限" }, + "revoke": { + "message": "Revoke" + }, "twoStepLoginProviderEnabled": { "message": "您的帳戶已啟用此兩步驟登入方式。" }, @@ -4521,6 +4508,40 @@ } } }, + "reorderFieldUp": { + "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, + "reorderFieldDown": { + "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "placeholders": { + "label": { + "content": "$1", + "example": "Custom field" + }, + "index": { + "content": "$2", + "example": "1" + }, + "length": { + "content": "$3", + "example": "3" + } + } + }, "keyUpdateFoldersFailed": { "message": "When updating your encryption key, your folders could not be decrypted. To continue with the update, your folders must be deleted. No vault items will be deleted if you proceed." }, @@ -5081,12 +5102,40 @@ "requireSsoExemption": { "message": "組織擁有者與管理員不受此原則的執行影響。" }, + "limitSendViews": { + "message": "Limit views" + }, + "limitSendViewsHint": { + "message": "No one can view this Send after the limit is reached.", + "description": "Displayed under the limit views field on Send" + }, + "limitSendViewsCount": { + "message": "$ACCESSCOUNT$ views left", + "description": "Displayed under the limit views field on Send", + "placeholders": { + "accessCount": { + "content": "$1", + "example": "2" + } + } + }, + "sendDetails": { + "message": "Send details", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeTextToShare": { + "message": "Text to share" + }, "sendTypeFile": { "message": "檔案" }, "sendTypeText": { "message": "文字" }, + "sendPasswordDescV3": { + "message": "Add an optional password for recipients to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, "createSend": { "message": "建立新 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5111,19 +5160,15 @@ "message": "刪除 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "deleteSendConfirmation": { - "message": "您確定要刪除此 Send 嗎?", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "whatTypeOfSend": { - "message": "這是什麽類型的 Send?", + "deleteSendPermanentConfirmation": { + "message": "Are you sure you want to permanently delete this Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { "message": "刪除日期" }, - "deletionDateDesc": { - "message": "此 Send 將在指定的日期和時間後被永久刪除。", + "deletionDateDescV2": { + "message": "The Send will be permanently deleted on this date.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -5136,21 +5181,6 @@ "maxAccessCount": { "message": "最大存取次數" }, - "maxAccessCountDesc": { - "message": "如果設定此選項,當達到最大存取次數時,使用者將無法再次存取此 Send。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "currentAccessCount": { - "message": "目前存取次數" - }, - "sendPasswordDesc": { - "message": "選用。使用者需提供密碼才能存取此 Send。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNotesDesc": { - "message": "關於此 Send 的私人備註。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "disabled": { "message": "已停用" }, @@ -5177,13 +5207,6 @@ "removePasswordConfirmation": { "message": "您確定要移除此密碼嗎?" }, - "hideEmail": { - "message": "對收件人隱藏我的電子郵件地址。" - }, - "disableThisSend": { - "message": "停用此 Send 以阻止任何人存取。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "allSends": { "message": "所有 Send" }, @@ -5194,6 +5217,9 @@ "pendingDeletion": { "message": "等待刪除" }, + "hideTextByDefault": { + "message": "Hide text by default" + }, "expired": { "message": "已逾期" }, @@ -5415,13 +5441,6 @@ "message": "建立或編輯 Send 時,始終對收件人顯示成員的電子郵件地址。", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, - "sendOptionsPolicyInEffect": { - "message": "以下組織原則目前作用中:" - }, - "sendDisableHideEmailInEffect": { - "message": "使用者在建立或編輯 Send 時不允許隱藏他們的電子郵件地址。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "modifiedPolicyId": { "message": "原則 $ID$ 已修改。", "placeholders": { @@ -5521,27 +5540,6 @@ "personalOwnershipCheckboxDesc": { "message": "停用組織使用者的個人擁有權" }, - "textHiddenByDefault": { - "message": "存取此 Send 時,將預設隱藏文字", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendNameDesc": { - "message": "用於描述此 Send 的易記名稱。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendTextDesc": { - "message": "您想要傳送的文字。" - }, - "sendFileDesc": { - "message": "您想要傳送的檔案。" - }, - "copySendLinkOnSave": { - "message": "儲存時複製連結至剪貼簿以便共用此 Send。" - }, - "sendLinkLabel": { - "message": "Send 連結", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "send": { "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -5690,6 +5688,9 @@ "dateParsingError": { "message": "儲存刪除日期和逾期日期時發生錯誤。" }, + "hideYourEmail": { + "message": "Hide your email address from viewers." + }, "webAuthnFallbackMsg": { "message": "要驗證您的 2FA,請點選下方的按鈕。" }, @@ -7275,12 +7276,6 @@ "numberOfUsers": { "message": "使用者數量" }, - "loggingInAs": { - "message": "正登入為" - }, - "notYou": { - "message": "不是您嗎?" - }, "pickAnAvatarColor": { "message": "選擇頭像顏色" }, @@ -8404,9 +8399,6 @@ "requestAdminApproval": { "message": "要求管理員核准" }, - "approveWithMasterPassword": { - "message": "使用主密碼核准" - }, "trustedDeviceEncryption": { "message": "可信任的裝置加密" }, @@ -8621,9 +8613,6 @@ "adminApprovalRequestSentToAdmins": { "message": "您的要求已傳送給您的管理員" }, - "youWillBeNotifiedOnceApproved": { - "message": "核准後將通知您。" - }, "troubleLoggingIn": { "message": "登入時遇到困難?" }, @@ -9349,6 +9338,15 @@ "deviceManagementDesc": { "message": "Configure device management for Bitwarden using the implementation guide for your platform." }, + "deviceIdMissing": { + "message": "Device ID is missing" + }, + "deviceTypeMissing": { + "message": "Device type is missing" + }, + "deviceCreationDateMissing": { + "message": "Device creation date is missing" + }, "desktopRequired": { "message": "Desktop required" }, @@ -9848,9 +9846,15 @@ "learnMoreAboutApi": { "message": "瞭解更多關於 Bitwarden API 的資訊" }, + "fileSend": { + "message": "File Send" + }, "fileSends": { "message": "File Sends" }, + "textSend": { + "message": "Text Send" + }, "textSends": { "message": "Text Sends" }, @@ -10084,10 +10088,6 @@ "message": "包含特殊字元", "description": "Full description for the password generator special characters checkbox" }, - "specialCharactersLabel": { - "message": "!@#$%^&*", - "description": "Label for the password generator special characters checkbox" - }, "addAttachment": { "message": "新增附件" }, @@ -10348,6 +10348,36 @@ "organizationNameMaxLength": { "message": "Organization name cannot exceed 50 characters." }, + "sshKeyWrongPassword": { + "message": "The password you entered is incorrect." + }, + "importSshKey": { + "message": "Import" + }, + "confirmSshKeyPassword": { + "message": "Confirm password" + }, + "enterSshKeyPasswordDesc": { + "message": "Enter the password for the SSH key." + }, + "enterSshKeyPassword": { + "message": "Enter password" + }, + "invalidSshKey": { + "message": "The SSH key is invalid" + }, + "sshKeyTypeUnsupported": { + "message": "The SSH key type is not supported" + }, + "importSshKeyFromClipboard": { + "message": "Import key from clipboard" + }, + "sshKeyImported": { + "message": "SSH key imported successfully" + }, + "copySSHPrivateKey": { + "message": "Copy private key" + }, "openingExtension": { "message": "Opening the Bitwarden browser extension" }, @@ -10487,6 +10517,9 @@ "assignedExceedsAvailable": { "message": "Assigned seats exceed available seats." }, + "changeAtRiskPassword": { + "message": "Change at-risk password" + }, "removeUnlockWithPinPolicyTitle": { "message": "Remove Unlock with PIN" }, @@ -10510,5 +10543,8 @@ }, "upgradeEventLogMessage": { "message": "These events are examples only and do not reflect real events within your Bitwarden organization." + }, + "cannotCreateCollection": { + "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections." } } diff --git a/apps/web/src/scss/buttons.scss b/apps/web/src/scss/buttons.scss index 881f853e76f..f026aa898e7 100644 --- a/apps/web/src/scss/buttons.scss +++ b/apps/web/src/scss/buttons.scss @@ -184,7 +184,8 @@ } } -button.no-btn { +button.no-btn, +a.no-btn { background: transparent; border: none; padding: 0; diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js index 28fe5ce1f35..d172ea95c71 100644 --- a/apps/web/webpack.config.js +++ b/apps/web/webpack.config.js @@ -81,6 +81,7 @@ const moduleRules = [ loader: "babel-loader", options: { configFile: "../../babel.config.json", + cacheDirectory: NODE_ENV !== "production", }, }, ], @@ -349,6 +350,20 @@ const webpackConfig = { styles: ["./src/scss/styles.scss", "./src/scss/tailwind.css"], theme_head: "./src/theme.ts", }, + cache: + NODE_ENV === "production" + ? false + : { + type: "filesystem", + allowCollectingMemory: true, + cacheDirectory: path.resolve(__dirname, "../../node_modules/.cache/webpack"), + buildDependencies: { + config: [__filename], + }, + }, + snapshot: { + unmanagedPaths: [path.resolve(__dirname, "../../node_modules/@bitwarden/")], + }, optimization: { splitChunks: { cacheGroups: { @@ -361,6 +376,7 @@ const webpackConfig = { }, }, }, + minimize: NODE_ENV === "production", minimizer: [ new TerserPlugin({ terserOptions: { diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts index d32d6fcfbc7..b0f65cd3f76 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts @@ -13,6 +13,7 @@ export class PendingAuthRequestView implements View { requestDeviceIdentifier: string; requestDeviceType: string; requestIpAddress: string; + requestCountryName: string; creationDate: Date; static fromResponse(response: PendingOrganizationAuthRequestResponse): PendingAuthRequestView { diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-organization-auth-request.response.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-organization-auth-request.response.ts index b4854eea4aa..0f686d17edd 100644 --- a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-organization-auth-request.response.ts +++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-organization-auth-request.response.ts @@ -9,6 +9,7 @@ export class PendingOrganizationAuthRequestResponse extends BaseResponse { requestDeviceIdentifier: string; requestDeviceType: string; requestIpAddress: string; + requestCountryName: string; creationDate: string; constructor(response: any) { @@ -21,6 +22,7 @@ export class PendingOrganizationAuthRequestResponse extends BaseResponse { this.requestDeviceIdentifier = this.getResponseProperty("RequestDeviceIdentifier"); this.requestDeviceType = this.getResponseProperty("RequestDeviceType"); this.requestIpAddress = this.getResponseProperty("RequestIpAddress"); + this.requestCountryName = this.getResponseProperty("RequestCountryName"); this.creationDate = this.getResponseProperty("CreationDate"); } } diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.html b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.html index 7723324781b..cafd0744a8f 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.html +++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.html @@ -1,7 +1,7 @@ diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.html b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.html index c292d51ebda..adf9fcd2dcf 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.html +++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.html @@ -24,7 +24,7 @@ @@ -74,7 +74,7 @@ {{ orgDomain.lastCheckedDate | date: "medium" }} - + + - +

    {{ "taxInformation" | i18n }}

    {{ "taxInformationDesc" | i18n }}

    -
    +
    diff --git a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts index 02fa29578d9..3d9388877fd 100644 --- a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts +++ b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts @@ -2,17 +2,26 @@ // @ts-strict-ignore import { Component, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; -import { Subject, concatMap, takeUntil } from "rxjs"; +import { concatMap, lastValueFrom, Subject, takeUntil } from "rxjs"; import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction"; +import { PaymentMethodType } from "@bitwarden/common/billing/enums"; import { TaxInformation } from "@bitwarden/common/billing/models/domain"; import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request"; +import { VerifyBankAccountRequest } from "@bitwarden/common/billing/models/request/verify-bank-account.request"; import { ProviderPlanResponse, ProviderSubscriptionResponse, } from "@bitwarden/common/billing/models/response/provider-subscription-response"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { ToastService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; +import { BillingNotificationService } from "@bitwarden/web-vault/app/billing/services/billing-notification.service"; +import { + AdjustPaymentDialogComponent, + AdjustPaymentDialogResultType, +} from "@bitwarden/web-vault/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog.component"; @Component({ selector: "app-provider-subscription", @@ -29,11 +38,18 @@ export class ProviderSubscriptionComponent implements OnInit, OnDestroy { protected readonly TaxInformation = TaxInformation; + protected readonly allowProviderPaymentMethod$ = this.configService.getFeatureFlag$( + FeatureFlag.PM18794_ProviderPaymentMethod, + ); + constructor( private billingApiService: BillingApiServiceAbstraction, private i18nService: I18nService, private route: ActivatedRoute, + private billingNotificationService: BillingNotificationService, + private dialogService: DialogService, private toastService: ToastService, + private configService: ConfigService, ) {} async ngOnInit() { @@ -54,19 +70,49 @@ export class ProviderSubscriptionComponent implements OnInit, OnDestroy { return; } this.loading = true; - this.subscription = await this.billingApiService.getProviderSubscription(this.providerId); - this.totalCost = - ((100 - this.subscription.discountPercentage) / 100) * this.sumCost(this.subscription.plans); - this.loading = false; + try { + this.subscription = await this.billingApiService.getProviderSubscription(this.providerId); + this.totalCost = + ((100 - this.subscription.discountPercentage) / 100) * + this.sumCost(this.subscription.plans); + } catch (error) { + this.billingNotificationService.handleError(error); + } finally { + this.loading = false; + } } + protected updatePaymentMethod = async (): Promise => { + const dialogRef = AdjustPaymentDialogComponent.open(this.dialogService, { + data: { + initialPaymentMethod: this.subscription.paymentSource?.type, + providerId: this.providerId, + }, + }); + + const result = await lastValueFrom(dialogRef.closed); + + if (result === AdjustPaymentDialogResultType.Submitted) { + await this.load(); + } + }; + protected updateTaxInformation = async (taxInformation: TaxInformation) => { - const request = ExpandedTaxInfoUpdateRequest.From(taxInformation); - await this.billingApiService.updateProviderTaxInformation(this.providerId, request); + try { + const request = ExpandedTaxInfoUpdateRequest.From(taxInformation); + await this.billingApiService.updateProviderTaxInformation(this.providerId, request); + this.billingNotificationService.showSuccess(this.i18nService.t("updatedTaxInformation")); + } catch (error) { + this.billingNotificationService.handleError(error); + } + }; + + protected verifyBankAccount = async (request: VerifyBankAccountRequest): Promise => { + await this.billingApiService.verifyProviderBankAccount(this.providerId, request); this.toastService.showToast({ variant: "success", title: null, - message: this.i18nService.t("updatedTaxInformation"), + message: this.i18nService.t("verifiedBankAccount"), }); }; @@ -127,4 +173,28 @@ export class ProviderSubscriptionComponent implements OnInit, OnDestroy { return "month"; } } + + protected get paymentSourceClasses() { + if (this.subscription.paymentSource == null) { + return []; + } + switch (this.subscription.paymentSource.type) { + case PaymentMethodType.Card: + return ["bwi-credit-card"]; + case PaymentMethodType.BankAccount: + return ["bwi-bank"]; + case PaymentMethodType.Check: + return ["bwi-money"]; + case PaymentMethodType.PayPal: + return ["bwi-paypal text-primary"]; + default: + return []; + } + } + + protected get updatePaymentSourceButtonText(): string { + const key = + this.subscription.paymentSource == null ? "addPaymentMethod" : "changePaymentMethod"; + return this.i18nService.t(key); + } } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts index 7eb28b2bc2d..698448c2d06 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts @@ -16,6 +16,8 @@ import { firstValueFrom, of, filter, + catchError, + from, } from "rxjs"; import { I18nPipe } from "@bitwarden/angular/platform/pipes/i18n.pipe"; @@ -32,6 +34,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { DialogService } from "@bitwarden/components"; +import { BillingNotificationService } from "@bitwarden/web-vault/app/billing/services/billing-notification.service"; import { TrialFlowService } from "@bitwarden/web-vault/app/billing/services/trial-flow.service"; import { FreeTrial } from "@bitwarden/web-vault/app/billing/types/free-trial"; @@ -126,6 +129,7 @@ export class OverviewComponent implements OnInit, OnDestroy { private organizationApiService: OrganizationApiServiceAbstraction, private trialFlowService: TrialFlowService, private organizationBillingService: OrganizationBillingServiceAbstraction, + private billingNotificationService: BillingNotificationService, ) {} ngOnInit() { @@ -161,12 +165,18 @@ export class OverviewComponent implements OnInit, OnDestroy { combineLatest([ of(org), this.organizationApiService.getSubscription(org.id), - this.organizationBillingService.getPaymentSource(org.id), + from(this.organizationBillingService.getPaymentSource(org.id)).pipe( + catchError((error: unknown) => { + this.billingNotificationService.handleError(error); + return of(null); + }), + ), ]), ), map(([org, sub, paymentSource]) => { return this.trialFlowService.checkForOrgsWithUpcomingPaymentIssues(org, sub, paymentSource); }), + filter((result) => result !== null), takeUntil(this.destroy$), ); diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts index 20dc320de20..68ec7bb2496 100644 --- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts +++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts @@ -15,7 +15,6 @@ import { DrawerType, PasswordHealthReportApplicationsResponse, } from "@bitwarden/bit-common/tools/reports/risk-insights/models/password-health"; -// eslint-disable-next-line no-restricted-imports -- used for dependency injection import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { devFlagEnabled } from "@bitwarden/common/platform/misc/flags"; diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.html b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.html index 6483a196a3f..f2e550cb68e 100644 --- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.html +++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.html @@ -35,7 +35,12 @@
    - + {{ "members" | i18n }} @@ -44,25 +49,23 @@ {{ "items" | i18n }} - - - -
    - -
    - + + +
    + +
    + -
    - {{ r.email }} -
    +
    + {{ row.email }}
    - - {{ r.groupsCount }} - {{ r.collectionsCount }} - {{ r.itemsCount }} - +
    + + {{ row.groupsCount }} + {{ row.collectionsCount }} + {{ row.itemsCount }}
    - + diff --git a/eslint.config.mjs b/eslint.config.mjs index 2d7c91521f9..9d93d1118c0 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -27,6 +27,9 @@ export default tseslint.config( importPlugin.flatConfigs.typescript, eslintConfigPrettier, // Disables rules that conflict with Prettier ], + linterOptions: { + reportUnusedDisableDirectives: "error", + }, plugins: { rxjs: rxjs, "rxjs-angular": angularRxjs, diff --git a/libs/admin-console/src/common/collections/models/collection.ts b/libs/admin-console/src/common/collections/models/collection.ts index f14ccb20141..5b6f1a6fb7a 100644 --- a/libs/admin-console/src/common/collections/models/collection.ts +++ b/libs/admin-console/src/common/collections/models/collection.ts @@ -39,11 +39,10 @@ export class Collection extends Domain { } decrypt(orgKey: OrgKey): Promise { - return this.decryptObj( + return this.decryptObj( + this, new CollectionView(this), - { - name: null, - }, + ["name"], this.organizationId, orgKey, ); diff --git a/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts b/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts deleted file mode 100644 index 32396c878d9..00000000000 --- a/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts +++ /dev/null @@ -1,307 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, OnDestroy, OnInit } from "@angular/core"; -import { FormBuilder, FormControl } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { - firstValueFrom, - switchMap, - Subject, - catchError, - from, - of, - finalize, - takeUntil, - defer, - throwError, - map, - Observable, - take, -} from "rxjs"; - -import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; -import { - LoginEmailServiceAbstraction, - UserDecryptionOptions, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices/devices.service.abstraction"; -import { PasswordResetEnrollmentServiceAbstraction } from "@bitwarden/common/auth/abstractions/password-reset-enrollment.service.abstraction"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; -import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { UserId } from "@bitwarden/common/types/guid"; -import { ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -enum State { - NewUser, - ExistingUserUntrustedDevice, -} - -type NewUserData = { - readonly state: State.NewUser; - readonly organizationId: string; - readonly userEmail: string; -}; - -type ExistingUserUntrustedDeviceData = { - readonly state: State.ExistingUserUntrustedDevice; - readonly showApproveFromOtherDeviceBtn: boolean; - readonly showReqAdminApprovalBtn: boolean; - readonly showApproveWithMasterPasswordBtn: boolean; - readonly userEmail: string; -}; - -type Data = NewUserData | ExistingUserUntrustedDeviceData; - -@Directive() -export class BaseLoginDecryptionOptionsComponentV1 implements OnInit, OnDestroy { - private destroy$ = new Subject(); - - protected State = State; - - protected data?: Data; - protected loading = true; - - private email$: Observable; - - activeAccountId: UserId; - - // Remember device means for the user to trust the device - rememberDeviceForm = this.formBuilder.group({ - rememberDevice: [true], - }); - - get rememberDevice(): FormControl { - return this.rememberDeviceForm?.controls.rememberDevice; - } - - constructor( - protected formBuilder: FormBuilder, - protected devicesService: DevicesServiceAbstraction, - protected stateService: StateService, - protected router: Router, - protected activatedRoute: ActivatedRoute, - protected messagingService: MessagingService, - protected tokenService: TokenService, - protected loginEmailService: LoginEmailServiceAbstraction, - protected organizationApiService: OrganizationApiServiceAbstraction, - protected keyService: KeyService, - protected organizationUserApiService: OrganizationUserApiService, - protected apiService: ApiService, - protected i18nService: I18nService, - protected validationService: ValidationService, - protected deviceTrustService: DeviceTrustServiceAbstraction, - protected platformUtilsService: PlatformUtilsService, - protected userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - protected passwordResetEnrollmentService: PasswordResetEnrollmentServiceAbstraction, - protected ssoLoginService: SsoLoginServiceAbstraction, - protected accountService: AccountService, - protected toastService: ToastService, - ) {} - - async ngOnInit() { - this.loading = true; - this.activeAccountId = (await firstValueFrom(this.accountService.activeAccount$))?.id; - this.email$ = this.accountService.activeAccount$.pipe( - map((a) => a?.email), - catchError((err: unknown) => { - this.validationService.showError(err); - return of(undefined); - }), - takeUntil(this.destroy$), - ); - - this.setupRememberDeviceValueChanges(); - - // Persist user choice from state if it exists - await this.setRememberDeviceDefaultValue(); - - try { - const userDecryptionOptions = await firstValueFrom( - this.userDecryptionOptionsService.userDecryptionOptions$, - ); - - // see sso-login.strategy - to determine if a user is new or not it just checks if there is a key on the token response.. - // can we check if they have a user key or master key in crypto service? Would that be sufficient? - if ( - !userDecryptionOptions?.trustedDeviceOption?.hasAdminApproval && - !userDecryptionOptions?.hasMasterPassword - ) { - // We are dealing with a new account if: - // - User does not have admin approval (i.e. has not enrolled into admin reset) - // - AND does not have a master password - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.loadNewUserData(); - } else { - this.loadUntrustedDeviceData(userDecryptionOptions); - } - - // Note: this is probably not a comprehensive write up of all scenarios: - - // If the TDE feature flag is enabled and TDE is configured for the org that the user is a member of, - // then new and existing users can be redirected here after completing the SSO flow (and 2FA if enabled). - - // First we must determine user type (new or existing): - - // New User - // - present user with option to remember the device or not (trust the device) - // - present a continue button to proceed to the vault - // - loadNewUserData() --> will need to load enrollment status and user email address. - - // Existing User - // - Determine if user is an admin with access to account recovery in admin console - // - Determine if user has a MP or not, if not, they must be redirected to set one (see PM-1035) - // - Determine if device is trusted or not via device crypto service (method not yet written) - // - If not trusted, present user with login decryption options (approve from other device, approve with master password, request admin approval) - // - loadUntrustedDeviceData() - } catch (err) { - this.validationService.showError(err); - } - } - - private async setRememberDeviceDefaultValue() { - const rememberDeviceFromState = await this.deviceTrustService.getShouldTrustDevice( - this.activeAccountId, - ); - - const rememberDevice = rememberDeviceFromState ?? true; - - this.rememberDevice.setValue(rememberDevice); - } - - private setupRememberDeviceValueChanges() { - this.rememberDevice.valueChanges - .pipe( - switchMap((value) => - defer(() => this.deviceTrustService.setShouldTrustDevice(this.activeAccountId, value)), - ), - takeUntil(this.destroy$), - ) - .subscribe(); - } - - async loadNewUserData() { - const autoEnrollStatus$ = defer(() => - this.ssoLoginService.getActiveUserOrganizationSsoIdentifier(this.activeAccountId), - ).pipe( - switchMap((organizationIdentifier) => { - if (organizationIdentifier == undefined) { - return throwError(() => new Error(this.i18nService.t("ssoIdentifierRequired"))); - } - - return from(this.organizationApiService.getAutoEnrollStatus(organizationIdentifier)); - }), - catchError((err: unknown) => { - this.validationService.showError(err); - return of(undefined); - }), - ); - - const autoEnrollStatus = await firstValueFrom(autoEnrollStatus$); - const email = await firstValueFrom(this.email$); - - this.data = { state: State.NewUser, organizationId: autoEnrollStatus.id, userEmail: email }; - this.loading = false; - } - - loadUntrustedDeviceData(userDecryptionOptions: UserDecryptionOptions) { - this.loading = true; - - this.email$ - .pipe( - take(1), - finalize(() => { - this.loading = false; - }), - ) - .subscribe((email) => { - const showApproveFromOtherDeviceBtn = - userDecryptionOptions?.trustedDeviceOption?.hasLoginApprovingDevice || false; - - const showReqAdminApprovalBtn = - !!userDecryptionOptions?.trustedDeviceOption?.hasAdminApproval || false; - - const showApproveWithMasterPasswordBtn = userDecryptionOptions?.hasMasterPassword || false; - - const userEmail = email; - - this.data = { - state: State.ExistingUserUntrustedDevice, - showApproveFromOtherDeviceBtn, - showReqAdminApprovalBtn, - showApproveWithMasterPasswordBtn, - userEmail, - }; - }); - } - - async approveFromOtherDevice() { - if (this.data.state !== State.ExistingUserUntrustedDevice) { - return; - } - - this.loginEmailService.setLoginEmail(this.data.userEmail); - await this.router.navigate(["/login-with-device"]); - } - - async requestAdminApproval() { - this.loginEmailService.setLoginEmail(this.data.userEmail); - await this.router.navigate(["/admin-approval-requested"]); - } - - async approveWithMasterPassword() { - await this.router.navigate(["/lock"], { queryParams: { from: "login-initiated" } }); - } - - async createUser() { - if (this.data.state !== State.NewUser) { - return; - } - - // this.loading to support clients without async-actions-support - this.loading = true; - // errors must be caught in child components to prevent navigation - try { - const { publicKey, privateKey } = await this.keyService.initAccount(); - const keysRequest = new KeysRequest(publicKey, privateKey.encryptedString); - await this.apiService.postAccountKeys(keysRequest); - - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("accountSuccessfullyCreated"), - }); - - await this.passwordResetEnrollmentService.enroll(this.data.organizationId); - - if (this.rememberDeviceForm.value.rememberDevice) { - await this.deviceTrustService.trustDevice(this.activeAccountId); - } - } finally { - this.loading = false; - } - } - - logOut() { - this.loading = true; // to avoid an awkward delay in browser extension - this.messagingService.send("logout"); - } - - ngOnDestroy(): void { - this.destroy$.next(); - this.destroy$.complete(); - } -} diff --git a/libs/angular/src/auth/components/change-password.component.ts b/libs/angular/src/auth/components/change-password.component.ts index ea2f9695768..2582d6a7103 100644 --- a/libs/angular/src/auth/components/change-password.component.ts +++ b/libs/angular/src/auth/components/change-password.component.ts @@ -6,7 +6,7 @@ import { Subject, firstValueFrom, map, takeUntil } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/libs/angular/src/auth/components/environment-selector.component.ts b/libs/angular/src/auth/components/environment-selector.component.ts index c984b7f0cba..16a249dda97 100644 --- a/libs/angular/src/auth/components/environment-selector.component.ts +++ b/libs/angular/src/auth/components/environment-selector.component.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { animate, state, style, transition, trigger } from "@angular/animations"; import { ConnectedPosition } from "@angular/cdk/overlay"; import { Component, EventEmitter, Output, Input, OnInit, OnDestroy } from "@angular/core"; @@ -7,8 +5,6 @@ import { ActivatedRoute } from "@angular/router"; import { Observable, map, Subject, takeUntil } from "rxjs"; import { SelfHostedEnvConfigDialogComponent } from "@bitwarden/auth/angular"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService, Region, @@ -88,7 +84,6 @@ export class EnvironmentSelectorComponent implements OnInit, OnDestroy { protected environmentService: EnvironmentService, private route: ActivatedRoute, private dialogService: DialogService, - private configService: ConfigService, private toastService: ToastService, private i18nService: I18nService, ) {} @@ -113,24 +108,18 @@ export class EnvironmentSelectorComponent implements OnInit, OnDestroy { } /** - * Opens the self-hosted settings dialog. - * - * If the `UnauthenticatedExtensionUIRefresh` feature flag is enabled, - * the self-hosted settings dialog is opened directly. Otherwise, the - * `onOpenSelfHostedSettings` event is emitted. + * Opens the self-hosted settings dialog when the self-hosted option is selected. */ - if (option === Region.SelfHosted) { - if (await this.configService.getFeatureFlag(FeatureFlag.UnauthenticatedExtensionUIRefresh)) { - if (await SelfHostedEnvConfigDialogComponent.open(this.dialogService)) { - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("environmentSaved"), - }); - } - } else { - this.onOpenSelfHostedSettings.emit(); - } + if ( + option === Region.SelfHosted && + (await SelfHostedEnvConfigDialogComponent.open(this.dialogService)) + ) { + this.toastService.showToast({ + variant: "success", + title: "", + message: this.i18nService.t("environmentSaved"), + }); + return; } diff --git a/libs/angular/src/auth/components/environment.component.ts b/libs/angular/src/auth/components/environment.component.ts deleted file mode 100644 index 315eb756574..00000000000 --- a/libs/angular/src/auth/components/environment.component.ts +++ /dev/null @@ -1,82 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, EventEmitter, Output } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; - -import { - EnvironmentService, - Region, -} from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -import { ModalService } from "../../services/modal.service"; - -@Directive() -export class EnvironmentComponent { - @Output() onSaved = new EventEmitter(); - - iconsUrl: string; - identityUrl: string; - apiUrl: string; - webVaultUrl: string; - notificationsUrl: string; - baseUrl: string; - showCustom = false; - - constructor( - protected platformUtilsService: PlatformUtilsService, - protected environmentService: EnvironmentService, - protected i18nService: I18nService, - private modalService: ModalService, - private toastService: ToastService, - ) { - this.environmentService.environment$.pipe(takeUntilDestroyed()).subscribe((env) => { - if (env.getRegion() !== Region.SelfHosted) { - this.baseUrl = ""; - this.webVaultUrl = ""; - this.apiUrl = ""; - this.identityUrl = ""; - this.iconsUrl = ""; - this.notificationsUrl = ""; - return; - } - - const urls = env.getUrls(); - this.baseUrl = urls.base || ""; - this.webVaultUrl = urls.webVault || ""; - this.apiUrl = urls.api || ""; - this.identityUrl = urls.identity || ""; - this.iconsUrl = urls.icons || ""; - this.notificationsUrl = urls.notifications || ""; - }); - } - - async submit() { - await this.environmentService.setEnvironment(Region.SelfHosted, { - base: this.baseUrl, - api: this.apiUrl, - identity: this.identityUrl, - webVault: this.webVaultUrl, - icons: this.iconsUrl, - notifications: this.notificationsUrl, - }); - - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("environmentSaved"), - }); - this.saved(); - } - - toggleCustom() { - this.showCustom = !this.showCustom; - } - - protected saved() { - this.onSaved.emit(); - this.modalService.closeAll(); - } -} diff --git a/libs/angular/src/auth/components/hint.component.ts b/libs/angular/src/auth/components/hint.component.ts deleted file mode 100644 index 09648314a9c..00000000000 --- a/libs/angular/src/auth/components/hint.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, OnInit } from "@angular/core"; -import { Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; - -import { LoginEmailServiceAbstraction } from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { PasswordHintRequest } from "@bitwarden/common/auth/models/request/password-hint.request"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ToastService } from "@bitwarden/components"; - -@Directive() -export class HintComponent implements OnInit { - email = ""; - formPromise: Promise; - - protected successRoute = "login"; - protected onSuccessfulSubmit: () => void; - - constructor( - protected router: Router, - protected i18nService: I18nService, - protected apiService: ApiService, - protected platformUtilsService: PlatformUtilsService, - private logService: LogService, - private loginEmailService: LoginEmailServiceAbstraction, - protected toastService: ToastService, - ) {} - - async ngOnInit(): Promise { - this.email = (await firstValueFrom(this.loginEmailService.loginEmail$)) ?? ""; - } - - async submit() { - if (this.email == null || this.email === "") { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccurred"), - message: this.i18nService.t("emailRequired"), - }); - return; - } - if (this.email.indexOf("@") === -1) { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccurred"), - message: this.i18nService.t("invalidEmail"), - }); - return; - } - - try { - this.formPromise = this.apiService.postPasswordHint(new PasswordHintRequest(this.email)); - await this.formPromise; - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("masterPassSent"), - }); - if (this.onSuccessfulSubmit != null) { - this.onSuccessfulSubmit(); - } else if (this.router != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.successRoute]); - } - } catch (e) { - this.logService.error(e); - } - } -} diff --git a/libs/angular/src/auth/components/login-v1.component.ts b/libs/angular/src/auth/components/login-v1.component.ts deleted file mode 100644 index 26903716edf..00000000000 --- a/libs/angular/src/auth/components/login-v1.component.ts +++ /dev/null @@ -1,401 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core"; -import { FormBuilder, Validators } from "@angular/forms"; -import { ActivatedRoute, NavigationSkipped, Router } from "@angular/router"; -import { Subject, firstValueFrom, of } from "rxjs"; -import { switchMap, take, takeUntil } from "rxjs/operators"; - -import { - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, - PasswordLoginCredentials, -} from "@bitwarden/auth/common"; -import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; -import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { UserId } from "@bitwarden/common/types/guid"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { - AllValidationErrors, - FormValidationErrorsService, -} from "../../platform/abstractions/form-validation-errors.service"; - -import { CaptchaProtectedComponent } from "./captcha-protected.component"; - -@Directive() -export class LoginComponentV1 extends CaptchaProtectedComponent implements OnInit, OnDestroy { - @ViewChild("masterPasswordInput", { static: true }) masterPasswordInput: ElementRef; - - showPassword = false; - formPromise: Promise; - - onSuccessfulLogin: () => Promise; - onSuccessfulLoginNavigate: (userId: UserId) => Promise; - onSuccessfulLoginTwoFactorNavigate: () => Promise; - onSuccessfulLoginForceResetNavigate: () => Promise; - - showLoginWithDevice: boolean; - validatedEmail = false; - paramEmailSet = false; - - get emailFormControl() { - return this.formGroup.controls.email; - } - - formGroup = this.formBuilder.nonNullable.group({ - email: ["", [Validators.required, Validators.email]], - masterPassword: [ - "", - [Validators.required, Validators.minLength(Utils.originalMinimumPasswordLength)], - ], - rememberEmail: [false], - }); - - protected twoFactorRoute = "2fa"; - protected successRoute = "vault"; - protected forcePasswordResetRoute = "update-temp-password"; - - protected destroy$ = new Subject(); - - get loggedEmail() { - return this.formGroup.controls.email.value; - } - - constructor( - protected devicesApiService: DevicesApiServiceAbstraction, - protected appIdService: AppIdService, - protected loginStrategyService: LoginStrategyServiceAbstraction, - protected router: Router, - platformUtilsService: PlatformUtilsService, - i18nService: I18nService, - protected stateService: StateService, - environmentService: EnvironmentService, - protected passwordGenerationService: PasswordGenerationServiceAbstraction, - protected cryptoFunctionService: CryptoFunctionService, - protected logService: LogService, - protected ngZone: NgZone, - protected formBuilder: FormBuilder, - protected formValidationErrorService: FormValidationErrorsService, - protected route: ActivatedRoute, - protected loginEmailService: LoginEmailServiceAbstraction, - protected ssoLoginService: SsoLoginServiceAbstraction, - protected toastService: ToastService, - ) { - super(environmentService, i18nService, platformUtilsService, toastService); - } - - async ngOnInit() { - this.route?.queryParams - .pipe( - switchMap((params) => { - if (!params) { - // If no params,loadEmailSettings from state - return this.loadEmailSettings(); - } - - const queryParamsEmail = params.email; - - if (queryParamsEmail != null && queryParamsEmail.indexOf("@") > -1) { - this.formGroup.controls.email.setValue(queryParamsEmail); - this.paramEmailSet = true; - } - - // If paramEmailSet is false, loadEmailSettings from state - return this.paramEmailSet ? of(null) : this.loadEmailSettings(); - }), - takeUntil(this.destroy$), - ) - .subscribe(); - - // If the user navigates to /login from /login, reset the validatedEmail flag - // This should bring the user back to the login screen with the email field - this.router.events.pipe(takeUntil(this.destroy$)).subscribe((event) => { - if (event instanceof NavigationSkipped && event.url === "/login") { - this.validatedEmail = false; - } - }); - - // Backup check to handle unknown case where activatedRoute is not available - // This shouldn't happen under normal circumstances - if (!this.route) { - await this.loadEmailSettings(); - } - } - - ngOnDestroy() { - this.destroy$.next(); - this.destroy$.complete(); - } - - async submit(showToast = true) { - await this.setupCaptcha(); - - this.formGroup.markAllAsTouched(); - - //web - if (this.formGroup.invalid && !showToast) { - return; - } - - //desktop, browser; This should be removed once all clients use reactive forms - if (this.formGroup.invalid && showToast) { - const errorText = this.getErrorToastMessage(); - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccurred"), - message: errorText, - }); - return; - } - - try { - const credentials = new PasswordLoginCredentials( - this.formGroup.controls.email.value, - this.formGroup.controls.masterPassword.value, - this.captchaToken, - undefined, - ); - - this.formPromise = this.loginStrategyService.logIn(credentials); - const response = await this.formPromise; - - await this.saveEmailSettings(); - - if (this.handleCaptchaRequired(response)) { - return; - } else if (await this.handleMigrateEncryptionKey(response)) { - return; - } else if (response.requiresTwoFactor) { - if (this.onSuccessfulLoginTwoFactorNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginTwoFactorNavigate(); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.twoFactorRoute]); - } - } else if (response.forcePasswordReset != ForceSetPasswordReason.None) { - if (this.onSuccessfulLoginForceResetNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginForceResetNavigate(); - } else { - this.loginEmailService.clearValues(); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.forcePasswordResetRoute]); - } - } else { - if (this.onSuccessfulLogin != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLogin(); - } - - if (this.onSuccessfulLoginNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginNavigate(response.userId); - } else { - this.loginEmailService.clearValues(); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.successRoute]); - } - } - } catch (e) { - this.logService.error(e); - } - } - - togglePassword() { - this.showPassword = !this.showPassword; - if (this.ngZone.isStable) { - document.getElementById("masterPassword").focus(); - } else { - this.ngZone.onStable - .pipe(take(1)) - .subscribe(() => document.getElementById("masterPassword").focus()); - } - } - - async startAuthRequestLogin() { - this.formGroup.get("masterPassword")?.clearValidators(); - this.formGroup.get("masterPassword")?.updateValueAndValidity(); - - if (!this.formGroup.valid) { - return; - } - - await this.saveEmailSettings(); - await this.router.navigate(["/login-with-device"]); - } - - async launchSsoBrowser(clientId: string, ssoRedirectUri: string) { - // Save off email for SSO - await this.ssoLoginService.setSsoEmail(this.formGroup.value.email); - - // Generate necessary sso params - const passwordOptions: any = { - type: "password", - length: 64, - uppercase: true, - lowercase: true, - numbers: true, - special: false, - }; - const state = await this.passwordGenerationService.generatePassword(passwordOptions); - const ssoCodeVerifier = await this.passwordGenerationService.generatePassword(passwordOptions); - const codeVerifierHash = await this.cryptoFunctionService.hash(ssoCodeVerifier, "sha256"); - const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); - - // Save sso params - await this.ssoLoginService.setSsoState(state); - await this.ssoLoginService.setCodeVerifier(ssoCodeVerifier); - - // Build URI - const env = await firstValueFrom(this.environmentService.environment$); - const webUrl = env.getWebVaultUrl(); - - // Launch browser - this.platformUtilsService.launchUri( - webUrl + - "/#/sso?clientId=" + - clientId + - "&redirectUri=" + - encodeURIComponent(ssoRedirectUri) + - "&state=" + - state + - "&codeChallenge=" + - codeChallenge + - "&email=" + - encodeURIComponent(this.formGroup.controls.email.value), - ); - } - - async validateEmail() { - this.formGroup.controls.email.markAsTouched(); - const emailValid = this.formGroup.get("email").valid; - - if (emailValid) { - this.toggleValidateEmail(true); - await this.getLoginWithDevice(this.loggedEmail); - } - } - - toggleValidateEmail(value: boolean) { - this.validatedEmail = value; - if (!this.validatedEmail) { - // Reset master password only when going from validated to not validated - // so that autofill can work properly - this.formGroup.controls.masterPassword.reset(); - } else { - // Mark MP as untouched so that, when users enter email and hit enter, - // the MP field doesn't load with validation errors - this.formGroup.controls.masterPassword.markAsUntouched(); - - // When email is validated, focus on master password after - // waiting for input to be rendered - if (this.ngZone.isStable) { - this.masterPasswordInput?.nativeElement?.focus(); - } else { - this.ngZone.onStable.pipe(take(1)).subscribe(() => { - this.masterPasswordInput?.nativeElement?.focus(); - }); - } - } - } - - private async loadEmailSettings() { - // Try to load from memory first - const email = await firstValueFrom(this.loginEmailService.loginEmail$); - const rememberEmail = this.loginEmailService.getRememberEmail(); - - if (email) { - this.formGroup.controls.email.setValue(email); - this.formGroup.controls.rememberEmail.setValue(rememberEmail); - } else { - // If not in memory, check email on disk - const storedEmail = await firstValueFrom(this.loginEmailService.storedEmail$); - if (storedEmail) { - // If we have a stored email, rememberEmail should default to true - this.formGroup.controls.email.setValue(storedEmail); - this.formGroup.controls.rememberEmail.setValue(true); - } - } - } - - protected async saveEmailSettings() { - // Save off email for SSO - await this.ssoLoginService.setSsoEmail(this.formGroup.value.email); - - this.loginEmailService.setLoginEmail(this.formGroup.value.email); - this.loginEmailService.setRememberEmail(this.formGroup.value.rememberEmail); - await this.loginEmailService.saveEmailSettings(); - } - - // Legacy accounts used the master key to encrypt data. Migration is required but only performed on web - protected async handleMigrateEncryptionKey(result: AuthResult): Promise { - if (!result.requiresEncryptionKeyMigration) { - return false; - } - - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("errorOccured"), - message: this.i18nService.t("encryptionKeyMigrationRequired"), - }); - return true; - } - - private getErrorToastMessage() { - const error: AllValidationErrors = this.formValidationErrorService - .getFormValidationErrors(this.formGroup.controls) - .shift(); - - if (error) { - switch (error.errorName) { - case "email": - return this.i18nService.t("invalidEmail"); - case "minlength": - return this.i18nService.t("masterPasswordMinlength", Utils.originalMinimumPasswordLength); - default: - return this.i18nService.t(this.errorTag(error)); - } - } - - return; - } - - private errorTag(error: AllValidationErrors): string { - const name = error.errorName.charAt(0).toUpperCase() + error.errorName.slice(1); - return `${error.controlName}${name}`; - } - - async getLoginWithDevice(email: string) { - try { - const deviceIdentifier = await this.appIdService.getAppId(); - this.showLoginWithDevice = await this.devicesApiService.getKnownDevice( - email, - deviceIdentifier, - ); - // FIXME: Remove when updating file. Eslint update - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (e) { - this.showLoginWithDevice = false; - } - } -} diff --git a/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts b/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts deleted file mode 100644 index 7409acf6845..00000000000 --- a/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts +++ /dev/null @@ -1,539 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Directive, OnDestroy, OnInit } from "@angular/core"; -import { IsActiveMatchOptions, Router } from "@angular/router"; -import { Subject, firstValueFrom, map, takeUntil } from "rxjs"; - -import { - AuthRequestLoginCredentials, - AuthRequestServiceAbstraction, - LoginStrategyServiceAbstraction, - LoginEmailServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AnonymousHubService } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { AuthRequestType } from "@bitwarden/common/auth/enums/auth-request-type"; -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; -import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; -import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; -import { AuthRequest } from "@bitwarden/common/auth/models/request/auth.request"; -import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; -import { HttpStatusCode } from "@bitwarden/common/enums/http-status-code.enum"; -import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { UserId } from "@bitwarden/common/types/guid"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { KeyService } from "@bitwarden/key-management"; - -import { CaptchaProtectedComponent } from "./captcha-protected.component"; - -enum State { - StandardAuthRequest, - AdminAuthRequest, -} - -@Directive() -export class LoginViaAuthRequestComponentV1 - extends CaptchaProtectedComponent - implements OnInit, OnDestroy -{ - private destroy$ = new Subject(); - userAuthNStatus: AuthenticationStatus; - email: string; - showResendNotification = false; - authRequest: AuthRequest; - fingerprintPhrase: string; - onSuccessfulLoginTwoFactorNavigate: () => Promise; - onSuccessfulLogin: () => Promise; - onSuccessfulLoginNavigate: () => Promise; - onSuccessfulLoginForceResetNavigate: () => Promise; - - protected adminApprovalRoute = "admin-approval-requested"; - - protected StateEnum = State; - protected state = State.StandardAuthRequest; - protected webVaultUrl: string; - protected twoFactorRoute = "2fa"; - protected successRoute = "vault"; - protected forcePasswordResetRoute = "update-temp-password"; - private resendTimeout = 12000; - protected deviceManagementUrl: string; - - private authRequestKeyPair: { publicKey: Uint8Array; privateKey: Uint8Array }; - - constructor( - protected router: Router, - private keyService: KeyService, - private cryptoFunctionService: CryptoFunctionService, - private appIdService: AppIdService, - private passwordGenerationService: PasswordGenerationServiceAbstraction, - private apiService: ApiService, - private authService: AuthService, - private logService: LogService, - environmentService: EnvironmentService, - i18nService: I18nService, - platformUtilsService: PlatformUtilsService, - private anonymousHubService: AnonymousHubService, - private validationService: ValidationService, - private accountService: AccountService, - private loginEmailService: LoginEmailServiceAbstraction, - private deviceTrustService: DeviceTrustServiceAbstraction, - private authRequestService: AuthRequestServiceAbstraction, - private loginStrategyService: LoginStrategyServiceAbstraction, - protected toastService: ToastService, - ) { - super(environmentService, i18nService, platformUtilsService, toastService); - - // Get the web vault URL from the environment service - environmentService.environment$.pipe(takeUntil(this.destroy$)).subscribe((env) => { - this.webVaultUrl = env.getWebVaultUrl(); - this.deviceManagementUrl = `${this.webVaultUrl}/#/settings/security/device-management`; - }); - - // Gets signalR push notification - // Only fires on approval to prevent enumeration - this.authRequestService.authRequestPushNotification$ - .pipe(takeUntil(this.destroy$)) - .subscribe((id) => { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.verifyAndHandleApprovedAuthReq(id).catch((e: Error) => { - this.toastService.showToast({ - variant: "error", - title: this.i18nService.t("error"), - message: e.message, - }); - this.logService.error("Failed to use approved auth request: " + e.message); - }); - }); - } - - async ngOnInit() { - this.email = await firstValueFrom(this.loginEmailService.loginEmail$); - this.userAuthNStatus = await this.authService.getAuthStatus(); - - const matchOptions: IsActiveMatchOptions = { - paths: "exact", - queryParams: "ignored", - fragment: "ignored", - matrixParams: "ignored", - }; - - if (this.router.isActive(this.adminApprovalRoute, matchOptions)) { - this.state = State.AdminAuthRequest; - } - - if (this.state === State.AdminAuthRequest) { - // Pull email from state for admin auth reqs b/c it is available - // This also prevents it from being lost on refresh as the - // login service email does not persist. - this.email = await firstValueFrom( - this.accountService.activeAccount$.pipe(map((a) => a?.email)), - ); - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; - - if (!this.email) { - this.toastService.showToast({ - variant: "error", - title: null, - message: this.i18nService.t("userEmailMissing"), - }); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["/login-initiated"]); - return; - } - - // We only allow a single admin approval request to be active at a time - // so must check state to see if we have an existing one or not - const adminAuthReqStorable = await this.authRequestService.getAdminAuthRequest(userId); - - if (adminAuthReqStorable) { - await this.handleExistingAdminAuthRequest(adminAuthReqStorable, userId); - } else { - // No existing admin auth request; so we need to create one - await this.startAuthRequestLogin(); - } - } else { - // Standard auth request - // TODO: evaluate if we can remove the setting of this.email in the constructor - this.email = await firstValueFrom(this.loginEmailService.loginEmail$); - - if (!this.email) { - this.toastService.showToast({ - variant: "error", - title: null, - message: this.i18nService.t("userEmailMissing"), - }); - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["/login"]); - return; - } - - await this.startAuthRequestLogin(); - } - } - - async ngOnDestroy() { - await this.anonymousHubService.stopHubConnection(); - this.destroy$.next(); - this.destroy$.complete(); - } - - private async handleExistingAdminAuthRequest( - adminAuthReqStorable: AdminAuthRequestStorable, - userId: UserId, - ) { - // Note: on login, the SSOLoginStrategy will also call to see an existing admin auth req - // has been approved and handle it if so. - - // Regardless, we always retrieve the auth request from the server verify and handle status changes here as well - let adminAuthReqResponse: AuthRequestResponse; - try { - adminAuthReqResponse = await this.apiService.getAuthRequest(adminAuthReqStorable.id); - } catch (error) { - if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); - } - } - - // Request doesn't exist anymore - if (!adminAuthReqResponse) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); - } - - // Re-derive the user's fingerprint phrase - // It is important to not use the server's public key here as it could have been compromised via MITM - const derivedPublicKeyArrayBuffer = await this.cryptoFunctionService.rsaExtractPublicKey( - adminAuthReqStorable.privateKey, - ); - this.fingerprintPhrase = await this.authRequestService.getFingerprintPhrase( - this.email, - derivedPublicKeyArrayBuffer, - ); - - // Request denied - if (adminAuthReqResponse.isAnswered && !adminAuthReqResponse.requestApproved) { - return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); - } - - // Request approved - if (adminAuthReqResponse.requestApproved) { - return await this.handleApprovedAdminAuthRequest( - adminAuthReqResponse, - adminAuthReqStorable.privateKey, - userId, - ); - } - - // Request still pending response from admin - // set keypair and create hub connection so that any approvals will be received via push notification - this.authRequestKeyPair = { privateKey: adminAuthReqStorable.privateKey, publicKey: null }; - await this.anonymousHubService.createHubConnection(adminAuthReqStorable.id); - } - - private async handleExistingAdminAuthReqDeletedOrDenied(userId: UserId) { - // clear the admin auth request from state - await this.authRequestService.clearAdminAuthRequest(userId); - - // start new auth request - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.startAuthRequestLogin(); - } - - private async buildAuthRequest(authRequestType: AuthRequestType) { - const authRequestKeyPairArray = await this.cryptoFunctionService.rsaGenerateKeyPair(2048); - - this.authRequestKeyPair = { - publicKey: authRequestKeyPairArray[0], - privateKey: authRequestKeyPairArray[1], - }; - - const deviceIdentifier = await this.appIdService.getAppId(); - const publicKey = Utils.fromBufferToB64(this.authRequestKeyPair.publicKey); - const accessCode = await this.passwordGenerationService.generatePassword({ - type: "password", - length: 25, - }); - - this.fingerprintPhrase = await this.authRequestService.getFingerprintPhrase( - this.email, - this.authRequestKeyPair.publicKey, - ); - - this.authRequest = new AuthRequest( - this.email, - deviceIdentifier, - publicKey, - authRequestType, - accessCode, - ); - } - - async startAuthRequestLogin() { - this.showResendNotification = false; - - try { - let reqResponse: AuthRequestResponse; - - if (this.state === State.AdminAuthRequest) { - await this.buildAuthRequest(AuthRequestType.AdminApproval); - reqResponse = await this.apiService.postAdminAuthRequest(this.authRequest); - - const adminAuthReqStorable = new AdminAuthRequestStorable({ - id: reqResponse.id, - privateKey: this.authRequestKeyPair.privateKey, - }); - - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; - await this.authRequestService.setAdminAuthRequest(adminAuthReqStorable, userId); - } else { - await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock); - reqResponse = await this.apiService.postAuthRequest(this.authRequest); - } - - if (reqResponse.id) { - await this.anonymousHubService.createHubConnection(reqResponse.id); - } - } catch (e) { - this.logService.error(e); - } - - setTimeout(() => { - this.showResendNotification = true; - }, this.resendTimeout); - } - - private async verifyAndHandleApprovedAuthReq(requestId: string) { - try { - // Retrieve the auth request from server and verify it's approved - let authReqResponse: AuthRequestResponse; - - switch (this.state) { - case State.StandardAuthRequest: - // Unauthed - access code required for user verification - authReqResponse = await this.apiService.getAuthResponse( - requestId, - this.authRequest.accessCode, - ); - break; - - case State.AdminAuthRequest: - // Authed - no access code required - authReqResponse = await this.apiService.getAuthRequest(requestId); - break; - - default: - break; - } - - if (!authReqResponse.requestApproved) { - return; - } - - // Approved so proceed: - - // 4 Scenarios to handle for approved auth requests: - // Existing flow 1: - // - Anon Login with Device > User is not AuthN > receives approval from device with pubKey(masterKey) - // > decrypt masterKey > must authenticate > gets masterKey(userKey) > decrypt userKey and proceed to vault - - // 3 new flows from TDE: - // Flow 2: - // - Post SSO > User is AuthN > SSO login strategy success sets masterKey(userKey) > receives approval from device with pubKey(masterKey) - // > decrypt masterKey > decrypt userKey > establish trust if required > proceed to vault - // Flow 3: - // - Post SSO > User is AuthN > Receives approval from device with pubKey(userKey) > decrypt userKey > establish trust if required > proceed to vault - // Flow 4: - // - Anon Login with Device > User is not AuthN > receives approval from device with pubKey(userKey) - // > decrypt userKey > must authenticate > set userKey > proceed to vault - - // if user has authenticated via SSO - if (this.userAuthNStatus === AuthenticationStatus.Locked) { - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; - return await this.handleApprovedAdminAuthRequest( - authReqResponse, - this.authRequestKeyPair.privateKey, - userId, - ); - } - - // Flow 1 and 4: - const loginAuthResult = await this.loginViaAuthRequestStrategy(requestId, authReqResponse); - await this.handlePostLoginNavigation(loginAuthResult); - } catch (error) { - if (error instanceof ErrorResponse) { - let errorRoute = "/login"; - if (this.state === State.AdminAuthRequest) { - errorRoute = "/login-initiated"; - } - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([errorRoute]); - this.validationService.showError(error); - return; - } - - this.logService.error(error); - } - } - - async handleApprovedAdminAuthRequest( - adminAuthReqResponse: AuthRequestResponse, - privateKey: ArrayBuffer, - userId: UserId, - ) { - // See verifyAndHandleApprovedAuthReq(...) for flow details - // it's flow 2 or 3 based on presence of masterPasswordHash - if (adminAuthReqResponse.masterPasswordHash) { - // Flow 2: masterPasswordHash is not null - // key is authRequestPublicKey(masterKey) + we have authRequestPublicKey(masterPasswordHash) - await this.authRequestService.setKeysAfterDecryptingSharedMasterKeyAndHash( - adminAuthReqResponse, - privateKey, - userId, - ); - } else { - // Flow 3: masterPasswordHash is null - // we can assume key is authRequestPublicKey(userKey) and we can just decrypt with userKey and proceed to vault - await this.authRequestService.setUserKeyAfterDecryptingSharedUserKey( - adminAuthReqResponse, - privateKey, - userId, - ); - } - - // clear the admin auth request from state so it cannot be used again (it's a one time use) - // TODO: this should eventually be enforced via deleting this on the server once it is used - await this.authRequestService.clearAdminAuthRequest(userId); - - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("loginApproved"), - }); - - // Now that we have a decrypted user key in memory, we can check if we - // need to establish trust on the current device - const activeAccount = await firstValueFrom(this.accountService.activeAccount$); - await this.deviceTrustService.trustDeviceIfRequired(activeAccount.id); - - // TODO: don't forget to use auto enrollment service everywhere we trust device - - await this.handleSuccessfulLoginNavigation(); - } - - // Authentication helper - private async buildAuthRequestLoginCredentials( - requestId: string, - response: AuthRequestResponse, - ): Promise { - // if masterPasswordHash has a value, we will always receive key as authRequestPublicKey(masterKey) + authRequestPublicKey(masterPasswordHash) - // if masterPasswordHash is null, we will always receive key as authRequestPublicKey(userKey) - if (response.masterPasswordHash) { - const { masterKey, masterKeyHash } = - await this.authRequestService.decryptPubKeyEncryptedMasterKeyAndHash( - response.key, - response.masterPasswordHash, - this.authRequestKeyPair.privateKey, - ); - - return new AuthRequestLoginCredentials( - this.email, - this.authRequest.accessCode, - requestId, - null, // no userKey - masterKey, - masterKeyHash, - ); - } else { - const userKey = await this.authRequestService.decryptPubKeyEncryptedUserKey( - response.key, - this.authRequestKeyPair.privateKey, - ); - return new AuthRequestLoginCredentials( - this.email, - this.authRequest.accessCode, - requestId, - userKey, - null, // no masterKey - null, // no masterKeyHash - ); - } - } - - private async loginViaAuthRequestStrategy( - requestId: string, - authReqResponse: AuthRequestResponse, - ): Promise { - // Note: credentials change based on if the authReqResponse.key is a encryptedMasterKey or UserKey - const credentials = await this.buildAuthRequestLoginCredentials(requestId, authReqResponse); - - // Note: keys are set by AuthRequestLoginStrategy success handling - return await this.loginStrategyService.logIn(credentials); - } - - // Routing logic - private async handlePostLoginNavigation(loginResponse: AuthResult) { - if (loginResponse.requiresTwoFactor) { - if (this.onSuccessfulLoginTwoFactorNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginTwoFactorNavigate(); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.twoFactorRoute]); - } - } else if (loginResponse.forcePasswordReset != ForceSetPasswordReason.None) { - if (this.onSuccessfulLoginForceResetNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginForceResetNavigate(); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.forcePasswordResetRoute]); - } - } else { - await this.handleSuccessfulLoginNavigation(); - } - } - - private async handleSuccessfulLoginNavigation() { - if (this.state === State.StandardAuthRequest) { - // Only need to set remembered email on standard login with auth req flow - await this.loginEmailService.saveEmailSettings(); - } - - if (this.onSuccessfulLogin != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLogin(); - } - - if (this.onSuccessfulLoginNavigate != null) { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.onSuccessfulLoginNavigate(); - } else { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate([this.successRoute]); - } - } -} diff --git a/libs/angular/src/auth/components/remove-password.component.ts b/libs/angular/src/auth/components/remove-password.component.ts index 74cb00a14b8..d68644f588e 100644 --- a/libs/angular/src/auth/components/remove-password.component.ts +++ b/libs/angular/src/auth/components/remove-password.component.ts @@ -7,7 +7,7 @@ import { firstValueFrom, map } from "rxjs"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; diff --git a/libs/angular/src/auth/components/set-password.component.ts b/libs/angular/src/auth/components/set-password.component.ts index de079a7ebca..aec0673bb52 100644 --- a/libs/angular/src/auth/components/set-password.component.ts +++ b/libs/angular/src/auth/components/set-password.component.ts @@ -17,11 +17,12 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; import { OrganizationAutoEnrollStatusResponse } from "@bitwarden/common/admin-console/models/response/organization-auto-enroll-status.response"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -62,6 +63,7 @@ export class SetPasswordComponent extends BaseChangePasswordComponent implements private policyApiService: PolicyApiServiceAbstraction, policyService: PolicyService, protected router: Router, + private masterPasswordApiService: MasterPasswordApiService, private apiService: ApiService, private syncService: SyncService, private route: ActivatedRoute, @@ -195,7 +197,7 @@ export class SetPasswordComponent extends BaseChangePasswordComponent implements ); try { if (this.resetPasswordAutoEnroll) { - this.formPromise = this.apiService + this.formPromise = this.masterPasswordApiService .setPassword(request) .then(async () => { await this.onSetPasswordSuccess(masterKey, userKey, newKeyPair); @@ -222,7 +224,7 @@ export class SetPasswordComponent extends BaseChangePasswordComponent implements ); }); } else { - this.formPromise = this.apiService.setPassword(request).then(async () => { + this.formPromise = this.masterPasswordApiService.setPassword(request).then(async () => { await this.onSetPasswordSuccess(masterKey, userKey, newKeyPair); }); } diff --git a/libs/angular/src/auth/components/sso.component.spec.ts b/libs/angular/src/auth/components/sso.component.spec.ts index af92c7dd1d4..8b89031e731 100644 --- a/libs/angular/src/auth/components/sso.component.spec.ts +++ b/libs/angular/src/auth/components/sso.component.spec.ts @@ -13,12 +13,12 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/libs/angular/src/auth/components/sso.component.ts b/libs/angular/src/auth/components/sso.component.ts index 5f5e53d8efe..24a619e28cf 100644 --- a/libs/angular/src/auth/components/sso.component.ts +++ b/libs/angular/src/auth/components/sso.component.ts @@ -14,11 +14,11 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SsoPreValidateResponse } from "@bitwarden/common/auth/models/response/sso-pre-validate.response"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/libs/angular/src/auth/components/two-factor-v1.component.spec.ts b/libs/angular/src/auth/components/two-factor-v1.component.spec.ts index 82dea7cd8c0..47075acc758 100644 --- a/libs/angular/src/auth/components/two-factor-v1.component.spec.ts +++ b/libs/angular/src/auth/components/two-factor-v1.component.spec.ts @@ -4,7 +4,6 @@ import { ActivatedRoute, convertToParamMap, Router } from "@angular/router"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; -// eslint-disable-next-line no-restricted-imports import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { LoginStrategyServiceAbstraction, @@ -16,13 +15,13 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/libs/angular/src/auth/components/two-factor-v1.component.ts b/libs/angular/src/auth/components/two-factor-v1.component.ts index 4cbaa9362f2..3fda2685f5e 100644 --- a/libs/angular/src/auth/components/two-factor-v1.component.ts +++ b/libs/angular/src/auth/components/two-factor-v1.component.ts @@ -6,7 +6,6 @@ import { ActivatedRoute, NavigationExtras, Router } from "@angular/router"; import { firstValueFrom } from "rxjs"; import { first } from "rxjs/operators"; -// eslint-disable-next-line no-restricted-imports import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { LoginStrategyServiceAbstraction, @@ -17,7 +16,6 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthenticationType } from "@bitwarden/common/auth/enums/authentication-type"; @@ -28,6 +26,7 @@ import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/ide import { TwoFactorEmailRequest } from "@bitwarden/common/auth/models/request/two-factor-email.request"; import { TwoFactorProviders } from "@bitwarden/common/auth/services/two-factor.service"; import { WebAuthnIFrame } from "@bitwarden/common/auth/webauthn-iframe"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; diff --git a/libs/angular/src/auth/components/update-password.component.ts b/libs/angular/src/auth/components/update-password.component.ts index e6cefd40d1d..77e854753d7 100644 --- a/libs/angular/src/auth/components/update-password.component.ts +++ b/libs/angular/src/auth/components/update-password.component.ts @@ -3,15 +3,15 @@ import { Directive } from "@angular/core"; import { Router } from "@angular/router"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; import { PasswordRequest } from "@bitwarden/common/auth/models/request/password.request"; import { Verification } from "@bitwarden/common/auth/types/verification"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -40,7 +40,7 @@ export class UpdatePasswordComponent extends BaseChangePasswordComponent { policyService: PolicyService, keyService: KeyService, messagingService: MessagingService, - private apiService: ApiService, + private masterPasswordApiService: MasterPasswordApiService, private userVerificationService: UserVerificationService, private logService: LogService, dialogService: DialogService, @@ -117,9 +117,7 @@ export class UpdatePasswordComponent extends BaseChangePasswordComponent { request.key = newUserKey[1].encryptedString; // Update user's password - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.apiService.postPassword(request); + await this.masterPasswordApiService.postPassword(request); this.toastService.showToast({ variant: "success", diff --git a/libs/angular/src/auth/components/update-temp-password.component.ts b/libs/angular/src/auth/components/update-temp-password.component.ts index 95c56d08486..267beb2b822 100644 --- a/libs/angular/src/auth/components/update-temp-password.component.ts +++ b/libs/angular/src/auth/components/update-temp-password.component.ts @@ -4,11 +4,10 @@ import { Directive, OnInit } from "@angular/core"; import { Router } from "@angular/router"; import { firstValueFrom, map } from "rxjs"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; @@ -16,6 +15,7 @@ import { PasswordRequest } from "@bitwarden/common/auth/models/request/password. import { UpdateTdeOffboardingPasswordRequest } from "@bitwarden/common/auth/models/request/update-tde-offboarding-password.request"; import { UpdateTempPasswordRequest } from "@bitwarden/common/auth/models/request/update-temp-password.request"; import { MasterPasswordVerification } from "@bitwarden/common/auth/types/verification"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -52,7 +52,7 @@ export class UpdateTempPasswordComponent extends BaseChangePasswordComponent imp policyService: PolicyService, keyService: KeyService, messagingService: MessagingService, - private apiService: ApiService, + private masterPasswordApiService: MasterPasswordApiService, private syncService: SyncService, private logService: LogService, private userVerificationService: UserVerificationService, @@ -202,7 +202,7 @@ export class UpdateTempPasswordComponent extends BaseChangePasswordComponent imp request.newMasterPasswordHash = masterPasswordHash; request.masterPasswordHint = this.hint; - return this.apiService.putUpdateTempPassword(request); + return this.masterPasswordApiService.putUpdateTempPassword(request); } private async updatePassword(newMasterPasswordHash: string, userKey: [UserKey, EncString]) { @@ -214,7 +214,7 @@ export class UpdateTempPasswordComponent extends BaseChangePasswordComponent imp request.newMasterPasswordHash = newMasterPasswordHash; request.key = userKey[1].encryptedString; - return this.apiService.postPassword(request); + return this.masterPasswordApiService.postPassword(request); } private async updateTdeOffboardingPassword( @@ -226,6 +226,6 @@ export class UpdateTempPasswordComponent extends BaseChangePasswordComponent imp request.newMasterPasswordHash = masterPasswordHash; request.masterPasswordHint = this.hint; - return this.apiService.putUpdateTdeOffboardingPassword(request); + return this.masterPasswordApiService.putUpdateTdeOffboardingPassword(request); } } diff --git a/libs/angular/src/auth/components/user-verification.component.ts b/libs/angular/src/auth/components/user-verification.component.ts index 7af53805a09..408d8403b88 100644 --- a/libs/angular/src/auth/components/user-verification.component.ts +++ b/libs/angular/src/auth/components/user-verification.component.ts @@ -23,7 +23,6 @@ import { KeyService } from "@bitwarden/key-management"; @Directive({ selector: "app-user-verification", }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class UserVerificationComponent implements ControlValueAccessor, OnInit, OnDestroy { private _invalidSecret = false; @Input() diff --git a/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.spec.ts b/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.spec.ts deleted file mode 100644 index 887f528d547..00000000000 --- a/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { TestBed } from "@angular/core/testing"; -import { Navigation, Router, UrlTree } from "@angular/router"; -import { mock, MockProxy } from "jest-mock-extended"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -import { unauthUiRefreshRedirect } from "./unauth-ui-refresh-redirect"; - -describe("unauthUiRefreshRedirect", () => { - let configService: MockProxy; - let router: MockProxy; - - beforeEach(() => { - configService = mock(); - router = mock(); - - TestBed.configureTestingModule({ - providers: [ - { provide: ConfigService, useValue: configService }, - { provide: Router, useValue: router }, - ], - }); - }); - - it("returns true when UnauthenticatedExtensionUIRefresh flag is disabled", async () => { - configService.getFeatureFlag.mockResolvedValue(false); - - const result = await TestBed.runInInjectionContext(() => - unauthUiRefreshRedirect("/redirect")(), - ); - - expect(result).toBe(true); - expect(configService.getFeatureFlag).toHaveBeenCalledWith( - FeatureFlag.UnauthenticatedExtensionUIRefresh, - ); - expect(router.parseUrl).not.toHaveBeenCalled(); - }); - - it("returns UrlTree when UnauthenticatedExtensionUIRefresh flag is enabled and preserves query params", async () => { - configService.getFeatureFlag.mockResolvedValue(true); - - const urlTree = new UrlTree(); - urlTree.queryParams = { test: "test" }; - - const navigation: Navigation = { - extras: {}, - id: 0, - initialUrl: new UrlTree(), - extractedUrl: urlTree, - trigger: "imperative", - previousNavigation: undefined, - }; - - router.getCurrentNavigation.mockReturnValue(navigation); - - await TestBed.runInInjectionContext(() => unauthUiRefreshRedirect("/redirect")()); - - expect(configService.getFeatureFlag).toHaveBeenCalledWith( - FeatureFlag.UnauthenticatedExtensionUIRefresh, - ); - expect(router.createUrlTree).toHaveBeenCalledWith(["/redirect"], { - queryParams: urlTree.queryParams, - }); - }); -}); diff --git a/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.ts b/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.ts deleted file mode 100644 index 2cb53d5324f..00000000000 --- a/libs/angular/src/auth/functions/unauth-ui-refresh-redirect.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { inject } from "@angular/core"; -import { UrlTree, Router } from "@angular/router"; - -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; - -/** - * Helper function to redirect to a new URL based on the UnauthenticatedExtensionUIRefresh feature flag. - * @param redirectUrl - The URL to redirect to if the UnauthenticatedExtensionUIRefresh flag is enabled. - */ -export function unauthUiRefreshRedirect(redirectUrl: string): () => Promise { - return async () => { - const configService = inject(ConfigService); - const router = inject(Router); - const shouldRedirect = await configService.getFeatureFlag( - FeatureFlag.UnauthenticatedExtensionUIRefresh, - ); - if (shouldRedirect) { - const currentNavigation = router.getCurrentNavigation(); - const queryParams = currentNavigation?.extractedUrl?.queryParams || {}; - - // Preserve query params when redirecting as it is likely that the refreshed component - // will be consuming the same query params. - return router.createUrlTree([redirectUrl], { queryParams }); - } else { - return true; - } - }; -} diff --git a/libs/angular/src/auth/guards/auth.guard.spec.ts b/libs/angular/src/auth/guards/auth.guard.spec.ts index a6bfd72e23e..4ed72baf284 100644 --- a/libs/angular/src/auth/guards/auth.guard.spec.ts +++ b/libs/angular/src/auth/guards/auth.guard.spec.ts @@ -11,10 +11,10 @@ import { AccountService, } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { MasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/angular/src/auth/guards/auth.guard.ts b/libs/angular/src/auth/guards/auth.guard.ts index 8d20d7323da..329e365e542 100644 --- a/libs/angular/src/auth/guards/auth.guard.ts +++ b/libs/angular/src/auth/guards/auth.guard.ts @@ -12,10 +12,10 @@ import { firstValueFrom } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { MasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; export const authGuard: CanActivateFn = async ( diff --git a/libs/angular/src/auth/guards/lock.guard.spec.ts b/libs/angular/src/auth/guards/lock.guard.spec.ts index 1b09a415999..32b8ecbb9dd 100644 --- a/libs/angular/src/auth/guards/lock.guard.spec.ts +++ b/libs/angular/src/auth/guards/lock.guard.spec.ts @@ -11,10 +11,10 @@ import { AccountService, } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ClientType } from "@bitwarden/common/enums"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/libs/angular/src/auth/guards/lock.guard.ts b/libs/angular/src/auth/guards/lock.guard.ts index c7627442c69..10ad4917f32 100644 --- a/libs/angular/src/auth/guards/lock.guard.ts +++ b/libs/angular/src/auth/guards/lock.guard.ts @@ -9,10 +9,10 @@ import { firstValueFrom } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ClientType } from "@bitwarden/common/enums"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; diff --git a/libs/angular/src/auth/guards/redirect.guard.ts b/libs/angular/src/auth/guards/redirect.guard.ts index f79f5d3c4b4..00dd20c9909 100644 --- a/libs/angular/src/auth/guards/redirect.guard.ts +++ b/libs/angular/src/auth/guards/redirect.guard.ts @@ -3,8 +3,8 @@ import { CanActivateFn, Router } from "@angular/router"; import { firstValueFrom } from "rxjs"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/angular/src/auth/guards/tde-decryption-required.guard.ts b/libs/angular/src/auth/guards/tde-decryption-required.guard.ts index 6bb83021fd0..1d98b1fa740 100644 --- a/libs/angular/src/auth/guards/tde-decryption-required.guard.ts +++ b/libs/angular/src/auth/guards/tde-decryption-required.guard.ts @@ -8,8 +8,8 @@ import { import { firstValueFrom } from "rxjs"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/angular/src/auth/guards/unauth.guard.spec.ts b/libs/angular/src/auth/guards/unauth.guard.spec.ts index ec36b146a03..ad0ce680a1f 100644 --- a/libs/angular/src/auth/guards/unauth.guard.spec.ts +++ b/libs/angular/src/auth/guards/unauth.guard.spec.ts @@ -7,8 +7,8 @@ import { BehaviorSubject } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/angular/src/auth/guards/unauth.guard.ts b/libs/angular/src/auth/guards/unauth.guard.ts index 1ac0eebb458..6764b46843e 100644 --- a/libs/angular/src/auth/guards/unauth.guard.ts +++ b/libs/angular/src/auth/guards/unauth.guard.ts @@ -4,8 +4,8 @@ import { firstValueFrom } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { KeyService } from "@bitwarden/key-management"; diff --git a/libs/angular/src/auth/services/device-trust-toast.service.abstraction.ts b/libs/angular/src/auth/services/device-trust-toast.service.abstraction.ts new file mode 100644 index 00000000000..3de288168b1 --- /dev/null +++ b/libs/angular/src/auth/services/device-trust-toast.service.abstraction.ts @@ -0,0 +1,9 @@ +import { Observable } from "rxjs"; + +export abstract class DeviceTrustToastService { + /** + * An observable pipeline that observes any cross-application toast messages + * that need to be shown as part of the trusted device encryption (TDE) process. + */ + abstract setupListeners$: Observable; +} diff --git a/libs/angular/src/auth/services/device-trust-toast.service.implementation.ts b/libs/angular/src/auth/services/device-trust-toast.service.implementation.ts new file mode 100644 index 00000000000..4013cf8df96 --- /dev/null +++ b/libs/angular/src/auth/services/device-trust-toast.service.implementation.ts @@ -0,0 +1,44 @@ +import { merge, Observable, tap } from "rxjs"; + +import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ToastService } from "@bitwarden/components"; + +import { DeviceTrustToastService as DeviceTrustToastServiceAbstraction } from "./device-trust-toast.service.abstraction"; + +export class DeviceTrustToastService implements DeviceTrustToastServiceAbstraction { + private adminLoginApproved$: Observable; + private deviceTrusted$: Observable; + + setupListeners$: Observable; + + constructor( + private authRequestService: AuthRequestServiceAbstraction, + private deviceTrustService: DeviceTrustServiceAbstraction, + private i18nService: I18nService, + private toastService: ToastService, + ) { + this.adminLoginApproved$ = this.authRequestService.adminLoginApproved$.pipe( + tap(() => { + this.toastService.showToast({ + variant: "success", + title: "", + message: this.i18nService.t("loginApproved"), + }); + }), + ); + + this.deviceTrusted$ = this.deviceTrustService.deviceTrusted$.pipe( + tap(() => { + this.toastService.showToast({ + variant: "success", + title: "", + message: this.i18nService.t("deviceTrusted"), + }); + }), + ); + + this.setupListeners$ = merge(this.adminLoginApproved$, this.deviceTrusted$); + } +} diff --git a/libs/angular/src/auth/services/device-trust-toast.service.spec.ts b/libs/angular/src/auth/services/device-trust-toast.service.spec.ts new file mode 100644 index 00000000000..96b7db9d0ce --- /dev/null +++ b/libs/angular/src/auth/services/device-trust-toast.service.spec.ts @@ -0,0 +1,167 @@ +import { mock, MockProxy } from "jest-mock-extended"; +import { EMPTY, of } from "rxjs"; + +import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ToastService } from "@bitwarden/components"; + +import { DeviceTrustToastService as DeviceTrustToastServiceAbstraction } from "./device-trust-toast.service.abstraction"; +import { DeviceTrustToastService } from "./device-trust-toast.service.implementation"; + +describe("DeviceTrustToastService", () => { + let authRequestService: MockProxy; + let deviceTrustService: MockProxy; + let i18nService: MockProxy; + let toastService: MockProxy; + + let sut: DeviceTrustToastServiceAbstraction; + + beforeEach(() => { + authRequestService = mock(); + deviceTrustService = mock(); + i18nService = mock(); + toastService = mock(); + + i18nService.t.mockImplementation((key: string) => key); // just return the key that was given + }); + + const initService = () => { + return new DeviceTrustToastService( + authRequestService, + deviceTrustService, + i18nService, + toastService, + ); + }; + + const loginApprovalToastOptions = { + variant: "success", + title: "", + message: "loginApproved", + }; + + const deviceTrustedToastOptions = { + variant: "success", + title: "", + message: "deviceTrusted", + }; + + describe("setupListeners$", () => { + describe("given adminLoginApproved$ emits and deviceTrusted$ emits", () => { + beforeEach(() => { + // Arrange + authRequestService.adminLoginApproved$ = of(undefined); + deviceTrustService.deviceTrusted$ = of(undefined); + sut = initService(); + }); + + it("should trigger a toast for login approval", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).toHaveBeenCalledWith(loginApprovalToastOptions); // Assert + done(); + }, + }); + }); + + it("should trigger a toast for device trust", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).toHaveBeenCalledWith(deviceTrustedToastOptions); // Assert + done(); + }, + }); + }); + }); + + describe("given adminLoginApproved$ emits and deviceTrusted$ does not emit", () => { + beforeEach(() => { + // Arrange + authRequestService.adminLoginApproved$ = of(undefined); + deviceTrustService.deviceTrusted$ = EMPTY; + sut = initService(); + }); + + it("should trigger a toast for login approval", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).toHaveBeenCalledWith(loginApprovalToastOptions); // Assert + done(); + }, + }); + }); + + it("should NOT trigger a toast for device trust", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).not.toHaveBeenCalledWith(deviceTrustedToastOptions); // Assert + done(); + }, + }); + }); + }); + + describe("given adminLoginApproved$ does not emit and deviceTrusted$ emits", () => { + beforeEach(() => { + // Arrange + authRequestService.adminLoginApproved$ = EMPTY; + deviceTrustService.deviceTrusted$ = of(undefined); + sut = initService(); + }); + + it("should NOT trigger a toast for login approval", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).not.toHaveBeenCalledWith(loginApprovalToastOptions); // Assert + done(); + }, + }); + }); + + it("should trigger a toast for device trust", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).toHaveBeenCalledWith(deviceTrustedToastOptions); // Assert + done(); + }, + }); + }); + }); + + describe("given adminLoginApproved$ does not emit and deviceTrusted$ does not emit", () => { + beforeEach(() => { + // Arrange + authRequestService.adminLoginApproved$ = EMPTY; + deviceTrustService.deviceTrusted$ = EMPTY; + sut = initService(); + }); + + it("should NOT trigger a toast for login approval", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).not.toHaveBeenCalledWith(loginApprovalToastOptions); // Assert + done(); + }, + }); + }); + + it("should NOT trigger a toast for device trust", (done) => { + // Act + sut.setupListeners$.subscribe({ + complete: () => { + expect(toastService.showToast).not.toHaveBeenCalledWith(deviceTrustedToastOptions); // Assert + done(); + }, + }); + }); + }); + }); +}); diff --git a/libs/angular/src/billing/components/invoices/invoices.component.html b/libs/angular/src/billing/components/invoices/invoices.component.html index 2a171e5b5bc..634baa4fa7f 100644 --- a/libs/angular/src/billing/components/invoices/invoices.component.html +++ b/libs/angular/src/billing/components/invoices/invoices.component.html @@ -1,10 +1,10 @@ - {{ "loading" | i18n }} + {{ "loading" | i18n }} diff --git a/libs/angular/src/platform/services/theming/angular-theming.service.ts b/libs/angular/src/platform/services/theming/angular-theming.service.ts index 2073abdcd10..8f1d863844f 100644 --- a/libs/angular/src/platform/services/theming/angular-theming.service.ts +++ b/libs/angular/src/platform/services/theming/angular-theming.service.ts @@ -59,8 +59,6 @@ export class AngularThemingService implements AbstractThemingService { document.documentElement.classList.remove( "theme_" + ThemeTypes.Light, "theme_" + ThemeTypes.Dark, - "theme_" + ThemeTypes.Nord, - "theme_" + ThemeTypes.SolarizedDark, ); document.documentElement.classList.add("theme_" + theme); }); diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index dc6c049101a..9cb39a35856 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -87,14 +87,9 @@ import { import { AnonymousHubService as AnonymousHubServiceAbstraction } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices/devices.service.abstraction"; import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/devices-api.service.abstraction"; -import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { - InternalMasterPasswordServiceAbstraction, - MasterPasswordServiceAbstraction, -} from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService as MasterPasswordApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { PasswordResetEnrollmentServiceAbstraction } from "@bitwarden/common/auth/abstractions/password-reset-enrollment.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/abstractions/token.service"; @@ -109,11 +104,9 @@ import { AccountServiceImplementation } from "@bitwarden/common/auth/services/ac import { AnonymousHubService } from "@bitwarden/common/auth/services/anonymous-hub.service"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { AvatarService } from "@bitwarden/common/auth/services/avatar.service"; -import { DeviceTrustService } from "@bitwarden/common/auth/services/device-trust.service.implementation"; import { DevicesServiceImplementation } from "@bitwarden/common/auth/services/devices/devices.service.implementation"; import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; -import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; -import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/services/master-password/master-password-api.service.implementation"; import { PasswordResetEnrollmentServiceImplementation } from "@bitwarden/common/auth/services/password-reset-enrollment.service.implementation"; import { SsoLoginService } from "@bitwarden/common/auth/services/sso-login.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; @@ -153,6 +146,15 @@ import { BulkEncryptService } from "@bitwarden/common/key-management/crypto/abst import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { BulkEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/bulk-encrypt.service.implementation"; import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/key-management/crypto/services/multithread-encrypt.service.implementation"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { DeviceTrustService } from "@bitwarden/common/key-management/device-trust/services/device-trust.service.implementation"; +import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/services/key-connector.service"; +import { + InternalMasterPasswordServiceAbstraction, + MasterPasswordServiceAbstraction, +} from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { MasterPasswordService } from "@bitwarden/common/key-management/master-password/services/master-password.service"; import { DefaultVaultTimeoutService, DefaultVaultTimeoutSettingsService, @@ -304,6 +306,8 @@ import { import { SafeInjectionToken } from "@bitwarden/ui-common"; import { DefaultTaskService, + DefaultEndUserNotificationService, + EndUserNotificationService, NewDeviceVerificationNoticeService, PasswordRepromptService, TaskService, @@ -317,6 +321,8 @@ import { IndividualVaultExportServiceAbstraction, } from "@bitwarden/vault-export-core"; +import { DeviceTrustToastService as DeviceTrustToastServiceAbstraction } from "../auth/services/device-trust-toast.service.abstraction"; +import { DeviceTrustToastService } from "../auth/services/device-trust-toast.service.implementation"; import { FormValidationErrorsService as FormValidationErrorsServiceAbstraction } from "../platform/abstractions/form-validation-errors.service"; import { ViewCacheService } from "../platform/abstractions/view-cache.service"; import { FormValidationErrorsService } from "../platform/services/form-validation-errors.service"; @@ -408,7 +414,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: ThemeStateService, useClass: DefaultThemeStateService, - deps: [GlobalStateProvider, ConfigService], + deps: [GlobalStateProvider], }), safeProvider({ provide: AbstractThemingService, @@ -603,7 +609,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: TotpServiceAbstraction, useClass: TotpService, - deps: [CryptoFunctionServiceAbstraction, LogService], + deps: [SdkService], }), safeProvider({ provide: TokenServiceAbstraction, @@ -1282,7 +1288,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: BillingApiServiceAbstraction, useClass: BillingApiService, - deps: [ApiServiceAbstraction, LogService, ToastService], + deps: [ApiServiceAbstraction], }), safeProvider({ provide: TaxServiceAbstraction, @@ -1346,6 +1352,7 @@ const safeProviders: SafeProvider[] = [ useClass: DefaultSetPasswordJitService, deps: [ ApiServiceAbstraction, + MasterPasswordApiServiceAbstraction, KeyService, EncryptService, I18nServiceAbstraction, @@ -1417,7 +1424,12 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: CipherAuthorizationService, useClass: DefaultCipherAuthorizationService, - deps: [CollectionService, OrganizationServiceAbstraction, AccountServiceAbstraction], + deps: [ + CollectionService, + OrganizationServiceAbstraction, + AccountServiceAbstraction, + ConfigService, + ], }), safeProvider({ provide: AuthRequestApiService, @@ -1463,6 +1475,26 @@ const safeProviders: SafeProvider[] = [ useClass: DefaultTaskService, deps: [StateProvider, ApiServiceAbstraction, OrganizationServiceAbstraction, ConfigService], }), + safeProvider({ + provide: EndUserNotificationService, + useClass: DefaultEndUserNotificationService, + deps: [StateProvider, ApiServiceAbstraction], + }), + safeProvider({ + provide: DeviceTrustToastServiceAbstraction, + useClass: DeviceTrustToastService, + deps: [ + AuthRequestServiceAbstraction, + DeviceTrustServiceAbstraction, + I18nServiceAbstraction, + ToastService, + ], + }), + safeProvider({ + provide: MasterPasswordApiServiceAbstraction, + useClass: MasterPasswordApiService, + deps: [ApiServiceAbstraction, LogService], + }), ]; @NgModule({ diff --git a/libs/angular/src/tools/send/send.component.ts b/libs/angular/src/tools/send/send.component.ts index 6b7f911ed12..738960fc628 100644 --- a/libs/angular/src/tools/send/send.component.ts +++ b/libs/angular/src/tools/send/send.component.ts @@ -14,6 +14,8 @@ import { import { SearchService } from "@bitwarden/common/abstractions/search.service"; 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"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -79,9 +81,12 @@ export class SendComponent implements OnInit, OnDestroy { protected sendApiService: SendApiService, protected dialogService: DialogService, protected toastService: ToastService, + private accountService: AccountService, ) {} async ngOnInit() { + const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.policyService .policyAppliesToActiveUser$(PolicyType.DisableSend) .pipe(takeUntil(this.destroy$)) @@ -91,7 +96,7 @@ export class SendComponent implements OnInit, OnDestroy { this._searchText$ .pipe( - switchMap((searchText) => from(this.searchService.isSearchable(searchText))), + switchMap((searchText) => from(this.searchService.isSearchable(userId, searchText))), takeUntil(this.destroy$), ) .subscribe((isSearchable) => { diff --git a/libs/angular/src/vault/components/add-edit.component.ts b/libs/angular/src/vault/components/add-edit.component.ts index c309aa9624a..eed90c2ba70 100644 --- a/libs/angular/src/vault/components/add-edit.component.ts +++ b/libs/angular/src/vault/components/add-edit.component.ts @@ -15,7 +15,6 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { normalizeExpiryYearFormat } from "@bitwarden/common/autofill/utils"; import { EventType } from "@bitwarden/common/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -41,7 +40,7 @@ import { SshKeyView } from "@bitwarden/common/vault/models/view/ssh-key.view"; import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { DialogService, ToastService } from "@bitwarden/components"; import { generate_ssh_key } from "@bitwarden/sdk-internal"; -import { PasswordRepromptService } from "@bitwarden/vault"; +import { PasswordRepromptService, SshImportPromptService } from "@bitwarden/vault"; @Directive() export class AddEditComponent implements OnInit, OnDestroy { @@ -131,7 +130,8 @@ export class AddEditComponent implements OnInit, OnDestroy { protected configService: ConfigService, protected cipherAuthorizationService: CipherAuthorizationService, protected toastService: ToastService, - private sdkService: SdkService, + protected sdkService: SdkService, + private sshImportPromptService: SshImportPromptService, ) { this.typeOptions = [ { name: i18nService.t("typeLogin"), value: CipherType.Login }, @@ -207,10 +207,7 @@ export class AddEditComponent implements OnInit, OnDestroy { this.writeableCollections = await this.loadCollections(); this.canUseReprompt = await this.passwordRepromptService.enabled(); - const sshKeysEnabled = await this.configService.getFeatureFlag(FeatureFlag.SSHKeyVaultItem); - if (sshKeysEnabled) { - this.typeOptions.push({ name: this.i18nService.t("typeSshKey"), value: CipherType.SshKey }); - } + this.typeOptions.push({ name: this.i18nService.t("typeSshKey"), value: CipherType.SshKey }); } ngOnDestroy() { @@ -824,6 +821,15 @@ export class AddEditComponent implements OnInit, OnDestroy { return true; } + async importSshKeyFromClipboard() { + const key = await this.sshImportPromptService.importSshKeyFromClipboard(); + if (key != null) { + this.cipher.sshKey.privateKey = key.privateKey; + this.cipher.sshKey.publicKey = key.publicKey; + this.cipher.sshKey.keyFingerprint = key.keyFingerprint; + } + } + private async generateSshKey(showNotification: boolean = true) { await firstValueFrom(this.sdkService.client$); const sshKey = generate_ssh_key("Ed25519"); diff --git a/libs/angular/src/vault/components/icon.component.html b/libs/angular/src/vault/components/icon.component.html index caca9ded04f..2dae3b26cc5 100644 --- a/libs/angular/src/vault/components/icon.component.html +++ b/libs/angular/src/vault/components/icon.component.html @@ -2,16 +2,18 @@
    diff --git a/libs/angular/src/vault/components/icon.component.ts b/libs/angular/src/vault/components/icon.component.ts index c30fb8a53e7..248378bf5ee 100644 --- a/libs/angular/src/vault/components/icon.component.ts +++ b/libs/angular/src/vault/components/icon.component.ts @@ -1,18 +1,18 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { ChangeDetectionStrategy, Component, Input, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, Component, input, signal } from "@angular/core"; +import { toObservable } from "@angular/core/rxjs-interop"; import { - BehaviorSubject, combineLatest, distinctUntilChanged, - filter, map, + tap, Observable, + startWith, + pairwise, } from "rxjs"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { buildCipherIcon } from "@bitwarden/common/vault/icon/build-cipher-icon"; +import { buildCipherIcon, CipherIconDetails } from "@bitwarden/common/vault/icon/build-cipher-icon"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @Component({ @@ -20,33 +20,40 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; templateUrl: "icon.component.html", changeDetection: ChangeDetectionStrategy.OnPush, }) -export class IconComponent implements OnInit { - @Input() - set cipher(value: CipherView) { - this.cipher$.next(value); - } +export class IconComponent { + /** + * The cipher to display the icon for. + */ + cipher = input.required(); - protected data$: Observable<{ - imageEnabled: boolean; - image?: string; - fallbackImage: string; - icon?: string; - }>; + imageLoaded = signal(false); - private cipher$ = new BehaviorSubject(undefined); + protected data$: Observable; constructor( private environmentService: EnvironmentService, private domainSettingsService: DomainSettingsService, - ) {} - - async ngOnInit() { - this.data$ = combineLatest([ + ) { + const iconSettings$ = combineLatest([ this.environmentService.environment$.pipe(map((e) => e.getIconsUrl())), this.domainSettingsService.showFavicons$.pipe(distinctUntilChanged()), - this.cipher$.pipe(filter((c) => c !== undefined)), ]).pipe( - map(([iconsUrl, showFavicon, cipher]) => buildCipherIcon(iconsUrl, cipher, showFavicon)), + map(([iconsUrl, showFavicon]) => ({ iconsUrl, showFavicon })), + startWith({ iconsUrl: null, showFavicon: false }), // Start with a safe default to avoid flickering icons + distinctUntilChanged(), + ); + + this.data$ = combineLatest([iconSettings$, toObservable(this.cipher)]).pipe( + map(([{ iconsUrl, showFavicon }, cipher]) => buildCipherIcon(iconsUrl, cipher, showFavicon)), + startWith(null), + pairwise(), + tap(([prev, next]) => { + if (prev?.image !== next?.image) { + // The image changed, reset the loaded state to not show an empty icon + this.imageLoaded.set(false); + } + }), + map(([_, next]) => next!), ); } } diff --git a/libs/angular/src/vault/components/vault-items.component.ts b/libs/angular/src/vault/components/vault-items.component.ts index 9db6aad1bd3..6fd29ae7ded 100644 --- a/libs/angular/src/vault/components/vault-items.component.ts +++ b/libs/angular/src/vault/components/vault-items.component.ts @@ -2,12 +2,22 @@ // @ts-strict-ignore import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { BehaviorSubject, Subject, combineLatest, filter, from, switchMap, takeUntil } from "rxjs"; +import { + BehaviorSubject, + Subject, + combineLatest, + filter, + firstValueFrom, + from, + switchMap, + takeUntil, +} from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -28,6 +38,7 @@ export class VaultItemsComponent implements OnInit, OnDestroy { /** Construct filters as an observable so it can be appended to the cipher stream. */ private _filter$ = new BehaviorSubject<(cipher: CipherView) => boolean | null>(null); + private userId: UserId; private destroy$ = new Subject(); private isSearchable: boolean = false; private _searchText$ = new BehaviorSubject(""); @@ -55,10 +66,12 @@ export class VaultItemsComponent implements OnInit, OnDestroy { this.subscribeToCiphers(); } - ngOnInit(): void { + async ngOnInit() { + this.userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this._searchText$ .pipe( - switchMap((searchText) => from(this.searchService.isSearchable(searchText))), + switchMap((searchText) => from(this.searchService.isSearchable(this.userId, searchText))), takeUntil(this.destroy$), ) .subscribe((isSearchable) => { @@ -138,6 +151,7 @@ export class VaultItemsComponent implements OnInit, OnDestroy { allCiphers = [..._failedCiphers, ...allCiphers]; return this.searchService.searchCiphers( + this.userId, searchText, [filter, this.deletedFilter], allCiphers, diff --git a/libs/angular/src/vault/components/view.component.ts b/libs/angular/src/vault/components/view.component.ts index d38e7d7b2d9..ee63eece6f4 100644 --- a/libs/angular/src/vault/components/view.component.ts +++ b/libs/angular/src/vault/components/view.component.ts @@ -51,6 +51,7 @@ import { AttachmentView } from "@bitwarden/common/vault/models/view/attachment.v import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service"; +import { TotpInfo } from "@bitwarden/common/vault/services/totp.service"; import { DialogService, ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; import { PasswordRepromptService } from "@bitwarden/vault"; @@ -87,20 +88,19 @@ export class ViewComponent implements OnDestroy, OnInit { showPrivateKey: boolean; canAccessPremium: boolean; showPremiumRequiredTotp: boolean; - totpCode: string; - totpCodeFormatted: string; - totpDash: number; - totpSec: number; - totpLow: boolean; fieldType = FieldType; checkPasswordPromise: Promise; folder: FolderView; cipherType = CipherType; - private totpInterval: any; private previousCipherId: string; private passwordReprompted = false; + /** + * Represents TOTP information including display formatting and timing + */ + protected totpInfo$: Observable | undefined; + get fido2CredentialCreationDateValue(): string { const dateCreated = this.i18nService.t("dateCreated"); const creationDate = this.datePipe.transform( @@ -504,57 +504,12 @@ export class ViewComponent implements OnDestroy, OnInit { } private cleanUp() { - this.totpCode = null; this.cipher = null; this.folder = null; this.showPassword = false; this.showCardNumber = false; this.showCardCode = false; this.passwordReprompted = false; - if (this.totpInterval) { - clearInterval(this.totpInterval); - } - } - - private async totpUpdateCode() { - if ( - this.cipher == null || - this.cipher.type !== CipherType.Login || - this.cipher.login.totp == null - ) { - if (this.totpInterval) { - clearInterval(this.totpInterval); - } - return; - } - - this.totpCode = await this.totpService.getCode(this.cipher.login.totp); - if (this.totpCode != null) { - if (this.totpCode.length > 4) { - const half = Math.floor(this.totpCode.length / 2); - this.totpCodeFormatted = - this.totpCode.substring(0, half) + " " + this.totpCode.substring(half); - } else { - this.totpCodeFormatted = this.totpCode; - } - } else { - this.totpCodeFormatted = null; - if (this.totpInterval) { - clearInterval(this.totpInterval); - } - } - } - - private async totpTick(intervalSeconds: number) { - const epoch = Math.round(new Date().getTime() / 1000.0); - const mod = epoch % intervalSeconds; - - this.totpSec = intervalSeconds - mod; - this.totpDash = +(Math.round(((78.6 / intervalSeconds) * mod + "e+2") as any) + "e-2"); - this.totpLow = this.totpSec <= 7; - if (mod === 0) { - await this.totpUpdateCode(); - } } /** @@ -577,19 +532,33 @@ export class ViewComponent implements OnDestroy, OnInit { ).find((f) => f.id == this.cipher.folderId); } - if ( + const canGenerateTotp = this.cipher.type === CipherType.Login && this.cipher.login.totp && - (this.cipher.organizationUseTotp || this.canAccessPremium) - ) { - await this.totpUpdateCode(); - const interval = this.totpService.getTimeInterval(this.cipher.login.totp); - await this.totpTick(interval); + (this.cipher.organizationUseTotp || this.canAccessPremium); - this.totpInterval = setInterval(async () => { - await this.totpTick(interval); - }, 1000); - } + this.totpInfo$ = canGenerateTotp + ? this.totpService.getCode$(this.cipher.login.totp).pipe( + map((response) => { + const epoch = Math.round(new Date().getTime() / 1000.0); + const mod = epoch % response.period; + + // Format code + const totpCodeFormatted = + response.code.length > 4 + ? `${response.code.slice(0, Math.floor(response.code.length / 2))} ${response.code.slice(Math.floor(response.code.length / 2))}` + : response.code; + + return { + totpCode: response.code, + totpCodeFormatted, + totpDash: +(Math.round(((78.6 / response.period) * mod + "e+2") as any) + "e-2"), + totpSec: response.period - mod, + totpLow: response.period - mod <= 7, + } as TotpInfo; + }), + ) + : undefined; if (this.previousCipherId !== this.cipherId) { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. diff --git a/libs/angular/tsconfig.json b/libs/angular/tsconfig.json index c603e5cf170..d77e56d778e 100644 --- a/libs/angular/tsconfig.json +++ b/libs/angular/tsconfig.json @@ -13,6 +13,8 @@ "@bitwarden/generator-history": ["../tools/generator/extensions/history/src"], "@bitwarden/generator-legacy": ["../tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../tools/generator/extensions/navigation/src"], + "@bitwarden/importer/core": ["../importer/src"], + "@bitwarden/importer-ui": ["../importer/src/components"], "@bitwarden/key-management": ["../key-management/src"], "@bitwarden/platform": ["../platform/src"], "@bitwarden/ui-common": ["../ui/common/src"], diff --git a/libs/auth/src/angular/login-approval/login-approval.component.html b/libs/auth/src/angular/login-approval/login-approval.component.html index 2115bdbff11..d37e30c5e0a 100644 --- a/libs/auth/src/angular/login-approval/login-approval.component.html +++ b/libs/auth/src/angular/login-approval/login-approval.component.html @@ -18,8 +18,11 @@

    {{ authRequestResponse?.requestDeviceType }}

    - {{ "ipAddress" | i18n }} -

    {{ authRequestResponse?.requestIpAddress }}

    + {{ "location" | i18n }} +

    + {{ authRequestResponse?.requestCountryName }} + ({{ authRequestResponse?.requestIpAddress }}) +

    {{ "time" | i18n }} diff --git a/libs/auth/src/angular/login-decryption-options/login-decryption-options.component.ts b/libs/auth/src/angular/login-decryption-options/login-decryption-options.component.ts index 4c93c79d6fe..62fbeae26b6 100644 --- a/libs/auth/src/angular/login-decryption-options/login-decryption-options.component.ts +++ b/libs/auth/src/angular/login-decryption-options/login-decryption-options.component.ts @@ -16,10 +16,10 @@ import { import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { PasswordResetEnrollmentServiceAbstraction } from "@bitwarden/common/auth/abstractions/password-reset-enrollment.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { ClientType } from "@bitwarden/common/enums"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; diff --git a/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.html b/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.html index 22cf8320036..d6b91b960b0 100644 --- a/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.html +++ b/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.html @@ -26,7 +26,7 @@ block buttonType="secondary" class="tw-mt-4" - (click)="startStandardAuthRequestLogin()" + (click)="startStandardAuthRequestLogin(true)" > {{ "resendNotification" | i18n }} diff --git a/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts b/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts index 00e2d621c47..bb2822d67e9 100644 --- a/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts +++ b/libs/auth/src/angular/login-via-auth-request/login-via-auth-request.component.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { CommonModule } from "@angular/common"; import { Component, OnDestroy, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @@ -17,7 +15,6 @@ import { import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AnonymousHubService } from "@bitwarden/common/auth/abstractions/anonymous-hub.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthRequestType } from "@bitwarden/common/auth/enums/auth-request-type"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; @@ -25,9 +22,13 @@ import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { AuthRequest } from "@bitwarden/common/auth/models/request/auth.request"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { LoginViaAuthRequestView } from "@bitwarden/common/auth/models/view/login-via-auth-request.view"; import { ClientType, HttpStatusCode } from "@bitwarden/common/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -40,6 +41,7 @@ import { ButtonModule, LinkModule, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { AuthRequestApiService } from "../../common/abstractions/auth-request-api.service"; +import { LoginViaAuthRequestCacheService } from "../../common/services/auth-request/default-login-via-auth-request-cache.service"; enum Flow { StandardAuthRequest, // when user clicks "Login with device" from /login or "Approve from your other device" from /login-initiated @@ -57,23 +59,26 @@ const matchOptions: IsActiveMatchOptions = { standalone: true, templateUrl: "./login-via-auth-request.component.html", imports: [ButtonModule, CommonModule, JslibModule, LinkModule, RouterModule], + providers: [{ provide: LoginViaAuthRequestCacheService }], }) export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { - private authRequest: AuthRequest; - private authRequestKeyPair: { publicKey: Uint8Array; privateKey: Uint8Array }; - private authStatus: AuthenticationStatus; + private authRequest: AuthRequest | undefined = undefined; + private authRequestKeyPair: + | { publicKey: Uint8Array | undefined; privateKey: Uint8Array | undefined } + | undefined = undefined; + private authStatus: AuthenticationStatus | undefined = undefined; private showResendNotificationTimeoutSeconds = 12; protected backToRoute = "/login"; protected clientType: ClientType; protected ClientType = ClientType; - protected email: string; - protected fingerprintPhrase: string; + protected email: string | undefined = undefined; + protected fingerprintPhrase: string | undefined = undefined; protected showResendNotification = false; protected Flow = Flow; protected flow = Flow.StandardAuthRequest; - protected webVaultUrl: string; - protected deviceManagementUrl: string; + protected webVaultUrl: string | undefined = undefined; + protected deviceManagementUrl: string | undefined; constructor( private accountService: AccountService, @@ -95,6 +100,8 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { private toastService: ToastService, private validationService: ValidationService, private loginSuccessHandlerService: LoginSuccessHandlerService, + private loginViaAuthRequestCacheService: LoginViaAuthRequestCacheService, + private configService: ConfigService, ) { this.clientType = this.platformUtilsService.getClientType(); @@ -124,6 +131,7 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { async ngOnInit(): Promise { // Get the authStatus early because we use it in both flows this.authStatus = await firstValueFrom(this.authService.activeAccountStatus$); + await this.loginViaAuthRequestCacheService.init(); const userHasAuthenticatedViaSSO = this.authStatus === AuthenticationStatus.Locked; @@ -133,7 +141,7 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { /** * The LoginViaAuthRequestComponent handles both the `login-with-device` and - * the `admin-approval-requested` routes. Therefore we check the route to determine + * the `admin-approval-requested` routes. Therefore, we check the route to determine * which flow to initialize. */ if (this.router.isActive("admin-approval-requested", matchOptions)) { @@ -159,7 +167,14 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { // We only allow a single admin approval request to be active at a time // so we must check state to see if we have an existing one or not - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + if (!userId) { + this.logService.error( + "Not able to get a user id from the account service active account observable.", + ); + return; + } + const existingAdminAuthRequest = await this.authRequestService.getAdminAuthRequest(userId); if (existingAdminAuthRequest) { @@ -172,7 +187,9 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { private async initStandardAuthRequestFlow(): Promise { this.flow = Flow.StandardAuthRequest; - this.email = await firstValueFrom(this.loginEmailService.loginEmail$); + this.email = await firstValueFrom( + this.accountService.activeAccount$.pipe(map((a) => a?.email)), + ); if (!this.email) { await this.handleMissingEmail(); @@ -185,7 +202,6 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { private async handleMissingEmail(): Promise { this.toastService.showToast({ variant: "error", - title: null, message: this.i18nService.t("userEmailMissing"), }); @@ -194,21 +210,41 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { async ngOnDestroy(): Promise { await this.anonymousHubService.stopHubConnection(); + + this.loginViaAuthRequestCacheService.clearCacheLoginView(); } private async startAdminAuthRequestLogin(): Promise { try { await this.buildAuthRequest(AuthRequestType.AdminApproval); + if (!this.authRequest) { + this.logService.error("Auth request failed to build."); + return; + } + + if (!this.authRequestKeyPair) { + this.logService.error("Key pairs failed to initialize from buildAuthRequest."); + return; + } + const authRequestResponse = await this.authRequestApiService.postAdminAuthRequest( - this.authRequest, + this.authRequest as AuthRequest, ); const adminAuthReqStorable = new AdminAuthRequestStorable({ id: authRequestResponse.id, privateKey: this.authRequestKeyPair.privateKey, }); - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + + if (!userId) { + this.logService.error( + "Not able to get a user id from the account service active account observable.", + ); + return; + } + await this.authRequestService.setAdminAuthRequest(adminAuthReqStorable, userId); if (authRequestResponse.id) { @@ -219,21 +255,104 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { } } - protected async startStandardAuthRequestLogin(): Promise { + protected async startStandardAuthRequestLogin( + clearCachedRequest: boolean = false, + ): Promise { this.showResendNotification = false; - try { - await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock); - - const authRequestResponse = await this.authRequestApiService.postAuthRequest( - this.authRequest, - ); - - if (authRequestResponse.id) { - await this.anonymousHubService.createHubConnection(authRequestResponse.id); + if (await this.configService.getFeatureFlag(FeatureFlag.PM9112_DeviceApprovalPersistence)) { + // Used for manually refreshing the auth request when clicking the resend auth request + // on the ui. + if (clearCachedRequest) { + this.loginViaAuthRequestCacheService.clearCacheLoginView(); + } + + try { + const loginAuthRequestView: LoginViaAuthRequestView | null = + this.loginViaAuthRequestCacheService.getCachedLoginViaAuthRequestView(); + + if (!loginAuthRequestView) { + await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock); + + // I tried several ways to get the IDE/linter to play nice with checking for null values + // in less code / more efficiently, but it struggles to identify code paths that + // are more complicated than this. + if (!this.authRequest) { + this.logService.error("AuthRequest failed to initialize from buildAuthRequest."); + return; + } + + if (!this.fingerprintPhrase) { + this.logService.error("FingerprintPhrase failed to initialize from buildAuthRequest."); + return; + } + + if (!this.authRequestKeyPair) { + this.logService.error("KeyPair failed to initialize from buildAuthRequest."); + return; + } + + const authRequestResponse: AuthRequestResponse = + await this.authRequestApiService.postAuthRequest(this.authRequest); + + this.loginViaAuthRequestCacheService.cacheLoginView( + this.authRequest, + authRequestResponse, + this.fingerprintPhrase, + this.authRequestKeyPair, + ); + + if (authRequestResponse.id) { + await this.anonymousHubService.createHubConnection(authRequestResponse.id); + } + } else { + // Grab the cached information and store it back in component state. + // We don't need the public key for handling the authentication request because + // the verifyAndHandleApprovedAuthReq function will receive the public key back + // from the looked up auth request and all we need is to make sure that + // we can use the cached private key that is associated with it. + this.authRequest = loginAuthRequestView.authRequest; + this.fingerprintPhrase = loginAuthRequestView.fingerprintPhrase; + this.authRequestKeyPair = { + privateKey: loginAuthRequestView.privateKey + ? Utils.fromB64ToArray(loginAuthRequestView.privateKey) + : undefined, + publicKey: undefined, + }; + + if (!loginAuthRequestView.authRequestResponse) { + this.logService.error("No cached auth request response."); + return; + } + + if (loginAuthRequestView.authRequestResponse.id) { + await this.anonymousHubService.createHubConnection( + loginAuthRequestView.authRequestResponse.id, + ); + } + } + } catch (e) { + this.logService.error(e); + } + } else { + try { + await this.buildAuthRequest(AuthRequestType.AuthenticateAndUnlock); + + if (!this.authRequest) { + this.logService.error("No auth request found."); + return; + } + + const authRequestResponse = await this.authRequestApiService.postAuthRequest( + this.authRequest, + ); + + if (authRequestResponse.id) { + await this.anonymousHubService.createHubConnection(authRequestResponse.id); + } + } catch (e) { + this.logService.error(e); } - } catch (e) { - this.logService.error(e); } setTimeout(() => { @@ -250,12 +369,23 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { }; const deviceIdentifier = await this.appIdService.getAppId(); + + if (!this.authRequestKeyPair.publicKey) { + this.logService.error("AuthRequest public key not set to value in building auth request."); + return; + } + const publicKey = Utils.fromBufferToB64(this.authRequestKeyPair.publicKey); const accessCode = await this.passwordGenerationService.generatePassword({ type: "password", length: 25, }); + if (!this.email) { + this.logService.error("Email not defined when building auth request."); + return; + } + this.fingerprintPhrase = await this.authRequestService.getFingerprintPhrase( this.email, this.authRequestKeyPair.publicKey, @@ -288,6 +418,8 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { if (error instanceof ErrorResponse && error.statusCode === HttpStatusCode.NotFound) { return await this.handleExistingAdminAuthReqDeletedOrDenied(userId); } + this.logService.error(error); + return; } // Request doesn't exist anymore @@ -300,6 +432,12 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { const derivedPublicKeyArrayBuffer = await this.cryptoFunctionService.rsaExtractPublicKey( adminAuthRequestStorable.privateKey, ); + + if (!this.email) { + this.logService.error("Email not defined when handling an existing an admin auth request."); + return; + } + this.fingerprintPhrase = await this.authRequestService.getFingerprintPhrase( this.email, derivedPublicKeyArrayBuffer, @@ -319,9 +457,12 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { ); } - // Request still pending response from admin - // set keypair and create hub connection so that any approvals will be received via push notification - this.authRequestKeyPair = { privateKey: adminAuthRequestStorable.privateKey, publicKey: null }; + // Request still pending response from admin set keypair and create hub connection + // so that any approvals will be received via push notification + this.authRequestKeyPair = { + privateKey: adminAuthRequestStorable.privateKey, + publicKey: undefined, + }; await this.anonymousHubService.createHubConnection(adminAuthRequestStorable.id); } @@ -382,7 +523,7 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { * | Standard Flow 1 | unauthed | "Login with device" [/login] | /login-with-device | yes | * | Standard Flow 2 | unauthed | "Login with device" [/login] | /login-with-device | no | * | Standard Flow 3 | authed | "Approve from your other device" [/login-initiated] | /login-with-device | yes | - * | Standard Flow 4 | authed | "Approve from your other device" [/login-initiated] | /login-with-device | no | | + * | Standard Flow 4 | authed | "Approve from your other device" [/login-initiated] | /login-with-device | no | * | Admin Flow | authed | "Request admin approval" [/login-initiated] | /admin-approval-requested | NA - admin requests always send encrypted userKey | * |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| * * Note 1: The phrase "in memory" here is important. It is possible for a user to have a master password for their account, but not have a masterKey IN MEMORY for @@ -403,6 +544,11 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { await this.handleAuthenticatedFlows(authRequestResponse); } } else { + if (!this.authRequest) { + this.logService.error("No auth request defined when handling approved auth request."); + return; + } + // Get the auth request from the server // User is unauthenticated, therefore the endpoint requires an access code for user verification. const authRequestResponse = await this.authRequestApiService.getAuthResponse( @@ -423,11 +569,26 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { } this.logService.error(error); + } finally { + // Manually clean out the cache to make sure sensitive + // data does not persist longer than it needs to. + this.loginViaAuthRequestCacheService.clearCacheLoginView(); } } private async handleAuthenticatedFlows(authRequestResponse: AuthRequestResponse) { - const userId = (await firstValueFrom(this.accountService.activeAccount$)).id; + const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id; + if (!userId) { + this.logService.error( + "Not able to get a user id from the account service active account observable.", + ); + return; + } + + if (!this.authRequestKeyPair || !this.authRequestKeyPair.privateKey) { + this.logService.error("No private key set when handling the authenticated flows."); + return; + } await this.decryptViaApprovedAuthRequest( authRequestResponse, @@ -445,6 +606,11 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { authRequestResponse, ); + if (!authRequestLoginCredentials) { + this.logService.error("Didn't set up auth request login credentials properly."); + return; + } + // Note: keys are set by AuthRequestLoginStrategy success handling const authResult = await this.loginStrategyService.logIn(authRequestLoginCredentials); @@ -463,7 +629,6 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { * - If `masterPasswordHash` has a value, we receive the `key` as an authRequestPublicKey(masterKey) [plus we have authRequestPublicKey(masterPasswordHash)] * - If `masterPasswordHash` does not have a value, we receive the `key` as an authRequestPublicKey(userKey) */ - if (authRequestResponse.masterPasswordHash) { // ...in Standard Auth Request Flow 3 await this.authRequestService.setKeysAfterDecryptingSharedMasterKeyAndHash( @@ -486,13 +651,17 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { this.toastService.showToast({ variant: "success", - title: null, message: this.i18nService.t("loginApproved"), }); // Now that we have a decrypted user key in memory, we can check if we // need to establish trust on the current device const activeAccount = await firstValueFrom(this.accountService.activeAccount$); + if (!activeAccount) { + this.logService.error("No active account defined from the account service."); + return; + } + await this.deviceTrustService.trustDeviceIfRequired(activeAccount.id); await this.handleSuccessfulLoginNavigation(userId); @@ -508,7 +677,24 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { private async buildAuthRequestLoginCredentials( requestId: string, authRequestResponse: AuthRequestResponse, - ): Promise { + ): Promise { + if (!this.authRequestKeyPair || !this.authRequestKeyPair.privateKey) { + this.logService.error("No private key set when building auth request login credentials."); + return; + } + + if (!this.email) { + this.logService.error("Email not defined."); + return; + } + + if (!this.authRequest) { + this.logService.error( + "AuthRequest not defined when building auth request login credentials.", + ); + return; + } + /** * See verifyAndHandleApprovedAuthReq() for flow details. * @@ -516,7 +702,6 @@ export class LoginViaAuthRequestComponent implements OnInit, OnDestroy { * - If `masterPasswordHash` has a value, we receive the `key` as an authRequestPublicKey(masterKey) [plus we have authRequestPublicKey(masterPasswordHash)] * - If `masterPasswordHash` does not have a value, we receive the `key` as an authRequestPublicKey(userKey) */ - if (authRequestResponse.masterPasswordHash) { // ...in Standard Auth Request Flow 1 const { masterKey, masterKeyHash } = diff --git a/libs/auth/src/angular/login/login.component.ts b/libs/auth/src/angular/login/login.component.ts index c291a64a8c5..cc38ec5dfb3 100644 --- a/libs/auth/src/angular/login/login.component.ts +++ b/libs/auth/src/angular/login/login.component.ts @@ -2,7 +2,7 @@ import { CommonModule } from "@angular/common"; import { Component, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core"; import { FormBuilder, FormControl, ReactiveFormsModule, Validators } from "@angular/forms"; import { ActivatedRoute, Router, RouterModule } from "@angular/router"; -import { firstValueFrom, Subject, take, takeUntil, tap } from "rxjs"; +import { firstValueFrom, Subject, take, takeUntil } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { @@ -19,11 +19,9 @@ import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstraction import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { ClientType, HttpStatusCode } from "@bitwarden/common/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; @@ -121,7 +119,6 @@ export class LoginComponent implements OnInit, OnDestroy { private toastService: ToastService, private logService: LogService, private validationService: ValidationService, - private configService: ConfigService, private loginSuccessHandlerService: LoginSuccessHandlerService, ) { this.clientType = this.platformUtilsService.getClientType(); @@ -131,9 +128,6 @@ export class LoginComponent implements OnInit, OnDestroy { // Add popstate listener to listen for browser back button clicks window.addEventListener("popstate", this.handlePopState); - // TODO: remove this when the UnauthenticatedExtensionUIRefresh feature flag is removed. - this.listenForUnauthUiRefreshFlagChanges(); - await this.defaultOnInit(); if (this.clientType === ClientType.Desktop) { @@ -154,30 +148,6 @@ export class LoginComponent implements OnInit, OnDestroy { this.destroy$.complete(); } - private listenForUnauthUiRefreshFlagChanges() { - this.configService - .getFeatureFlag$(FeatureFlag.UnauthenticatedExtensionUIRefresh) - .pipe( - tap(async (flag) => { - // If the flag is turned OFF, we must force a reload to ensure the correct UI is shown - if (!flag) { - const qParams = await firstValueFrom(this.activatedRoute.queryParams); - const uniqueQueryParams = { - ...qParams, - // adding a unique timestamp to the query params to force a reload - t: new Date().getTime().toString(), // Adding a unique timestamp as a query parameter - }; - - await this.router.navigate(["/"], { - queryParams: uniqueQueryParams, - }); - } - }), - takeUntil(this.destroy$), - ) - .subscribe(); - } - submit = async (): Promise => { if (this.clientType === ClientType.Desktop) { if (this.loginUiState !== LoginUiState.MASTER_PASSWORD_ENTRY) { diff --git a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts index 6c48a471d08..57583eb24d2 100644 --- a/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts +++ b/libs/auth/src/angular/new-device-verification/new-device-verification.component.ts @@ -15,7 +15,6 @@ import { FormFieldModule, IconButtonModule, LinkModule, - ToastService, } from "@bitwarden/components"; import { LoginEmailServiceAbstraction } from "../../common/abstractions/login-email.service"; @@ -60,7 +59,6 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { private apiService: ApiService, private loginStrategyService: LoginStrategyServiceAbstraction, private logService: LogService, - private toastService: ToastService, private i18nService: I18nService, private syncService: SyncService, private loginEmailService: LoginEmailServiceAbstraction, @@ -153,9 +151,17 @@ export class NewDeviceVerificationComponent implements OnInit, OnDestroy { await this.router.navigate(["/vault"]); } catch (e) { this.logService.error(e); - const errorMessage = - (e as any)?.response?.error_description ?? this.i18nService.t("errorOccurred"); + let errorMessage = + ((e as any)?.response?.error_description as string) ?? this.i18nService.t("errorOccurred"); + + if (errorMessage.includes("Invalid New Device OTP")) { + errorMessage = this.i18nService.t("invalidVerificationCode"); + } + codeControl.setErrors({ serverError: { message: errorMessage } }); + // For enter key press scenarios, we have to manually mark the control as touched + // to get the error message to display + codeControl.markAsTouched(); } }; } diff --git a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts index 726110663fc..bd62092a4b6 100644 --- a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts +++ b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.spec.ts @@ -9,9 +9,10 @@ import { import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationKeysResponse } from "@bitwarden/common/admin-console/models/response/organization-keys.response"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -31,6 +32,7 @@ describe("DefaultSetPasswordJitService", () => { let sut: DefaultSetPasswordJitService; let apiService: MockProxy; + let masterPasswordApiService: MockProxy; let keyService: MockProxy; let encryptService: MockProxy; let i18nService: MockProxy; @@ -42,6 +44,7 @@ describe("DefaultSetPasswordJitService", () => { beforeEach(() => { apiService = mock(); + masterPasswordApiService = mock(); keyService = mock(); encryptService = mock(); i18nService = mock(); @@ -53,6 +56,7 @@ describe("DefaultSetPasswordJitService", () => { sut = new DefaultSetPasswordJitService( apiService, + masterPasswordApiService, keyService, encryptService, i18nService, @@ -148,7 +152,7 @@ describe("DefaultSetPasswordJitService", () => { keyService.makeKeyPair.mockResolvedValue(keyPair); - apiService.setPassword.mockResolvedValue(undefined); + masterPasswordApiService.setPassword.mockResolvedValue(undefined); masterPasswordService.setForceSetPasswordReason.mockResolvedValue(undefined); userDecryptionOptionsSubject.next(new UserDecryptionOptions({ hasMasterPassword: true })); @@ -185,7 +189,7 @@ describe("DefaultSetPasswordJitService", () => { await sut.setPassword(credentials); // Assert - expect(apiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); + expect(masterPasswordApiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); }); it("should set password successfully (given no user key)", async () => { @@ -196,7 +200,7 @@ describe("DefaultSetPasswordJitService", () => { await sut.setPassword(credentials); // Assert - expect(apiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); + expect(masterPasswordApiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); }); it("should handle reset password auto enroll", async () => { @@ -210,7 +214,7 @@ describe("DefaultSetPasswordJitService", () => { await sut.setPassword(credentials); // Assert - expect(apiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); + expect(masterPasswordApiService.setPassword).toHaveBeenCalledWith(setPasswordRequest); expect(organizationApiService.getKeys).toHaveBeenCalledWith(orgId); expect(encryptService.rsaEncrypt).toHaveBeenCalledWith(userKey.key, orgPublicKey); expect( diff --git a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts index 6c9ce8f9267..42d964f3de0 100644 --- a/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts +++ b/libs/auth/src/angular/set-password-jit/default-set-password-jit.service.ts @@ -9,10 +9,11 @@ import { import { InternalUserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; +import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/master-password-api.service.abstraction"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SetPasswordRequest } from "@bitwarden/common/auth/models/request/set-password.request"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { KeysRequest } from "@bitwarden/common/models/request/keys.request"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -29,6 +30,7 @@ import { export class DefaultSetPasswordJitService implements SetPasswordJitService { constructor( protected apiService: ApiService, + protected masterPasswordApiService: MasterPasswordApiService, protected keyService: KeyService, protected encryptService: EncryptService, protected i18nService: I18nService, @@ -77,7 +79,7 @@ export class DefaultSetPasswordJitService implements SetPasswordJitService { kdfConfig.iterations, ); - await this.apiService.setPassword(request); + await this.masterPasswordApiService.setPassword(request); // Clear force set password reason to allow navigation back to vault. await this.masterPasswordService.setForceSetPasswordReason(ForceSetPasswordReason.None, userId); diff --git a/libs/auth/src/angular/sso/sso-component.service.ts b/libs/auth/src/angular/sso/sso-component.service.ts index b5712dfacc9..6b71b8f9903 100644 --- a/libs/auth/src/angular/sso/sso-component.service.ts +++ b/libs/auth/src/angular/sso/sso-component.service.ts @@ -1,6 +1,10 @@ import { ClientType } from "@bitwarden/common/enums"; -export type SsoClientType = ClientType.Web | ClientType.Browser | ClientType.Desktop; +export type SsoClientType = + | ClientType.Web + | ClientType.Browser + | ClientType.Desktop + | ClientType.Cli; /** * Abstract class for SSO component services. diff --git a/libs/auth/src/angular/sso/sso.component.ts b/libs/auth/src/angular/sso/sso.component.ts index ce63769ffca..5d3fd689dd6 100644 --- a/libs/auth/src/angular/sso/sso.component.ts +++ b/libs/auth/src/angular/sso/sso.component.ts @@ -19,13 +19,13 @@ import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/admin-console/ import { OrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain-sso-details.response"; import { VerifiedOrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/verified-organization-domain-sso-details.response"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SsoPreValidateResponse } from "@bitwarden/common/auth/models/response/sso-pre-validate.response"; import { ClientType, HttpStatusCode } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; @@ -199,7 +199,9 @@ export class SsoComponent implements OnInit { * @returns True if the value is a valid SSO client type, otherwise false */ private isValidSsoClientType(value: string): value is SsoClientType { - return [ClientType.Web, ClientType.Browser, ClientType.Desktop].includes(value as ClientType); + return [ClientType.Web, ClientType.Browser, ClientType.Desktop, ClientType.Cli].includes( + value as ClientType, + ); } /** diff --git a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-webauthn/two-factor-auth-webauthn.component.ts b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-webauthn/two-factor-auth-webauthn.component.ts index 4987b41707b..ae348c27a62 100644 --- a/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-webauthn/two-factor-auth-webauthn.component.ts +++ b/libs/auth/src/angular/two-factor-auth/child-components/two-factor-auth-webauthn/two-factor-auth-webauthn.component.ts @@ -108,6 +108,8 @@ export class TwoFactorAuthWebAuthnComponent implements OnInit, OnDestroy { this.webAuthnResultEmitter.emit({ token }); }, (error: string) => { + this.logService.error("WebAuthn error: ", error); + this.toastService.showToast({ variant: "error", title: this.i18nService.t("errorOccurred"), diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.spec.ts b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.spec.ts index 79856157aaa..20e9aa73048 100644 --- a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.spec.ts +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.spec.ts @@ -6,7 +6,6 @@ import { ActivatedRoute, convertToParamMap, Router } from "@angular/router"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; -// eslint-disable-next-line no-restricted-imports import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; import { LoginStrategyServiceAbstraction, @@ -19,14 +18,14 @@ import { } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthenticationType } from "@bitwarden/common/auth/enums/authentication-type"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -227,20 +226,6 @@ describe("TwoFactorAuthComponent", () => { }); }; - const testForceResetOnSuccessfulLogin = (reasonString: string) => { - it(`navigates to the component's defined forcePasswordResetRoute route when response.forcePasswordReset is ${reasonString}`, async () => { - // Act - await component.submit("testToken"); - - // expect(mockRouter.navigate).toHaveBeenCalledTimes(1); - expect(mockRouter.navigate).toHaveBeenCalledWith(["update-temp-password"], { - queryParams: { - identifier: component.orgSsoIdentifier, - }, - }); - }); - }; - describe("Standard 2FA scenarios", () => { describe("submit", () => { const token = "testToken"; @@ -312,26 +297,6 @@ describe("TwoFactorAuthComponent", () => { }); }); - describe("Force Master Password Reset scenarios", () => { - [ - ForceSetPasswordReason.AdminForcePasswordReset, - ForceSetPasswordReason.WeakMasterPassword, - ].forEach((forceResetPasswordReason) => { - const reasonString = ForceSetPasswordReason[forceResetPasswordReason]; - - beforeEach(() => { - // use standard user with MP because this test is not concerned with password reset. - selectedUserDecryptionOptions.next(mockUserDecryptionOpts.withMasterPassword); - - const authResult = new AuthResult(); - authResult.forcePasswordReset = forceResetPasswordReason; - mockLoginStrategyService.logInTwoFactor.mockResolvedValue(authResult); - }); - - testForceResetOnSuccessfulLogin(reasonString); - }); - }); - it("navigates to the component's defined success route (vault is default) when the login is successful", async () => { mockLoginStrategyService.logInTwoFactor.mockResolvedValue(new AuthResult()); @@ -408,29 +373,7 @@ describe("TwoFactorAuthComponent", () => { }); }); - describe("Given Trusted Device Encryption is enabled, user doesn't need to set a MP, and forcePasswordReset is required", () => { - [ - ForceSetPasswordReason.AdminForcePasswordReset, - ForceSetPasswordReason.WeakMasterPassword, - ].forEach((forceResetPasswordReason) => { - const reasonString = ForceSetPasswordReason[forceResetPasswordReason]; - - beforeEach(() => { - // use standard user with MP because this test is not concerned with password reset. - selectedUserDecryptionOptions.next( - mockUserDecryptionOpts.withMasterPasswordAndTrustedDevice, - ); - - const authResult = new AuthResult(); - authResult.forcePasswordReset = forceResetPasswordReason; - mockLoginStrategyService.logInTwoFactor.mockResolvedValue(authResult); - }); - - testForceResetOnSuccessfulLogin(reasonString); - }); - }); - - describe("Given Trusted Device Encryption is enabled, user doesn't need to set a MP, and forcePasswordReset is not required", () => { + describe("Given Trusted Device Encryption is enabled and user doesn't need to set a MP", () => { let authResult; beforeEach(() => { selectedUserDecryptionOptions.next( @@ -438,7 +381,6 @@ describe("TwoFactorAuthComponent", () => { ); authResult = new AuthResult(); - authResult.forcePasswordReset = ForceSetPasswordReason.None; mockLoginStrategyService.logInTwoFactor.mockResolvedValue(authResult); }); diff --git a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts index 296316198b0..74b5db634f5 100644 --- a/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts +++ b/libs/auth/src/angular/two-factor-auth/two-factor-auth.component.ts @@ -24,7 +24,6 @@ import { LoginSuccessHandlerService, } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthenticationType } from "@bitwarden/common/auth/enums/authentication-type"; @@ -32,6 +31,7 @@ import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-p import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -188,8 +188,7 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { this.twoFactorAuthComponentService.shouldCheckForWebAuthnQueryParamResponse() && webAuthnSupported ) { - const webAuthn2faResponse = - this.activatedRoute.snapshot.queryParamMap.get("webAuthnResponse"); + const webAuthn2faResponse = this.activatedRoute.snapshot.paramMap.get("webAuthnResponse"); if (webAuthn2faResponse) { this.selectedProviderType = TwoFactorProviderType.WebAuthn; return; @@ -396,11 +395,6 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { ); } - // note: this flow affects both TDE & standard users - if (this.isForcePasswordResetRequired(authResult)) { - return await this.handleForcePasswordReset(this.orgSsoIdentifier); - } - const userDecryptionOpts = await firstValueFrom( this.userDecryptionOptionsService.userDecryptionOptions$, ); @@ -415,6 +409,7 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { const requireSetPassword = !userDecryptionOpts.hasMasterPassword && userDecryptionOpts.keyConnectorOption === undefined; + // New users without a master password must set a master password before advancing. if (requireSetPassword || authResult.resetMasterPassword) { // Change implies going no password -> password in this case return await this.handleChangePasswordRequired(this.orgSsoIdentifier); @@ -524,14 +519,6 @@ export class TwoFactorAuthComponent implements OnInit, OnDestroy { return forceResetReasons.includes(authResult.forcePasswordReset); } - private async handleForcePasswordReset(orgIdentifier: string | undefined) { - await this.router.navigate(["update-temp-password"], { - queryParams: { - identifier: orgIdentifier, - }, - }); - } - showContinueButton() { return ( this.selectedProviderType != null && diff --git a/libs/auth/src/angular/user-verification/user-verification-form-input.component.ts b/libs/auth/src/angular/user-verification/user-verification-form-input.component.ts index 40c3106b188..ff4af51f732 100644 --- a/libs/auth/src/angular/user-verification/user-verification-form-input.component.ts +++ b/libs/auth/src/angular/user-verification/user-verification-form-input.component.ts @@ -68,7 +68,6 @@ import { ActiveClientVerificationOption } from "./active-client-verification-opt CalloutModule, ], }) -// eslint-disable-next-line rxjs-angular/prefer-takeuntil export class UserVerificationFormInputComponent implements ControlValueAccessor, OnInit, OnDestroy { @Input() verificationType: "server" | "client" = "server"; // server represents original behavior private _invalidSecret = false; diff --git a/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts b/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts index 1829fe6b0c9..75bb8686163 100644 --- a/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts +++ b/libs/auth/src/common/abstractions/auth-request.service.abstraction.ts @@ -12,6 +12,12 @@ export abstract class AuthRequestServiceAbstraction { /** Emits an auth request id when an auth request has been approved. */ authRequestPushNotification$: Observable; + /** + * Emits when a login has been approved by an admin. This emission is specifically for the + * purpose of notifying the consuming component to display a toast informing the user. + */ + adminLoginApproved$: Observable; + /** * Returns an admin auth request for the given user if it exists. * @param userId The user id. @@ -106,4 +112,13 @@ export abstract class AuthRequestServiceAbstraction { * @returns The dash-delimited fingerprint phrase. */ abstract getFingerprintPhrase(email: string, publicKey: Uint8Array): Promise; + + /** + * Passes a value to the adminLoginApprovedSubject via next(), which causes the + * adminLoginApproved$ observable to emit. + * + * The purpose is to notify consuming components (of adminLoginApproved$) to display + * a toast informing the user that a login has been approved by an admin. + */ + abstract emitAdminLoginApproved(): void; } diff --git a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts index 0646da4862b..842dfb3f4e3 100644 --- a/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/auth-request-login.strategy.spec.ts @@ -2,13 +2,13 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts b/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts index e546f89032b..3d91adf35cf 100644 --- a/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/auth-request-login.strategy.ts @@ -3,11 +3,11 @@ import { firstValueFrom, Observable, map, BehaviorSubject } from "rxjs"; import { Jsonify } from "type-fest"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { PasswordTokenRequest } from "@bitwarden/common/auth/models/request/identity-token/password-token.request"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { UserId } from "@bitwarden/common/types/guid"; import { AuthRequestLoginCredentials } from "../models/domain/login-credentials"; diff --git a/libs/auth/src/common/login-strategies/login.strategy.spec.ts b/libs/auth/src/common/login-strategies/login.strategy.spec.ts index b4a1e6a77d9..fc3be61fe11 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.spec.ts @@ -17,9 +17,9 @@ import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/id import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/response/identity-two-factor.response"; import { MasterPasswordPolicyResponse } from "@bitwarden/common/auth/models/response/master-password-policy.response"; import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/models/response/user-decryption-options/user-decryption-options.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, @@ -306,6 +306,31 @@ describe("LoginStrategy", () => { expect(result).toEqual(expected); }); + it("processes a forcePasswordReset response properly", async () => { + const tokenResponse = identityTokenResponseFactory(); + tokenResponse.forcePasswordReset = true; + + apiService.postIdentityToken.mockResolvedValue(tokenResponse); + + const result = await passwordLoginStrategy.logIn(credentials); + + const expected = new AuthResult(); + expected.userId = userId; + expected.forcePasswordReset = ForceSetPasswordReason.AdminForcePasswordReset; + expected.resetMasterPassword = false; + expected.twoFactorProviders = {} as Partial< + Record> + >; + expected.captchaSiteKey = ""; + expected.twoFactorProviders = null; + expect(result).toEqual(expected); + + expect(masterPasswordService.mock.setForceSetPasswordReason).toHaveBeenCalledWith( + ForceSetPasswordReason.AdminForcePasswordReset, + userId, + ); + }); + it("rejects login if CAPTCHA is required", async () => { // Sample CAPTCHA response const tokenResponse = new IdentityCaptchaResponse({ diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index 89802c609c0..96d7b6b0f74 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -2,7 +2,6 @@ import { BehaviorSubject, filter, firstValueFrom, timeout, Observable } from "rx import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; @@ -21,6 +20,7 @@ import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/respons import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { ClientType } from "@bitwarden/common/enums"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutAction, VaultTimeoutSettingsService, @@ -271,17 +271,24 @@ export abstract class LoginStrategy { } } - result.resetMasterPassword = response.resetMasterPassword; - - // Convert boolean to enum - if (response.forcePasswordReset) { - result.forcePasswordReset = ForceSetPasswordReason.AdminForcePasswordReset; - } - - // Must come before setting keys, user key needs email to update additional keys + // Must come before setting keys, user key needs email to update additional keys. const userId = await this.saveAccountInformation(response); result.userId = userId; + result.resetMasterPassword = response.resetMasterPassword; + + // Convert boolean to enum and set the state for the master password service to + // so we know when we reach the auth guard that we need to guide them properly to admin + // password reset. + if (response.forcePasswordReset) { + result.forcePasswordReset = ForceSetPasswordReason.AdminForcePasswordReset; + + await this.masterPasswordService.setForceSetPasswordReason( + ForceSetPasswordReason.AdminForcePasswordReset, + userId, + ); + } + if (response.twoFactorToken != null) { // note: we can read email from access token b/c it was saved in saveAccountInformation const userEmail = await this.tokenService.getEmail(); @@ -300,7 +307,9 @@ export abstract class LoginStrategy { // The keys comes from different sources depending on the login strategy protected abstract setMasterKey(response: IdentityTokenResponse, userId: UserId): Promise; + protected abstract setUserKey(response: IdentityTokenResponse, userId: UserId): Promise; + protected abstract setPrivateKey(response: IdentityTokenResponse, userId: UserId): Promise; // Old accounts used master key for encryption. We are forcing migrations but only need to diff --git a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts index 0821405e535..3752960fc47 100644 --- a/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/password-login.strategy.spec.ts @@ -10,9 +10,9 @@ import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/for import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/response/identity-two-factor.response"; import { MasterPasswordPolicyResponse } from "@bitwarden/common/auth/models/response/master-password-policy.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts index 6efb17a8d26..546fa0c5fa7 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.spec.ts @@ -2,17 +2,17 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/models/response/user-decryption-options/user-decryption-options.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/login-strategies/sso-login.strategy.ts b/libs/auth/src/common/login-strategies/sso-login.strategy.ts index e9d1e0a6c88..1dd01d6fc75 100644 --- a/libs/auth/src/common/login-strategies/sso-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/sso-login.strategy.ts @@ -3,14 +3,13 @@ import { firstValueFrom, Observable, map, BehaviorSubject } from "rxjs"; import { Jsonify } from "type-fest"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; -import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; import { SsoTokenRequest } from "@bitwarden/common/auth/models/request/identity-token/sso-token.request"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { HttpStatusCode } from "@bitwarden/common/enums"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { UserId } from "@bitwarden/common/types/guid"; @@ -108,14 +107,6 @@ export class SsoLoginStrategy extends LoginStrategy { const email = ssoAuthResult.email; const ssoEmail2FaSessionToken = ssoAuthResult.ssoEmail2FaSessionToken; - // Auth guard currently handles redirects for this. - if (ssoAuthResult.forcePasswordReset == ForceSetPasswordReason.AdminForcePasswordReset) { - await this.masterPasswordService.setForceSetPasswordReason( - ssoAuthResult.forcePasswordReset, - ssoAuthResult.userId, - ); - } - this.cache.next({ ...this.cache.value, email, @@ -278,7 +269,8 @@ export class SsoLoginStrategy extends LoginStrategy { // TODO: eventually we post and clean up DB as well once consumed on client await this.authRequestService.clearAdminAuthRequest(userId); - this.platformUtilsService.showToast("success", null, this.i18nService.t("loginApproved")); + // This notification will be picked up by the SsoComponent to handle displaying a toast to the user + this.authRequestService.emitAdminLoginApproved(); } } } diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts index c0c7e828b68..ec017e58c3c 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.spec.ts @@ -2,12 +2,12 @@ import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts index 0bff20b4a65..32cd5ceaf40 100644 --- a/libs/auth/src/common/login-strategies/user-api-login.strategy.ts +++ b/libs/auth/src/common/login-strategies/user-api-login.strategy.ts @@ -3,9 +3,9 @@ import { firstValueFrom, BehaviorSubject } from "rxjs"; import { Jsonify } from "type-fest"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { UserApiTokenRequest } from "@bitwarden/common/auth/models/request/identity-token/user-api-token.request"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; import { VaultTimeoutAction } from "@bitwarden/common/key-management/vault-timeout"; import { UserId } from "@bitwarden/common/types/guid"; diff --git a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts index 837c6a2a910..aac4a36c24a 100644 --- a/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts +++ b/libs/auth/src/common/login-strategies/webauthn-login.strategy.spec.ts @@ -7,10 +7,10 @@ import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { IUserDecryptionOptionsServerResponse } from "@bitwarden/common/auth/models/response/user-decryption-options/user-decryption-options.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { WebAuthnLoginAssertionResponseRequest } from "@bitwarden/common/auth/services/webauthn-login/request/webauthn-login-assertion-response.request"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/models/domain/login-credentials.ts b/libs/auth/src/common/models/domain/login-credentials.ts index 72cc7413bec..cc21e5b2505 100644 --- a/libs/auth/src/common/models/domain/login-credentials.ts +++ b/libs/auth/src/common/models/domain/login-credentials.ts @@ -53,9 +53,9 @@ export class AuthRequestLoginCredentials { public email: string, public accessCode: string, public authRequestId: string, - public decryptedUserKey: UserKey, - public decryptedMasterKey: MasterKey, - public decryptedMasterKeyHash: string, + public decryptedUserKey: UserKey | null, + public decryptedMasterKey: MasterKey | null, + public decryptedMasterKeyHash: string | null, public twoFactor?: TokenTwoFactorRequest, ) {} diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts index 2ea6d427641..1e9c46db0ee 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.spec.ts @@ -2,8 +2,8 @@ import { mock } from "jest-mock-extended"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; diff --git a/libs/auth/src/common/services/auth-request/auth-request.service.ts b/libs/auth/src/common/services/auth-request/auth-request.service.ts index 5bc200ae1e8..1da5d2f1882 100644 --- a/libs/auth/src/common/services/auth-request/auth-request.service.ts +++ b/libs/auth/src/common/services/auth-request/auth-request.service.ts @@ -5,11 +5,11 @@ import { Jsonify } from "type-fest"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { AdminAuthRequestStorable } from "@bitwarden/common/auth/models/domain/admin-auth-req-storable"; import { PasswordlessAuthRequest } from "@bitwarden/common/auth/models/request/passwordless-auth.request"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { AuthRequestPushNotification } from "@bitwarden/common/models/response/notification.response"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -43,6 +43,10 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { private authRequestPushNotificationSubject = new Subject(); authRequestPushNotification$: Observable; + // Observable emission is used to trigger a toast in consuming components + private adminLoginApprovedSubject = new Subject(); + adminLoginApproved$: Observable; + constructor( private appIdService: AppIdService, private accountService: AccountService, @@ -53,6 +57,7 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { private stateProvider: StateProvider, ) { this.authRequestPushNotification$ = this.authRequestPushNotificationSubject.asObservable(); + this.adminLoginApproved$ = this.adminLoginApprovedSubject.asObservable(); } async getAdminAuthRequest(userId: UserId): Promise { @@ -207,4 +212,8 @@ export class AuthRequestService implements AuthRequestServiceAbstraction { async getFingerprintPhrase(email: string, publicKey: Uint8Array): Promise { return (await this.keyService.getFingerprint(email.toLowerCase(), publicKey)).join("-"); } + + emitAdminLoginApproved(): void { + this.adminLoginApprovedSubject.next(); + } } diff --git a/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.spec.ts b/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.spec.ts new file mode 100644 index 00000000000..82ac0f1006d --- /dev/null +++ b/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.spec.ts @@ -0,0 +1,111 @@ +import { signal } from "@angular/core"; +import { TestBed } from "@angular/core/testing"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { AuthRequestType } from "@bitwarden/common/auth/enums/auth-request-type"; +import { AuthRequest } from "@bitwarden/common/auth/models/request/auth.request"; +import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { LoginViaAuthRequestView } from "@bitwarden/common/auth/models/view/login-via-auth-request.view"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; + +import { LoginViaAuthRequestCacheService } from "./default-login-via-auth-request-cache.service"; + +describe("LoginViaAuthRequestCache", () => { + let service: LoginViaAuthRequestCacheService; + let testBed: TestBed; + + const cacheSignal = signal(null); + const getCacheSignal = jest.fn().mockReturnValue(cacheSignal); + const getFeatureFlag = jest.fn().mockResolvedValue(false); + const cacheSetMock = jest.spyOn(cacheSignal, "set"); + + beforeEach(() => { + getCacheSignal.mockClear(); + getFeatureFlag.mockClear(); + cacheSetMock.mockClear(); + + testBed = TestBed.configureTestingModule({ + providers: [ + { provide: ViewCacheService, useValue: { signal: getCacheSignal } }, + { provide: ConfigService, useValue: { getFeatureFlag } }, + LoginViaAuthRequestCacheService, + ], + }); + }); + + describe("feature enabled", () => { + beforeEach(() => { + getFeatureFlag.mockResolvedValue(true); + }); + + it("`getCachedLoginViaAuthRequestView` returns the cached data", async () => { + cacheSignal.set({ ...buildAuthenticMockAuthView() }); + service = testBed.inject(LoginViaAuthRequestCacheService); + await service.init(); + + expect(service.getCachedLoginViaAuthRequestView()).toEqual({ + ...buildAuthenticMockAuthView(), + }); + }); + + it("updates the signal value", async () => { + service = testBed.inject(LoginViaAuthRequestCacheService); + await service.init(); + + const parameters = buildAuthenticMockAuthView(); + + service.cacheLoginView( + parameters.authRequest, + parameters.authRequestResponse, + parameters.fingerprintPhrase, + { publicKey: new Uint8Array(), privateKey: new Uint8Array() }, + ); + + expect(cacheSignal.set).toHaveBeenCalledWith(parameters); + }); + }); + + describe("feature disabled", () => { + beforeEach(async () => { + cacheSignal.set({ ...buildAuthenticMockAuthView() } as LoginViaAuthRequestView); + getFeatureFlag.mockResolvedValue(false); + cacheSetMock.mockClear(); + + service = testBed.inject(LoginViaAuthRequestCacheService); + await service.init(); + }); + + it("`getCachedCipherView` returns null", () => { + expect(service.getCachedLoginViaAuthRequestView()).toBeNull(); + }); + + it("does not update the signal value", () => { + const params = buildAuthenticMockAuthView(); + + service.cacheLoginView( + params.authRequest, + params.authRequestResponse, + params.fingerprintPhrase, + { publicKey: new Uint8Array(), privateKey: new Uint8Array() }, + ); + + expect(cacheSignal.set).not.toHaveBeenCalled(); + }); + }); + + const buildAuthenticMockAuthView = () => { + return { + fingerprintPhrase: "", + privateKey: "", + publicKey: "", + authRequest: new AuthRequest( + "test@gmail.com", + "deviceIdentifier", + "publicKey", + AuthRequestType.Unlock, + "accessCode", + ), + authRequestResponse: new AuthRequestResponse({}), + }; + }; +}); diff --git a/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.ts b/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.ts new file mode 100644 index 00000000000..30ba8879546 --- /dev/null +++ b/libs/auth/src/common/services/auth-request/default-login-via-auth-request-cache.service.ts @@ -0,0 +1,88 @@ +import { inject, Injectable, WritableSignal } from "@angular/core"; + +import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; +import { AuthRequest } from "@bitwarden/common/auth/models/request/auth.request"; +import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { LoginViaAuthRequestView } from "@bitwarden/common/auth/models/view/login-via-auth-request.view"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; + +const LOGIN_VIA_AUTH_CACHE_KEY = "login-via-auth-request-form-cache"; + +/** + * This is a cache service used for the login via auth request component. + * + * There is sensitive information stored temporarily here. Cache will be cleared + * after 2 minutes. + */ +@Injectable() +export class LoginViaAuthRequestCacheService { + private viewCacheService: ViewCacheService = inject(ViewCacheService); + private configService: ConfigService = inject(ConfigService); + + /** True when the `PM9112_DeviceApproval` flag is enabled */ + private featureEnabled: boolean = false; + + private defaultLoginViaAuthRequestCache: WritableSignal = + this.viewCacheService.signal({ + key: LOGIN_VIA_AUTH_CACHE_KEY, + initialValue: null, + deserializer: LoginViaAuthRequestView.fromJSON, + }); + + constructor() {} + + /** + * Must be called once before interacting with the cached data, otherwise methods will be noop. + */ + async init() { + this.featureEnabled = await this.configService.getFeatureFlag( + FeatureFlag.PM9112_DeviceApprovalPersistence, + ); + } + + /** + * Update the cache with the new LoginView. + */ + cacheLoginView( + authRequest: AuthRequest, + authRequestResponse: AuthRequestResponse, + fingerprintPhrase: string, + keys: { privateKey: Uint8Array | undefined; publicKey: Uint8Array | undefined }, + ): void { + if (!this.featureEnabled) { + return; + } + + // When the keys get stored they should be converted to a B64 string to ensure + // data can be properly formed when json-ified. If not done, they are not stored properly and + // will not be parsable by the cryptography library after coming out of storage. + this.defaultLoginViaAuthRequestCache.set({ + authRequest, + authRequestResponse, + fingerprintPhrase, + privateKey: keys.privateKey ? Utils.fromBufferToB64(keys.privateKey.buffer) : undefined, + publicKey: keys.publicKey ? Utils.fromBufferToB64(keys.publicKey.buffer) : undefined, + } as LoginViaAuthRequestView); + } + + clearCacheLoginView(): void { + if (!this.featureEnabled) { + return; + } + + this.defaultLoginViaAuthRequestCache.set(null); + } + + /** + * Returns the cached LoginViaAuthRequestView when available. + */ + getCachedLoginViaAuthRequestView(): LoginViaAuthRequestView | null { + if (!this.featureEnabled) { + return null; + } + + return this.defaultLoginViaAuthRequestCache(); + } +} diff --git a/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts b/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts index d8d16fa3701..1dc05cafa00 100644 --- a/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts +++ b/libs/auth/src/common/services/login-strategies/login-strategy.service.spec.ts @@ -3,8 +3,6 @@ import { BehaviorSubject } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; @@ -13,9 +11,11 @@ import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/ide import { IdentityTokenResponse } from "@bitwarden/common/auth/models/response/identity-token.response"; import { IdentityTwoFactorResponse } from "@bitwarden/common/auth/models/response/identity-two-factor.response"; import { PreloginResponse } from "@bitwarden/common/auth/models/response/prelogin.response"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutAction, VaultTimeoutSettingsService, diff --git a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts index 4068c09338b..2adea85a9ec 100644 --- a/libs/auth/src/common/services/login-strategies/login-strategy.service.ts +++ b/libs/auth/src/common/services/login-strategies/login-strategy.service.ts @@ -12,9 +12,6 @@ import { import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; import { AuthenticationType } from "@bitwarden/common/auth/enums/authentication-type"; @@ -22,6 +19,9 @@ import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result"; import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/identity-token/token-two-factor.request"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { PreloginRequest } from "@bitwarden/common/models/request/prelogin.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; diff --git a/libs/auth/src/common/services/pin/pin.service.implementation.ts b/libs/auth/src/common/services/pin/pin.service.implementation.ts index c903a45b3a2..0f6ac05f381 100644 --- a/libs/auth/src/common/services/pin/pin.service.implementation.ts +++ b/libs/auth/src/common/services/pin/pin.service.implementation.ts @@ -3,8 +3,8 @@ import { firstValueFrom, map } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { MasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/libs/auth/src/common/services/pin/pin.service.spec.ts b/libs/auth/src/common/services/pin/pin.service.spec.ts index 1d6443535bc..794d08b63b2 100644 --- a/libs/auth/src/common/services/pin/pin.service.spec.ts +++ b/libs/auth/src/common/services/pin/pin.service.spec.ts @@ -1,7 +1,7 @@ import { mock } from "jest-mock-extended"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index fe3f356719b..f186787f7c0 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -38,7 +38,6 @@ import { ProviderUserUserDetailsResponse, } from "../admin-console/models/response/provider/provider-user.response"; import { SelectionReadOnlyResponse } from "../admin-console/models/response/selection-read-only.response"; -import { AuthRequest } from "../auth/models/request/auth.request"; import { DeviceVerificationRequest } from "../auth/models/request/device-verification.request"; import { DisableTwoFactorAuthenticatorRequest } from "../auth/models/request/disable-two-factor-authenticator.request"; import { EmailTokenRequest } from "../auth/models/request/email-token.request"; @@ -47,19 +46,12 @@ import { PasswordTokenRequest } from "../auth/models/request/identity-token/pass import { SsoTokenRequest } from "../auth/models/request/identity-token/sso-token.request"; import { UserApiTokenRequest } from "../auth/models/request/identity-token/user-api-token.request"; import { WebAuthnLoginTokenRequest } from "../auth/models/request/identity-token/webauthn-login-token.request"; -import { KeyConnectorUserKeyRequest } from "../auth/models/request/key-connector-user-key.request"; import { PasswordHintRequest } from "../auth/models/request/password-hint.request"; -import { PasswordRequest } from "../auth/models/request/password.request"; import { PasswordlessAuthRequest } from "../auth/models/request/passwordless-auth.request"; import { SecretVerificationRequest } from "../auth/models/request/secret-verification.request"; -import { SetKeyConnectorKeyRequest } from "../auth/models/request/set-key-connector-key.request"; -import { SetPasswordRequest } from "../auth/models/request/set-password.request"; import { TwoFactorEmailRequest } from "../auth/models/request/two-factor-email.request"; import { TwoFactorProviderRequest } from "../auth/models/request/two-factor-provider.request"; -import { TwoFactorRecoveryRequest } from "../auth/models/request/two-factor-recovery.request"; import { UpdateProfileRequest } from "../auth/models/request/update-profile.request"; -import { UpdateTdeOffboardingPasswordRequest } from "../auth/models/request/update-tde-offboarding-password.request"; -import { UpdateTempPasswordRequest } from "../auth/models/request/update-temp-password.request"; import { UpdateTwoFactorAuthenticatorRequest } from "../auth/models/request/update-two-factor-authenticator.request"; import { UpdateTwoFactorDuoRequest } from "../auth/models/request/update-two-factor-duo.request"; import { UpdateTwoFactorEmailRequest } from "../auth/models/request/update-two-factor-email.request"; @@ -96,6 +88,8 @@ import { PaymentResponse } from "../billing/models/response/payment.response"; import { PlanResponse } from "../billing/models/response/plan.response"; import { SubscriptionResponse } from "../billing/models/response/subscription.response"; import { TaxInfoResponse } from "../billing/models/response/tax-info.response"; +import { KeyConnectorUserKeyRequest } from "../key-management/key-connector/models/key-connector-user-key.request"; +import { SetKeyConnectorKeyRequest } from "../key-management/key-connector/models/set-key-connector-key.request"; import { DeleteRecoverRequest } from "../models/request/delete-recover.request"; import { EventRequest } from "../models/request/event.request"; import { KdfRequest } from "../models/request/kdf.request"; @@ -169,8 +163,6 @@ export abstract class ApiService { postPrelogin: (request: PreloginRequest) => Promise; postEmailToken: (request: EmailTokenRequest) => Promise; postEmail: (request: EmailRequest) => Promise; - postPassword: (request: PasswordRequest) => Promise; - setPassword: (request: SetPasswordRequest) => Promise; postSetKeyConnectorKey: (request: SetKeyConnectorKeyRequest) => Promise; postSecurityStamp: (request: SecretVerificationRequest) => Promise; getAccountRevisionDate: () => Promise; @@ -189,13 +181,8 @@ export abstract class ApiService { postAccountKdf: (request: KdfRequest) => Promise; postUserApiKey: (id: string, request: SecretVerificationRequest) => Promise; postUserRotateApiKey: (id: string, request: SecretVerificationRequest) => Promise; - putUpdateTempPassword: (request: UpdateTempPasswordRequest) => Promise; - putUpdateTdeOffboardingPassword: (request: UpdateTdeOffboardingPasswordRequest) => Promise; postConvertToKeyConnector: () => Promise; //passwordless - postAuthRequest: (request: AuthRequest) => Promise; - postAdminAuthRequest: (request: AuthRequest) => Promise; - getAuthResponse: (id: string, accessCode: string) => Promise; getAuthRequest: (id: string) => Promise; putAuthRequest: (id: string, request: PasswordlessAuthRequest) => Promise; getAuthRequests: () => Promise>; @@ -356,7 +343,6 @@ export abstract class ApiService { organizationId: string, request: TwoFactorProviderRequest, ) => Promise; - postTwoFactorRecover: (request: TwoFactorRecoveryRequest) => Promise; postTwoFactorEmailSetup: (request: TwoFactorEmailRequest) => Promise; postTwoFactorEmail: (request: TwoFactorEmailRequest) => Promise; getDeviceVerificationSettings: () => Promise; diff --git a/libs/common/src/abstractions/search.service.ts b/libs/common/src/abstractions/search.service.ts index ae53266cc21..2bff33bf2db 100644 --- a/libs/common/src/abstractions/search.service.ts +++ b/libs/common/src/abstractions/search.service.ts @@ -3,16 +3,21 @@ import { Observable } from "rxjs"; import { SendView } from "../tools/send/models/view/send.view"; -import { IndexedEntityId } from "../types/guid"; +import { IndexedEntityId, UserId } from "../types/guid"; import { CipherView } from "../vault/models/view/cipher.view"; export abstract class SearchService { - indexedEntityId$: Observable; + indexedEntityId$: (userId: UserId) => Observable; - clearIndex: () => Promise; - isSearchable: (query: string) => Promise; - indexCiphers: (ciphersToIndex: CipherView[], indexedEntityGuid?: string) => Promise; + clearIndex: (userId: UserId) => Promise; + isSearchable: (userId: UserId, query: string) => Promise; + indexCiphers: ( + userId: UserId, + ciphersToIndex: CipherView[], + indexedEntityGuid?: string, + ) => Promise; searchCiphers: ( + userId: UserId, query: string, filter?: ((cipher: CipherView) => boolean) | ((cipher: CipherView) => boolean)[], ciphers?: CipherView[], diff --git a/libs/common/src/models/request/collection-bulk-delete.request.ts b/libs/common/src/admin-console/models/request/collection-bulk-delete.request.ts similarity index 100% rename from libs/common/src/models/request/collection-bulk-delete.request.ts rename to libs/common/src/admin-console/models/request/collection-bulk-delete.request.ts diff --git a/libs/common/src/auth/abstractions/master-password-api.service.abstraction.ts b/libs/common/src/auth/abstractions/master-password-api.service.abstraction.ts new file mode 100644 index 00000000000..442347ca456 --- /dev/null +++ b/libs/common/src/auth/abstractions/master-password-api.service.abstraction.ts @@ -0,0 +1,28 @@ +import { PasswordRequest } from "../models/request/password.request"; +import { SetPasswordRequest } from "../models/request/set-password.request"; +import { UpdateTdeOffboardingPasswordRequest } from "../models/request/update-tde-offboarding-password.request"; +import { UpdateTempPasswordRequest } from "../models/request/update-temp-password.request"; + +export abstract class MasterPasswordApiService { + /** + * POSTs a SetPasswordRequest to "/accounts/set-password" + */ + abstract setPassword: (request: SetPasswordRequest) => Promise; + + /** + * POSTs a PasswordRequest to "/accounts/password" + */ + abstract postPassword: (request: PasswordRequest) => Promise; + + /** + * PUTs an UpdateTempPasswordRequest to "/accounts/update-temp-password" + */ + abstract putUpdateTempPassword: (request: UpdateTempPasswordRequest) => Promise; + + /** + * PUTs an UpdateTdeOffboardingPasswordRequest to "/accounts/update-tde-offboarding-password" + */ + abstract putUpdateTdeOffboardingPassword: ( + request: UpdateTdeOffboardingPasswordRequest, + ) => Promise; +} diff --git a/libs/common/src/auth/models/request/identity-token/token.request.ts b/libs/common/src/auth/models/request/identity-token/token.request.ts index 390f184c069..497038878d0 100644 --- a/libs/common/src/auth/models/request/identity-token/token.request.ts +++ b/libs/common/src/auth/models/request/identity-token/token.request.ts @@ -14,7 +14,6 @@ export abstract class TokenRequest { this.device = device != null ? device : null; } - // eslint-disable-next-line alterIdentityTokenHeaders(headers: Headers) { // Implemented in subclass if required } diff --git a/libs/common/src/auth/models/request/two-factor-recovery.request.ts b/libs/common/src/auth/models/request/two-factor-recovery.request.ts deleted file mode 100644 index 79ef6da280c..00000000000 --- a/libs/common/src/auth/models/request/two-factor-recovery.request.ts +++ /dev/null @@ -1,8 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { SecretVerificationRequest } from "./secret-verification.request"; - -export class TwoFactorRecoveryRequest extends SecretVerificationRequest { - recoveryCode: string; - email: string; -} diff --git a/libs/common/src/auth/models/response/auth-request.response.ts b/libs/common/src/auth/models/response/auth-request.response.ts index 88e7c542fae..372ae047f4d 100644 --- a/libs/common/src/auth/models/response/auth-request.response.ts +++ b/libs/common/src/auth/models/response/auth-request.response.ts @@ -10,6 +10,7 @@ export class AuthRequestResponse extends BaseResponse { requestDeviceTypeValue: DeviceType; requestDeviceIdentifier: string; requestIpAddress: string; + requestCountryName: string; key: string; // could be either an encrypted MasterKey or an encrypted UserKey masterPasswordHash: string; // if hash is present, the `key` above is an encrypted MasterKey (else `key` is an encrypted UserKey) creationDate: string; @@ -26,6 +27,7 @@ export class AuthRequestResponse extends BaseResponse { this.requestDeviceTypeValue = this.getResponseProperty("RequestDeviceTypeValue"); this.requestDeviceIdentifier = this.getResponseProperty("RequestDeviceIdentifier"); this.requestIpAddress = this.getResponseProperty("RequestIpAddress"); + this.requestCountryName = this.getResponseProperty("RequestCountryName"); this.key = this.getResponseProperty("Key"); this.masterPasswordHash = this.getResponseProperty("MasterPasswordHash"); this.creationDate = this.getResponseProperty("CreationDate"); diff --git a/libs/common/src/auth/models/view/login-via-auth-request.view.ts b/libs/common/src/auth/models/view/login-via-auth-request.view.ts new file mode 100644 index 00000000000..0691b8efd86 --- /dev/null +++ b/libs/common/src/auth/models/view/login-via-auth-request.view.ts @@ -0,0 +1,17 @@ +import { Jsonify } from "type-fest"; + +import { AuthRequest } from "@bitwarden/common/auth/models/request/auth.request"; +import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; +import { View } from "@bitwarden/common/models/view/view"; + +export class LoginViaAuthRequestView implements View { + authRequest: AuthRequest | undefined = undefined; + authRequestResponse: AuthRequestResponse | undefined = undefined; + fingerprintPhrase: string | undefined = undefined; + privateKey: string | undefined = undefined; + publicKey: string | undefined = undefined; + + static fromJSON(obj: Partial>): LoginViaAuthRequestView { + return Object.assign(new LoginViaAuthRequestView(), obj); + } +} diff --git a/libs/common/src/auth/services/master-password/master-password-api.service.implementation.ts b/libs/common/src/auth/services/master-password/master-password-api.service.implementation.ts new file mode 100644 index 00000000000..a91ccab24ef --- /dev/null +++ b/libs/common/src/auth/services/master-password/master-password-api.service.implementation.ts @@ -0,0 +1,85 @@ +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import { MasterPasswordApiService as MasterPasswordApiServiceAbstraction } from "../../abstractions/master-password-api.service.abstraction"; +import { PasswordRequest } from "../../models/request/password.request"; +import { SetPasswordRequest } from "../../models/request/set-password.request"; +import { UpdateTdeOffboardingPasswordRequest } from "../../models/request/update-tde-offboarding-password.request"; +import { UpdateTempPasswordRequest } from "../../models/request/update-temp-password.request"; + +export class MasterPasswordApiService implements MasterPasswordApiServiceAbstraction { + constructor( + private apiService: ApiService, + private logService: LogService, + ) {} + + async setPassword(request: SetPasswordRequest): Promise { + try { + const response = await this.apiService.send( + "POST", + "/accounts/set-password", + request, + true, + false, + ); + + return response; + } catch (e: unknown) { + this.logService.error(e); + throw e; + } + } + + async postPassword(request: PasswordRequest): Promise { + try { + const response = await this.apiService.send( + "POST", + "/accounts/password", + request, + true, + false, + ); + + return response; + } catch (e: unknown) { + this.logService.error(e); + throw e; + } + } + + async putUpdateTempPassword(request: UpdateTempPasswordRequest): Promise { + try { + const response = await this.apiService.send( + "PUT", + "/accounts/update-temp-password", + request, + true, + false, + ); + + return response; + } catch (e: unknown) { + this.logService.error(e); + throw e; + } + } + + async putUpdateTdeOffboardingPassword( + request: UpdateTdeOffboardingPasswordRequest, + ): Promise { + try { + const response = await this.apiService.send( + "PUT", + "/accounts/update-tde-offboarding-password", + request, + true, + false, + ); + + return response; + } catch (e: unknown) { + this.logService.error(e); + throw e; + } + } +} diff --git a/libs/common/src/auth/services/master-password/master-password-api.service.spec.ts b/libs/common/src/auth/services/master-password/master-password-api.service.spec.ts new file mode 100644 index 00000000000..64d4fdf1c7b --- /dev/null +++ b/libs/common/src/auth/services/master-password/master-password-api.service.spec.ts @@ -0,0 +1,130 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { KdfType } from "@bitwarden/key-management"; + +import { PasswordRequest } from "../../models/request/password.request"; +import { SetPasswordRequest } from "../../models/request/set-password.request"; +import { UpdateTdeOffboardingPasswordRequest } from "../../models/request/update-tde-offboarding-password.request"; +import { UpdateTempPasswordRequest } from "../../models/request/update-temp-password.request"; + +import { MasterPasswordApiService } from "./master-password-api.service.implementation"; + +describe("MasterPasswordApiService", () => { + let apiService: MockProxy; + let logService: MockProxy; + + let sut: MasterPasswordApiService; + + beforeEach(() => { + apiService = mock(); + logService = mock(); + + sut = new MasterPasswordApiService(apiService, logService); + }); + + it("should instantiate", () => { + expect(sut).not.toBeFalsy(); + }); + + describe("setPassword", () => { + it("should call apiService.send with the correct parameters", async () => { + // Arrange + const request = new SetPasswordRequest( + "masterPasswordHash", + "key", + "masterPasswordHint", + "orgIdentifier", + { + publicKey: "publicKey", + encryptedPrivateKey: "encryptedPrivateKey", + }, + KdfType.PBKDF2_SHA256, + 600_000, + ); + + // Act + await sut.setPassword(request); + + // Assert + expect(apiService.send).toHaveBeenCalledWith( + "POST", + "/accounts/set-password", + request, + true, + false, + ); + }); + }); + + describe("postPassword", () => { + it("should call apiService.send with the correct parameters", async () => { + // Arrange + const request = { + newMasterPasswordHash: "newMasterPasswordHash", + masterPasswordHint: "masterPasswordHint", + key: "key", + masterPasswordHash: "masterPasswordHash", + } as PasswordRequest; + + // Act + await sut.postPassword(request); + + // Assert + expect(apiService.send).toHaveBeenCalledWith( + "POST", + "/accounts/password", + request, + true, + false, + ); + }); + }); + + describe("putUpdateTempPassword", () => { + it("should call apiService.send with the correct parameters", async () => { + // Arrange + const request = { + masterPasswordHint: "masterPasswordHint", + newMasterPasswordHash: "newMasterPasswordHash", + key: "key", + } as UpdateTempPasswordRequest; + + // Act + await sut.putUpdateTempPassword(request); + + // Assert + expect(apiService.send).toHaveBeenCalledWith( + "PUT", + "/accounts/update-temp-password", + request, + true, + false, + ); + }); + }); + + describe("putUpdateTdeOffboardingPassword", () => { + it("should call apiService.send with the correct parameters", async () => { + // Arrange + const request = { + masterPasswordHint: "masterPasswordHint", + newMasterPasswordHash: "newMasterPasswordHash", + key: "key", + } as UpdateTdeOffboardingPasswordRequest; + + // Act + await sut.putUpdateTdeOffboardingPassword(request); + + // Assert + expect(apiService.send).toHaveBeenCalledWith( + "PUT", + "/accounts/update-tde-offboarding-password", + request, + true, + false, + ); + }); + }); +}); diff --git a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts index 8660b9428a1..1b6199b771e 100644 --- a/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts +++ b/libs/common/src/auth/services/user-verification/user-verification.service.spec.ts @@ -16,13 +16,13 @@ import { } from "@bitwarden/key-management"; import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; +import { InternalMasterPasswordServiceAbstraction } from "../../../key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutSettingsService } from "../../../key-management/vault-timeout"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { HashPurpose } from "../../../platform/enums"; import { Utils } from "../../../platform/misc/utils"; import { UserId } from "../../../types/guid"; import { MasterKey } from "../../../types/key"; -import { InternalMasterPasswordServiceAbstraction } from "../../abstractions/master-password.service.abstraction"; import { UserVerificationApiServiceAbstraction } from "../../abstractions/user-verification/user-verification-api.service.abstraction"; import { VerificationType } from "../../enums/verification-type"; import { MasterPasswordPolicyResponse } from "../../models/response/master-password-policy.response"; diff --git a/libs/common/src/auth/services/user-verification/user-verification.service.ts b/libs/common/src/auth/services/user-verification/user-verification.service.ts index 4735da32b6b..8f171c6064e 100644 --- a/libs/common/src/auth/services/user-verification/user-verification.service.ts +++ b/libs/common/src/auth/services/user-verification/user-verification.service.ts @@ -13,11 +13,11 @@ import { // FIXME: remove `src` and fix import // eslint-disable-next-line no-restricted-imports import { PinServiceAbstraction } from "../../../../../auth/src/common/abstractions/pin.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "../../../key-management/master-password/abstractions/master-password.service.abstraction"; import { I18nService } from "../../../platform/abstractions/i18n.service"; import { HashPurpose } from "../../../platform/enums"; import { UserId } from "../../../types/guid"; import { AccountService } from "../../abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "../../abstractions/master-password.service.abstraction"; import { UserVerificationApiServiceAbstraction } from "../../abstractions/user-verification/user-verification-api.service.abstraction"; import { UserVerificationService as UserVerificationServiceAbstraction } from "../../abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "../../enums/verification-type"; diff --git a/libs/common/src/billing/abstractions/billing-api.service.abstraction.ts b/libs/common/src/billing/abstractions/billing-api.service.abstraction.ts index 928f65a3636..21089933a59 100644 --- a/libs/common/src/billing/abstractions/billing-api.service.abstraction.ts +++ b/libs/common/src/billing/abstractions/billing-api.service.abstraction.ts @@ -1,6 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { TaxInfoResponse } from "@bitwarden/common/billing/models/response/tax-info.response"; + import { OrganizationCreateRequest } from "../../admin-console/models/request/organization-create.request"; import { ProviderOrganizationOrganizationDetailsResponse } from "../../admin-console/models/response/provider/provider-organization.response"; import { SubscriptionCancellationRequest } from "../../billing/models/request/subscription-cancellation.request"; @@ -50,6 +52,8 @@ export abstract class BillingApiServiceAbstraction { getProviderSubscription: (providerId: string) => Promise; + getProviderTaxInformation: (providerId: string) => Promise; + updateOrganizationPaymentMethod: ( organizationId: string, request: UpdatePaymentMethodRequest, @@ -66,6 +70,11 @@ export abstract class BillingApiServiceAbstraction { request: UpdateClientOrganizationRequest, ) => Promise; + updateProviderPaymentMethod: ( + providerId: string, + request: UpdatePaymentMethodRequest, + ) => Promise; + updateProviderTaxInformation: ( providerId: string, request: ExpandedTaxInfoUpdateRequest, @@ -76,6 +85,11 @@ export abstract class BillingApiServiceAbstraction { request: VerifyBankAccountRequest, ) => Promise; + verifyProviderBankAccount: ( + providerId: string, + request: VerifyBankAccountRequest, + ) => Promise; + restartSubscription: ( organizationId: string, request: OrganizationCreateRequest, diff --git a/libs/common/src/billing/models/response/provider-subscription-response.ts b/libs/common/src/billing/models/response/provider-subscription-response.ts index 4481f7588ff..d861a8a9d46 100644 --- a/libs/common/src/billing/models/response/provider-subscription-response.ts +++ b/libs/common/src/billing/models/response/provider-subscription-response.ts @@ -1,3 +1,5 @@ +import { PaymentSourceResponse } from "@bitwarden/common/billing/models/response/payment-source.response"; + import { ProviderType } from "../../../admin-console/enums"; import { BaseResponse } from "../../../models/response/base.response"; import { PlanType, ProductTierType } from "../../enums"; @@ -16,6 +18,7 @@ export class ProviderSubscriptionResponse extends BaseResponse { cancelAt?: string; suspension?: SubscriptionSuspensionResponse; providerType: ProviderType; + paymentSource?: PaymentSourceResponse; constructor(response: any) { super(response); @@ -38,6 +41,10 @@ export class ProviderSubscriptionResponse extends BaseResponse { this.suspension = new SubscriptionSuspensionResponse(suspension); } this.providerType = this.getResponseProperty("providerType"); + const paymentSource = this.getResponseProperty("paymentSource"); + if (paymentSource != null) { + this.paymentSource = new PaymentSourceResponse(paymentSource); + } } } diff --git a/libs/common/src/billing/services/billing-api.service.ts b/libs/common/src/billing/services/billing-api.service.ts index 4306324395e..2292f26e616 100644 --- a/libs/common/src/billing/services/billing-api.service.ts +++ b/libs/common/src/billing/services/billing-api.service.ts @@ -1,13 +1,12 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { ToastService } from "@bitwarden/components"; + +import { TaxInfoResponse } from "@bitwarden/common/billing/models/response/tax-info.response"; import { ApiService } from "../../abstractions/api.service"; import { OrganizationCreateRequest } from "../../admin-console/models/request/organization-create.request"; import { ProviderOrganizationOrganizationDetailsResponse } from "../../admin-console/models/response/provider/provider-organization.response"; -import { ErrorResponse } from "../../models/response/error.response"; import { ListResponse } from "../../models/response/list.response"; -import { LogService } from "../../platform/abstractions/log.service"; import { BillingApiServiceAbstraction } from "../abstractions"; import { PaymentMethodType } from "../enums"; import { CreateClientOrganizationRequest } from "../models/request/create-client-organization.request"; @@ -23,11 +22,7 @@ import { PlanResponse } from "../models/response/plan.response"; import { ProviderSubscriptionResponse } from "../models/response/provider-subscription-response"; export class BillingApiService implements BillingApiServiceAbstraction { - constructor( - private apiService: ApiService, - private logService: LogService, - private toastService: ToastService, - ) {} + constructor(private apiService: ApiService) {} cancelOrganizationSubscription( organizationId: string, @@ -89,14 +84,12 @@ export class BillingApiService implements BillingApiServiceAbstraction { } async getOrganizationPaymentMethod(organizationId: string): Promise { - const response = await this.execute(() => - this.apiService.send( - "GET", - "/organizations/" + organizationId + "/billing/payment-method", - null, - true, - true, - ), + const response = await this.apiService.send( + "GET", + "/organizations/" + organizationId + "/billing/payment-method", + null, + true, + true, ); return new PaymentMethodResponse(response); } @@ -120,38 +113,49 @@ export class BillingApiService implements BillingApiServiceAbstraction { async getProviderClientOrganizations( providerId: string, ): Promise> { - const response = await this.execute(() => - this.apiService.send("GET", "/providers/" + providerId + "/organizations", null, true, true), + const response = await this.apiService.send( + "GET", + "/providers/" + providerId + "/organizations", + null, + true, + true, ); return new ListResponse(response, ProviderOrganizationOrganizationDetailsResponse); } async getProviderInvoices(providerId: string): Promise { - const response = await this.execute(() => - this.apiService.send( - "GET", - "/providers/" + providerId + "/billing/invoices", - null, - true, - true, - ), + const response = await this.apiService.send( + "GET", + "/providers/" + providerId + "/billing/invoices", + null, + true, + true, ); return new InvoicesResponse(response); } async getProviderSubscription(providerId: string): Promise { - const response = await this.execute(() => - this.apiService.send( - "GET", - "/providers/" + providerId + "/billing/subscription", - null, - true, - true, - ), + const response = await this.apiService.send( + "GET", + "/providers/" + providerId + "/billing/subscription", + null, + true, + true, ); return new ProviderSubscriptionResponse(response); } + async getProviderTaxInformation(providerId: string): Promise { + const response = await this.apiService.send( + "GET", + "/providers/" + providerId + "/billing/tax-information", + null, + true, + true, + ); + return new TaxInfoResponse(response); + } + async updateOrganizationPaymentMethod( organizationId: string, request: UpdatePaymentMethodRequest, @@ -192,6 +196,19 @@ export class BillingApiService implements BillingApiServiceAbstraction { ); } + async updateProviderPaymentMethod( + providerId: string, + request: UpdatePaymentMethodRequest, + ): Promise { + return await this.apiService.send( + "PUT", + "/providers/" + providerId + "/billing/payment-method", + request, + true, + false, + ); + } + async updateProviderTaxInformation(providerId: string, request: ExpandedTaxInfoUpdateRequest) { return await this.apiService.send( "PUT", @@ -215,6 +232,19 @@ export class BillingApiService implements BillingApiServiceAbstraction { ); } + async verifyProviderBankAccount( + providerId: string, + request: VerifyBankAccountRequest, + ): Promise { + return await this.apiService.send( + "POST", + "/providers/" + providerId + "/billing/payment-method/verify-bank-account", + request, + true, + false, + ); + } + async restartSubscription( organizationId: string, request: OrganizationCreateRequest, @@ -227,20 +257,4 @@ export class BillingApiService implements BillingApiServiceAbstraction { false, ); } - - private async execute(request: () => Promise): Promise { - try { - return await request(); - } catch (error) { - this.logService.error(error); - if (error instanceof ErrorResponse) { - this.toastService.showToast({ - variant: "error", - title: null, - message: error.getSingleMessage(), - }); - } - throw error; - } - } } diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts index 5d34e5b8310..d35a1854653 100644 --- a/libs/common/src/enums/feature-flag.enum.ts +++ b/libs/common/src/enums/feature-flag.enum.ts @@ -5,7 +5,6 @@ */ export enum FeatureFlag { /* Admin Console Team */ - ProviderClientVaultPrivacyBanner = "ac-2833-provider-client-vault-privacy-banner", AccountDeprovisioning = "pm-10308-account-deprovisioning", VerifiedSsoDomainEndpoint = "pm-12337-refactor-sso-details-endpoint", LimitItemDeletion = "pm-15493-restrict-item-deletion-to-can-manage-permission", @@ -18,7 +17,6 @@ export enum FeatureFlag { IdpAutoSubmitLogin = "idp-auto-submit-login", InlineMenuFieldQualification = "inline-menu-field-qualification", InlineMenuPositioningImprovements = "inline-menu-positioning-improvements", - InlineMenuTotp = "inline-menu-totp", NotificationBarAddLoginImprovements = "notification-bar-add-login-improvements", NotificationRefresh = "notification-refresh", UseTreeWalkerApiForPageDetailsCollection = "use-tree-walker-api-for-page-details-collection", @@ -27,27 +25,31 @@ export enum FeatureFlag { ItemShare = "item-share", CriticalApps = "pm-14466-risk-insights-critical-application", EnableRiskInsightsNotifications = "enable-risk-insights-notifications", + DesktopSendUIRefresh = "desktop-send-ui-refresh", + ExportAttachments = "export-attachments", - AC1795_UpdatedSubscriptionStatusSection = "AC-1795_updated-subscription-status-section", - ExtensionRefresh = "extension-refresh", - PM4154_BulkEncryptionService = "PM-4154-bulk-encryption-service", - VaultBulkManagementAction = "vault-bulk-management-action", - UnauthenticatedExtensionUIRefresh = "unauth-ui-refresh", - SSHKeyVaultItem = "ssh-key-vault-item", - SSHAgent = "ssh-agent", - CipherKeyEncryption = "cipher-key-encryption", - TrialPaymentOptional = "PM-8163-trial-payment", - SecurityTasks = "security-tasks", + /* Vault */ + PM8851_BrowserOnboardingNudge = "pm-8851-browser-onboarding-nudge", + PM9111ExtensionPersistAddEditForm = "pm-9111-extension-persist-add-edit-form", NewDeviceVerificationTemporaryDismiss = "new-device-temporary-dismiss", NewDeviceVerificationPermanentDismiss = "new-device-permanent-dismiss", + VaultBulkManagementAction = "vault-bulk-management-action", + SecurityTasks = "security-tasks", + + /* Auth */ + PM9112_DeviceApprovalPersistence = "pm-9112-device-approval-persistence", + + PM4154_BulkEncryptionService = "PM-4154-bulk-encryption-service", + UnauthenticatedExtensionUIRefresh = "unauth-ui-refresh", + CipherKeyEncryption = "cipher-key-encryption", + TrialPaymentOptional = "PM-8163-trial-payment", MacOsNativeCredentialSync = "macos-native-credential-sync", - PM9111ExtensionPersistAddEditForm = "pm-9111-extension-persist-add-edit-form", PrivateKeyRegeneration = "pm-12241-private-key-regeneration", ResellerManagedOrgAlert = "PM-15814-alert-owners-of-reseller-managed-orgs", AccountDeprovisioningBanner = "pm-17120-account-deprovisioning-admin-console-banner", PM15179_AddExistingOrgsFromProviderPortal = "pm-15179-add-existing-orgs-from-provider-portal", - RecoveryCodeLogin = "pm-17128-recovery-code-login", PM12276_BreadcrumbEventLogs = "pm-12276-breadcrumbing-for-business-features", + PM18794_ProviderPaymentMethod = "pm-18794-provider-payment-method", } export type AllowedFeatureFlagTypes = boolean | number | string; @@ -63,7 +65,6 @@ const FALSE = false as boolean; */ export const DefaultFeatureFlagValue = { /* Admin Console Team */ - [FeatureFlag.ProviderClientVaultPrivacyBanner]: FALSE, [FeatureFlag.AccountDeprovisioning]: FALSE, [FeatureFlag.VerifiedSsoDomainEndpoint]: FALSE, [FeatureFlag.LimitItemDeletion]: FALSE, @@ -76,7 +77,6 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.IdpAutoSubmitLogin]: FALSE, [FeatureFlag.InlineMenuFieldQualification]: FALSE, [FeatureFlag.InlineMenuPositioningImprovements]: FALSE, - [FeatureFlag.InlineMenuTotp]: FALSE, [FeatureFlag.NotificationBarAddLoginImprovements]: FALSE, [FeatureFlag.NotificationRefresh]: FALSE, [FeatureFlag.UseTreeWalkerApiForPageDetailsCollection]: FALSE, @@ -85,27 +85,31 @@ export const DefaultFeatureFlagValue = { [FeatureFlag.ItemShare]: FALSE, [FeatureFlag.CriticalApps]: FALSE, [FeatureFlag.EnableRiskInsightsNotifications]: FALSE, + [FeatureFlag.DesktopSendUIRefresh]: FALSE, + [FeatureFlag.ExportAttachments]: FALSE, - [FeatureFlag.AC1795_UpdatedSubscriptionStatusSection]: FALSE, - [FeatureFlag.ExtensionRefresh]: FALSE, - [FeatureFlag.PM4154_BulkEncryptionService]: FALSE, - [FeatureFlag.VaultBulkManagementAction]: FALSE, - [FeatureFlag.UnauthenticatedExtensionUIRefresh]: FALSE, - [FeatureFlag.SSHKeyVaultItem]: FALSE, - [FeatureFlag.SSHAgent]: FALSE, - [FeatureFlag.CipherKeyEncryption]: FALSE, - [FeatureFlag.TrialPaymentOptional]: FALSE, - [FeatureFlag.SecurityTasks]: FALSE, + /* Vault */ + [FeatureFlag.PM8851_BrowserOnboardingNudge]: FALSE, + [FeatureFlag.PM9111ExtensionPersistAddEditForm]: FALSE, [FeatureFlag.NewDeviceVerificationTemporaryDismiss]: FALSE, [FeatureFlag.NewDeviceVerificationPermanentDismiss]: FALSE, + [FeatureFlag.VaultBulkManagementAction]: FALSE, + [FeatureFlag.SecurityTasks]: FALSE, + + /* Auth */ + [FeatureFlag.PM9112_DeviceApprovalPersistence]: FALSE, + + [FeatureFlag.PM4154_BulkEncryptionService]: FALSE, + [FeatureFlag.UnauthenticatedExtensionUIRefresh]: FALSE, + [FeatureFlag.CipherKeyEncryption]: FALSE, + [FeatureFlag.TrialPaymentOptional]: FALSE, [FeatureFlag.MacOsNativeCredentialSync]: FALSE, - [FeatureFlag.PM9111ExtensionPersistAddEditForm]: FALSE, [FeatureFlag.PrivateKeyRegeneration]: FALSE, [FeatureFlag.ResellerManagedOrgAlert]: FALSE, [FeatureFlag.AccountDeprovisioningBanner]: FALSE, [FeatureFlag.PM15179_AddExistingOrgsFromProviderPortal]: FALSE, - [FeatureFlag.RecoveryCodeLogin]: FALSE, [FeatureFlag.PM12276_BreadcrumbEventLogs]: FALSE, + [FeatureFlag.PM18794_ProviderPaymentMethod]: FALSE, } satisfies Record; export type DefaultFeatureFlagValueType = typeof DefaultFeatureFlagValue; diff --git a/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts b/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts index 484327bcd27..f7f064f5251 100644 --- a/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts +++ b/libs/common/src/key-management/crypto/abstractions/encrypt.service.ts @@ -36,7 +36,6 @@ export abstract class EncryptService { ): Promise; abstract rsaEncrypt(data: Uint8Array, publicKey: Uint8Array): Promise; abstract rsaDecrypt(data: EncString, privateKey: Uint8Array): Promise; - abstract resolveLegacyKey(key: SymmetricCryptoKey, encThing: Encrypted): SymmetricCryptoKey; /** * @deprecated Replaced by BulkEncryptService, remove once the feature is tested and the featureflag PM-4154-multi-worker-encryption-service is removed * @param items The items to decrypt diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts index 8a001886837..d426340c277 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.implementation.ts @@ -78,8 +78,6 @@ export class EncryptServiceImplementation implements EncryptService { throw new Error("No key provided for decryption."); } - key = this.resolveLegacyKey(key, encString); - // DO NOT REMOVE OR MOVE. This prevents downgrade to mac-less CBC, which would compromise integrity and confidentiality. if (key.macKey != null && encString?.mac == null) { this.logService.error( @@ -145,8 +143,6 @@ export class EncryptServiceImplementation implements EncryptService { throw new Error("Nothing provided for decryption."); } - key = this.resolveLegacyKey(key, encThing); - // DO NOT REMOVE OR MOVE. This prevents downgrade to mac-less CBC, which would compromise integrity and confidentiality. if (key.macKey != null && encThing.macBytes == null) { this.logService.error( @@ -298,19 +294,4 @@ export class EncryptServiceImplementation implements EncryptService { this.logService.error(msg); } } - - /** - * Transform into new key for the old encrypt-then-mac scheme if required, otherwise return the current key unchanged - * @param encThing The encrypted object (e.g. encString or encArrayBuffer) that you want to decrypt - */ - resolveLegacyKey(key: SymmetricCryptoKey, encThing: Encrypted): SymmetricCryptoKey { - if ( - encThing.encryptionType === EncryptionType.AesCbc128_HmacSha256_B64 && - key.encType === EncryptionType.AesCbc256_B64 - ) { - return new SymmetricCryptoKey(key.key, EncryptionType.AesCbc128_HmacSha256_B64); - } - - return key; - } } diff --git a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts index cff695f4829..3ce0d5883d2 100644 --- a/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts +++ b/libs/common/src/key-management/crypto/services/encrypt.service.spec.ts @@ -325,6 +325,25 @@ describe("EncryptService", () => { }); }); + describe("decryptToUtf8", () => { + it("throws if no key is provided", () => { + return expect(encryptService.decryptToUtf8(null, null)).rejects.toThrow( + "No key provided for decryption.", + ); + }); + it("returns null if key is mac key but encstring has no mac", async () => { + const key = new SymmetricCryptoKey( + makeStaticByteArray(64, 0), + EncryptionType.AesCbc256_HmacSha256_B64, + ); + const encString = new EncString(EncryptionType.AesCbc256_B64, "data"); + + const actual = await encryptService.decryptToUtf8(encString, key); + expect(actual).toBeNull(); + expect(logService.error).toHaveBeenCalled(); + }); + }); + describe("rsa", () => { const data = makeStaticByteArray(10, 100); const encryptedData = makeStaticByteArray(10, 150); @@ -370,17 +389,16 @@ describe("EncryptService", () => { return expect(encryptService.rsaDecrypt(encString, null)).rejects.toThrow("No private key"); }); - it.each([ - EncryptionType.AesCbc256_B64, - EncryptionType.AesCbc128_HmacSha256_B64, - EncryptionType.AesCbc256_HmacSha256_B64, - ])("throws if encryption type is %s", async (encType) => { - encString.encryptionType = encType; + it.each([EncryptionType.AesCbc256_B64, EncryptionType.AesCbc256_HmacSha256_B64])( + "throws if encryption type is %s", + async (encType) => { + encString.encryptionType = encType; - await expect(encryptService.rsaDecrypt(encString, privateKey)).rejects.toThrow( - "Invalid encryption type", - ); - }); + await expect(encryptService.rsaDecrypt(encString, privateKey)).rejects.toThrow( + "Invalid encryption type", + ); + }, + ); it("decrypts data with provided key", async () => { cryptoFunctionService.rsaDecrypt.mockResolvedValue(data); @@ -398,30 +416,6 @@ describe("EncryptService", () => { }); }); - describe("resolveLegacyKey", () => { - it("creates a legacy key if required", async () => { - const key = new SymmetricCryptoKey(makeStaticByteArray(32), EncryptionType.AesCbc256_B64); - const encString = mock(); - encString.encryptionType = EncryptionType.AesCbc128_HmacSha256_B64; - - const actual = encryptService.resolveLegacyKey(key, encString); - - const expected = new SymmetricCryptoKey(key.key, EncryptionType.AesCbc128_HmacSha256_B64); - expect(actual).toEqual(expected); - }); - - it("does not create a legacy key if not required", async () => { - const encType = EncryptionType.AesCbc256_HmacSha256_B64; - const key = new SymmetricCryptoKey(makeStaticByteArray(64), encType); - const encString = mock(); - encString.encryptionType = encType; - - const actual = encryptService.resolveLegacyKey(key, encString); - - expect(actual).toEqual(key); - }); - }); - describe("hash", () => { it("hashes a string and returns b64", async () => { cryptoFunctionService.hash.mockResolvedValue(Uint8Array.from([1, 2, 3])); diff --git a/libs/common/src/auth/abstractions/device-trust.service.abstraction.ts b/libs/common/src/key-management/device-trust/abstractions/device-trust.service.abstraction.ts similarity index 77% rename from libs/common/src/auth/abstractions/device-trust.service.abstraction.ts rename to libs/common/src/key-management/device-trust/abstractions/device-trust.service.abstraction.ts index 24a5d4e8413..882625fa231 100644 --- a/libs/common/src/auth/abstractions/device-trust.service.abstraction.ts +++ b/libs/common/src/key-management/device-trust/abstractions/device-trust.service.abstraction.ts @@ -2,11 +2,10 @@ // @ts-strict-ignore import { Observable } from "rxjs"; -import { EncString } from "../../platform/models/domain/enc-string"; -import { UserId } from "../../types/guid"; -import { DeviceKey, UserKey } from "../../types/key"; - -import { DeviceResponse } from "./devices/responses/device.response"; +import { DeviceResponse } from "../../../auth/abstractions/devices/responses/device.response"; +import { EncString } from "../../../platform/models/domain/enc-string"; +import { UserId } from "../../../types/guid"; +import { DeviceKey, UserKey } from "../../../types/key"; export abstract class DeviceTrustServiceAbstraction { /** @@ -16,6 +15,12 @@ export abstract class DeviceTrustServiceAbstraction { */ supportsDeviceTrust$: Observable; + /** + * Emits when a device has been trusted. This emission is specifically for the purpose of notifying + * the consuming component to display a toast informing the user the device has been trusted. + */ + deviceTrusted$: Observable; + /** * @description Checks if the device trust feature is supported for the given user. */ diff --git a/libs/common/src/auth/services/device-trust.service.implementation.ts b/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts similarity index 86% rename from libs/common/src/auth/services/device-trust.service.implementation.ts rename to libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts index fe43df53c48..579fe9360a6 100644 --- a/libs/common/src/auth/services/device-trust.service.implementation.ts +++ b/libs/common/src/key-management/device-trust/services/device-trust.service.implementation.ts @@ -1,34 +1,34 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, map, Observable } from "rxjs"; +import { firstValueFrom, map, Observable, Subject } from "rxjs"; import { UserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common"; import { KeyService } from "@bitwarden/key-management"; -import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; -import { AppIdService } from "../../platform/abstractions/app-id.service"; -import { ConfigService } from "../../platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; -import { I18nService } from "../../platform/abstractions/i18n.service"; -import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; -import { LogService } from "../../platform/abstractions/log.service"; -import { PlatformUtilsService } from "../../platform/abstractions/platform-utils.service"; -import { AbstractStorageService } from "../../platform/abstractions/storage.service"; -import { StorageLocation } from "../../platform/enums"; -import { EncString } from "../../platform/models/domain/enc-string"; -import { StorageOptions } from "../../platform/models/domain/storage-options"; -import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; -import { DEVICE_TRUST_DISK_LOCAL, StateProvider, UserKeyDefinition } from "../../platform/state"; -import { UserId } from "../../types/guid"; -import { UserKey, DeviceKey } from "../../types/key"; -import { DeviceTrustServiceAbstraction } from "../abstractions/device-trust.service.abstraction"; -import { DeviceResponse } from "../abstractions/devices/responses/device.response"; -import { DevicesApiServiceAbstraction } from "../abstractions/devices-api.service.abstraction"; -import { SecretVerificationRequest } from "../models/request/secret-verification.request"; +import { DeviceResponse } from "../../../auth/abstractions/devices/responses/device.response"; +import { DevicesApiServiceAbstraction } from "../../../auth/abstractions/devices-api.service.abstraction"; +import { SecretVerificationRequest } from "../../../auth/models/request/secret-verification.request"; import { DeviceKeysUpdateRequest, UpdateDevicesTrustRequest, -} from "../models/request/update-devices-trust.request"; +} from "../../../auth/models/request/update-devices-trust.request"; +import { AppIdService } from "../../../platform/abstractions/app-id.service"; +import { ConfigService } from "../../../platform/abstractions/config/config.service"; +import { CryptoFunctionService } from "../../../platform/abstractions/crypto-function.service"; +import { I18nService } from "../../../platform/abstractions/i18n.service"; +import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { PlatformUtilsService } from "../../../platform/abstractions/platform-utils.service"; +import { AbstractStorageService } from "../../../platform/abstractions/storage.service"; +import { StorageLocation } from "../../../platform/enums"; +import { EncString } from "../../../platform/models/domain/enc-string"; +import { StorageOptions } from "../../../platform/models/domain/storage-options"; +import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; +import { DEVICE_TRUST_DISK_LOCAL, StateProvider, UserKeyDefinition } from "../../../platform/state"; +import { UserId } from "../../../types/guid"; +import { UserKey, DeviceKey } from "../../../types/key"; +import { EncryptService } from "../../crypto/abstractions/encrypt.service"; +import { DeviceTrustServiceAbstraction } from "../abstractions/device-trust.service.abstraction"; /** Uses disk storage so that the device key can persist after log out and tab removal. */ export const DEVICE_KEY = new UserKeyDefinition( @@ -63,6 +63,10 @@ export class DeviceTrustService implements DeviceTrustServiceAbstraction { supportsDeviceTrust$: Observable; + // Observable emission is used to trigger a toast in consuming components + private deviceTrustedSubject = new Subject(); + deviceTrusted$ = this.deviceTrustedSubject.asObservable(); + constructor( private keyGenerationService: KeyGenerationService, private cryptoFunctionService: CryptoFunctionService, @@ -177,7 +181,8 @@ export class DeviceTrustService implements DeviceTrustServiceAbstraction { // store device key in local/secure storage if enc keys posted to server successfully await this.setDeviceKey(userId, deviceKey); - this.platformUtilsService.showToast("success", null, this.i18nService.t("deviceTrusted")); + // This emission will be picked up by consuming components to handle displaying a toast to the user + this.deviceTrustedSubject.next(); return deviceResponse; } diff --git a/libs/common/src/auth/services/device-trust.service.spec.ts b/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts similarity index 93% rename from libs/common/src/auth/services/device-trust.service.spec.ts rename to libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts index e689c93395d..1893b097ec6 100644 --- a/libs/common/src/auth/services/device-trust.service.spec.ts +++ b/libs/common/src/key-management/device-trust/services/device-trust.service.spec.ts @@ -3,38 +3,38 @@ import { matches, mock } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom, of } from "rxjs"; -import { UserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common"; +import { + UserDecryptionOptionsServiceAbstraction, + UserDecryptionOptions, +} from "@bitwarden/auth/common"; import { KeyService } from "@bitwarden/key-management"; -// FIXME: remove `src` and fix import -// eslint-disable-next-line no-restricted-imports -import { UserDecryptionOptions } from "../../../../auth/src/common/models/domain/user-decryption-options"; -import { FakeAccountService, mockAccountServiceWith } from "../../../spec/fake-account-service"; -import { FakeActiveUserState } from "../../../spec/fake-state"; -import { FakeStateProvider } from "../../../spec/fake-state-provider"; -import { DeviceType } from "../../enums"; -import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; -import { AppIdService } from "../../platform/abstractions/app-id.service"; -import { ConfigService } from "../../platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; -import { I18nService } from "../../platform/abstractions/i18n.service"; -import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; -import { LogService } from "../../platform/abstractions/log.service"; -import { PlatformUtilsService } from "../../platform/abstractions/platform-utils.service"; -import { AbstractStorageService } from "../../platform/abstractions/storage.service"; -import { StorageLocation } from "../../platform/enums"; -import { EncryptionType } from "../../platform/enums/encryption-type.enum"; -import { Utils } from "../../platform/misc/utils"; -import { EncString } from "../../platform/models/domain/enc-string"; -import { StorageOptions } from "../../platform/models/domain/storage-options"; -import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; -import { CsprngArray } from "../../types/csprng"; -import { UserId } from "../../types/guid"; -import { DeviceKey, UserKey } from "../../types/key"; -import { DeviceResponse } from "../abstractions/devices/responses/device.response"; -import { DevicesApiServiceAbstraction } from "../abstractions/devices-api.service.abstraction"; -import { UpdateDevicesTrustRequest } from "../models/request/update-devices-trust.request"; -import { ProtectedDeviceResponse } from "../models/response/protected-device.response"; +import { FakeAccountService, mockAccountServiceWith } from "../../../../spec/fake-account-service"; +import { FakeActiveUserState } from "../../../../spec/fake-state"; +import { FakeStateProvider } from "../../../../spec/fake-state-provider"; +import { DeviceResponse } from "../../../auth/abstractions/devices/responses/device.response"; +import { DevicesApiServiceAbstraction } from "../../../auth/abstractions/devices-api.service.abstraction"; +import { UpdateDevicesTrustRequest } from "../../../auth/models/request/update-devices-trust.request"; +import { ProtectedDeviceResponse } from "../../../auth/models/response/protected-device.response"; +import { DeviceType } from "../../../enums"; +import { AppIdService } from "../../../platform/abstractions/app-id.service"; +import { ConfigService } from "../../../platform/abstractions/config/config.service"; +import { CryptoFunctionService } from "../../../platform/abstractions/crypto-function.service"; +import { I18nService } from "../../../platform/abstractions/i18n.service"; +import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { PlatformUtilsService } from "../../../platform/abstractions/platform-utils.service"; +import { AbstractStorageService } from "../../../platform/abstractions/storage.service"; +import { StorageLocation } from "../../../platform/enums"; +import { EncryptionType } from "../../../platform/enums/encryption-type.enum"; +import { Utils } from "../../../platform/misc/utils"; +import { EncString } from "../../../platform/models/domain/enc-string"; +import { StorageOptions } from "../../../platform/models/domain/storage-options"; +import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; +import { CsprngArray } from "../../../types/csprng"; +import { UserId } from "../../../types/guid"; +import { DeviceKey, UserKey } from "../../../types/key"; +import { EncryptService } from "../../crypto/abstractions/encrypt.service"; import { SHOULD_TRUST_DEVICE, diff --git a/libs/common/src/auth/abstractions/key-connector.service.ts b/libs/common/src/key-management/key-connector/abstractions/key-connector.service.ts similarity index 79% rename from libs/common/src/auth/abstractions/key-connector.service.ts rename to libs/common/src/key-management/key-connector/abstractions/key-connector.service.ts index 9bcca1f5619..b88f7bc7cd6 100644 --- a/libs/common/src/auth/abstractions/key-connector.service.ts +++ b/libs/common/src/key-management/key-connector/abstractions/key-connector.service.ts @@ -1,8 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Organization } from "../../admin-console/models/domain/organization"; -import { UserId } from "../../types/guid"; -import { IdentityTokenResponse } from "../models/response/identity-token.response"; +import { Organization } from "../../../admin-console/models/domain/organization"; +import { IdentityTokenResponse } from "../../../auth/models/response/identity-token.response"; +import { UserId } from "../../../types/guid"; export abstract class KeyConnectorService { setMasterKeyFromUrl: (url: string, userId: UserId) => Promise; diff --git a/libs/common/src/auth/models/request/key-connector-user-key.request.ts b/libs/common/src/key-management/key-connector/models/key-connector-user-key.request.ts similarity index 100% rename from libs/common/src/auth/models/request/key-connector-user-key.request.ts rename to libs/common/src/key-management/key-connector/models/key-connector-user-key.request.ts diff --git a/libs/common/src/auth/models/request/set-key-connector-key.request.ts b/libs/common/src/key-management/key-connector/models/set-key-connector-key.request.ts similarity index 100% rename from libs/common/src/auth/models/request/set-key-connector-key.request.ts rename to libs/common/src/key-management/key-connector/models/set-key-connector-key.request.ts diff --git a/libs/common/src/auth/services/key-connector.service.spec.ts b/libs/common/src/key-management/key-connector/services/key-connector.service.spec.ts similarity index 91% rename from libs/common/src/auth/services/key-connector.service.spec.ts rename to libs/common/src/key-management/key-connector/services/key-connector.service.spec.ts index ec03c7ece55..fd3ce0c4777 100644 --- a/libs/common/src/auth/services/key-connector.service.spec.ts +++ b/libs/common/src/key-management/key-connector/services/key-connector.service.spec.ts @@ -4,27 +4,27 @@ import { of } from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { KeyService } from "@bitwarden/key-management"; -import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../spec"; -import { ApiService } from "../../abstractions/api.service"; -import { OrganizationData } from "../../admin-console/models/data/organization.data"; -import { Organization } from "../../admin-console/models/domain/organization"; -import { ProfileOrganizationResponse } from "../../admin-console/models/response/profile-organization.response"; -import { LogService } from "../../platform/abstractions/log.service"; -import { Utils } from "../../platform/misc/utils"; -import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; -import { KeyGenerationService } from "../../platform/services/key-generation.service"; -import { OrganizationId, UserId } from "../../types/guid"; -import { MasterKey } from "../../types/key"; -import { KeyConnectorUserKeyRequest } from "../models/request/key-connector-user-key.request"; -import { KeyConnectorUserKeyResponse } from "../models/response/key-connector-user-key.response"; +import { FakeAccountService, FakeStateProvider, mockAccountServiceWith } from "../../../../spec"; +import { ApiService } from "../../../abstractions/api.service"; +import { OrganizationData } from "../../../admin-console/models/data/organization.data"; +import { Organization } from "../../../admin-console/models/domain/organization"; +import { ProfileOrganizationResponse } from "../../../admin-console/models/response/profile-organization.response"; +import { KeyConnectorUserKeyResponse } from "../../../auth/models/response/key-connector-user-key.response"; +import { TokenService } from "../../../auth/services/token.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { Utils } from "../../../platform/misc/utils"; +import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; +import { KeyGenerationService } from "../../../platform/services/key-generation.service"; +import { OrganizationId, UserId } from "../../../types/guid"; +import { MasterKey } from "../../../types/key"; +import { FakeMasterPasswordService } from "../../master-password/services/fake-master-password.service"; +import { KeyConnectorUserKeyRequest } from "../models/key-connector-user-key.request"; import { USES_KEY_CONNECTOR, CONVERT_ACCOUNT_TO_KEY_CONNECTOR, KeyConnectorService, } from "./key-connector.service"; -import { FakeMasterPasswordService } from "./master-password/fake-master-password.service"; -import { TokenService } from "./token.service"; describe("KeyConnectorService", () => { let keyConnectorService: KeyConnectorService; diff --git a/libs/common/src/auth/services/key-connector.service.ts b/libs/common/src/key-management/key-connector/services/key-connector.service.ts similarity index 83% rename from libs/common/src/auth/services/key-connector.service.ts rename to libs/common/src/key-management/key-connector/services/key-connector.service.ts index f6f76579ee5..91b8e9100ac 100644 --- a/libs/common/src/auth/services/key-connector.service.ts +++ b/libs/common/src/key-management/key-connector/services/key-connector.service.ts @@ -3,8 +3,6 @@ import { firstValueFrom } from "rxjs"; import { LogoutReason } from "@bitwarden/auth/common"; -import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { Argon2KdfConfig, KdfConfig, @@ -13,28 +11,30 @@ import { KdfType, } from "@bitwarden/key-management"; -import { ApiService } from "../../abstractions/api.service"; -import { OrganizationUserType } from "../../admin-console/enums"; -import { Organization } from "../../admin-console/models/domain/organization"; -import { KeysRequest } from "../../models/request/keys.request"; -import { KeyGenerationService } from "../../platform/abstractions/key-generation.service"; -import { LogService } from "../../platform/abstractions/log.service"; -import { Utils } from "../../platform/misc/utils"; -import { SymmetricCryptoKey } from "../../platform/models/domain/symmetric-crypto-key"; +import { ApiService } from "../../../abstractions/api.service"; +import { OrganizationService } from "../../../admin-console/abstractions/organization/organization.service.abstraction"; +import { OrganizationUserType } from "../../../admin-console/enums"; +import { Organization } from "../../../admin-console/models/domain/organization"; +import { AccountService } from "../../../auth/abstractions/account.service"; +import { TokenService } from "../../../auth/abstractions/token.service"; +import { IdentityTokenResponse } from "../../../auth/models/response/identity-token.response"; +import { KeysRequest } from "../../../models/request/keys.request"; +import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; +import { LogService } from "../../../platform/abstractions/log.service"; +import { Utils } from "../../../platform/misc/utils"; +import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-crypto-key"; import { ActiveUserState, KEY_CONNECTOR_DISK, StateProvider, UserKeyDefinition, -} from "../../platform/state"; -import { UserId } from "../../types/guid"; -import { MasterKey } from "../../types/key"; +} from "../../../platform/state"; +import { UserId } from "../../../types/guid"; +import { MasterKey } from "../../../types/key"; +import { InternalMasterPasswordServiceAbstraction } from "../../master-password/abstractions/master-password.service.abstraction"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "../abstractions/key-connector.service"; -import { InternalMasterPasswordServiceAbstraction } from "../abstractions/master-password.service.abstraction"; -import { TokenService } from "../abstractions/token.service"; -import { KeyConnectorUserKeyRequest } from "../models/request/key-connector-user-key.request"; -import { SetKeyConnectorKeyRequest } from "../models/request/set-key-connector-key.request"; -import { IdentityTokenResponse } from "../models/response/identity-token.response"; +import { KeyConnectorUserKeyRequest } from "../models/key-connector-user-key.request"; +import { SetKeyConnectorKeyRequest } from "../models/set-key-connector-key.request"; export const USES_KEY_CONNECTOR = new UserKeyDefinition( KEY_CONNECTOR_DISK, diff --git a/libs/common/src/auth/abstractions/master-password.service.abstraction.ts b/libs/common/src/key-management/master-password/abstractions/master-password.service.abstraction.ts similarity index 92% rename from libs/common/src/auth/abstractions/master-password.service.abstraction.ts rename to libs/common/src/key-management/master-password/abstractions/master-password.service.abstraction.ts index c3a0f135a06..221ce8ed6ef 100644 --- a/libs/common/src/auth/abstractions/master-password.service.abstraction.ts +++ b/libs/common/src/key-management/master-password/abstractions/master-password.service.abstraction.ts @@ -1,9 +1,9 @@ import { Observable } from "rxjs"; -import { EncString } from "../../platform/models/domain/enc-string"; -import { UserId } from "../../types/guid"; -import { MasterKey, UserKey } from "../../types/key"; -import { ForceSetPasswordReason } from "../models/domain/force-set-password-reason"; +import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; +import { EncString } from "../../../platform/models/domain/enc-string"; +import { UserId } from "../../../types/guid"; +import { MasterKey, UserKey } from "../../../types/key"; export abstract class MasterPasswordServiceAbstraction { /** diff --git a/libs/common/src/auth/services/master-password/fake-master-password.service.ts b/libs/common/src/key-management/master-password/services/fake-master-password.service.ts similarity index 92% rename from libs/common/src/auth/services/master-password/fake-master-password.service.ts rename to libs/common/src/key-management/master-password/services/fake-master-password.service.ts index f2c5a8a00c3..73611bbdc1b 100644 --- a/libs/common/src/auth/services/master-password/fake-master-password.service.ts +++ b/libs/common/src/key-management/master-password/services/fake-master-password.service.ts @@ -3,11 +3,11 @@ import { mock } from "jest-mock-extended"; import { ReplaySubject, Observable } from "rxjs"; +import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; import { EncString } from "../../../platform/models/domain/enc-string"; import { UserId } from "../../../types/guid"; import { MasterKey, UserKey } from "../../../types/key"; -import { InternalMasterPasswordServiceAbstraction } from "../../abstractions/master-password.service.abstraction"; -import { ForceSetPasswordReason } from "../../models/domain/force-set-password-reason"; +import { InternalMasterPasswordServiceAbstraction } from "../abstractions/master-password.service.abstraction"; export class FakeMasterPasswordService implements InternalMasterPasswordServiceAbstraction { mock = mock(); diff --git a/libs/common/src/auth/services/master-password/master-password.service.ts b/libs/common/src/key-management/master-password/services/master-password.service.ts similarity index 95% rename from libs/common/src/auth/services/master-password/master-password.service.ts rename to libs/common/src/key-management/master-password/services/master-password.service.ts index 9b5ce588bd3..72987b13827 100644 --- a/libs/common/src/auth/services/master-password/master-password.service.ts +++ b/libs/common/src/key-management/master-password/services/master-password.service.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { firstValueFrom, map, Observable } from "rxjs"; -import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; +import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; import { KeyGenerationService } from "../../../platform/abstractions/key-generation.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { StateService } from "../../../platform/abstractions/state.service"; @@ -17,8 +17,8 @@ import { } from "../../../platform/state"; import { UserId } from "../../../types/guid"; import { MasterKey, UserKey } from "../../../types/key"; -import { InternalMasterPasswordServiceAbstraction } from "../../abstractions/master-password.service.abstraction"; -import { ForceSetPasswordReason } from "../../models/domain/force-set-password-reason"; +import { EncryptService } from "../../crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "../abstractions/master-password.service.abstraction"; /** Memory since master key shouldn't be available on lock */ const MASTER_KEY = new UserKeyDefinition(MASTER_PASSWORD_MEMORY, "masterKey", { diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts index 0be7daa3f6f..5fdae07b2d7 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts @@ -12,7 +12,6 @@ import { SearchService } from "../../../abstractions/search.service"; import { AccountInfo } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; -import { FakeMasterPasswordService } from "../../../auth/services/master-password/fake-master-password.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { MessagingService } from "../../../platform/abstractions/messaging.service"; import { PlatformUtilsService } from "../../../platform/abstractions/platform-utils.service"; @@ -23,6 +22,7 @@ import { StateEventRunnerService } from "../../../platform/state"; import { UserId } from "../../../types/guid"; import { CipherService } from "../../../vault/abstractions/cipher.service"; import { FolderService } from "../../../vault/abstractions/folder/folder.service.abstraction"; +import { FakeMasterPasswordService } from "../../master-password/services/fake-master-password.service"; import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; import { VaultTimeout, VaultTimeoutStringType } from "../types/vault-timeout.type"; diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts index efe8f081b6f..1762b9156db 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.ts @@ -9,7 +9,6 @@ import { BiometricsService } from "@bitwarden/key-management"; import { SearchService } from "../../../abstractions/search.service"; import { AccountService } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; -import { InternalMasterPasswordServiceAbstraction } from "../../../auth/abstractions/master-password.service.abstraction"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; import { LogService } from "../../../platform/abstractions/log.service"; import { MessagingService } from "../../../platform/abstractions/messaging.service"; @@ -20,6 +19,7 @@ import { StateEventRunnerService } from "../../../platform/state"; import { UserId } from "../../../types/guid"; import { CipherService } from "../../../vault/abstractions/cipher.service"; import { FolderService } from "../../../vault/abstractions/folder/folder.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "../../master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutSettingsService } from "../abstractions/vault-timeout-settings.service"; import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "../abstractions/vault-timeout.service"; import { VaultTimeoutAction } from "../enums/vault-timeout-action.enum"; @@ -138,10 +138,11 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { ); if (userId == null || userId === currentUserId) { - await this.searchService.clearIndex(); await this.collectionService.clearActiveUserCache(); } + await this.searchService.clearIndex(lockingUserId); + await this.folderService.clearDecryptedFolderState(lockingUserId); await this.masterPasswordService.clearMasterKey(lockingUserId); diff --git a/libs/common/src/models/export/cipher.export.ts b/libs/common/src/models/export/cipher.export.ts index e542d0dfc1f..7d0ef9e9c34 100644 --- a/libs/common/src/models/export/cipher.export.ts +++ b/libs/common/src/models/export/cipher.export.ts @@ -73,6 +73,7 @@ export class CipherExport { break; case CipherType.SshKey: view.sshKey = SshKeyExport.toView(req.sshKey); + break; } if (req.passwordHistory != null) { diff --git a/libs/common/src/models/export/ssh-key.export.ts b/libs/common/src/models/export/ssh-key.export.ts index a99ebac34b3..5387daf7dd0 100644 --- a/libs/common/src/models/export/ssh-key.export.ts +++ b/libs/common/src/models/export/ssh-key.export.ts @@ -1,5 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { import_ssh_key } from "@bitwarden/sdk-internal"; import { EncString } from "../../platform/models/domain/enc-string"; import { SshKey as SshKeyDomain } from "../../vault/models/domain/ssh-key"; @@ -17,16 +18,18 @@ export class SshKeyExport { } static toView(req: SshKeyExport, view = new SshKeyView()) { - view.privateKey = req.privateKey; - view.publicKey = req.publicKey; - view.keyFingerprint = req.keyFingerprint; + const parsedKey = import_ssh_key(req.privateKey); + view.privateKey = parsedKey.privateKey; + view.publicKey = parsedKey.publicKey; + view.keyFingerprint = parsedKey.fingerprint; return view; } static toDomain(req: SshKeyExport, domain = new SshKeyDomain()) { - domain.privateKey = req.privateKey != null ? new EncString(req.privateKey) : null; - domain.publicKey = req.publicKey != null ? new EncString(req.publicKey) : null; - domain.keyFingerprint = req.keyFingerprint != null ? new EncString(req.keyFingerprint) : null; + const parsedKey = import_ssh_key(req.privateKey); + domain.privateKey = new EncString(parsedKey.privateKey); + domain.publicKey = new EncString(parsedKey.publicKey); + domain.keyFingerprint = new EncString(parsedKey.fingerprint); return domain; } diff --git a/libs/common/src/platform/enums/encryption-type.enum.ts b/libs/common/src/platform/enums/encryption-type.enum.ts index a0ffe679279..fd484dc2fdf 100644 --- a/libs/common/src/platform/enums/encryption-type.enum.ts +++ b/libs/common/src/platform/enums/encryption-type.enum.ts @@ -1,6 +1,6 @@ export enum EncryptionType { AesCbc256_B64 = 0, - AesCbc128_HmacSha256_B64 = 1, + // Type 1 was the unused and removed AesCbc128_HmacSha256_B64 AesCbc256_HmacSha256_B64 = 2, Rsa2048_OaepSha256_B64 = 3, Rsa2048_OaepSha1_B64 = 4, @@ -17,12 +17,10 @@ export function encryptionTypeToString(encryptionType: EncryptionType): string { } /** The expected number of parts to a serialized EncString of the given encryption type. - * For example, an EncString of type AesCbc256_B64 will have 2 parts, and an EncString of type - * AesCbc128_HmacSha256_B64 will have 3 parts. + * For example, an EncString of type AesCbc256_B64 will have 2 parts * * Example of annotated serialized EncStrings: * 0.iv|data - * 1.iv|data|mac * 2.iv|data|mac * 3.data * 4.data @@ -33,7 +31,6 @@ export function encryptionTypeToString(encryptionType: EncryptionType): string { */ export const EXPECTED_NUM_PARTS_BY_ENCRYPTION_TYPE = { [EncryptionType.AesCbc256_B64]: 2, - [EncryptionType.AesCbc128_HmacSha256_B64]: 3, [EncryptionType.AesCbc256_HmacSha256_B64]: 3, [EncryptionType.Rsa2048_OaepSha256_B64]: 1, [EncryptionType.Rsa2048_OaepSha1_B64]: 1, diff --git a/libs/common/src/platform/enums/theme-type.enum.ts b/libs/common/src/platform/enums/theme-type.enum.ts index 5e1a0c21c36..d1767c4990a 100644 --- a/libs/common/src/platform/enums/theme-type.enum.ts +++ b/libs/common/src/platform/enums/theme-type.enum.ts @@ -5,16 +5,12 @@ export enum ThemeType { System = "system", Light = "light", Dark = "dark", - Nord = "nord", - SolarizedDark = "solarizedDark", } export const ThemeTypes = { System: "system", Light: "light", Dark: "dark", - Nord: "nord", - SolarizedDark: "solarizedDark", } as const; export type Theme = (typeof ThemeTypes)[keyof typeof ThemeTypes]; diff --git a/libs/common/src/platform/models/domain/domain-base.ts b/libs/common/src/platform/models/domain/domain-base.ts index 5aa79946653..11d0193accc 100644 --- a/libs/common/src/platform/models/domain/domain-base.ts +++ b/libs/common/src/platform/models/domain/domain-base.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { ConditionalExcept, ConditionalKeys, Constructor } from "type-fest"; import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; @@ -15,6 +13,19 @@ export type DecryptedObject< TDecryptedKeys extends EncStringKeys, > = Record & Omit; +// extracts shared keys from the domain and view types +type EncryptableKeys = (keyof D & + ConditionalKeys) & + (keyof V & ConditionalKeys); + +type DomainEncryptableKeys = { + [key in ConditionalKeys]: EncString | null; +}; + +type ViewEncryptableKeys = { + [key in ConditionalKeys]: string | null; +}; + // https://contributing.bitwarden.com/architecture/clients/data-model#domain export default class Domain { protected buildDomainModel( @@ -37,6 +48,7 @@ export default class Domain { } } } + protected buildDataModel( domain: D, dataObj: any, @@ -58,31 +70,24 @@ export default class Domain { } } - protected async decryptObj( - viewModel: T, - map: any, - orgId: string, - key: SymmetricCryptoKey = null, + protected async decryptObj( + domain: DomainEncryptableKeys, + viewModel: ViewEncryptableKeys, + props: EncryptableKeys[], + orgId: string | null, + key: SymmetricCryptoKey | null = null, objectContext: string = "No Domain Context", - ): Promise { - const self: any = this; - - for (const prop in map) { - // eslint-disable-next-line - if (!map.hasOwnProperty(prop)) { - continue; - } - - const mapProp = map[prop] || prop; - if (self[mapProp]) { - (viewModel as any)[prop] = await self[mapProp].decrypt( + ): Promise { + for (const prop of props) { + viewModel[prop] = + (await domain[prop]?.decrypt( orgId, key, - `Property: ${prop}; ObjectContext: ${objectContext}`, - ); - } + `Property: ${prop as string}; ObjectContext: ${objectContext}`, + )) ?? null; } - return viewModel; + + return viewModel as V; } /** @@ -111,7 +116,7 @@ export default class Domain { const decryptedObjects = []; for (const prop of encryptedProperties) { - const value = (this as any)[prop] as EncString; + const value = this[prop] as EncString; const decrypted = await this.decryptProperty( prop, value, @@ -138,11 +143,9 @@ export default class Domain { encryptService: EncryptService, decryptTrace: string, ) { - let decrypted: string = null; + let decrypted: string | null = null; if (value) { decrypted = await value.decryptWithKey(key, encryptService, decryptTrace); - } else { - decrypted = null; } return { [propertyKey]: decrypted, diff --git a/libs/common/src/platform/models/domain/enc-array-buffer.spec.ts b/libs/common/src/platform/models/domain/enc-array-buffer.spec.ts index 45a45ffe087..de0fea58e36 100644 --- a/libs/common/src/platform/models/domain/enc-array-buffer.spec.ts +++ b/libs/common/src/platform/models/domain/enc-array-buffer.spec.ts @@ -5,28 +5,28 @@ import { EncArrayBuffer } from "./enc-array-buffer"; describe("encArrayBuffer", () => { describe("parses the buffer", () => { - test.each([ - [EncryptionType.AesCbc128_HmacSha256_B64, "AesCbc128_HmacSha256_B64"], - [EncryptionType.AesCbc256_HmacSha256_B64, "AesCbc256_HmacSha256_B64"], - ])("with %c%s", (encType: EncryptionType) => { - const iv = makeStaticByteArray(16, 10); - const mac = makeStaticByteArray(32, 20); - // We use the minimum data length of 1 to test the boundary of valid lengths - const data = makeStaticByteArray(1, 100); + test.each([[EncryptionType.AesCbc256_HmacSha256_B64, "AesCbc256_HmacSha256_B64"]])( + "with %c%s", + (encType: EncryptionType) => { + const iv = makeStaticByteArray(16, 10); + const mac = makeStaticByteArray(32, 20); + // We use the minimum data length of 1 to test the boundary of valid lengths + const data = makeStaticByteArray(1, 100); - const array = new Uint8Array(1 + iv.byteLength + mac.byteLength + data.byteLength); - array.set([encType]); - array.set(iv, 1); - array.set(mac, 1 + iv.byteLength); - array.set(data, 1 + iv.byteLength + mac.byteLength); + const array = new Uint8Array(1 + iv.byteLength + mac.byteLength + data.byteLength); + array.set([encType]); + array.set(iv, 1); + array.set(mac, 1 + iv.byteLength); + array.set(data, 1 + iv.byteLength + mac.byteLength); - const actual = new EncArrayBuffer(array); + const actual = new EncArrayBuffer(array); - expect(actual.encryptionType).toEqual(encType); - expect(actual.ivBytes).toEqualBuffer(iv); - expect(actual.macBytes).toEqualBuffer(mac); - expect(actual.dataBytes).toEqualBuffer(data); - }); + expect(actual.encryptionType).toEqual(encType); + expect(actual.ivBytes).toEqualBuffer(iv); + expect(actual.macBytes).toEqualBuffer(mac); + expect(actual.dataBytes).toEqualBuffer(data); + }, + ); it("with AesCbc256_B64", () => { const encType = EncryptionType.AesCbc256_B64; @@ -50,7 +50,6 @@ describe("encArrayBuffer", () => { describe("throws if the buffer has an invalid length", () => { test.each([ - [EncryptionType.AesCbc128_HmacSha256_B64, 50, "AesCbc128_HmacSha256_B64"], [EncryptionType.AesCbc256_HmacSha256_B64, 50, "AesCbc256_HmacSha256_B64"], [EncryptionType.AesCbc256_B64, 18, "AesCbc256_B64"], ])("with %c%c%s", (encType: EncryptionType, minLength: number) => { diff --git a/libs/common/src/platform/models/domain/enc-array-buffer.ts b/libs/common/src/platform/models/domain/enc-array-buffer.ts index 305504f57b7..8b69cb347ba 100644 --- a/libs/common/src/platform/models/domain/enc-array-buffer.ts +++ b/libs/common/src/platform/models/domain/enc-array-buffer.ts @@ -20,7 +20,6 @@ export class EncArrayBuffer implements Encrypted { const encType = encBytes[0]; switch (encType) { - case EncryptionType.AesCbc128_HmacSha256_B64: case EncryptionType.AesCbc256_HmacSha256_B64: { const minimumLength = ENC_TYPE_LENGTH + IV_LENGTH + MAC_LENGTH + MIN_DATA_LENGTH; if (encBytes.length < minimumLength) { diff --git a/libs/common/src/platform/models/domain/enc-string.spec.ts b/libs/common/src/platform/models/domain/enc-string.spec.ts index 3b2586fc22f..c3f257d442a 100644 --- a/libs/common/src/platform/models/domain/enc-string.spec.ts +++ b/libs/common/src/platform/models/domain/enc-string.spec.ts @@ -60,9 +60,7 @@ describe("EncString", () => { const cases = [ "aXY=|Y3Q=", // AesCbc256_B64 w/out header - "aXY=|Y3Q=|cnNhQ3Q=", // AesCbc128_HmacSha256_B64 w/out header "0.QmFzZTY0UGFydA==|QmFzZTY0UGFydA==", // AesCbc256_B64 with header - "1.QmFzZTY0UGFydA==|QmFzZTY0UGFydA==|QmFzZTY0UGFydA==", // AesCbc128_HmacSha256_B64 "2.QmFzZTY0UGFydA==|QmFzZTY0UGFydA==|QmFzZTY0UGFydA==", // AesCbc256_HmacSha256_B64 "3.QmFzZTY0UGFydA==", // Rsa2048_OaepSha256_B64 "4.QmFzZTY0UGFydA==", // Rsa2048_OaepSha1_B64 diff --git a/libs/common/src/platform/models/domain/enc-string.ts b/libs/common/src/platform/models/domain/enc-string.ts index 360cb9bab46..b0b03e0fb3c 100644 --- a/libs/common/src/platform/models/domain/enc-string.ts +++ b/libs/common/src/platform/models/domain/enc-string.ts @@ -89,7 +89,6 @@ export class EncString implements Encrypted { } switch (encType) { - case EncryptionType.AesCbc128_HmacSha256_B64: case EncryptionType.AesCbc256_HmacSha256_B64: this.iv = encPieces[0]; this.data = encPieces[1]; @@ -132,10 +131,7 @@ export class EncString implements Encrypted { } } else { encPieces = encryptedString.split("|"); - encType = - encPieces.length === 3 - ? EncryptionType.AesCbc128_HmacSha256_B64 - : EncryptionType.AesCbc256_B64; + encType = EncryptionType.AesCbc256_B64; } return { @@ -160,7 +156,7 @@ export class EncString implements Encrypted { async decrypt( orgId: string | null, - key: SymmetricCryptoKey = null, + key: SymmetricCryptoKey | null = null, context?: string, ): Promise { if (this.decryptedValue != null) { diff --git a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts index e4c43264eaf..58c902ebab6 100644 --- a/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts +++ b/libs/common/src/platform/models/domain/symmetric-crypto-key.spec.ts @@ -27,21 +27,6 @@ describe("SymmetricCryptoKey", () => { }); }); - it("AesCbc128_HmacSha256_B64", () => { - const key = makeStaticByteArray(32); - const cryptoKey = new SymmetricCryptoKey(key, EncryptionType.AesCbc128_HmacSha256_B64); - - expect(cryptoKey).toEqual({ - encKey: key.slice(0, 16), - encKeyB64: "AAECAwQFBgcICQoLDA0ODw==", - encType: 1, - key: key, - keyB64: "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", - macKey: key.slice(16, 32), - macKeyB64: "EBESExQVFhcYGRobHB0eHw==", - }); - }); - it("AesCbc256_HmacSha256_B64", () => { const key = makeStaticByteArray(64); const cryptoKey = new SymmetricCryptoKey(key); diff --git a/libs/common/src/platform/models/domain/symmetric-crypto-key.ts b/libs/common/src/platform/models/domain/symmetric-crypto-key.ts index eab4c7b2114..372b869fd9c 100644 --- a/libs/common/src/platform/models/domain/symmetric-crypto-key.ts +++ b/libs/common/src/platform/models/domain/symmetric-crypto-key.ts @@ -38,9 +38,6 @@ export class SymmetricCryptoKey { if (encType === EncryptionType.AesCbc256_B64 && key.byteLength === 32) { this.encKey = key; this.macKey = null; - } else if (encType === EncryptionType.AesCbc128_HmacSha256_B64 && key.byteLength === 32) { - this.encKey = key.slice(0, 16); - this.macKey = key.slice(16, 32); } else if (encType === EncryptionType.AesCbc256_HmacSha256_B64 && key.byteLength === 64) { this.encKey = key.slice(0, 32); this.macKey = key.slice(32, 64); diff --git a/libs/common/src/platform/state/state-definitions.ts b/libs/common/src/platform/state/state-definitions.ts index 84d5b81ee73..b37aeb442ed 100644 --- a/libs/common/src/platform/state/state-definitions.ts +++ b/libs/common/src/platform/state/state-definitions.ts @@ -131,6 +131,10 @@ export const THEMING_DISK = new StateDefinition("theming", "disk", { web: "disk- export const TRANSLATION_DISK = new StateDefinition("translation", "disk", { web: "disk-local" }); export const ANIMATION_DISK = new StateDefinition("animation", "disk"); export const TASK_SCHEDULER_DISK = new StateDefinition("taskScheduler", "disk"); +export const EXTENSION_INITIAL_INSTALL_DISK = new StateDefinition( + "extensionInitialInstall", + "disk", +); // Design System @@ -144,6 +148,7 @@ export const SM_ONBOARDING_DISK = new StateDefinition("smOnboarding", "disk", { // Tools +export const EXTENSION_DISK = new StateDefinition("extension", "disk"); export const GENERATOR_DISK = new StateDefinition("generator", "disk"); export const GENERATOR_MEMORY = new StateDefinition("generator", "memory"); export const BROWSER_SEND_MEMORY = new StateDefinition("sendBrowser", "memory"); @@ -200,3 +205,4 @@ export const NEW_DEVICE_VERIFICATION_NOTICE = new StateDefinition( export const VAULT_APPEARANCE = new StateDefinition("vaultAppearance", "disk"); export const SECURITY_TASKS_DISK = new StateDefinition("securityTasks", "disk"); export const AT_RISK_PASSWORDS_PAGE_DISK = new StateDefinition("atRiskPasswordsPage", "disk"); +export const NOTIFICATION_DISK = new StateDefinition("notifications", "disk"); diff --git a/libs/common/src/platform/sync/default-sync.service.ts b/libs/common/src/platform/sync/default-sync.service.ts index b47f0c54208..656267d864c 100644 --- a/libs/common/src/platform/sync/default-sync.service.ts +++ b/libs/common/src/platform/sync/default-sync.service.ts @@ -27,13 +27,13 @@ import { PolicyResponse } from "../../admin-console/models/response/policy.respo import { AccountService } from "../../auth/abstractions/account.service"; import { AuthService } from "../../auth/abstractions/auth.service"; import { AvatarService } from "../../auth/abstractions/avatar.service"; -import { KeyConnectorService } from "../../auth/abstractions/key-connector.service"; -import { InternalMasterPasswordServiceAbstraction } from "../../auth/abstractions/master-password.service.abstraction"; import { TokenService } from "../../auth/abstractions/token.service"; import { AuthenticationStatus } from "../../auth/enums/authentication-status"; import { ForceSetPasswordReason } from "../../auth/models/domain/force-set-password-reason"; import { DomainSettingsService } from "../../autofill/services/domain-settings.service"; import { BillingAccountProfileStateService } from "../../billing/abstractions"; +import { KeyConnectorService } from "../../key-management/key-connector/abstractions/key-connector.service"; +import { InternalMasterPasswordServiceAbstraction } from "../../key-management/master-password/abstractions/master-password.service.abstraction"; import { DomainsResponse } from "../../models/response/domains.response"; import { ProfileResponse } from "../../models/response/profile.response"; import { SendData } from "../../tools/send/models/data/send.data"; diff --git a/libs/common/src/platform/theming/theme-state.service.ts b/libs/common/src/platform/theming/theme-state.service.ts index df2c96c49d0..a02400b5b3a 100644 --- a/libs/common/src/platform/theming/theme-state.service.ts +++ b/libs/common/src/platform/theming/theme-state.service.ts @@ -1,43 +1,33 @@ -import { Observable, combineLatest, map } from "rxjs"; +import { Observable, map } from "rxjs"; -import { FeatureFlag } from "../../enums/feature-flag.enum"; -import { ConfigService } from "../abstractions/config/config.service"; -import { ThemeType } from "../enums"; +import { Theme, ThemeTypes } from "../enums"; import { GlobalStateProvider, KeyDefinition, THEMING_DISK } from "../state"; export abstract class ThemeStateService { /** * The users selected theme. */ - abstract selectedTheme$: Observable; + abstract selectedTheme$: Observable; /** * A method for updating the current users configured theme. * @param theme The chosen user theme. */ - abstract setSelectedTheme(theme: ThemeType): Promise; + abstract setSelectedTheme(theme: Theme): Promise; } -export const THEME_SELECTION = new KeyDefinition(THEMING_DISK, "selection", { +export const THEME_SELECTION = new KeyDefinition(THEMING_DISK, "selection", { deserializer: (s) => s, }); export class DefaultThemeStateService implements ThemeStateService { private readonly selectedThemeState = this.globalStateProvider.get(THEME_SELECTION); - selectedTheme$ = combineLatest([ - this.selectedThemeState.state$, - this.configService.getFeatureFlag$(FeatureFlag.ExtensionRefresh), - ]).pipe( - map(([theme, isExtensionRefresh]) => { - // The extension refresh should not allow for Nord or SolarizedDark - // Default the user to their system theme - if ( - isExtensionRefresh && - theme != null && - [ThemeType.Nord, ThemeType.SolarizedDark].includes(theme) - ) { - return ThemeType.System; + selectedTheme$ = this.selectedThemeState.state$.pipe( + map((theme) => { + // We used to support additional themes. Since these are no longer supported we return null to default to the system theme. + if (theme != null && !Object.values(ThemeTypes).includes(theme)) { + return null; } return theme; @@ -47,11 +37,10 @@ export class DefaultThemeStateService implements ThemeStateService { constructor( private globalStateProvider: GlobalStateProvider, - private configService: ConfigService, - private defaultTheme: ThemeType = ThemeType.System, + private defaultTheme: Theme = ThemeTypes.System, ) {} - async setSelectedTheme(theme: ThemeType): Promise { + async setSelectedTheme(theme: Theme): Promise { await this.selectedThemeState.update(() => theme, { shouldUpdate: (currentTheme) => currentTheme !== theme, }); diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 7a43daccf6e..2ff2fb01c87 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -12,6 +12,7 @@ import { LogoutReason } from "@bitwarden/auth/common"; import { ApiService as ApiServiceAbstraction } from "../abstractions/api.service"; import { OrganizationConnectionType } from "../admin-console/enums"; +import { CollectionBulkDeleteRequest } from "../admin-console/models/request/collection-bulk-delete.request"; import { OrganizationSponsorshipCreateRequest } from "../admin-console/models/request/organization/organization-sponsorship-create.request"; import { OrganizationSponsorshipRedeemRequest } from "../admin-console/models/request/organization/organization-sponsorship-redeem.request"; import { OrganizationConnectionRequest } from "../admin-console/models/request/organization-connection.request"; @@ -43,7 +44,6 @@ import { } from "../admin-console/models/response/provider/provider-user.response"; import { SelectionReadOnlyResponse } from "../admin-console/models/response/selection-read-only.response"; import { TokenService } from "../auth/abstractions/token.service"; -import { AuthRequest } from "../auth/models/request/auth.request"; import { DeviceVerificationRequest } from "../auth/models/request/device-verification.request"; import { DisableTwoFactorAuthenticatorRequest } from "../auth/models/request/disable-two-factor-authenticator.request"; import { EmailTokenRequest } from "../auth/models/request/email-token.request"; @@ -54,19 +54,12 @@ import { SsoTokenRequest } from "../auth/models/request/identity-token/sso-token import { TokenTwoFactorRequest } from "../auth/models/request/identity-token/token-two-factor.request"; import { UserApiTokenRequest } from "../auth/models/request/identity-token/user-api-token.request"; import { WebAuthnLoginTokenRequest } from "../auth/models/request/identity-token/webauthn-login-token.request"; -import { KeyConnectorUserKeyRequest } from "../auth/models/request/key-connector-user-key.request"; import { PasswordHintRequest } from "../auth/models/request/password-hint.request"; -import { PasswordRequest } from "../auth/models/request/password.request"; import { PasswordlessAuthRequest } from "../auth/models/request/passwordless-auth.request"; import { SecretVerificationRequest } from "../auth/models/request/secret-verification.request"; -import { SetKeyConnectorKeyRequest } from "../auth/models/request/set-key-connector-key.request"; -import { SetPasswordRequest } from "../auth/models/request/set-password.request"; import { TwoFactorEmailRequest } from "../auth/models/request/two-factor-email.request"; import { TwoFactorProviderRequest } from "../auth/models/request/two-factor-provider.request"; -import { TwoFactorRecoveryRequest } from "../auth/models/request/two-factor-recovery.request"; import { UpdateProfileRequest } from "../auth/models/request/update-profile.request"; -import { UpdateTdeOffboardingPasswordRequest } from "../auth/models/request/update-tde-offboarding-password.request"; -import { UpdateTempPasswordRequest } from "../auth/models/request/update-temp-password.request"; import { UpdateTwoFactorAuthenticatorRequest } from "../auth/models/request/update-two-factor-authenticator.request"; import { UpdateTwoFactorDuoRequest } from "../auth/models/request/update-two-factor-duo.request"; import { UpdateTwoFactorEmailRequest } from "../auth/models/request/update-two-factor-email.request"; @@ -104,9 +97,10 @@ import { PlanResponse } from "../billing/models/response/plan.response"; import { SubscriptionResponse } from "../billing/models/response/subscription.response"; import { TaxInfoResponse } from "../billing/models/response/tax-info.response"; import { DeviceType } from "../enums"; +import { KeyConnectorUserKeyRequest } from "../key-management/key-connector/models/key-connector-user-key.request"; +import { SetKeyConnectorKeyRequest } from "../key-management/key-connector/models/set-key-connector-key.request"; import { VaultTimeoutSettingsService } from "../key-management/vault-timeout"; import { VaultTimeoutAction } from "../key-management/vault-timeout/enums/vault-timeout-action.enum"; -import { CollectionBulkDeleteRequest } from "../models/request/collection-bulk-delete.request"; import { DeleteRecoverRequest } from "../models/request/delete-recover.request"; import { EventRequest } from "../models/request/event.request"; import { KdfRequest } from "../models/request/kdf.request"; @@ -279,22 +273,6 @@ export class ApiService implements ApiServiceAbstraction { } // TODO: PM-3519: Create and move to AuthRequest Api service - // TODO: PM-9724: Remove legacy auth request methods when we remove legacy LoginViaAuthRequestV1Components - async postAuthRequest(request: AuthRequest): Promise { - const r = await this.send("POST", "/auth-requests/", request, false, true); - return new AuthRequestResponse(r); - } - async postAdminAuthRequest(request: AuthRequest): Promise { - const r = await this.send("POST", "/auth-requests/admin-request", request, true, true); - return new AuthRequestResponse(r); - } - - async getAuthResponse(id: string, accessCode: string): Promise { - const path = `/auth-requests/${id}/response?code=${accessCode}`; - const r = await this.send("GET", path, null, false, true); - return new AuthRequestResponse(r); - } - async getAuthRequest(id: string): Promise { const path = `/auth-requests/${id}`; const r = await this.send("GET", path, null, true, true); @@ -374,14 +352,6 @@ export class ApiService implements ApiServiceAbstraction { return this.send("POST", "/accounts/email", request, true, false); } - postPassword(request: PasswordRequest): Promise { - return this.send("POST", "/accounts/password", request, true, false); - } - - setPassword(request: SetPasswordRequest): Promise { - return this.send("POST", "/accounts/set-password", request, true, false); - } - postSetKeyConnectorKey(request: SetKeyConnectorKeyRequest): Promise { return this.send("POST", "/accounts/set-key-connector-key", request, true, false); } @@ -479,14 +449,6 @@ export class ApiService implements ApiServiceAbstraction { return new ApiKeyResponse(r); } - putUpdateTempPassword(request: UpdateTempPasswordRequest): Promise { - return this.send("PUT", "/accounts/update-temp-password", request, true, false); - } - - putUpdateTdeOffboardingPassword(request: UpdateTdeOffboardingPasswordRequest): Promise { - return this.send("PUT", "/accounts/update-tde-offboarding-password", request, true, false); - } - postConvertToKeyConnector(): Promise { return this.send("POST", "/accounts/convert-to-key-connector", null, true, false); } @@ -1101,10 +1063,6 @@ export class ApiService implements ApiServiceAbstraction { return new TwoFactorProviderResponse(r); } - postTwoFactorRecover(request: TwoFactorRecoveryRequest): Promise { - return this.send("POST", "/two-factor/recover", request, false, false); - } - postTwoFactorEmailSetup(request: TwoFactorEmailRequest): Promise { return this.send("POST", "/two-factor/send-email", request, true, false); } diff --git a/libs/common/src/services/search.service.ts b/libs/common/src/services/search.service.ts index 3ee46818432..28e2902f102 100644 --- a/libs/common/src/services/search.service.ts +++ b/libs/common/src/services/search.service.ts @@ -9,13 +9,13 @@ import { UriMatchStrategy } from "../models/domain/domain-service"; import { I18nService } from "../platform/abstractions/i18n.service"; import { LogService } from "../platform/abstractions/log.service"; import { - ActiveUserState, + SingleUserState, StateProvider, UserKeyDefinition, VAULT_SEARCH_MEMORY, } from "../platform/state"; import { SendView } from "../tools/send/models/view/send.view"; -import { IndexedEntityId } from "../types/guid"; +import { IndexedEntityId, UserId } from "../types/guid"; import { FieldType } from "../vault/enums"; import { CipherType } from "../vault/enums/cipher-type"; import { CipherView } from "../vault/models/view/cipher.view"; @@ -70,24 +70,6 @@ export const LUNR_SEARCH_INDEXING = new UserKeyDefinition( export class SearchService implements SearchServiceAbstraction { private static registeredPipeline = false; - private searchIndexState: ActiveUserState = - this.stateProvider.getActive(LUNR_SEARCH_INDEX); - private readonly index$: Observable = this.searchIndexState.state$.pipe( - map((searchIndex) => (searchIndex ? lunr.Index.load(searchIndex) : null)), - ); - - private searchIndexEntityIdState: ActiveUserState = this.stateProvider.getActive( - LUNR_SEARCH_INDEXED_ENTITY_ID, - ); - readonly indexedEntityId$: Observable = - this.searchIndexEntityIdState.state$.pipe(map((id) => id)); - - private searchIsIndexingState: ActiveUserState = - this.stateProvider.getActive(LUNR_SEARCH_INDEXING); - private readonly searchIsIndexing$: Observable = this.searchIsIndexingState.state$.pipe( - map((indexing) => indexing ?? false), - ); - private readonly immediateSearchLocales: string[] = ["zh-CN", "zh-TW", "ja", "ko", "vi"]; private readonly defaultSearchableMinLength: number = 2; private searchableMinLength: number = this.defaultSearchableMinLength; @@ -114,15 +96,41 @@ export class SearchService implements SearchServiceAbstraction { } } - async clearIndex(): Promise { - await this.searchIndexEntityIdState.update(() => null); - await this.searchIndexState.update(() => null); - await this.searchIsIndexingState.update(() => null); + private searchIndexState(userId: UserId): SingleUserState { + return this.stateProvider.getUser(userId, LUNR_SEARCH_INDEX); } - async isSearchable(query: string): Promise { + private index$(userId: UserId): Observable { + return this.searchIndexState(userId).state$.pipe( + map((searchIndex) => (searchIndex ? lunr.Index.load(searchIndex) : null)), + ); + } + + private searchIndexEntityIdState(userId: UserId): SingleUserState { + return this.stateProvider.getUser(userId, LUNR_SEARCH_INDEXED_ENTITY_ID); + } + + indexedEntityId$(userId: UserId): Observable { + return this.searchIndexEntityIdState(userId).state$.pipe(map((id) => id)); + } + + private searchIsIndexingState(userId: UserId): SingleUserState { + return this.stateProvider.getUser(userId, LUNR_SEARCH_INDEXING); + } + + private searchIsIndexing$(userId: UserId): Observable { + return this.searchIsIndexingState(userId).state$.pipe(map((indexing) => indexing ?? false)); + } + + async clearIndex(userId: UserId): Promise { + await this.searchIndexEntityIdState(userId).update(() => null); + await this.searchIndexState(userId).update(() => null); + await this.searchIsIndexingState(userId).update(() => null); + } + + async isSearchable(userId: UserId, query: string): Promise { query = SearchService.normalizeSearchQuery(query); - const index = await this.getIndexForSearch(); + const index = await this.getIndexForSearch(userId); const notSearchable = query == null || (index == null && query.length < this.searchableMinLength) || @@ -130,13 +138,17 @@ export class SearchService implements SearchServiceAbstraction { return !notSearchable; } - async indexCiphers(ciphers: CipherView[], indexedEntityId?: string): Promise { - if (await this.getIsIndexing()) { + async indexCiphers( + userId: UserId, + ciphers: CipherView[], + indexedEntityId?: string, + ): Promise { + if (await this.getIsIndexing(userId)) { return; } - await this.setIsIndexing(true); - await this.setIndexedEntityIdForSearch(indexedEntityId as IndexedEntityId); + await this.setIsIndexing(userId, true); + await this.setIndexedEntityIdForSearch(userId, indexedEntityId as IndexedEntityId); const builder = new lunr.Builder(); builder.pipeline.add(this.normalizeAccentsPipelineFunction); builder.ref("id"); @@ -172,14 +184,15 @@ export class SearchService implements SearchServiceAbstraction { ciphers.forEach((c) => builder.add(c)); const index = builder.build(); - await this.setIndexForSearch(index.toJSON() as SerializedLunrIndex); + await this.setIndexForSearch(userId, index.toJSON() as SerializedLunrIndex); - await this.setIsIndexing(false); + await this.setIsIndexing(userId, false); this.logService.info("Finished search indexing"); } async searchCiphers( + userId: UserId, query: string, filter: ((cipher: CipherView) => boolean) | ((cipher: CipherView) => boolean)[] = null, ciphers: CipherView[], @@ -202,18 +215,18 @@ export class SearchService implements SearchServiceAbstraction { ciphers = ciphers.filter(filter as (cipher: CipherView) => boolean); } - if (!(await this.isSearchable(query))) { + if (!(await this.isSearchable(userId, query))) { return ciphers; } - if (await this.getIsIndexing()) { + if (await this.getIsIndexing(userId)) { await new Promise((r) => setTimeout(r, 250)); - if (await this.getIsIndexing()) { + if (await this.getIsIndexing(userId)) { await new Promise((r) => setTimeout(r, 500)); } } - const index = await this.getIndexForSearch(); + const index = await this.getIndexForSearch(userId); if (index == null) { // Fall back to basic search if index is not available return this.searchCiphersBasic(ciphers, query); @@ -307,24 +320,27 @@ export class SearchService implements SearchServiceAbstraction { return sendsMatched.concat(lowPriorityMatched); } - async getIndexForSearch(): Promise { - return await firstValueFrom(this.index$); + async getIndexForSearch(userId: UserId): Promise { + return await firstValueFrom(this.index$(userId)); } - private async setIndexForSearch(index: SerializedLunrIndex): Promise { - await this.searchIndexState.update(() => index); + private async setIndexForSearch(userId: UserId, index: SerializedLunrIndex): Promise { + await this.searchIndexState(userId).update(() => index); } - private async setIndexedEntityIdForSearch(indexedEntityId: IndexedEntityId): Promise { - await this.searchIndexEntityIdState.update(() => indexedEntityId); + private async setIndexedEntityIdForSearch( + userId: UserId, + indexedEntityId: IndexedEntityId, + ): Promise { + await this.searchIndexEntityIdState(userId).update(() => indexedEntityId); } - private async setIsIndexing(indexing: boolean): Promise { - await this.searchIsIndexingState.update(() => indexing); + private async setIsIndexing(userId: UserId, indexing: boolean): Promise { + await this.searchIsIndexingState(userId).update(() => indexing); } - private async getIsIndexing(): Promise { - return await firstValueFrom(this.searchIsIndexing$); + private async getIsIndexing(userId: UserId): Promise { + return await firstValueFrom(this.searchIsIndexing$(userId)); } private fieldExtractor(c: CipherView, joined: boolean) { diff --git a/libs/common/src/state-migrations/migration-helper.spec.ts b/libs/common/src/state-migrations/migration-helper.spec.ts index 49e6e7fe9cf..11126c6723a 100644 --- a/libs/common/src/state-migrations/migration-helper.spec.ts +++ b/libs/common/src/state-migrations/migration-helper.spec.ts @@ -1,6 +1,5 @@ import { MockProxy, mock } from "jest-mock-extended"; -// eslint-disable-next-line import/no-restricted-paths -- Needed to print log messages import { FakeStorageService } from "../../spec/fake-storage.service"; // eslint-disable-next-line import/no-restricted-paths -- Needed client type enum import { ClientType } from "../enums"; diff --git a/libs/common/src/tools/extension/extension.service.spec.ts b/libs/common/src/tools/extension/extension.service.spec.ts new file mode 100644 index 00000000000..dad5684b523 --- /dev/null +++ b/libs/common/src/tools/extension/extension.service.spec.ts @@ -0,0 +1,136 @@ +import { mock } from "jest-mock-extended"; +import { BehaviorSubject, firstValueFrom } from "rxjs"; + +import { FakeAccountService, FakeStateProvider, awaitAsync } from "../../../spec"; +import { Account } from "../../auth/abstractions/account.service"; +import { EXTENSION_DISK, UserKeyDefinition } from "../../platform/state"; +import { UserId } from "../../types/guid"; +import { LegacyEncryptorProvider } from "../cryptography/legacy-encryptor-provider"; +import { UserEncryptor } from "../cryptography/user-encryptor.abstraction"; +import { disabledSemanticLoggerProvider } from "../log"; +import { UserStateSubjectDependencyProvider } from "../state/user-state-subject-dependency-provider"; + +import { Site } from "./data"; +import { ExtensionRegistry } from "./extension-registry.abstraction"; +import { ExtensionSite } from "./extension-site"; +import { ExtensionService } from "./extension.service"; +import { ExtensionMetadata, ExtensionProfileMetadata, ExtensionStorageKey } from "./type"; +import { Vendor } from "./vendor/data"; +import { SimpleLogin } from "./vendor/simplelogin"; + +const SomeUser = "some user" as UserId; +const SomeAccount = { + id: SomeUser, + email: "someone@example.com", + emailVerified: true, + name: "Someone", +}; +const SomeAccount$ = new BehaviorSubject(SomeAccount); + +type TestType = { foo: string }; + +const SomeEncryptor: UserEncryptor = { + userId: SomeUser, + + encrypt(secret) { + const tmp: any = secret; + return Promise.resolve({ foo: `encrypt(${tmp.foo})` } as any); + }, + + decrypt(secret) { + const tmp: any = JSON.parse(secret.encryptedString!); + return Promise.resolve({ foo: `decrypt(${tmp.foo})` } as any); + }, +}; + +const SomeAccountService = new FakeAccountService({ + [SomeUser]: SomeAccount, +}); + +const SomeStateProvider = new FakeStateProvider(SomeAccountService); + +const SomeProvider = { + encryptor: { + userEncryptor$: () => { + return new BehaviorSubject({ encryptor: SomeEncryptor, userId: SomeUser }).asObservable(); + }, + organizationEncryptor$() { + throw new Error("`organizationEncryptor$` should never be invoked."); + }, + } as LegacyEncryptorProvider, + state: SomeStateProvider, + log: disabledSemanticLoggerProvider, +} as UserStateSubjectDependencyProvider; + +const SomeExtension: ExtensionMetadata = { + site: { id: "forwarder", availableFields: [] }, + product: { vendor: SimpleLogin }, + host: { + selfHost: "maybe", + baseUrl: "https://www.example.com/", + authentication: true, + }, + requestedFields: [], +}; + +const SomeRegistry = mock(); + +const SomeProfileMetadata = { + type: "extension", + site: Site.forwarder, + storage: { + key: "someProfile", + options: { + deserializer: (value) => value as TestType, + clearOn: [], + }, + } as ExtensionStorageKey, +} satisfies ExtensionProfileMetadata; + +describe("ExtensionService", () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe("settings", () => { + it("writes to the user's state", async () => { + const extension = new ExtensionService(SomeRegistry, SomeProvider); + SomeRegistry.extension.mockReturnValue(SomeExtension); + const subject = extension.settings(SomeProfileMetadata, Vendor.simplelogin, { + account$: SomeAccount$, + }); + + subject.next({ foo: "next value" }); + await awaitAsync(); + + // if the write succeeded, then the storage location should contain an object; + // the precise value isn't tested to avoid coupling the test to the storage format + const expectedKey = new UserKeyDefinition( + EXTENSION_DISK, + "forwarder.simplelogin.someProfile", + SomeProfileMetadata.storage.options, + ); + const result = await firstValueFrom(SomeStateProvider.getUserState$(expectedKey, SomeUser)); + expect(result).toBeTruthy(); + }); + + it("panics when the extension metadata isn't available", async () => { + const extension = new ExtensionService(SomeRegistry, SomeProvider); + expect(() => + extension.settings(SomeProfileMetadata, Vendor.bitwarden, { account$: SomeAccount$ }), + ).toThrow("extension not defined"); + }); + }); + + describe("site", () => { + it("returns an extension site", () => { + const expected = new ExtensionSite(SomeExtension.site, new Map()); + SomeRegistry.build.mockReturnValueOnce(expected); + const extension = new ExtensionService(SomeRegistry, SomeProvider); + + const site = extension.site(Site.forwarder); + + expect(site).toEqual(expected); + }); + }); +}); diff --git a/libs/common/src/tools/extension/extension.service.ts b/libs/common/src/tools/extension/extension.service.ts new file mode 100644 index 00000000000..c4e6887b821 --- /dev/null +++ b/libs/common/src/tools/extension/extension.service.ts @@ -0,0 +1,63 @@ +import { shareReplay } from "rxjs"; + +import { Account } from "../../auth/abstractions/account.service"; +import { BoundDependency } from "../dependencies"; +import { SemanticLogger } from "../log"; +import { UserStateSubject } from "../state/user-state-subject"; +import { UserStateSubjectDependencyProvider } from "../state/user-state-subject-dependency-provider"; + +import { ExtensionRegistry } from "./extension-registry.abstraction"; +import { ExtensionProfileMetadata, SiteId, VendorId } from "./type"; +import { toObjectKey } from "./util"; + +/** Provides configuration and storage support for Bitwarden client extensions. + * These extensions integrate 3rd party services into Bitwarden. + */ +export class ExtensionService { + /** Instantiate the extension service. + * @param registry provides runtime status for extension sites + * @param providers provide persistent data + */ + constructor( + private registry: ExtensionRegistry, + private readonly providers: UserStateSubjectDependencyProvider, + ) { + this.log = providers.log({ + type: "ExtensionService", + }); + } + + private log: SemanticLogger; + + /** Get a subject bound to a user's extension settings + * @param profile the site's extension profile + * @param vendor the vendor integrated at the extension site + * @param dependencies.account$ the account to which the settings are bound + * @returns a subject bound to the requested user's generator settings + */ + settings( + profile: ExtensionProfileMetadata, + vendor: VendorId, + dependencies: BoundDependency<"account", Account>, + ): UserStateSubject { + const metadata = this.registry.extension(profile.site, vendor); + if (!metadata) { + this.log.panic({ site: profile.site as string, vendor }, "extension not defined"); + } + + const key = toObjectKey(profile, metadata); + const account$ = dependencies.account$.pipe(shareReplay({ bufferSize: 1, refCount: true })); + // FIXME: load and apply constraints + const subject = new UserStateSubject(key, this.providers, { account$ }); + + return subject; + } + + /** Look up extension metadata for a site + * @param site defines the site to retrieve. + * @returns the extensions available at the site. + */ + site(site: SiteId) { + return this.registry.build(site); + } +} diff --git a/libs/common/src/tools/extension/type.ts b/libs/common/src/tools/extension/type.ts index f37d4ff8e53..26135e41421 100644 --- a/libs/common/src/tools/extension/type.ts +++ b/libs/common/src/tools/extension/type.ts @@ -1,5 +1,7 @@ import { Opaque } from "type-fest"; +import { ObjectKey } from "../state/object-key"; + import { Site, Field, Permission } from "./data"; /** well-known name for a feature extensible through an extension. */ @@ -17,6 +19,11 @@ export type ExtensionId = { site: SiteId; vendor: VendorId }; /** Permission levels for metadata. */ export type ExtensionPermission = keyof typeof Permission; +/** The preferred vendor to use at each site. */ +export type ExtensionPreferences = { + [key in SiteId]?: { vendor: VendorId; updated: Date }; +}; + /** The capabilities and descriptive content for an extension */ export type SiteMetadata = { /** Uniquely identifies the extension site. */ @@ -107,3 +114,29 @@ export type ExtensionSet = */ all: true; }; + +/** A key for storing JavaScript objects (`{ an: "example" }`) + * in the extension profile system. + * @remarks The omitted keys are filled by the extension service. + */ +export type ExtensionStorageKey = Omit< + ObjectKey, + "target" | "state" | "format" | "classifier" +>; + +/** Extension profiles encapsulate data storage using the extension system. + */ +export type ExtensionProfileMetadata = { + /** distinguishes profile metadata types */ + type: "extension"; + + /** The extension site described by this metadata */ + site: Site; + + /** persistent storage location; `storage.key` is used to construct + * the extension key in the format `${extension.site}.${extension.vendor}.${storage.key}`, + * where `extension.`-prefixed fields are read from extension metadata. Extension + * settings always use the "classified" format and keep all fields private. + */ + storage: ExtensionStorageKey; +}; diff --git a/libs/common/src/tools/extension/util.spec.ts b/libs/common/src/tools/extension/util.spec.ts new file mode 100644 index 00000000000..f6f3341a986 --- /dev/null +++ b/libs/common/src/tools/extension/util.spec.ts @@ -0,0 +1,54 @@ +import { EXTENSION_DISK } from "../../platform/state"; +import { PrivateClassifier } from "../private-classifier"; +import { deepFreeze } from "../util"; + +import { Site } from "./data"; +import { ExtensionMetadata, ExtensionProfileMetadata } from "./type"; +import { toObjectKey } from "./util"; +import { Bitwarden } from "./vendor/bitwarden"; + +const ExampleProfile: ExtensionProfileMetadata = deepFreeze({ + type: "extension", + site: "forwarder", + storage: { + key: "example", + options: { + clearOn: [], + deserializer: (value) => value as any, + }, + initial: {}, + frame: 1, + }, +}); + +const ExampleMetadata: ExtensionMetadata = { + site: { id: Site.forwarder, availableFields: [] }, + product: { vendor: Bitwarden }, + host: { authentication: true, selfHost: "maybe", baseUrl: "http://example.com" }, + requestedFields: [], +}; + +describe("toObjectKey", () => { + it("sets static fields", () => { + const result = toObjectKey(ExampleProfile, ExampleMetadata); + + expect(result.target).toEqual("object"); + expect(result.format).toEqual("classified"); + expect(result.state).toBe(EXTENSION_DISK); + expect(result.classifier).toBeInstanceOf(PrivateClassifier); + }); + + it("creates a dynamic object key", () => { + const result = toObjectKey(ExampleProfile, ExampleMetadata); + + expect(result.key).toEqual("forwarder.bitwarden.example"); + }); + + it("copies the profile storage metadata", () => { + const result = toObjectKey(ExampleProfile, ExampleMetadata); + + expect(result.frame).toEqual(ExampleProfile.storage.frame); + expect(result.options).toBe(ExampleProfile.storage.options); + expect(result.initial).toBe(ExampleProfile.storage.initial); + }); +}); diff --git a/libs/common/src/tools/extension/util.ts b/libs/common/src/tools/extension/util.ts new file mode 100644 index 00000000000..f700e84c497 --- /dev/null +++ b/libs/common/src/tools/extension/util.ts @@ -0,0 +1,36 @@ +import { EXTENSION_DISK } from "../../platform/state"; +import { PrivateClassifier } from "../private-classifier"; +import { Classifier } from "../state/classifier"; +import { ObjectKey } from "../state/object-key"; + +import { ExtensionMetadata, ExtensionProfileMetadata, SiteId } from "./type"; + +/** Create an object key from an extension instance and a site profile. + * @param profile the extension profile to bind + * @param extension the extension metadata to bind + */ +export function toObjectKey( + profile: ExtensionProfileMetadata, + extension: ExtensionMetadata, +) { + // FIXME: eliminate this cast + const classifier = new PrivateClassifier() as Classifier< + Settings, + Record, + Settings + >; + + const result: ObjectKey = { + // copy storage to retain extensibility + ...profile.storage, + + // fields controlled by the extension system override those in the profile + target: "object", + key: `${extension.site.id}.${extension.product.vendor.id}.${profile.storage.key}`, + state: EXTENSION_DISK, + classifier, + format: "classified", + }; + + return result; +} diff --git a/libs/common/src/tools/integration/integration-id.ts b/libs/common/src/tools/integration/integration-id.ts index a15db143ee1..a3d83aba46e 100644 --- a/libs/common/src/tools/integration/integration-id.ts +++ b/libs/common/src/tools/integration/integration-id.ts @@ -10,4 +10,4 @@ export const IntegrationIds = [ ] as const; /** Identifies a vendor integrated into bitwarden */ -export type IntegrationId = Opaque<(typeof IntegrationIds)[number], "IntegrationId">; +export type IntegrationId = Opaque; diff --git a/libs/common/src/tools/log/default-semantic-logger.spec.ts b/libs/common/src/tools/log/default-semantic-logger.spec.ts index 853056f1bbd..7f608fb40ef 100644 --- a/libs/common/src/tools/log/default-semantic-logger.spec.ts +++ b/libs/common/src/tools/log/default-semantic-logger.spec.ts @@ -14,33 +14,36 @@ describe("DefaultSemanticLogger", () => { describe("debug", () => { it("writes structural log messages to console.log", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.debug("this is a debug message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Debug, { + "@timestamp": 0, message: "this is a debug message", level: "debug", }); }); it("writes structural content to console.log", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.debug({ example: "this is content" }); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Debug, { + "@timestamp": 0, content: { example: "this is content" }, level: "debug", }); }); it("writes structural content to console.log with a message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.info({ example: "this is content" }, "this is a message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + "@timestamp": 0, content: { example: "this is content" }, message: "this is a message", level: "information", @@ -50,33 +53,36 @@ describe("DefaultSemanticLogger", () => { describe("info", () => { it("writes structural log messages to console.log", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.info("this is an info message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + "@timestamp": 0, message: "this is an info message", level: "information", }); }); it("writes structural content to console.log", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.info({ example: "this is content" }); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + "@timestamp": 0, content: { example: "this is content" }, level: "information", }); }); it("writes structural content to console.log with a message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.info({ example: "this is content" }, "this is a message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Info, { + "@timestamp": 0, content: { example: "this is content" }, message: "this is a message", level: "information", @@ -86,33 +92,36 @@ describe("DefaultSemanticLogger", () => { describe("warn", () => { it("writes structural log messages to console.warn", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.warn("this is a warning message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + "@timestamp": 0, message: "this is a warning message", level: "warning", }); }); it("writes structural content to console.warn", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.warn({ example: "this is content" }); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + "@timestamp": 0, content: { example: "this is content" }, level: "warning", }); }); it("writes structural content to console.warn with a message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.warn({ example: "this is content" }, "this is a message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Warning, { + "@timestamp": 0, content: { example: "this is content" }, message: "this is a message", level: "warning", @@ -122,33 +131,36 @@ describe("DefaultSemanticLogger", () => { describe("error", () => { it("writes structural log messages to console.error", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.error("this is an error message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, message: "this is an error message", level: "error", }); }); it("writes structural content to console.error", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.error({ example: "this is content" }); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, content: { example: "this is content" }, level: "error", }); }); it("writes structural content to console.error with a message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); log.error({ example: "this is content" }, "this is a message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, content: { example: "this is content" }, message: "this is a message", level: "error", @@ -158,24 +170,26 @@ describe("DefaultSemanticLogger", () => { describe("panic", () => { it("writes structural log messages to console.error before throwing the message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); expect(() => log.panic("this is an error message")).toThrow("this is an error message"); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, message: "this is an error message", level: "error", }); }); it("writes structural log messages to console.error with a message before throwing the message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); expect(() => log.panic({ example: "this is content" }, "this is an error message")).toThrow( "this is an error message", ); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, content: { example: "this is content" }, message: "this is an error message", level: "error", @@ -183,13 +197,14 @@ describe("DefaultSemanticLogger", () => { }); it("writes structural log messages to console.error with a content before throwing the message", () => { - const log = new DefaultSemanticLogger(logger, {}); + const log = new DefaultSemanticLogger(logger, {}, () => 0); expect(() => log.panic("this is content", "this is an error message")).toThrow( "this is an error message", ); expect(logger.write).toHaveBeenCalledWith(LogLevelType.Error, { + "@timestamp": 0, content: "this is content", message: "this is an error message", level: "error", diff --git a/libs/common/src/tools/log/default-semantic-logger.ts b/libs/common/src/tools/log/default-semantic-logger.ts index 90788e7031b..eb1ecbe36c6 100644 --- a/libs/common/src/tools/log/default-semantic-logger.ts +++ b/libs/common/src/tools/log/default-semantic-logger.ts @@ -18,6 +18,7 @@ export class DefaultSemanticLogger implements SemanticLo constructor( private logger: LogService, context: Jsonify, + private now = () => Date.now(), ) { this.context = context && typeof context === "object" ? context : {}; } @@ -53,6 +54,7 @@ export class DefaultSemanticLogger implements SemanticLo message, content: content ?? undefined, level: stringifyLevel(level), + "@timestamp": this.now(), }; if (typeof content === "string" && !message) { diff --git a/libs/common/src/tools/private-classifier.ts b/libs/common/src/tools/private-classifier.ts index 58244ae9906..e2406d314c0 100644 --- a/libs/common/src/tools/private-classifier.ts +++ b/libs/common/src/tools/private-classifier.ts @@ -17,7 +17,7 @@ export class PrivateClassifier implements Classifier; - return { disclosed: null, secret }; + return { disclosed: {}, secret }; } declassify(_disclosed: Jsonify>, secret: Jsonify) { diff --git a/libs/common/src/tools/providers.ts b/libs/common/src/tools/providers.ts new file mode 100644 index 00000000000..a22a22addc5 --- /dev/null +++ b/libs/common/src/tools/providers.ts @@ -0,0 +1,16 @@ +import { PolicyService } from "../admin-console/abstractions/policy/policy.service.abstraction"; + +import { ExtensionService } from "./extension/extension.service"; +import { LogProvider } from "./log"; + +/** Provides access to commonly-used cross-cutting services. */ +export type SystemServiceProvider = { + /** Policy configured by the administrative console */ + readonly policy: PolicyService; + + /** Client extension metadata and profile access */ + readonly extension: ExtensionService; + + /** Event monitoring and diagnostic interfaces */ + readonly log: LogProvider; +}; diff --git a/libs/common/src/tools/public-classifier.ts b/libs/common/src/tools/public-classifier.ts index e036ebd1c42..136bee555ac 100644 --- a/libs/common/src/tools/public-classifier.ts +++ b/libs/common/src/tools/public-classifier.ts @@ -16,7 +16,7 @@ export class PublicClassifier implements Classifier; - return { disclosed, secret: null }; + return { disclosed, secret: "" }; } declassify(disclosed: Jsonify, _secret: Jsonify>) { diff --git a/libs/common/src/tools/send/models/domain/send-access.ts b/libs/common/src/tools/send/models/domain/send-access.ts index dcc2d3ef426..588c4e84aa1 100644 --- a/libs/common/src/tools/send/models/domain/send-access.ts +++ b/libs/common/src/tools/send/models/domain/send-access.ts @@ -54,14 +54,7 @@ export class SendAccess extends Domain { async decrypt(key: SymmetricCryptoKey): Promise { const model = new SendAccessView(this); - await this.decryptObj( - model, - { - name: null, - }, - null, - key, - ); + await this.decryptObj(this, model, ["name"], null, key); switch (this.type) { case SendType.File: diff --git a/libs/common/src/tools/send/models/domain/send-file.ts b/libs/common/src/tools/send/models/domain/send-file.ts index 90e40f3959a..b8d0a265081 100644 --- a/libs/common/src/tools/send/models/domain/send-file.ts +++ b/libs/common/src/tools/send/models/domain/send-file.ts @@ -34,15 +34,13 @@ export class SendFile extends Domain { } async decrypt(key: SymmetricCryptoKey): Promise { - const view = await this.decryptObj( + return await this.decryptObj( + this, new SendFileView(this), - { - fileName: null, - }, + ["fileName"], null, key, ); - return view; } static fromJSON(obj: Jsonify) { diff --git a/libs/common/src/tools/send/models/domain/send-text.ts b/libs/common/src/tools/send/models/domain/send-text.ts index b17e3f769fb..df33e555896 100644 --- a/libs/common/src/tools/send/models/domain/send-text.ts +++ b/libs/common/src/tools/send/models/domain/send-text.ts @@ -30,11 +30,10 @@ export class SendText extends Domain { } decrypt(key: SymmetricCryptoKey): Promise { - return this.decryptObj( + return this.decryptObj( + this, new SendTextView(this), - { - text: null, - }, + ["text"], null, key, ); diff --git a/libs/common/src/tools/send/models/domain/send.ts b/libs/common/src/tools/send/models/domain/send.ts index c2390d439e7..f12a0010fab 100644 --- a/libs/common/src/tools/send/models/domain/send.ts +++ b/libs/common/src/tools/send/models/domain/send.ts @@ -87,15 +87,7 @@ export class Send extends Domain { // TODO: error? } - await this.decryptObj( - model, - { - name: null, - notes: null, - }, - null, - model.cryptoKey, - ); + await this.decryptObj(this, model, ["name", "notes"], null, model.cryptoKey); switch (this.type) { case SendType.File: diff --git a/libs/common/src/tools/state/classified-format.spec.ts b/libs/common/src/tools/state/classified-format.spec.ts new file mode 100644 index 00000000000..77d39ba4cac --- /dev/null +++ b/libs/common/src/tools/state/classified-format.spec.ts @@ -0,0 +1,27 @@ +import { isClassifiedFormat } from "./classified-format"; + +describe("isClassifiedFormat", () => { + it("returns `false` when the argument is `null`", () => { + expect(isClassifiedFormat(null)).toEqual(false); + }); + + it.each([ + [{ id: true, secret: "" }], + [{ secret: "", disclosed: {} }], + [{ id: true, disclosed: {} }], + ])("returns `false` when the argument is missing a required member (=%p).", (value) => { + expect(isClassifiedFormat(value)).toEqual(false); + }); + + it("returns `false` when 'secret' is not a string", () => { + expect(isClassifiedFormat({ id: true, secret: false, disclosed: {} })).toEqual(false); + }); + + it("returns `false` when 'disclosed' is not an object", () => { + expect(isClassifiedFormat({ id: true, secret: "", disclosed: false })).toEqual(false); + }); + + it("returns `true` when the argument has a `secret`, `disclosed`, and `id`.", () => { + expect(isClassifiedFormat({ id: true, secret: "", disclosed: {} })).toEqual(true); + }); +}); diff --git a/libs/common/src/tools/state/classified-format.ts b/libs/common/src/tools/state/classified-format.ts index 26aca0197c5..ea738dad58e 100644 --- a/libs/common/src/tools/state/classified-format.ts +++ b/libs/common/src/tools/state/classified-format.ts @@ -21,5 +21,12 @@ export type ClassifiedFormat = { export function isClassifiedFormat( value: any, ): value is ClassifiedFormat { - return "id" in value && "secret" in value && "disclosed" in value; + return ( + !!value && + "id" in value && + "secret" in value && + "disclosed" in value && + typeof value.secret === "string" && + typeof value.disclosed === "object" + ); } diff --git a/libs/common/src/tools/state/user-state-subject.ts b/libs/common/src/tools/state/user-state-subject.ts index b643b642154..dd88ec2fb20 100644 --- a/libs/common/src/tools/state/user-state-subject.ts +++ b/libs/common/src/tools/state/user-state-subject.ts @@ -523,6 +523,7 @@ export class UserStateSubject< private onError(value: any) { if (!this.isDisposed) { + this.log.debug(value, "forwarding error to subscribers"); this.output.error(value); } diff --git a/libs/common/src/types/guid.ts b/libs/common/src/types/guid.ts index 5ad498c115a..7a0ec4c1d58 100644 --- a/libs/common/src/types/guid.ts +++ b/libs/common/src/types/guid.ts @@ -11,3 +11,4 @@ export type CipherId = Opaque; export type SendId = Opaque; export type IndexedEntityId = Opaque; export type SecurityTaskId = Opaque; +export type NotificationId = Opaque; diff --git a/libs/common/src/vault/abstractions/totp.service.ts b/libs/common/src/vault/abstractions/totp.service.ts index af4409a15a6..f07b84e3bd2 100644 --- a/libs/common/src/vault/abstractions/totp.service.ts +++ b/libs/common/src/vault/abstractions/totp.service.ts @@ -1,6 +1,15 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore +import { Observable } from "rxjs"; + +import { TotpResponse } from "@bitwarden/sdk-internal"; + export abstract class TotpService { - getCode: (key: string) => Promise; - getTimeInterval: (key: string) => number; + /** + * Gets an observable that emits TOTP codes at regular intervals + * @param key - Can be: + * - A base32 encoded string + * - OTP Auth URI + * - Steam URI + * @returns Observable that emits TotpResponse containing the code and period + */ + abstract getCode$(key: string): Observable; } diff --git a/libs/common/src/vault/icon/build-cipher-icon.spec.ts b/libs/common/src/vault/icon/build-cipher-icon.spec.ts index 8de65390bf7..90ccaaec3a6 100644 --- a/libs/common/src/vault/icon/build-cipher-icon.spec.ts +++ b/libs/common/src/vault/icon/build-cipher-icon.spec.ts @@ -89,7 +89,7 @@ describe("buildCipherIcon", () => { expect(iconDetails).toEqual({ icon: "bwi-globe", - image: undefined, + image: null, fallbackImage: "", imageEnabled: false, }); @@ -102,7 +102,7 @@ describe("buildCipherIcon", () => { expect(iconDetails).toEqual({ icon: "bwi-globe", - image: undefined, + image: null, fallbackImage: "", imageEnabled: true, }); diff --git a/libs/common/src/vault/icon/build-cipher-icon.ts b/libs/common/src/vault/icon/build-cipher-icon.ts index 5775bc7f55e..b7456e1ae96 100644 --- a/libs/common/src/vault/icon/build-cipher-icon.ts +++ b/libs/common/src/vault/icon/build-cipher-icon.ts @@ -2,9 +2,23 @@ import { Utils } from "../../platform/misc/utils"; import { CipherType } from "../enums/cipher-type"; import { CipherView } from "../models/view/cipher.view"; -export function buildCipherIcon(iconsServerUrl: string, cipher: CipherView, showFavicon: boolean) { - let icon; - let image; +export interface CipherIconDetails { + imageEnabled: boolean; + image: string | null; + /** + * @deprecated Fallback to `icon` instead which will default to "bwi-globe" if no other icon is applicable. + */ + fallbackImage: string; + icon: string; +} + +export function buildCipherIcon( + iconsServerUrl: string | null, + cipher: CipherView, + showFavicon: boolean, +): CipherIconDetails { + let icon: string = "bwi-globe"; + let image: string | null = null; let fallbackImage = ""; const cardIcons: Record = { Visa: "card-visa", @@ -18,6 +32,10 @@ export function buildCipherIcon(iconsServerUrl: string, cipher: CipherView, show RuPay: "card-ru-pay", }; + if (iconsServerUrl == null) { + showFavicon = false; + } + switch (cipher.type) { case CipherType.Login: icon = "bwi-globe"; @@ -53,9 +71,7 @@ export function buildCipherIcon(iconsServerUrl: string, cipher: CipherView, show try { image = `${iconsServerUrl}/${Utils.getHostname(hostnameUri)}/icon.png`; fallbackImage = "images/bwi-globe.png"; - // FIXME: Remove when updating file. Eslint update - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (e) { + } catch { // Ignore error since the fallback icon will be shown if image is null. } } diff --git a/libs/common/src/vault/models/api/cipher-permissions.api.ts b/libs/common/src/vault/models/api/cipher-permissions.api.ts new file mode 100644 index 00000000000..4df7f891e26 --- /dev/null +++ b/libs/common/src/vault/models/api/cipher-permissions.api.ts @@ -0,0 +1,21 @@ +import { Jsonify } from "type-fest"; + +import { BaseResponse } from "../../../models/response/base.response"; + +export class CipherPermissionsApi extends BaseResponse { + delete: boolean = false; + restore: boolean = false; + + constructor(data: any = null) { + super(data); + if (data == null) { + return; + } + this.delete = this.getResponseProperty("Delete"); + this.restore = this.getResponseProperty("Restore"); + } + + static fromJSON(obj: Jsonify) { + return Object.assign(new CipherPermissionsApi(), obj); + } +} diff --git a/libs/common/src/vault/models/data/cipher.data.ts b/libs/common/src/vault/models/data/cipher.data.ts index 1c86f91c82f..ee5e5b3e72b 100644 --- a/libs/common/src/vault/models/data/cipher.data.ts +++ b/libs/common/src/vault/models/data/cipher.data.ts @@ -4,6 +4,7 @@ import { Jsonify } from "type-fest"; import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; import { CipherType } from "../../enums/cipher-type"; +import { CipherPermissionsApi } from "../api/cipher-permissions.api"; import { CipherResponse } from "../response/cipher.response"; import { AttachmentData } from "./attachment.data"; @@ -21,6 +22,7 @@ export class CipherData { folderId: string; edit: boolean; viewPassword: boolean; + permissions: CipherPermissionsApi; organizationUseTotp: boolean; favorite: boolean; revisionDate: string; @@ -51,6 +53,7 @@ export class CipherData { this.folderId = response.folderId; this.edit = response.edit; this.viewPassword = response.viewPassword; + this.permissions = response.permissions; this.organizationUseTotp = response.organizationUseTotp; this.favorite = response.favorite; this.revisionDate = response.revisionDate; @@ -95,6 +98,8 @@ export class CipherData { } static fromJSON(obj: Jsonify) { - return Object.assign(new CipherData(), obj); + const result = Object.assign(new CipherData(), obj); + result.permissions = CipherPermissionsApi.fromJSON(obj.permissions); + return result; } } diff --git a/libs/common/src/vault/models/domain/attachment.ts b/libs/common/src/vault/models/domain/attachment.ts index 4eee0307746..16f3adbe307 100644 --- a/libs/common/src/vault/models/domain/attachment.ts +++ b/libs/common/src/vault/models/domain/attachment.ts @@ -43,11 +43,10 @@ export class Attachment extends Domain { context = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - const view = await this.decryptObj( + const view = await this.decryptObj( + this, new AttachmentView(this), - { - fileName: null, - }, + ["fileName"], orgId, encKey, "DomainType: Attachment; " + context, diff --git a/libs/common/src/vault/models/domain/card.ts b/libs/common/src/vault/models/domain/card.ts index fccfe3f595b..3d73a8f527c 100644 --- a/libs/common/src/vault/models/domain/card.ts +++ b/libs/common/src/vault/models/domain/card.ts @@ -42,16 +42,10 @@ export class Card extends Domain { context = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - return this.decryptObj( + return this.decryptObj( + this, new CardView(), - { - cardholderName: null, - brand: null, - number: null, - expMonth: null, - expYear: null, - code: null, - }, + ["cardholderName", "brand", "number", "expMonth", "expYear", "code"], orgId, encKey, "DomainType: Card; " + context, diff --git a/libs/common/src/vault/models/domain/cipher.spec.ts b/libs/common/src/vault/models/domain/cipher.spec.ts index 9eadd20f543..1b2b093a553 100644 --- a/libs/common/src/vault/models/domain/cipher.spec.ts +++ b/libs/common/src/vault/models/domain/cipher.spec.ts @@ -26,6 +26,7 @@ import { SecureNote } from "../../models/domain/secure-note"; import { CardView } from "../../models/view/card.view"; import { IdentityView } from "../../models/view/identity.view"; import { LoginView } from "../../models/view/login.view"; +import { CipherPermissionsApi } from "../api/cipher-permissions.api"; describe("Cipher DTO", () => { it("Convert from empty CipherData", () => { @@ -54,6 +55,7 @@ describe("Cipher DTO", () => { fields: null, passwordHistory: null, key: null, + permissions: undefined, }); }); @@ -75,6 +77,7 @@ describe("Cipher DTO", () => { notes: "EncryptedString", creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, + permissions: new CipherPermissionsApi(), reprompt: CipherRepromptType.None, key: "EncryptedString", login: { @@ -149,6 +152,7 @@ describe("Cipher DTO", () => { localData: null, creationDate: new Date("2022-01-01T12:00:00.000Z"), deletedDate: null, + permissions: new CipherPermissionsApi(), reprompt: 0, key: { encryptedString: "EncryptedString", encryptionType: 0 }, login: { @@ -228,6 +232,7 @@ describe("Cipher DTO", () => { cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; cipher.key = mockEnc("EncKey"); + cipher.permissions = new CipherPermissionsApi(); const loginView = new LoginView(); loginView.username = "username"; @@ -270,6 +275,7 @@ describe("Cipher DTO", () => { deletedDate: null, reprompt: 0, localData: undefined, + permissions: new CipherPermissionsApi(), }); }); }); @@ -297,6 +303,7 @@ describe("Cipher DTO", () => { secureNote: { type: SecureNoteType.Generic, }, + permissions: new CipherPermissionsApi(), }; }); @@ -326,6 +333,7 @@ describe("Cipher DTO", () => { fields: null, passwordHistory: null, key: { encryptedString: "EncKey", encryptionType: 0 }, + permissions: new CipherPermissionsApi(), }); }); @@ -353,6 +361,7 @@ describe("Cipher DTO", () => { cipher.secureNote = new SecureNote(); cipher.secureNote.type = SecureNoteType.Generic; cipher.key = mockEnc("EncKey"); + cipher.permissions = new CipherPermissionsApi(); const keyService = mock(); const encryptService = mock(); @@ -387,6 +396,7 @@ describe("Cipher DTO", () => { deletedDate: null, reprompt: 0, localData: undefined, + permissions: new CipherPermissionsApi(), }); }); }); @@ -409,6 +419,7 @@ describe("Cipher DTO", () => { notes: "EncryptedString", creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, + permissions: new CipherPermissionsApi(), reprompt: CipherRepromptType.None, card: { cardholderName: "EncryptedString", @@ -455,6 +466,7 @@ describe("Cipher DTO", () => { fields: null, passwordHistory: null, key: { encryptedString: "EncKey", encryptionType: 0 }, + permissions: new CipherPermissionsApi(), }); }); @@ -480,6 +492,7 @@ describe("Cipher DTO", () => { cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; cipher.key = mockEnc("EncKey"); + cipher.permissions = new CipherPermissionsApi(); const cardView = new CardView(); cardView.cardholderName = "cardholderName"; @@ -522,6 +535,7 @@ describe("Cipher DTO", () => { deletedDate: null, reprompt: 0, localData: undefined, + permissions: new CipherPermissionsApi(), }); }); }); @@ -544,6 +558,7 @@ describe("Cipher DTO", () => { notes: "EncryptedString", creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, + permissions: new CipherPermissionsApi(), reprompt: CipherRepromptType.None, key: "EncKey", identity: { @@ -614,6 +629,7 @@ describe("Cipher DTO", () => { fields: null, passwordHistory: null, key: { encryptedString: "EncKey", encryptionType: 0 }, + permissions: new CipherPermissionsApi(), }); }); @@ -639,6 +655,7 @@ describe("Cipher DTO", () => { cipher.deletedDate = null; cipher.reprompt = CipherRepromptType.None; cipher.key = mockEnc("EncKey"); + cipher.permissions = new CipherPermissionsApi(); const identityView = new IdentityView(); identityView.firstName = "firstName"; @@ -681,6 +698,7 @@ describe("Cipher DTO", () => { deletedDate: null, reprompt: 0, localData: undefined, + permissions: new CipherPermissionsApi(), }); }); }); diff --git a/libs/common/src/vault/models/domain/cipher.ts b/libs/common/src/vault/models/domain/cipher.ts index 21538b87788..f23e3c0c579 100644 --- a/libs/common/src/vault/models/domain/cipher.ts +++ b/libs/common/src/vault/models/domain/cipher.ts @@ -10,6 +10,7 @@ import { SymmetricCryptoKey } from "../../../platform/models/domain/symmetric-cr import { InitializerKey } from "../../../platform/services/cryptography/initializer-key"; import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; import { CipherType } from "../../enums/cipher-type"; +import { CipherPermissionsApi } from "../api/cipher-permissions.api"; import { CipherData } from "../data/cipher.data"; import { LocalData } from "../data/local.data"; import { AttachmentView } from "../view/attachment.view"; @@ -39,6 +40,7 @@ export class Cipher extends Domain implements Decryptable { organizationUseTotp: boolean; edit: boolean; viewPassword: boolean; + permissions: CipherPermissionsApi; revisionDate: Date; localData: LocalData; login: Login; @@ -84,6 +86,7 @@ export class Cipher extends Domain implements Decryptable { } else { this.viewPassword = true; // Default for already synced Ciphers without viewPassword } + this.permissions = obj.permissions; this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null; this.collectionIds = obj.collectionIds; this.localData = localData; @@ -154,12 +157,10 @@ export class Cipher extends Domain implements Decryptable { bypassValidation = false; } - await this.decryptObj( + await this.decryptObj( + this, model, - { - name: null, - notes: null, - }, + ["name", "notes"], this.organizationId, encKey, ); @@ -246,6 +247,7 @@ export class Cipher extends Domain implements Decryptable { c.deletedDate = this.deletedDate != null ? this.deletedDate.toISOString() : null; c.reprompt = this.reprompt; c.key = this.key?.encryptedString; + c.permissions = this.permissions; this.buildDataModel(this, c, { name: null, diff --git a/libs/common/src/vault/models/domain/fido2-credential.ts b/libs/common/src/vault/models/domain/fido2-credential.ts index 9aa2c753d7c..8b0082892e4 100644 --- a/libs/common/src/vault/models/domain/fido2-credential.ts +++ b/libs/common/src/vault/models/domain/fido2-credential.ts @@ -52,41 +52,38 @@ export class Fido2Credential extends Domain { } async decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise { - const view = await this.decryptObj( + const view = await this.decryptObj( + this, new Fido2CredentialView(), - { - credentialId: null, - keyType: null, - keyAlgorithm: null, - keyCurve: null, - keyValue: null, - rpId: null, - userHandle: null, - userName: null, - rpName: null, - userDisplayName: null, - discoverable: null, - }, + [ + "credentialId", + "keyType", + "keyAlgorithm", + "keyCurve", + "keyValue", + "rpId", + "userHandle", + "userName", + "rpName", + "userDisplayName", + ], orgId, encKey, ); - const { counter } = await this.decryptObj( - { counter: "" }, + const { counter } = await this.decryptObj< + Fido2Credential, { - counter: null, - }, - orgId, - encKey, - ); + counter: string; + } + >(this, { counter: "" }, ["counter"], orgId, encKey); // Counter will end up as NaN if this fails view.counter = parseInt(counter); - const { discoverable } = await this.decryptObj( + const { discoverable } = await this.decryptObj( + this, { discoverable: "" }, - { - discoverable: null, - }, + ["discoverable"], orgId, encKey, ); diff --git a/libs/common/src/vault/models/domain/field.ts b/libs/common/src/vault/models/domain/field.ts index f836184da6a..c0f08a38bcc 100644 --- a/libs/common/src/vault/models/domain/field.ts +++ b/libs/common/src/vault/models/domain/field.ts @@ -35,12 +35,10 @@ export class Field extends Domain { } decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise { - return this.decryptObj( + return this.decryptObj( + this, new FieldView(this), - { - name: null, - value: null, - }, + ["name", "value"], orgId, encKey, ); diff --git a/libs/common/src/vault/models/domain/folder.ts b/libs/common/src/vault/models/domain/folder.ts index 65018e3cf08..8749a92fb65 100644 --- a/libs/common/src/vault/models/domain/folder.ts +++ b/libs/common/src/vault/models/domain/folder.ts @@ -40,13 +40,7 @@ export class Folder extends Domain { } decrypt(): Promise { - return this.decryptObj( - new FolderView(this), - { - name: null, - }, - null, - ); + return this.decryptObj(this, new FolderView(this), ["name"], null); } async decryptWithKey( diff --git a/libs/common/src/vault/models/domain/identity.ts b/libs/common/src/vault/models/domain/identity.ts index 570e6c0b4d5..5d8c20ef2b3 100644 --- a/libs/common/src/vault/models/domain/identity.ts +++ b/libs/common/src/vault/models/domain/identity.ts @@ -66,28 +66,29 @@ export class Identity extends Domain { context: string = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - return this.decryptObj( + return this.decryptObj( + this, new IdentityView(), - { - title: null, - firstName: null, - middleName: null, - lastName: null, - address1: null, - address2: null, - address3: null, - city: null, - state: null, - postalCode: null, - country: null, - company: null, - email: null, - phone: null, - ssn: null, - username: null, - passportNumber: null, - licenseNumber: null, - }, + [ + "title", + "firstName", + "middleName", + "lastName", + "address1", + "address2", + "address3", + "city", + "state", + "postalCode", + "country", + "company", + "email", + "phone", + "ssn", + "username", + "passportNumber", + "licenseNumber", + ], orgId, encKey, "DomainType: Identity; " + context, diff --git a/libs/common/src/vault/models/domain/login-uri.ts b/libs/common/src/vault/models/domain/login-uri.ts index 36782a81502..883f8c9a616 100644 --- a/libs/common/src/vault/models/domain/login-uri.ts +++ b/libs/common/src/vault/models/domain/login-uri.ts @@ -38,11 +38,10 @@ export class LoginUri extends Domain { context: string = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - return this.decryptObj( + return this.decryptObj( + this, new LoginUriView(this), - { - uri: null, - }, + ["uri"], orgId, encKey, context, diff --git a/libs/common/src/vault/models/domain/login.ts b/libs/common/src/vault/models/domain/login.ts index f9a85cd818e..b29b42bf3de 100644 --- a/libs/common/src/vault/models/domain/login.ts +++ b/libs/common/src/vault/models/domain/login.ts @@ -58,13 +58,10 @@ export class Login extends Domain { context: string = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - const view = await this.decryptObj( + const view = await this.decryptObj( + this, new LoginView(this), - { - username: null, - password: null, - totp: null, - }, + ["username", "password", "totp"], orgId, encKey, `DomainType: Login; ${context}`, diff --git a/libs/common/src/vault/models/domain/password.ts b/libs/common/src/vault/models/domain/password.ts index 48063f495f0..8573c224416 100644 --- a/libs/common/src/vault/models/domain/password.ts +++ b/libs/common/src/vault/models/domain/password.ts @@ -25,11 +25,10 @@ export class Password extends Domain { } decrypt(orgId: string, encKey?: SymmetricCryptoKey): Promise { - return this.decryptObj( + return this.decryptObj( + this, new PasswordHistoryView(this), - { - password: null, - }, + ["password"], orgId, encKey, "DomainType: PasswordHistory", diff --git a/libs/common/src/vault/models/domain/ssh-key.ts b/libs/common/src/vault/models/domain/ssh-key.ts index b4df172e543..f32a1a913ca 100644 --- a/libs/common/src/vault/models/domain/ssh-key.ts +++ b/libs/common/src/vault/models/domain/ssh-key.ts @@ -36,13 +36,10 @@ export class SshKey extends Domain { context = "No Cipher Context", encKey?: SymmetricCryptoKey, ): Promise { - return this.decryptObj( + return this.decryptObj( + this, new SshKeyView(), - { - privateKey: null, - publicKey: null, - keyFingerprint: null, - }, + ["privateKey", "publicKey", "keyFingerprint"], orgId, encKey, "DomainType: SshKey; " + context, diff --git a/libs/common/src/vault/models/response/cipher.response.ts b/libs/common/src/vault/models/response/cipher.response.ts index ee0d36aed97..944a19e088b 100644 --- a/libs/common/src/vault/models/response/cipher.response.ts +++ b/libs/common/src/vault/models/response/cipher.response.ts @@ -3,6 +3,7 @@ import { BaseResponse } from "../../../models/response/base.response"; import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; import { CardApi } from "../api/card.api"; +import { CipherPermissionsApi } from "../api/cipher-permissions.api"; import { FieldApi } from "../api/field.api"; import { IdentityApi } from "../api/identity.api"; import { LoginApi } from "../api/login.api"; @@ -28,6 +29,7 @@ export class CipherResponse extends BaseResponse { favorite: boolean; edit: boolean; viewPassword: boolean; + permissions: CipherPermissionsApi; organizationUseTotp: boolean; revisionDate: string; attachments: AttachmentResponse[]; @@ -53,6 +55,7 @@ export class CipherResponse extends BaseResponse { } else { this.viewPassword = this.getResponseProperty("ViewPassword"); } + this.permissions = new CipherPermissionsApi(this.getResponseProperty("Permissions")); this.organizationUseTotp = this.getResponseProperty("OrganizationUseTotp"); this.revisionDate = this.getResponseProperty("RevisionDate"); this.collectionIds = this.getResponseProperty("CollectionIds"); diff --git a/libs/common/src/vault/models/view/cipher.view.ts b/libs/common/src/vault/models/view/cipher.view.ts index 650a1e9dc45..7ddba9e2ed5 100644 --- a/libs/common/src/vault/models/view/cipher.view.ts +++ b/libs/common/src/vault/models/view/cipher.view.ts @@ -6,6 +6,7 @@ import { InitializerKey } from "../../../platform/services/cryptography/initiali import { DeepJsonify } from "../../../types/deep-jsonify"; import { CipherType, LinkedIdType } from "../../enums"; import { CipherRepromptType } from "../../enums/cipher-reprompt-type"; +import { CipherPermissionsApi } from "../api/cipher-permissions.api"; import { LocalData } from "../data/local.data"; import { Cipher } from "../domain/cipher"; @@ -29,6 +30,7 @@ export class CipherView implements View, InitializerMetadata { type: CipherType = null; favorite = false; organizationUseTotp = false; + permissions: CipherPermissionsApi = new CipherPermissionsApi(); edit = false; viewPassword = true; localData: LocalData; @@ -63,6 +65,7 @@ export class CipherView implements View, InitializerMetadata { this.organizationUseTotp = c.organizationUseTotp; this.edit = c.edit; this.viewPassword = c.viewPassword; + this.permissions = c.permissions; this.type = c.type; this.localData = c.localData; this.collectionIds = c.collectionIds; diff --git a/libs/common/src/vault/services/cipher-authorization.service.spec.ts b/libs/common/src/vault/services/cipher-authorization.service.spec.ts index 37ddfdeaeeb..33af28842ca 100644 --- a/libs/common/src/vault/services/cipher-authorization.service.spec.ts +++ b/libs/common/src/vault/services/cipher-authorization.service.spec.ts @@ -8,6 +8,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CollectionId, UserId } from "@bitwarden/common/types/guid"; import { FakeAccountService, mockAccountServiceWith } from "../../../spec"; +import { ConfigService } from "../../platform/abstractions/config/config.service"; +import { CipherPermissionsApi } from "../models/api/cipher-permissions.api"; import { CipherView } from "../models/view/cipher.view"; import { @@ -20,6 +22,7 @@ describe("CipherAuthorizationService", () => { const mockCollectionService = mock(); const mockOrganizationService = mock(); + const mockConfigService = mock(); const mockUserId = Utils.newGuid() as UserId; let mockAccountService: FakeAccountService; @@ -28,10 +31,12 @@ describe("CipherAuthorizationService", () => { organizationId: string | null, collectionIds: string[], edit: boolean = true, + permissions: CipherPermissionsApi = new CipherPermissionsApi(), ) => ({ organizationId, collectionIds, edit, + permissions, }); const createMockCollection = (id: string, manage: boolean) => ({ @@ -63,7 +68,78 @@ describe("CipherAuthorizationService", () => { mockCollectionService, mockOrganizationService, mockAccountService, + mockConfigService, ); + + mockConfigService.getFeatureFlag$.mockReturnValue(of(false)); + }); + + describe("canRestoreCipher$", () => { + it("should return true if isAdminConsoleAction and cipher is unassigned", (done) => { + const cipher = createMockCipher("org1", []) as CipherView; + const organization = createMockOrganization({ canEditUnassignedCiphers: true }); + mockOrganizationService.organizations$.mockReturnValue( + of([organization]) as Observable, + ); + + cipherAuthorizationService.canRestoreCipher$(cipher, true).subscribe((result) => { + expect(result).toBe(true); + done(); + }); + }); + + it("should return true if isAdminConsleAction and user can edit all ciphers in the org", (done) => { + const cipher = createMockCipher("org1", ["col1"]) as CipherView; + const organization = createMockOrganization({ canEditAllCiphers: true }); + mockOrganizationService.organizations$.mockReturnValue( + of([organization]) as Observable, + ); + + cipherAuthorizationService.canRestoreCipher$(cipher, true).subscribe((result) => { + expect(result).toBe(true); + expect(mockOrganizationService.organizations$).toHaveBeenCalledWith(mockUserId); + done(); + }); + }); + + it("should return false if isAdminConsoleAction is true but user does not have permission to edit unassigned ciphers", (done) => { + const cipher = createMockCipher("org1", []) as CipherView; + const organization = createMockOrganization({ canEditUnassignedCiphers: false }); + mockOrganizationService.organizations$.mockReturnValue(of([organization] as Organization[])); + + cipherAuthorizationService.canRestoreCipher$(cipher, true).subscribe((result) => { + expect(result).toBe(false); + done(); + }); + }); + + it("should return false if cipher.permission.restore is false and is not an admin action", (done) => { + const cipher = createMockCipher("org1", [], true, { + restore: false, + } as CipherPermissionsApi) as CipherView; + const organization = createMockOrganization(); + mockOrganizationService.organizations$.mockReturnValue(of([organization] as Organization[])); + + cipherAuthorizationService.canRestoreCipher$(cipher, false).subscribe((result) => { + expect(result).toBe(false); + expect(mockCollectionService.decryptedCollectionViews$).not.toHaveBeenCalled(); + done(); + }); + }); + + it("should return true if cipher.permission.restore is true and is not an admin action", (done) => { + const cipher = createMockCipher("org1", [], true, { + restore: true, + } as CipherPermissionsApi) as CipherView; + const organization = createMockOrganization(); + mockOrganizationService.organizations$.mockReturnValue(of([organization] as Organization[])); + + cipherAuthorizationService.canRestoreCipher$(cipher, false).subscribe((result) => { + expect(result).toBe(true); + expect(mockCollectionService.decryptedCollectionViews$).not.toHaveBeenCalled(); + done(); + }); + }); }); describe("canDeleteCipher$", () => { @@ -213,6 +289,34 @@ describe("CipherAuthorizationService", () => { done(); }); }); + + it("should return true if feature flag enabled and cipher.permissions.delete is true", (done) => { + const cipher = createMockCipher("org1", [], true, { + delete: true, + } as CipherPermissionsApi) as CipherView; + const organization = createMockOrganization(); + mockOrganizationService.organizations$.mockReturnValue(of([organization] as Organization[])); + mockConfigService.getFeatureFlag$.mockReturnValue(of(true)); + + cipherAuthorizationService.canDeleteCipher$(cipher, [], false).subscribe((result) => { + expect(result).toBe(true); + expect(mockCollectionService.decryptedCollectionViews$).not.toHaveBeenCalled(); + done(); + }); + }); + + it("should return false if feature flag enabled and cipher.permissions.delete is false", (done) => { + const cipher = createMockCipher("org1", []) as CipherView; + const organization = createMockOrganization(); + mockOrganizationService.organizations$.mockReturnValue(of([organization] as Organization[])); + mockConfigService.getFeatureFlag$.mockReturnValue(of(true)); + + cipherAuthorizationService.canDeleteCipher$(cipher, [], false).subscribe((result) => { + expect(result).toBe(false); + expect(mockCollectionService.decryptedCollectionViews$).not.toHaveBeenCalled(); + done(); + }); + }); }); describe("canCloneCipher$", () => { diff --git a/libs/common/src/vault/services/cipher-authorization.service.ts b/libs/common/src/vault/services/cipher-authorization.service.ts index fbee3ed8622..b415760a035 100644 --- a/libs/common/src/vault/services/cipher-authorization.service.ts +++ b/libs/common/src/vault/services/cipher-authorization.service.ts @@ -1,12 +1,13 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { map, Observable, of, shareReplay, switchMap } from "rxjs"; +import { combineLatest, map, Observable, of, shareReplay, switchMap } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { CollectionId } from "@bitwarden/common/types/guid"; +import { getUserId } from "../../auth/services/account.service"; +import { FeatureFlag } from "../../enums/feature-flag.enum"; import { Cipher } from "../models/domain/cipher"; import { CipherView } from "../models/view/cipher.view"; @@ -28,12 +29,25 @@ export abstract class CipherAuthorizationService { * * @returns {Observable} - An observable that emits a boolean value indicating if the user can delete the cipher. */ - canDeleteCipher$: ( + abstract canDeleteCipher$: ( cipher: CipherLike, allowedCollections?: CollectionId[], isAdminConsoleAction?: boolean, ) => Observable; + /** + * Determines if the user can restore the specified cipher. + * + * @param {CipherLike} cipher - The cipher object to evaluate for restore permissions. + * @param {boolean} isAdminConsoleAction - Optional. A flag indicating if the action is being performed from the admin console. + * + * @returns {Observable} - An observable that emits a boolean value indicating if the user can restore the cipher. + */ + abstract canRestoreCipher$: ( + cipher: CipherLike, + isAdminConsoleAction?: boolean, + ) => Observable; + /** * Determines if the user can clone the specified cipher. * @@ -42,7 +56,10 @@ export abstract class CipherAuthorizationService { * * @returns {Observable} - An observable that emits a boolean value indicating if the user can clone the cipher. */ - canCloneCipher$: (cipher: CipherLike, isAdminConsoleAction?: boolean) => Observable; + abstract canCloneCipher$: ( + cipher: CipherLike, + isAdminConsoleAction?: boolean, + ) => Observable; } /** @@ -53,13 +70,16 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer private collectionService: CollectionService, private organizationService: OrganizationService, private accountService: AccountService, + private configService: ConfigService, ) {} private organization$ = (cipher: CipherLike) => this.accountService.activeAccount$.pipe( - switchMap((account) => this.organizationService.organizations$(account?.id)), + getUserId, + switchMap((userId) => this.organizationService.organizations$(userId)), map((orgs) => orgs.find((org) => org.id === cipher.organizationId)), ); + /** * * {@link CipherAuthorizationService.canDeleteCipher$} @@ -69,12 +89,11 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer allowedCollections?: CollectionId[], isAdminConsoleAction?: boolean, ): Observable { - if (cipher.organizationId == null) { - return of(true); - } - - return this.organization$(cipher).pipe( - switchMap((organization) => { + return combineLatest([ + this.organization$(cipher), + this.configService.getFeatureFlag$(FeatureFlag.LimitItemDeletion), + ]).pipe( + switchMap(([organization, featureFlagEnabled]) => { if (isAdminConsoleAction) { // If the user is an admin, they can delete an unassigned cipher if (!cipher.collectionIds || cipher.collectionIds.length === 0) { @@ -86,6 +105,14 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer } } + if (featureFlagEnabled) { + return of(cipher.permissions.delete); + } + + if (cipher.organizationId == null) { + return of(true); + } + return this.collectionService .decryptedCollectionViews$(cipher.collectionIds as CollectionId[]) .pipe( @@ -93,7 +120,7 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer const shouldFilter = allowedCollections?.some(Boolean); const collections = shouldFilter - ? allCollections.filter((c) => allowedCollections.includes(c.id as CollectionId)) + ? allCollections.filter((c) => allowedCollections?.includes(c.id as CollectionId)) : allCollections; return collections.some((collection) => collection.manage); @@ -103,6 +130,29 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer ); } + /** + * + * {@link CipherAuthorizationService.canRestoreCipher$} + */ + canRestoreCipher$(cipher: CipherLike, isAdminConsoleAction?: boolean): Observable { + return this.organization$(cipher).pipe( + map((organization) => { + if (isAdminConsoleAction) { + // If the user is an admin, they can restore an unassigned cipher + if (!cipher.collectionIds || cipher.collectionIds.length === 0) { + return organization?.canEditUnassignedCiphers === true; + } + + if (organization?.canEditAllCiphers) { + return true; + } + } + + return cipher.permissions.restore; + }), + ); + } + /** * {@link CipherAuthorizationService.canCloneCipher$} */ @@ -116,6 +166,7 @@ export class DefaultCipherAuthorizationService implements CipherAuthorizationSer // Admins and custom users can always clone when in the Admin Console if ( isAdminConsoleAction && + organization && (organization.isAdmin || organization.permissions?.editAnyCollection) ) { return of(true); diff --git a/libs/common/src/vault/services/cipher.service.spec.ts b/libs/common/src/vault/services/cipher.service.spec.ts index d87ee56ddda..def0c04dd16 100644 --- a/libs/common/src/vault/services/cipher.service.spec.ts +++ b/libs/common/src/vault/services/cipher.service.spec.ts @@ -27,6 +27,7 @@ import { CipherFileUploadService } from "../abstractions/file-upload/cipher-file import { FieldType } from "../enums"; import { CipherRepromptType } from "../enums/cipher-reprompt-type"; import { CipherType } from "../enums/cipher-type"; +import { CipherPermissionsApi } from "../models/api/cipher-permissions.api"; import { CipherData } from "../models/data/cipher.data"; import { Cipher } from "../models/domain/cipher"; import { CipherCreateRequest } from "../models/request/cipher-create.request"; @@ -57,6 +58,7 @@ const cipherData: CipherData = { notes: "EncryptedString", creationDate: "2022-01-01T12:00:00.000Z", deletedDate: null, + permissions: new CipherPermissionsApi(), key: "EncKey", reprompt: CipherRepromptType.None, login: { @@ -363,7 +365,8 @@ describe("Cipher Service", () => { configService.getFeatureFlag.mockResolvedValue(true); configService.checkServerMeetsVersionRequirement$.mockReturnValue(of(true)); - searchService.indexedEntityId$ = of(null); + searchService.indexedEntityId$.mockReturnValue(of(null)); + stateService.getUserId.mockResolvedValue(mockUserId); const keys = { diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index 05c875e7546..d774277c4a0 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -165,9 +165,9 @@ export class CipherService implements CipherServiceAbstraction { } if (this.searchService != null) { if (value == null) { - await this.searchService.clearIndex(); + await this.searchService.clearIndex(userId); } else { - await this.searchService.indexCiphers(value); + await this.searchService.indexCiphers(userId, value); } } } @@ -480,9 +480,9 @@ export class CipherService implements CipherServiceAbstraction { private async reindexCiphers(userId: UserId) { const reindexRequired = this.searchService != null && - ((await firstValueFrom(this.searchService.indexedEntityId$)) ?? userId) !== userId; + ((await firstValueFrom(this.searchService.indexedEntityId$(userId))) ?? userId) !== userId; if (reindexRequired) { - await this.searchService.indexCiphers(await this.getDecryptedCiphers(userId), userId); + await this.searchService.indexCiphers(userId, await this.getDecryptedCiphers(userId), userId); } } diff --git a/libs/common/src/vault/services/totp.service.spec.ts b/libs/common/src/vault/services/totp.service.spec.ts index 71e3ce80b18..c653b4ce1db 100644 --- a/libs/common/src/vault/services/totp.service.spec.ts +++ b/libs/common/src/vault/services/totp.service.spec.ts @@ -1,17 +1,39 @@ import { mock } from "jest-mock-extended"; +import { of, take } from "rxjs"; -import { LogService } from "../../platform/abstractions/log.service"; -import { WebCryptoFunctionService } from "../../platform/services/web-crypto-function.service"; +import { BitwardenClient, TotpResponse } from "@bitwarden/sdk-internal"; + +import { SdkService } from "../../platform/abstractions/sdk/sdk.service"; import { TotpService } from "./totp.service"; describe("TotpService", () => { let totpService: TotpService; + let generateTotpMock: jest.Mock; - const logService = mock(); + const sdkService = mock(); beforeEach(() => { - totpService = new TotpService(new WebCryptoFunctionService(global), logService); + generateTotpMock = jest + .fn() + .mockReturnValueOnce({ + code: "123456", + period: 30, + }) + .mockReturnValueOnce({ code: "654321", period: 30 }) + .mockReturnValueOnce({ code: "567892", period: 30 }); + + const mockBitwardenClient = { + vault: () => ({ + totp: () => ({ + generate_totp: generateTotpMock, + }), + }), + }; + + sdkService.client$ = of(mockBitwardenClient as unknown as BitwardenClient); + + totpService = new TotpService(sdkService); // TOTP is time-based, so we need to mock the current time jest.useFakeTimers({ @@ -24,40 +46,50 @@ describe("TotpService", () => { jest.useRealTimers(); }); - it("should return null if key is null", async () => { - const result = await totpService.getCode(null); - expect(result).toBeNull(); - }); + describe("getCode$", () => { + it("should emit TOTP response when key is provided", (done) => { + totpService + .getCode$("WQIQ25BRKZYCJVYP") + .pipe(take(1)) + .subscribe((result) => { + expect(result).toEqual({ code: "123456", period: 30 }); + done(); + }); - it("should return a code if key is not null", async () => { - const result = await totpService.getCode("WQIQ25BRKZYCJVYP"); - expect(result).toBe("194506"); - }); + jest.advanceTimersByTime(1000); + }); - it("should handle otpauth keys", async () => { - const key = "otpauth://totp/test-account?secret=WQIQ25BRKZYCJVYP"; - const result = await totpService.getCode(key); - expect(result).toBe("194506"); + it("should emit TOTP response every second", () => { + const responses: TotpResponse[] = []; - const period = totpService.getTimeInterval(key); - expect(period).toBe(30); - }); + totpService + .getCode$("WQIQ25BRKZYCJVYP") + .pipe(take(3)) + .subscribe((result) => { + responses.push(result); + }); - it("should handle otpauth different period", async () => { - const key = "otpauth://totp/test-account?secret=WQIQ25BRKZYCJVYP&period=60"; - const result = await totpService.getCode(key); - expect(result).toBe("730364"); + jest.advanceTimersByTime(2000); - const period = totpService.getTimeInterval(key); - expect(period).toBe(60); - }); + expect(responses).toEqual([ + { code: "123456", period: 30 }, + { code: "654321", period: 30 }, + { code: "567892", period: 30 }, + ]); + }); - it("should handle steam keys", async () => { - const key = "steam://HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ"; - const result = await totpService.getCode(key); - expect(result).toBe("7W6CJ"); + it("should stop emitting TOTP response after unsubscribing", () => { + const responses: TotpResponse[] = []; - const period = totpService.getTimeInterval(key); - expect(period).toBe(30); + const subscription = totpService.getCode$("WQIQ25BRKZYCJVYP").subscribe((result) => { + responses.push(result); + }); + + jest.advanceTimersByTime(1000); + subscription.unsubscribe(); + jest.advanceTimersByTime(1000); + + expect(responses).toHaveLength(2); + }); }); }); diff --git a/libs/common/src/vault/services/totp.service.ts b/libs/common/src/vault/services/totp.service.ts index b66e4a1bcf0..3f09462a2c5 100644 --- a/libs/common/src/vault/services/totp.service.ts +++ b/libs/common/src/vault/services/totp.service.ts @@ -1,170 +1,43 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { CryptoFunctionService } from "../../platform/abstractions/crypto-function.service"; -import { LogService } from "../../platform/abstractions/log.service"; -import { Utils } from "../../platform/misc/utils"; +import { Observable, map, shareReplay, switchMap, timer } from "rxjs"; + +import { TotpResponse } from "@bitwarden/sdk-internal"; + +import { SdkService } from "../../platform/abstractions/sdk/sdk.service"; import { TotpService as TotpServiceAbstraction } from "../abstractions/totp.service"; -const B32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; -const SteamChars = "23456789BCDFGHJKMNPQRTVWXY"; +/** + * Represents TOTP information including display formatting and timing + */ +export type TotpInfo = { + /** The TOTP code value */ + totpCode: string; + + /** The TOTP code value formatted for display, includes spaces */ + totpCodeFormatted: string; + + /** Progress bar percentage value */ + totpDash: number; + + /** Seconds remaining until the TOTP code changes */ + totpSec: number; + + /** Indicates when the code is close to expiring */ + totpLow: boolean; +}; export class TotpService implements TotpServiceAbstraction { - constructor( - private cryptoFunctionService: CryptoFunctionService, - private logService: LogService, - ) {} + constructor(private sdkService: SdkService) {} - async getCode(key: string): Promise { - if (key == null) { - return null; - } - let period = 30; - let alg: "sha1" | "sha256" | "sha512" = "sha1"; - let digits = 6; - let keyB32 = key; - const isOtpAuth = key.toLowerCase().indexOf("otpauth://") === 0; - const isSteamAuth = !isOtpAuth && key.toLowerCase().indexOf("steam://") === 0; - if (isOtpAuth) { - const params = Utils.getQueryParams(key); - if (params.has("digits") && params.get("digits") != null) { - try { - const digitParams = parseInt(params.get("digits").trim(), null); - if (digitParams > 10) { - digits = 10; - } else if (digitParams > 0) { - digits = digitParams; - } - } catch { - this.logService.error("Invalid digits param."); - } - } - if (params.has("period") && params.get("period") != null) { - try { - const periodParam = parseInt(params.get("period").trim(), null); - if (periodParam > 0) { - period = periodParam; - } - } catch { - this.logService.error("Invalid period param."); - } - } - if (params.has("secret") && params.get("secret") != null) { - keyB32 = params.get("secret"); - } - if (params.has("algorithm") && params.get("algorithm") != null) { - const algParam = params.get("algorithm").toLowerCase(); - if (algParam === "sha1" || algParam === "sha256" || algParam === "sha512") { - alg = algParam; - } - } - } else if (isSteamAuth) { - keyB32 = key.substr("steam://".length); - digits = 5; - } - - const epoch = Math.round(new Date().getTime() / 1000.0); - const timeHex = this.leftPad(this.decToHex(Math.floor(epoch / period)), 16, "0"); - const timeBytes = Utils.fromHexToArray(timeHex); - const keyBytes = this.b32ToBytes(keyB32); - - if (!keyBytes.length || !timeBytes.length) { - return null; - } - - const hash = await this.sign(keyBytes, timeBytes, alg); - if (hash.length === 0) { - return null; - } - - const offset = hash[hash.length - 1] & 0xf; - const binary = - ((hash[offset] & 0x7f) << 24) | - ((hash[offset + 1] & 0xff) << 16) | - ((hash[offset + 2] & 0xff) << 8) | - (hash[offset + 3] & 0xff); - - let otp = ""; - if (isSteamAuth) { - let fullCode = binary & 0x7fffffff; - for (let i = 0; i < digits; i++) { - otp += SteamChars[fullCode % SteamChars.length]; - fullCode = Math.trunc(fullCode / SteamChars.length); - } - } else { - otp = (binary % Math.pow(10, digits)).toString(); - otp = this.leftPad(otp, digits, "0"); - } - - return otp; - } - - getTimeInterval(key: string): number { - let period = 30; - if (key != null && key.toLowerCase().indexOf("otpauth://") === 0) { - const params = Utils.getQueryParams(key); - if (params.has("period") && params.get("period") != null) { - try { - period = parseInt(params.get("period").trim(), null); - } catch { - this.logService.error("Invalid period param."); - } - } - } - return period; - } - - // Helpers - - private leftPad(s: string, l: number, p: string): string { - if (l + 1 >= s.length) { - s = Array(l + 1 - s.length).join(p) + s; - } - return s; - } - - private decToHex(d: number): string { - return (d < 15.5 ? "0" : "") + Math.round(d).toString(16); - } - - private b32ToHex(s: string): string { - s = s.toUpperCase(); - let cleanedInput = ""; - - for (let i = 0; i < s.length; i++) { - if (B32Chars.indexOf(s[i]) < 0) { - continue; - } - - cleanedInput += s[i]; - } - s = cleanedInput; - - let bits = ""; - let hex = ""; - for (let i = 0; i < s.length; i++) { - const byteIndex = B32Chars.indexOf(s.charAt(i)); - if (byteIndex < 0) { - continue; - } - bits += this.leftPad(byteIndex.toString(2), 5, "0"); - } - for (let i = 0; i + 4 <= bits.length; i += 4) { - const chunk = bits.substr(i, 4); - hex = hex + parseInt(chunk, 2).toString(16); - } - return hex; - } - - private b32ToBytes(s: string): Uint8Array { - return Utils.fromHexToArray(this.b32ToHex(s)); - } - - private async sign( - keyBytes: Uint8Array, - timeBytes: Uint8Array, - alg: "sha1" | "sha256" | "sha512", - ) { - const signature = await this.cryptoFunctionService.hmac(timeBytes, keyBytes, alg); - return new Uint8Array(signature); + getCode$(key: string): Observable { + return timer(0, 1000).pipe( + switchMap(() => + this.sdkService.client$.pipe( + map((sdk) => { + return sdk.vault().totp().generate_totp(key); + }), + ), + ), + shareReplay({ refCount: true, bufferSize: 1 }), + ); } } diff --git a/libs/common/tsconfig.json b/libs/common/tsconfig.json index 2d1379f9c5f..03f66196a30 100644 --- a/libs/common/tsconfig.json +++ b/libs/common/tsconfig.json @@ -6,12 +6,8 @@ "@bitwarden/auth/common": ["../auth/src/common"], // TODO: Remove once circular dependencies in admin-console, auth and key-management are resolved "@bitwarden/common/*": ["../common/src/*"], - // TODO: Remove once billing stops depending on components - "@bitwarden/components": ["../components/src"], "@bitwarden/key-management": ["../key-management/src"], - "@bitwarden/platform": ["../platform/src"], - // TODO: Remove once billing stops depending on components - "@bitwarden/ui-common": ["../ui/common/src"] + "@bitwarden/vault-export-core": ["../tools/export/vault-export/vault-export-core/src"] } }, "include": ["src", "spec", "./custom-matchers.d.ts", "../key-management/src/index.ts"], diff --git a/libs/components/src/table/table-scroll.component.html b/libs/components/src/table/table-scroll.component.html index 26b06ee0e5c..8f2c88ba3ad 100644 --- a/libs/components/src/table/table-scroll.component.html +++ b/libs/components/src/table/table-scroll.component.html @@ -12,7 +12,7 @@ - + diff --git a/libs/components/src/test.setup.ts b/libs/components/src/test.setup.ts index c7b9b1fdbf7..6c54c8648ed 100644 --- a/libs/components/src/test.setup.ts +++ b/libs/components/src/test.setup.ts @@ -1,5 +1,4 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -// eslint-disable-next-line import "zone.js/testing"; import { getTestBed } from "@angular/core/testing"; diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css index 7d113660293..3bc7cd3d81f 100644 --- a/libs/components/src/tw-theme.css +++ b/libs/components/src/tw-theme.css @@ -117,88 +117,6 @@ --tw-ring-offset-color: #1f242e; } -.theme_nord { - --color-transparent-hover: rgb(255 255 255 / 0.12); - - --color-background: 67 76 94; - --color-background-alt: 59 66 82; - --color-background-alt2: 76 86 106; - --color-background-alt3: 76 86 106; - --color-background-alt4: 67 76 94; - - --color-primary-300: 108 153 166; - --color-primary-600: 136 192 208; - --color-primary-700: 160 224 242; - - --color-secondary-100: 76 86 106; - --color-secondary-300: 94 105 125; - --color-secondary-600: 216 222 233; - --color-secondary-700: 255 255 255; - - --color-success-600: 163 190 140; - --color-success-700: 144 170 122; - - --color-danger-600: 228 129 139; - --color-danger-700: 191 97 106; - - --color-warning-600: 235 203 139; - --color-warning-700: 210 181 121; - - --color-info-600: 129 161 193; - --color-info-700: 94 129 172; - - --color-text-main: 229 233 240; - --color-text-muted: 216 222 233; - --color-text-contrast: 46 52 64; - --color-text-alt2: 255 255 255; - --color-text-code: 219 177 211; - - --color-marketing-logo: 255 255 255; - - --tw-ring-offset-color: #434c5e; -} - -.theme_solarized { - --color-transparent-hover: rgb(255 255 255 / 0.12); - - --color-background: 0 43 54; - --color-background-alt: 7 54 66; - --color-background-alt2: 31 72 87; - --color-background-alt3: 31 72 87; - --color-background-alt4: 0 43 54; - - --color-primary-300: 42 161 152; - --color-primary-600: 133 153 0; - --color-primary-700: 192 203 123; - - --color-secondary-100: 31 72 87; - --color-secondary-300: 101 123 131; - --color-secondary-600: 131 148 150; - --color-secondary-700: 238 232 213; - - --color-success-600: 133 153 0; - --color-success-700: 192 203 123; - - --color-danger-600: 220 50 47; - --color-danger-700: 223 135 134; - - --color-warning-600: 181 137 0; - --color-warning-700: 220 189 92; - - --color-info-600: 133 153 0; - --color-info-700: 192 203 123; - - --color-text-main: 253 246 227; - --color-text-muted: 147 161 161; - --color-text-contrast: 0 0 0; - --color-text-alt2: 255 255 255; - --color-text-code: 240 141 199; - - --color-marketing-logo: 255 255 255; - - --tw-ring-offset-color: #002b36; -} - /** * tw-break-words does not work with table cells: * https://github.com/tailwindlabs/tailwindcss/issues/835 diff --git a/libs/components/tailwind.config.base.js b/libs/components/tailwind.config.base.js index 45d5572dfc9..fde59f4a089 100644 --- a/libs/components/tailwind.config.base.js +++ b/libs/components/tailwind.config.base.js @@ -141,6 +141,9 @@ module.exports = { ...theme("width"), "90vw": "90vw", }), + fontSize: { + "3xl": ["1.75rem", "2rem"], + }, }, }, plugins: [ diff --git a/libs/importer/jest.config.js b/libs/importer/jest.config.js index ab449dc7757..ee5ae302b99 100644 --- a/libs/importer/jest.config.js +++ b/libs/importer/jest.config.js @@ -7,7 +7,7 @@ const sharedConfig = require("../shared/jest.config.ts"); /** @type {import('jest').Config} */ module.exports = { ...sharedConfig, - preset: "ts-jest", + preset: "jest-preset-angular", testEnvironment: "jsdom", moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, { prefix: "/", diff --git a/libs/importer/src/components/import.component.ts b/libs/importer/src/components/import.component.ts index 6ea58545352..79d194b87bc 100644 --- a/libs/importer/src/components/import.component.ts +++ b/libs/importer/src/components/import.component.ts @@ -37,6 +37,7 @@ import { EncryptService } from "@bitwarden/common/key-management/crypto/abstract import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -96,6 +97,7 @@ const safeProviders: SafeProvider[] = [ EncryptService, PinServiceAbstraction, AccountService, + SdkService, ], }), ]; diff --git a/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.spec.ts b/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.spec.ts new file mode 100644 index 00000000000..e66779f0372 --- /dev/null +++ b/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.spec.ts @@ -0,0 +1,94 @@ +import { OrganizationId } from "@bitwarden/common/types/guid"; +import { CipherType, SecureNoteType } from "@bitwarden/common/vault/enums"; +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; + +import { BitwardenCsvImporter } from "./bitwarden-csv-importer"; + +describe("BitwardenCsvImporter", () => { + let importer: BitwardenCsvImporter; + + beforeEach(() => { + importer = new BitwardenCsvImporter(); + importer.organizationId = "orgId" as OrganizationId; + }); + + it("should return an empty result if data is null", async () => { + const result = await importer.parse(""); + expect(result.success).toBe(false); + expect(result.ciphers.length).toBe(0); + }); + + it("should parse CSV data correctly", async () => { + const data = + `collections,type,name,notes,fields,reprompt,login_uri,login_username,login_password,login_totp` + + `\ncollection1/collection2,login,testlogin,testnotes,,0,https://example.com,testusername,testpassword,`; + + const result = await importer.parse(data); + + expect(result.success).toBe(true); + expect(result.ciphers.length).toBe(1); + + const cipher = result.ciphers[0]; + expect(cipher.name).toBe("testlogin"); + expect(cipher.type).toBe(CipherType.Login); + expect(cipher.notes).toBe("testnotes"); + expect(cipher.reprompt).toBe(CipherRepromptType.None); + + expect(cipher.login).toBeDefined(); + expect(cipher.login.username).toBe("testusername"); + expect(cipher.login.password).toBe("testpassword"); + expect(cipher.login.uris[0].uri).toBe("https://example.com"); + + expect(result.collections.length).toBe(2); + expect(result.collections[0].name).toBe("collection1/collection2"); + expect(result.collections[1].name).toBe("collection1"); + }); + + it("should handle secure notes correctly", async () => { + const data = `name,type,notes` + `\nTest Note,note,Some secure notes`; + + const result = await importer.parse(data); + + expect(result.success).toBe(true); + expect(result.ciphers.length).toBe(1); + + const cipher = result.ciphers[0]; + expect(cipher.name).toBe("Test Note"); + expect(cipher.type).toBe(CipherType.SecureNote); + expect(cipher.notes).toBe("Some secure notes"); + + expect(cipher.secureNote).toBeDefined(); + expect(cipher.secureNote.type).toBe(SecureNoteType.Generic); + }); + + it("should handle missing fields gracefully", async () => { + const data = + `name,login_username,login_password,login_uri` + + `\nTest Login,username,password,http://example.com`; + + const result = await importer.parse(data); + + expect(result.success).toBe(true); + expect(result.ciphers.length).toBe(1); + + const cipher = result.ciphers[0]; + expect(cipher.name).toBe("Test Login"); + expect(cipher.type).toBe(CipherType.Login); + expect(cipher.login.username).toBe("username"); + expect(cipher.login.password).toBe("password"); + expect(cipher.login.uris[0].uri).toBe("http://example.com"); + }); + + it("should handle collections correctly", async () => { + const data = `name,collections` + `\nTest Login,collection1/collection2`; + + const result = await importer.parse(data); + + expect(result.success).toBe(true); + expect(result.ciphers.length).toBe(1); + + expect(result.collections.length).toBe(2); + expect(result.collections[0].name).toBe("collection1/collection2"); + expect(result.collections[1].name).toBe("collection1"); + }); +}); diff --git a/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.ts b/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.ts index 026c055b213..fab47b30b1a 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-csv-importer.ts @@ -43,6 +43,17 @@ export class BitwardenCsvImporter extends BaseImporter implements Importer { } result.collectionRelationships.push([result.ciphers.length, collectionIndex]); + + // if the collection name is a/b/c/d, we need to create a/b/c and a/b and a + const parts = col.split("/"); + for (let i = parts.length - 1; i > 0; i--) { + const parentCollectionName = parts.slice(0, i).join("/") as string; + if (result.collections.find((c) => c.name === parentCollectionName) == null) { + const parentCollection = new CollectionView(); + parentCollection.name = parentCollectionName; + result.collections.push(parentCollection); + } + } }); } else if (!this.organization) { this.processFolder(result, value.folder); diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts index 5ccf0971daa..07b25976521 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-account.csv.ts @@ -1,3 +1,2 @@ -/* eslint-disable */ export const userAccountData = `nickname,url,username,password,additionalInfo,twofaSecret,status,tags PasswordNickname,www.google.com,user.name@email.com,abc123,This is the additional information text.,someTOTPSeed,active,someTag`; diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts index 0b127627ad8..24cbec3a5b1 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-credit-card.csv.ts @@ -1,3 +1,2 @@ -/* eslint-disable */ export const userCreditCardData = `nickname,status,tags,cardNumber,cardName,exp_month,exp_year,cvv,additionalInfo Visa test card,active,someTag,4111111111111111,Joe User,04,24,222,This is the additional information field`; diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts index e1311d85bc7..6fa6b6f737c 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-id-card.csv.ts @@ -1,4 +1,3 @@ -/* eslint-disable */ export const userIdCardData = `nickname,status,tags,idType,idNumber,idName,idIssuanceDate,idExpirationDate,idCountry,additionalInfo Joe User's nickname,active,someTag,Driver's License,123456,Joe M User,02/02/2022,02/02/2024,United States,Additional information Passport ID card,active,someTag,Passport,1234567,Joe M User,03/07/2022,03/07/2028,United States,Additional information field diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts index 13afb16dae8..c1938995d01 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-identity.csv.ts @@ -1,3 +1,2 @@ -/* eslint-disable */ export const userIdentityData = `nickname,status,tags,firstName,middleName,lastName,email,firstAddressLine,secondAddressLine,title,gender,number,city,country,zipCode,additionalInfo Joe User's nickname,active,someTag,Joe,M,User,joe.user@email.com,1 Example House,Suite 300,Mr,Male,2223334444,Portland,United States,04101,Additional information field`; diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts index 8094c92f2a8..66bd1005501 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-note.csv.ts @@ -1,3 +1,2 @@ -/* eslint-disable */ export const userNoteData = `nickname,status,content The title of a secure note,active,"The content of a secure note. Lorem ipsum, etc."`; diff --git a/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts b/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts index 68cfd44f385..0d0b0053bbf 100644 --- a/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts +++ b/libs/importer/src/importers/spec-data/myki-csv/user-twofa.csv.ts @@ -1,3 +1,2 @@ -/* eslint-disable */ export const userTwoFaData = `nickname,status,tags,authToken,additionalInfo 2FA nickname,active,someTag,someTOTPSeed,"Additional information field content. "`; diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index 4de0bf70b07..908f062ecc1 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -1,16 +1,19 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { of } from "rxjs"; import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { KeyService } from "@bitwarden/key-management"; +import { BitwardenClient } from "@bitwarden/sdk-internal"; import { BitwardenPasswordProtectedImporter } from "../importers/bitwarden/bitwarden-password-protected-importer"; import { Importer } from "../importers/importer"; @@ -30,6 +33,7 @@ describe("ImportService", () => { let encryptService: MockProxy; let pinService: MockProxy; let accountService: MockProxy; + let sdkService: MockProxy; beforeEach(() => { cipherService = mock(); @@ -40,6 +44,9 @@ describe("ImportService", () => { keyService = mock(); encryptService = mock(); pinService = mock(); + const mockClient = mock(); + sdkService = mock(); + sdkService.client$ = of(mockClient, mockClient, mockClient); importService = new ImportService( cipherService, @@ -51,6 +58,7 @@ describe("ImportService", () => { encryptService, pinService, accountService, + sdkService, ); }); diff --git a/libs/importer/src/services/import.service.ts b/libs/importer/src/services/import.service.ts index 781b4f75e56..cc9cdc39320 100644 --- a/libs/importer/src/services/import.service.ts +++ b/libs/importer/src/services/import.service.ts @@ -15,6 +15,7 @@ import { ImportOrganizationCiphersRequest } from "@bitwarden/common/models/reque import { KvpRequest } from "@bitwarden/common/models/request/kvp.request"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -114,6 +115,7 @@ export class ImportService implements ImportServiceAbstraction { private encryptService: EncryptService, private pinService: PinServiceAbstraction, private accountService: AccountService, + private sdkService: SdkService, ) {} getImportOptions(): ImportOption[] { diff --git a/libs/key-management-ui/src/lock/components/lock.component.ts b/libs/key-management-ui/src/lock/components/lock.component.ts index 4661a4167fd..b50c7d23337 100644 --- a/libs/key-management-ui/src/lock/components/lock.component.ts +++ b/libs/key-management-ui/src/lock/components/lock.component.ts @@ -19,8 +19,6 @@ import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { DeviceTrustServiceAbstraction } from "@bitwarden/common/auth/abstractions/device-trust.service.abstraction"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { VerificationType } from "@bitwarden/common/auth/enums/verification-type"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; @@ -29,6 +27,8 @@ import { MasterPasswordVerificationResponse, } from "@bitwarden/common/auth/types/verification"; import { ClientType, DeviceType } from "@bitwarden/common/enums"; +import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index ca14f31a229..8c201152997 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -3,8 +3,8 @@ import { bufferCount, firstValueFrom, lastValueFrom, of, take, tap } from "rxjs" import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; -import { FakeMasterPasswordService } from "@bitwarden/common/auth/services/master-password/fake-master-password.service"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { FakeMasterPasswordService } from "@bitwarden/common/key-management/master-password/services/fake-master-password.service"; import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; diff --git a/libs/key-management/src/key.service.ts b/libs/key-management/src/key.service.ts index 129c33f1e80..0de6d4859d2 100644 --- a/libs/key-management/src/key.service.ts +++ b/libs/key-management/src/key.service.ts @@ -17,8 +17,8 @@ import { ProfileOrganizationResponse } from "@bitwarden/common/admin-console/mod import { ProfileProviderOrganizationResponse } from "@bitwarden/common/admin-console/models/response/profile-provider-organization.response"; import { ProfileProviderResponse } from "@bitwarden/common/admin-console/models/response/profile-provider.response"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { VaultTimeoutStringType } from "@bitwarden/common/key-management/vault-timeout"; import { VAULT_TIMEOUT } from "@bitwarden/common/key-management/vault-timeout/services/vault-timeout-settings.state"; import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; @@ -260,7 +260,6 @@ export class DefaultKeyService implements KeyServiceAbstraction { } if (keySuffix === KeySuffixOptions.Pin && userId != null) { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises this.pinService.clearPinKeyEncryptedUserKeyEphemeral(userId); // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises diff --git a/libs/tools/generator/components/src/password-settings.component.html b/libs/tools/generator/components/src/password-settings.component.html index 5e4d1079725..2145782df57 100644 --- a/libs/tools/generator/components/src/password-settings.component.html +++ b/libs/tools/generator/components/src/password-settings.component.html @@ -61,7 +61,11 @@ formControlName="special" (change)="save('special')" /> - {{ "specialCharactersLabel" | i18n }} + + {{ "!@#$%^&*" }}
    diff --git a/libs/tools/generator/core/src/metadata/index.ts b/libs/tools/generator/core/src/metadata/index.ts index 2aef138c0e3..79806fd1bcc 100644 --- a/libs/tools/generator/core/src/metadata/index.ts +++ b/libs/tools/generator/core/src/metadata/index.ts @@ -1,10 +1,13 @@ import { AlgorithmsByType as ABT } from "./data"; import { CredentialType, CredentialAlgorithm } from "./type"; +// `CredentialAlgorithm` is defined in terms of `ABT`; supplying +// type information in the barrel file breaks a circular dependency. +/** Credential generation algorithms grouped by purpose. */ export const AlgorithmsByType: Record> = ABT; export { Profile, Type } from "./data"; export { GeneratorMetadata } from "./generator-metadata"; export { ProfileContext, CoreProfileMetadata, ProfileMetadata } from "./profile-metadata"; export { GeneratorProfile, CredentialAlgorithm, CredentialType } from "./type"; -export { isForwarderProfile, isForwarderExtensionId } from "./util"; +export { isForwarderProfile, toVendorId, isForwarderExtensionId } from "./util"; diff --git a/libs/tools/generator/core/src/metadata/profile-metadata.ts b/libs/tools/generator/core/src/metadata/profile-metadata.ts index 4ac9139f632..7c25f401863 100644 --- a/libs/tools/generator/core/src/metadata/profile-metadata.ts +++ b/libs/tools/generator/core/src/metadata/profile-metadata.ts @@ -1,6 +1,6 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; -import { SiteId } from "@bitwarden/common/tools/extension"; +import { ExtensionProfileMetadata } from "@bitwarden/common/tools/extension/type"; import { ObjectKey } from "@bitwarden/common/tools/state/object-key"; import { Constraints } from "@bitwarden/common/tools/types"; @@ -61,13 +61,7 @@ export type CoreProfileMetadata = { * manager. Extension profiles store their data * using the extension system. */ -export type ExtensionProfileMetadata = { - /** distinguishes profile metadata types */ - type: "extension"; - - /** The extension site described by this metadata */ - site: Site; - +export type ForwarderProfileMetadata = ExtensionProfileMetadata & { constraints: ProfileConstraints; }; @@ -77,4 +71,4 @@ export type ExtensionProfileMetadata = { */ export type ProfileMetadata = | CoreProfileMetadata - | ExtensionProfileMetadata; + | ForwarderProfileMetadata; diff --git a/libs/tools/generator/core/src/metadata/util.spec.ts b/libs/tools/generator/core/src/metadata/util.spec.ts index 2283699140b..fc88c7a1f57 100644 --- a/libs/tools/generator/core/src/metadata/util.spec.ts +++ b/libs/tools/generator/core/src/metadata/util.spec.ts @@ -1,7 +1,12 @@ +import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; +import { GENERATOR_DISK } from "@bitwarden/common/platform/state"; import { VendorId } from "@bitwarden/common/tools/extension"; +import { PrivateClassifier } from "@bitwarden/common/tools/private-classifier"; +import { IdentityConstraint } from "@bitwarden/common/tools/state/identity-state-constraint"; +import { ObjectKey } from "@bitwarden/common/tools/state/object-key"; import { Algorithm, AlgorithmsByType } from "./data"; -import { ProfileMetadata } from "./profile-metadata"; +import { ProfileContext, ProfileMetadata } from "./profile-metadata"; import { isPasswordAlgorithm, isUsernameAlgorithm, @@ -12,6 +17,19 @@ import { isForwarderProfile, } from "./util"; +const SomeStorage: ObjectKey = { + target: "object", + key: "arbitrary", + state: GENERATOR_DISK, + classifier: new PrivateClassifier(), + format: "classified", + options: { clearOn: [], deserializer: (value) => value }, +}; + +function createConstraints(policies: Policy[], context: ProfileContext) { + return new IdentityConstraint(); +} + describe("credential generator metadata utility functions", () => { describe("isPasswordAlgorithm", () => { it("returns `true` when the algorithm is a password algorithm", () => { @@ -151,10 +169,10 @@ describe("credential generator metadata utility functions", () => { it("returns `true` when the profile's type is `core`", () => { const profile: ProfileMetadata = { type: "core", - storage: null, + storage: SomeStorage, constraints: { default: {}, - create: () => null, + create: createConstraints, }, }; @@ -165,9 +183,10 @@ describe("credential generator metadata utility functions", () => { const profile: ProfileMetadata = { type: "extension", site: "forwarder", + storage: SomeStorage, constraints: { default: {}, - create: () => null, + create: createConstraints, }, }; @@ -179,10 +198,10 @@ describe("credential generator metadata utility functions", () => { it("returns `false` when the profile's type is `core`", () => { const profile: ProfileMetadata = { type: "core", - storage: null, + storage: SomeStorage, constraints: { default: {}, - create: () => null, + create: createConstraints, }, }; @@ -193,9 +212,10 @@ describe("credential generator metadata utility functions", () => { const profile: ProfileMetadata = { type: "extension", site: "forwarder", + storage: SomeStorage, constraints: { default: {}, - create: () => null, + create: createConstraints, }, }; @@ -206,9 +226,10 @@ describe("credential generator metadata utility functions", () => { const profile: ProfileMetadata = { type: "extension", site: "not-a-forwarder" as any, + storage: SomeStorage, constraints: { default: {}, - create: () => null, + create: createConstraints, }, }; diff --git a/libs/tools/generator/core/src/metadata/util.ts b/libs/tools/generator/core/src/metadata/util.ts index e85061720ad..86b2742e86d 100644 --- a/libs/tools/generator/core/src/metadata/util.ts +++ b/libs/tools/generator/core/src/metadata/util.ts @@ -1,5 +1,7 @@ +import { VendorId } from "@bitwarden/common/tools/extension"; + import { AlgorithmsByType } from "./data"; -import { CoreProfileMetadata, ExtensionProfileMetadata, ProfileMetadata } from "./profile-metadata"; +import { CoreProfileMetadata, ForwarderProfileMetadata, ProfileMetadata } from "./profile-metadata"; import { CredentialAlgorithm, EmailAlgorithm, @@ -29,6 +31,17 @@ export function isForwarderExtensionId( return algorithm && typeof algorithm === "object" && "forwarder" in algorithm; } +/** Extract a `VendorId` from a `CredentialAlgorithm`. + * @param algorithm the algorithm containing the vendor id + * @returns the vendor id if the algorithm identifies a forwarder extension. + * Otherwise, undefined. + */ +export function toVendorId(algorithm: CredentialAlgorithm): VendorId | undefined { + if (isForwarderExtensionId(algorithm)) { + return algorithm.forwarder as VendorId; + } +} + /** Returns true when the input algorithm is an email algorithm. */ export function isEmailAlgorithm(algorithm: CredentialAlgorithm): algorithm is EmailAlgorithm { return AlgorithmsByType.email.includes(algorithm as any) || isForwarderExtensionId(algorithm); @@ -55,6 +68,6 @@ export function isCoreProfile( /** Returns true when the input describes a forwarder extension profile. */ export function isForwarderProfile( value: ProfileMetadata, -): value is ExtensionProfileMetadata { +): value is ForwarderProfileMetadata { return value.type === "extension" && value.site === "forwarder"; } diff --git a/apps/web/src/app/tools/send/send-add-edit.component.html b/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.html similarity index 100% rename from apps/web/src/app/tools/send/send-add-edit.component.html rename to libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.html diff --git a/apps/web/src/app/tools/send/send-add-edit.component.ts b/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts similarity index 94% rename from apps/web/src/app/tools/send/send-add-edit.component.ts rename to libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts index 490683a4b4d..fd15c87920f 100644 --- a/apps/web/src/app/tools/send/send-add-edit.component.ts +++ b/libs/tools/send/send-ui/src/add-edit/send-add-edit-dialog.component.ts @@ -19,7 +19,8 @@ import { ToastService, DialogModule, } from "@bitwarden/components"; -import { SendFormConfig, SendFormMode, SendFormModule } from "@bitwarden/send-ui"; + +import { SendFormConfig, SendFormMode, SendFormModule } from "../send-form"; export interface SendItemDialogParams { /** @@ -49,8 +50,7 @@ export enum SendItemDialogResult { * Component for adding or editing a send item. */ @Component({ - selector: "tools-send-add-edit", - templateUrl: "send-add-edit.component.html", + templateUrl: "send-add-edit-dialog.component.html", standalone: true, imports: [ CommonModule, @@ -64,7 +64,7 @@ export enum SendItemDialogResult { DialogModule, ], }) -export class SendAddEditComponent { +export class SendAddEditDialogComponent { /** * The header text for the component. */ @@ -169,8 +169,11 @@ export class SendAddEditComponent { * @returns The dialog result. */ static open(dialogService: DialogService, params: SendItemDialogParams) { - return dialogService.open(SendAddEditComponent, { - data: params, - }); + return dialogService.open( + SendAddEditDialogComponent, + { + data: params, + }, + ); } } diff --git a/libs/tools/send/send-ui/src/index.ts b/libs/tools/send/send-ui/src/index.ts index d208709c36d..db4416a13f0 100644 --- a/libs/tools/send/send-ui/src/index.ts +++ b/libs/tools/send/send-ui/src/index.ts @@ -1,6 +1,7 @@ export * from "./icons"; export * from "./send-form"; export { NewSendDropdownComponent } from "./new-send-dropdown/new-send-dropdown.component"; +export * from "./add-edit/send-add-edit-dialog.component"; export { SendListItemsContainerComponent } from "./send-list-items-container/send-list-items-container.component"; export { SendItemsService } from "./services/send-items.service"; export { SendSearchComponent } from "./send-search/send-search.component"; diff --git a/libs/tools/send/send-ui/src/send-form/services/default-send-form-config.service.ts b/libs/tools/send/send-ui/src/send-form/services/default-send-form-config.service.ts index a786d62df06..b222aa6cc1a 100644 --- a/libs/tools/send/send-ui/src/send-form/services/default-send-form-config.service.ts +++ b/libs/tools/send/send-ui/src/send-form/services/default-send-form-config.service.ts @@ -34,7 +34,7 @@ export class DefaultSendFormConfigService implements SendFormConfigService { return { mode, - sendType: sendType, + sendType: send?.type ?? sendType ?? SendType.Text, areSendsAllowed, originalSend: send, }; diff --git a/libs/tools/send/send-ui/src/send-search/send-search.component.html b/libs/tools/send/send-ui/src/send-search/send-search.component.html index 898d93da32c..7cf154c0ee8 100644 --- a/libs/tools/send/send-ui/src/send-search/send-search.component.html +++ b/libs/tools/send/send-ui/src/send-search/send-search.component.html @@ -1,9 +1,7 @@ -
    - - -
    + + diff --git a/libs/tools/send/send-ui/src/send-search/send-search.component.ts b/libs/tools/send/send-ui/src/send-search/send-search.component.ts index 3d7d7d6285f..8142ce58f64 100644 --- a/libs/tools/send/send-ui/src/send-search/send-search.component.ts +++ b/libs/tools/send/send-ui/src/send-search/send-search.component.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { CommonModule } from "@angular/common"; import { Component } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @@ -20,7 +18,7 @@ const SearchTextDebounceInterval = 200; templateUrl: "send-search.component.html", }) export class SendSearchComponent { - searchText: string; + searchText: string = ""; private searchText$ = new Subject(); diff --git a/libs/tools/send/send-ui/src/services/send-items.service.spec.ts b/libs/tools/send/send-ui/src/services/send-items.service.spec.ts index 7a7c86df922..77e3725e813 100644 --- a/libs/tools/send/send-ui/src/services/send-items.service.spec.ts +++ b/libs/tools/send/send-ui/src/services/send-items.service.spec.ts @@ -3,8 +3,12 @@ import { mock } from "jest-mock-extended"; import { BehaviorSubject, first, Subject } from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { mockAccountServiceWith } from "../../../../../common/spec"; import { SendItemsService } from "./send-items.service"; import { SendListFiltersService } from "./send-list-filters.service"; @@ -30,6 +34,7 @@ describe("SendItemsService", () => { { provide: SendService, useValue: sendServiceMock }, { provide: SendListFiltersService, useValue: sendListFiltersServiceMock }, { provide: SearchService, useValue: searchServiceMock }, + { provide: AccountService, useValue: mockAccountServiceWith("UserId" as UserId) }, SendItemsService, ], }); diff --git a/libs/tools/send/send-ui/src/services/send-items.service.ts b/libs/tools/send/send-ui/src/services/send-items.service.ts index 6cef663f891..1ade6f37f71 100644 --- a/libs/tools/send/send-ui/src/services/send-items.service.ts +++ b/libs/tools/send/send-ui/src/services/send-items.service.ts @@ -15,6 +15,8 @@ import { } from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; @@ -71,9 +73,13 @@ export class SendItemsService { /** * Observable that indicates whether a filter is currently applied to the sends. */ - hasFilterApplied$ = combineLatest([this._searchText$, this.sendListFiltersService.filters$]).pipe( - switchMap(([searchText, filters]) => { - return from(this.searchService.isSearchable(searchText)).pipe( + hasFilterApplied$ = combineLatest([ + this._searchText$, + this.sendListFiltersService.filters$, + getUserId(this.accountService.activeAccount$), + ]).pipe( + switchMap(([searchText, filters, activeAcctId]) => { + return from(this.searchService.isSearchable(activeAcctId, searchText)).pipe( map( (isSearchable) => isSearchable || Object.values(filters).some((filter) => filter !== null), @@ -98,6 +104,7 @@ export class SendItemsService { private sendService: SendService, private sendListFiltersService: SendListFiltersService, private searchService: SearchService, + private accountService: AccountService, ) {} applyFilter(newSearchText: string) { diff --git a/libs/vault/src/abstractions/change-login-password.service.ts b/libs/vault/src/abstractions/change-login-password.service.ts index c89162d42be..b8981282f4b 100644 --- a/libs/vault/src/abstractions/change-login-password.service.ts +++ b/libs/vault/src/abstractions/change-login-password.service.ts @@ -4,6 +4,8 @@ export abstract class ChangeLoginPasswordService { /** * Attempts to find a well-known change password URL for the given cipher. Only works for Login ciphers with at * least one http/https URL. If no well-known change password URL is found, the first URL is returned. + * Checks each URL until the first reliable one well-known URL is found, otherwise returns the first URL. + * * Non-Login ciphers and Logins with no valid http/https URLs return null. */ abstract getChangePasswordUrl(cipher: CipherView): Promise; diff --git a/libs/vault/src/cipher-form/cipher-form.stories.ts b/libs/vault/src/cipher-form/cipher-form.stories.ts index 1af73b5a8b8..5d6464b4c79 100644 --- a/libs/vault/src/cipher-form/cipher-form.stories.ts +++ b/libs/vault/src/cipher-form/cipher-form.stories.ts @@ -24,6 +24,7 @@ import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherType } from "@bitwarden/common/vault/enums"; +import { SshKeyData } from "@bitwarden/common/vault/models/data/ssh-key.data"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; @@ -36,9 +37,11 @@ import { } from "@bitwarden/vault"; // FIXME: remove `/apps` import from `/libs` // FIXME: remove `src` and fix import -// eslint-disable-next-line import/no-restricted-paths, no-restricted-imports +// eslint-disable-next-line no-restricted-imports import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/src/app/core/tests"; +import { SshImportPromptService } from "../services/ssh-import-prompt.service"; + import { CipherFormService } from "./abstractions/cipher-form.service"; import { TotpCaptureService } from "./abstractions/totp-capture.service"; import { CipherFormModule } from "./cipher-form.module"; @@ -146,6 +149,12 @@ export default { enabled$: new BehaviorSubject(true), }, }, + { + provide: SshImportPromptService, + useValue: { + importSshKeyFromClipboard: () => Promise.resolve(new SshKeyData()), + }, + }, { provide: CipherFormGenerationService, useValue: { diff --git a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.html b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.html index 6f7dd35be9e..42164ae6854 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.html +++ b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.html @@ -5,12 +5,15 @@ - + { + const actual = jest.requireActual("@angular/cdk/drag-drop"); + return { + ...actual, + moveItemInArray: jest.fn(actual.moveItemInArray), + }; +}); + describe("AutofillOptionsComponent", () => { let component: AutofillOptionsComponent; let fixture: ComponentFixture; @@ -255,4 +264,111 @@ describe("AutofillOptionsComponent", () => { expect(component.autofillOptionsForm.value.uris.length).toEqual(1); }); + + describe("Drag & Drop Functionality", () => { + beforeEach(() => { + // Prevent auto‑adding an empty URI by setting a non‑null initial value. + // This overrides the call to initNewCipher. + + // Now clear any existing URIs (including the auto‑added one) + component.autofillOptionsForm.controls.uris.clear(); + + // Add exactly three URIs that we want to test reordering on. + component.addUri({ uri: "https://first.com", matchDetection: null }); + component.addUri({ uri: "https://second.com", matchDetection: null }); + component.addUri({ uri: "https://third.com", matchDetection: null }); + fixture.detectChanges(); + }); + + it("should reorder URI inputs on drop event", () => { + // Simulate a drop event that moves the first URI (index 0) to the last position (index 2). + const dropEvent: CdkDragDrop = { + previousIndex: 0, + currentIndex: 2, + container: null, + previousContainer: null, + isPointerOverContainer: true, + item: null, + distance: { x: 0, y: 0 }, + } as any; + + component.onUriItemDrop(dropEvent); + fixture.detectChanges(); + + expect(moveItemInArray).toHaveBeenCalledWith( + component.autofillOptionsForm.controls.uris.controls, + 0, + 2, + ); + }); + + it("should reorder URI input via keyboard ArrowUp", async () => { + // Clear and add exactly two URIs. + component.autofillOptionsForm.controls.uris.clear(); + component.addUri({ uri: "https://first.com", matchDetection: null }); + component.addUri({ uri: "https://second.com", matchDetection: null }); + fixture.detectChanges(); + + // Simulate pressing ArrowUp on the second URI (index 1) + const keyEvent = { + key: "ArrowUp", + preventDefault: jest.fn(), + target: document.createElement("button"), + } as unknown as KeyboardEvent; + + // Force requestAnimationFrame to run synchronously + jest.spyOn(window, "requestAnimationFrame").mockImplementation((cb: FrameRequestCallback) => { + cb(new Date().getTime()); + return 0; + }); + (liveAnnouncer.announce as jest.Mock).mockResolvedValue(null); + + await component.onUriItemKeydown(keyEvent, 1); + fixture.detectChanges(); + + expect(moveItemInArray).toHaveBeenCalledWith( + component.autofillOptionsForm.controls.uris.controls, + 1, + 0, + ); + expect(liveAnnouncer.announce).toHaveBeenCalledWith( + "reorderFieldUp websiteUri 1 2", + "assertive", + ); + }); + + it("should reorder URI input via keyboard ArrowDown", async () => { + // Clear and add exactly three URIs. + component.autofillOptionsForm.controls.uris.clear(); + component.addUri({ uri: "https://first.com", matchDetection: null }); + component.addUri({ uri: "https://second.com", matchDetection: null }); + component.addUri({ uri: "https://third.com", matchDetection: null }); + fixture.detectChanges(); + + // Simulate pressing ArrowDown on the second URI (index 1) + const keyEvent = { + key: "ArrowDown", + preventDefault: jest.fn(), + target: document.createElement("button"), + } as unknown as KeyboardEvent; + + jest.spyOn(window, "requestAnimationFrame").mockImplementation((cb: FrameRequestCallback) => { + cb(new Date().getTime()); + return 0; + }); + (liveAnnouncer.announce as jest.Mock).mockResolvedValue(null); + + await component.onUriItemKeydown(keyEvent, 1); + + expect(moveItemInArray).toHaveBeenCalledWith( + component.autofillOptionsForm.controls.uris.controls, + 1, + 2, + ); + expect(liveAnnouncer.announce).toHaveBeenCalledWith( + "reorderFieldDown websiteUri 3 3", + "assertive", + ); + }); + }); }); diff --git a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts index c3b2a0fb9f9..5b1e4eca103 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts +++ b/libs/vault/src/cipher-form/components/autofill-options/autofill-options.component.ts @@ -1,6 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { LiveAnnouncer } from "@angular/cdk/a11y"; +import { CdkDragDrop, DragDropModule, moveItemInArray } from "@angular/cdk/drag-drop"; import { AsyncPipe, NgForOf, NgIf } from "@angular/common"; import { Component, OnInit, QueryList, ViewChildren } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @@ -41,6 +42,7 @@ interface UriField { templateUrl: "./autofill-options.component.html", standalone: true, imports: [ + DragDropModule, SectionComponent, SectionHeaderComponent, TypographyModule, @@ -229,4 +231,58 @@ export class AutofillOptionsComponent implements OnInit { removeUri(i: number) { this.autofillOptionsForm.controls.uris.removeAt(i); } + + /** Create a new list of LoginUriViews from the form objects and update the cipher */ + private updateUriFields() { + this.cipherFormContainer.patchCipher((cipher) => { + cipher.login.uris = this.uriControls.map( + (control) => + Object.assign(new LoginUriView(), { + uri: control.value.uri, + matchDetection: control.value.matchDetection ?? null, + }) as LoginUriView, + ); + return cipher; + }); + } + + /** Reorder the controls to match the new order after a "drop" event */ + onUriItemDrop(event: CdkDragDrop) { + moveItemInArray(this.uriControls, event.previousIndex, event.currentIndex); + this.updateUriFields(); + } + + /** Handles a uri item keyboard up or down event */ + async onUriItemKeydown(event: KeyboardEvent, index: number) { + if (event.key === "ArrowUp" && index !== 0) { + await this.reorderUriItems(event, index, "Up"); + } + + if (event.key === "ArrowDown" && index !== this.uriControls.length - 1) { + await this.reorderUriItems(event, index, "Down"); + } + } + + /** Reorders the uri items from a keyboard up or down event */ + async reorderUriItems(event: KeyboardEvent, previousIndex: number, direction: "Up" | "Down") { + const currentIndex = previousIndex + (direction === "Up" ? -1 : 1); + event.preventDefault(); + await this.liveAnnouncer.announce( + this.i18nService.t( + `reorderField${direction}`, + this.i18nService.t("websiteUri"), + currentIndex + 1, + this.uriControls.length, + ), + "assertive", + ); + moveItemInArray(this.uriControls, previousIndex, currentIndex); + this.updateUriFields(); + // Refocus the button after the reorder + // Angular re-renders the list when moving an item up which causes the focus to be lost + // Wait for the next tick to ensure the button is rendered before focusing + requestAnimationFrame(() => { + (event.target as HTMLButtonElement).focus(); + }); + } } diff --git a/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.html b/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.html index a55716083de..5301e4f32b9 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.html +++ b/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.html @@ -1,35 +1,50 @@ - - {{ uriLabel }} - - - - - - - {{ "matchDetection" | i18n }} - - - - +
    +
    + + {{ uriLabel }} + + + + +
    + +
    +
    + + {{ "matchDetection" | i18n }} + + + + +
    diff --git a/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.ts b/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.ts index f712e3114e0..07bf7bef775 100644 --- a/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.ts +++ b/libs/vault/src/cipher-form/components/autofill-options/uri-option.component.ts @@ -1,5 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore +import { DragDropModule } from "@angular/cdk/drag-drop"; import { NgForOf, NgIf } from "@angular/common"; import { Component, @@ -43,6 +44,7 @@ import { }, ], imports: [ + DragDropModule, FormFieldModule, ReactiveFormsModule, IconButtonModule, @@ -74,6 +76,12 @@ export class UriOptionComponent implements ControlValueAccessor { { label: this.i18nService.t("never"), value: UriMatchStrategy.Never }, ]; + /** + * Whether the option can be reordered. If false, the reorder button will be hidden. + */ + @Input({ required: true }) + canReorder: boolean; + /** * Whether the URI can be removed from the form. If false, the remove button will be hidden. */ @@ -101,6 +109,9 @@ export class UriOptionComponent implements ControlValueAccessor { */ @Input({ required: true }) index: number; + @Output() + onKeydown = new EventEmitter(); + /** * Emits when the remove button is clicked and URI should be removed from the form. */ @@ -132,6 +143,10 @@ export class UriOptionComponent implements ControlValueAccessor { private onChange: any = () => {}; private onTouched: any = () => {}; + protected handleKeydown(event: KeyboardEvent) { + this.onKeydown.emit(event); + } + constructor( private formBuilder: FormBuilder, private i18nService: I18nService, diff --git a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html index fab3c8f1ab1..c7c5f4a930e 100644 --- a/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html +++ b/libs/vault/src/cipher-form/components/custom-fields/custom-fields.component.html @@ -87,7 +87,7 @@ (click)="openAddEditCustomFieldDialog({ index: i, label: field.value.name })" [appA11yTitle]="'editFieldLabel' | i18n: field.value.name" bitIconButton="bwi-pencil-square" - class="tw-self-end" + class="tw-self-center tw-mt-2" data-testid="edit-custom-field-button" *ngIf="!isPartialEdit" > @@ -95,7 +95,7 @@ + diff --git a/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts b/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts index 773ddd4ad66..500bb886f7a 100644 --- a/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts +++ b/libs/vault/src/cipher-form/components/sshkey-section/sshkey-section.component.ts @@ -7,7 +7,8 @@ import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { ClientType } from "@bitwarden/common/enums"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { SshKeyView } from "@bitwarden/common/vault/models/view/ssh-key.view"; @@ -22,6 +23,7 @@ import { } from "@bitwarden/components"; import { generate_ssh_key } from "@bitwarden/sdk-internal"; +import { SshImportPromptService } from "../../../services/ssh-import-prompt.service"; import { CipherFormContainer } from "../../cipher-form-container"; @Component({ @@ -60,11 +62,14 @@ export class SshKeySectionComponent implements OnInit { keyFingerprint: [""], }); + showImport = false; + constructor( private cipherFormContainer: CipherFormContainer, private formBuilder: FormBuilder, - private i18nService: I18nService, private sdkService: SdkService, + private sshImportPromptService: SshImportPromptService, + private platformUtilsService: PlatformUtilsService, ) { this.cipherFormContainer.registerChildForm("sshKeyDetails", this.sshKeyForm); this.sshKeyForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => { @@ -87,6 +92,11 @@ export class SshKeySectionComponent implements OnInit { } this.sshKeyForm.disable(); + + // Web does not support clipboard access + if (this.platformUtilsService.getClientType() !== ClientType.Web) { + this.showImport = true; + } } /** Set form initial form values from the current cipher */ @@ -100,6 +110,17 @@ export class SshKeySectionComponent implements OnInit { }); } + async importSshKeyFromClipboard() { + const key = await this.sshImportPromptService.importSshKeyFromClipboard(); + if (key != null) { + this.sshKeyForm.setValue({ + privateKey: key.privateKey, + publicKey: key.publicKey, + keyFingerprint: key.keyFingerprint, + }); + } + } + private async generateSshKey() { await firstValueFrom(this.sdkService.client$); const sshKey = generate_ssh_key("Ed25519"); diff --git a/libs/vault/src/cipher-view/cipher-view.component.html b/libs/vault/src/cipher-view/cipher-view.component.html index def98b2fe96..b2e747aa2fe 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.html +++ b/libs/vault/src/cipher-view/cipher-view.component.html @@ -10,9 +10,9 @@ [title]="''" > - + {{ "changeAtRiskPassword" | i18n }} - +
    diff --git a/libs/vault/src/cipher-view/cipher-view.component.ts b/libs/vault/src/cipher-view/cipher-view.component.ts index 3782b866f1d..1df96656da5 100644 --- a/libs/vault/src/cipher-view/cipher-view.component.ts +++ b/libs/vault/src/cipher-view/cipher-view.component.ts @@ -171,6 +171,10 @@ export class CipherViewComponent implements OnChanges, OnDestroy { } async checkPendingChangePasswordTasks(userId: UserId): Promise { + if (!(await firstValueFrom(this.isSecurityTasksEnabled$))) { + return; + } + const tasks = await firstValueFrom(this.defaultTaskService.pendingTasks$(userId)); this.hadPendingChangePasswordTask = tasks?.some((task) => { diff --git a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html index 19d1cfe1744..c069e36dde1 100644 --- a/libs/vault/src/cipher-view/item-history/item-history-v2.component.html +++ b/libs/vault/src/cipher-view/item-history/item-history-v2.component.html @@ -3,12 +3,12 @@

    {{ "itemHistory" | i18n }}

    -

    +

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

    {{ "datePasswordUpdated" | i18n }}: diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html index 6de6fb6848d..e44f1ebb3d8 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.html @@ -90,9 +90,9 @@ > - + {{ "changeAtRiskPassword" | i18n }} - +

    { const appliedTheme = theme === "system" ? systemTheme : theme; - const isDark = - appliedTheme === "dark" || appliedTheme === "nord" || appliedTheme === "solarizedDark"; + const isDark = appliedTheme === "dark"; this.src = isDark ? this.darkImgSrc() : this.lightImgSrc; }); } diff --git a/libs/vault/src/components/new-device-verification-notice/new-device-verification-notice-page-one.component.html b/libs/vault/src/components/new-device-verification-notice/new-device-verification-notice-page-one.component.html index 9d7808379d3..812a8faa66c 100644 --- a/libs/vault/src/components/new-device-verification-notice/new-device-verification-notice-page-one.component.html +++ b/libs/vault/src/components/new-device-verification-notice/new-device-verification-notice-page-one.component.html @@ -13,7 +13,7 @@ 'md:tw-flex md:tw-flex-col md:tw-items-center md:!tw-rounded-b-none': !isDesktop, }" > -

    +

    {{ "newDeviceVerificationNoticePageOneFormContent" | i18n: this.currentEmail }}

    diff --git a/libs/vault/src/components/password-history-view/password-history-view.component.html b/libs/vault/src/components/password-history-view/password-history-view.component.html index 459c679945c..7510d80a549 100644 --- a/libs/vault/src/components/password-history-view/password-history-view.component.html +++ b/libs/vault/src/components/password-history-view/password-history-view.component.html @@ -23,6 +23,9 @@
    -
    +

    {{ "noPasswordsInList" | i18n }}

    diff --git a/libs/vault/src/components/totp-countdown/totp-countdown.component.html b/libs/vault/src/components/totp-countdown/totp-countdown.component.html index 5c535a9e270..c6277826022 100644 --- a/libs/vault/src/components/totp-countdown/totp-countdown.component.html +++ b/libs/vault/src/components/totp-countdown/totp-countdown.component.html @@ -1,34 +1,42 @@ -
    - -
    + +
    + +
    +
    diff --git a/libs/vault/src/components/totp-countdown/totp-countdown.component.ts b/libs/vault/src/components/totp-countdown/totp-countdown.component.ts index 17b6cd98c25..08587cbb9fa 100644 --- a/libs/vault/src/components/totp-countdown/totp-countdown.component.ts +++ b/libs/vault/src/components/totp-countdown/totp-countdown.component.ts @@ -2,9 +2,11 @@ // @ts-strict-ignore import { CommonModule } from "@angular/common"; import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { Observable, map, tap } from "rxjs"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { TotpInfo } from "@bitwarden/common/vault/services/totp.service"; import { TypographyModule } from "@bitwarden/components"; @Component({ @@ -17,69 +19,45 @@ export class BitTotpCountdownComponent implements OnInit { @Input() cipher: CipherView; @Output() sendCopyCode = new EventEmitter(); - totpCode: string; - totpCodeFormatted: string; - totpDash: number; - totpSec: number; - totpLow: boolean; - private totpInterval: any; + /** + * Represents TOTP information including display formatting and timing + */ + totpInfo$: Observable | undefined; constructor(protected totpService: TotpService) {} async ngOnInit() { - await this.totpUpdateCode(); - const interval = this.totpService.getTimeInterval(this.cipher.login.totp); - await this.totpTick(interval); + this.totpInfo$ = this.cipher?.login?.totp + ? this.totpService.getCode$(this.cipher.login.totp).pipe( + map((response) => { + const epoch = Math.round(new Date().getTime() / 1000.0); + const mod = epoch % response.period; - this.totpInterval = setInterval(async () => { - await this.totpTick(interval); - }, 1000); + return { + totpCode: response.code, + totpCodeFormatted: this.formatTotpCode(response.code), + totpSec: response.period - mod, + totpDash: +(Math.round(((60 / response.period) * mod + "e+2") as any) + "e-2"), + totpLow: response.period - mod <= 7, + } as TotpInfo; + }), + tap((totpInfo) => { + if (totpInfo.totpCode && totpInfo.totpCode.length > 4) { + this.sendCopyCode.emit({ + totpCode: totpInfo.totpCode, + totpCodeFormatted: totpInfo.totpCodeFormatted, + }); + } + }), + ) + : undefined; } - private async totpUpdateCode() { - if (this.cipher.login.totp == null) { - this.clearTotp(); - return; - } - - this.totpCode = await this.totpService.getCode(this.cipher.login.totp); - if (this.totpCode != null) { - if (this.totpCode.length > 4) { - this.totpCodeFormatted = this.formatTotpCode(); - this.sendCopyCode.emit({ - totpCode: this.totpCode, - totpCodeFormatted: this.totpCodeFormatted, - }); - } else { - this.totpCodeFormatted = this.totpCode; - } - } else { - this.totpCodeFormatted = null; - this.sendCopyCode.emit({ totpCode: null, totpCodeFormatted: null }); - this.clearTotp(); - } - } - - private async totpTick(intervalSeconds: number) { - const epoch = Math.round(new Date().getTime() / 1000.0); - const mod = epoch % intervalSeconds; - - this.totpSec = intervalSeconds - mod; - this.totpDash = +(Math.round(((60 / intervalSeconds) * mod + "e+2") as any) + "e-2"); - this.totpLow = this.totpSec <= 7; - if (mod === 0) { - await this.totpUpdateCode(); - } - } - - private formatTotpCode(): string { - const half = Math.floor(this.totpCode.length / 2); - return this.totpCode.substring(0, half) + " " + this.totpCode.substring(half); - } - - private clearTotp() { - if (this.totpInterval) { - clearInterval(this.totpInterval); + private formatTotpCode(code: string): string { + if (code.length > 4) { + const half = Math.floor(code.length / 2); + return code.substring(0, half) + " " + code.substring(half); } + return code; } } diff --git a/libs/vault/src/icons/browser-extension.ts b/libs/vault/src/icons/browser-extension.ts index f0f9b781491..ac54322292f 100644 --- a/libs/vault/src/icons/browser-extension.ts +++ b/libs/vault/src/icons/browser-extension.ts @@ -1,7 +1,7 @@ import { svgIcon } from "@bitwarden/components"; export const BrowserExtensionIcon = svgIcon` - + diff --git a/libs/vault/src/index.ts b/libs/vault/src/index.ts index e4857411d05..f359b7289ae 100644 --- a/libs/vault/src/index.ts +++ b/libs/vault/src/index.ts @@ -25,8 +25,11 @@ export * from "./components/add-edit-folder-dialog/add-edit-folder-dialog.compon export * from "./components/carousel"; export * as VaultIcons from "./icons"; - export * from "./tasks"; +export * from "./notifications"; + +export { DefaultSshImportPromptService } from "./services/default-ssh-import-prompt.service"; +export { SshImportPromptService } from "./services/ssh-import-prompt.service"; export * from "./abstractions/change-login-password.service"; export * from "./services/default-change-login-password.service"; diff --git a/libs/vault/src/notifications/abstractions/end-user-notification.service.ts b/libs/vault/src/notifications/abstractions/end-user-notification.service.ts new file mode 100644 index 00000000000..2ed7e1de631 --- /dev/null +++ b/libs/vault/src/notifications/abstractions/end-user-notification.service.ts @@ -0,0 +1,49 @@ +import { Observable } from "rxjs"; + +import { UserId } from "@bitwarden/common/types/guid"; + +import { NotificationView } from "../models"; + +/** + * A service for retrieving and managing notifications for end users. + */ +export abstract class EndUserNotificationService { + /** + * Observable of all notifications for the given user. + * @param userId + */ + abstract notifications$(userId: UserId): Observable; + + /** + * Observable of all unread notifications for the given user. + * @param userId + */ + abstract unreadNotifications$(userId: UserId): Observable; + + /** + * Mark a notification as read. + * @param notificationId + * @param userId + */ + abstract markAsRead(notificationId: any, userId: UserId): Promise; + + /** + * Mark a notification as deleted. + * @param notificationId + * @param userId + */ + abstract markAsDeleted(notificationId: any, userId: UserId): Promise; + + /** + * Create/update a notification in the state for the user specified within the notification. + * @remarks This method should only be called when a notification payload is received from the web socket. + * @param notification + */ + abstract upsert(notification: Notification): Promise; + + /** + * Clear all notifications from state for the given user. + * @param userId + */ + abstract clearState(userId: UserId): Promise; +} diff --git a/libs/vault/src/notifications/index.ts b/libs/vault/src/notifications/index.ts new file mode 100644 index 00000000000..0c9d5c0d16b --- /dev/null +++ b/libs/vault/src/notifications/index.ts @@ -0,0 +1,2 @@ +export * from "./abstractions/end-user-notification.service"; +export * from "./services/default-end-user-notification.service"; diff --git a/libs/vault/src/notifications/models/index.ts b/libs/vault/src/notifications/models/index.ts new file mode 100644 index 00000000000..b782335caa9 --- /dev/null +++ b/libs/vault/src/notifications/models/index.ts @@ -0,0 +1,3 @@ +export * from "./notification-view"; +export * from "./notification-view.data"; +export * from "./notification-view.response"; diff --git a/libs/vault/src/notifications/models/notification-view.data.ts b/libs/vault/src/notifications/models/notification-view.data.ts new file mode 100644 index 00000000000..07c147052ad --- /dev/null +++ b/libs/vault/src/notifications/models/notification-view.data.ts @@ -0,0 +1,37 @@ +import { Jsonify } from "type-fest"; + +import { NotificationId } from "@bitwarden/common/types/guid"; + +import { NotificationViewResponse } from "./notification-view.response"; + +export class NotificationViewData { + id: NotificationId; + priority: number; + title: string; + body: string; + date: Date; + readDate: Date | null; + deletedDate: Date | null; + + constructor(response: NotificationViewResponse) { + this.id = response.id; + this.priority = response.priority; + this.title = response.title; + this.body = response.body; + this.date = response.date; + this.readDate = response.readDate; + this.deletedDate = response.deletedDate; + } + + static fromJSON(obj: Jsonify) { + return Object.assign(new NotificationViewData({} as NotificationViewResponse), obj, { + id: obj.id, + priority: obj.priority, + title: obj.title, + body: obj.body, + date: new Date(obj.date), + readDate: obj.readDate ? new Date(obj.readDate) : null, + deletedDate: obj.deletedDate ? new Date(obj.deletedDate) : null, + }); + } +} diff --git a/libs/vault/src/notifications/models/notification-view.response.ts b/libs/vault/src/notifications/models/notification-view.response.ts new file mode 100644 index 00000000000..bbebf25bd4e --- /dev/null +++ b/libs/vault/src/notifications/models/notification-view.response.ts @@ -0,0 +1,23 @@ +import { BaseResponse } from "@bitwarden/common/models/response/base.response"; +import { NotificationId } from "@bitwarden/common/types/guid"; + +export class NotificationViewResponse extends BaseResponse { + id: NotificationId; + priority: number; + title: string; + body: string; + date: Date; + readDate: Date; + deletedDate: Date; + + constructor(response: any) { + super(response); + this.id = this.getResponseProperty("Id"); + this.priority = this.getResponseProperty("Priority"); + this.title = this.getResponseProperty("Title"); + this.body = this.getResponseProperty("Body"); + this.date = this.getResponseProperty("Date"); + this.readDate = this.getResponseProperty("ReadDate"); + this.deletedDate = this.getResponseProperty("DeletedDate"); + } +} diff --git a/libs/vault/src/notifications/models/notification-view.ts b/libs/vault/src/notifications/models/notification-view.ts new file mode 100644 index 00000000000..b577a889d05 --- /dev/null +++ b/libs/vault/src/notifications/models/notification-view.ts @@ -0,0 +1,21 @@ +import { NotificationId } from "@bitwarden/common/types/guid"; + +export class NotificationView { + id: NotificationId; + priority: number; + title: string; + body: string; + date: Date; + readDate: Date | null; + deletedDate: Date | null; + + constructor(obj: any) { + this.id = obj.id; + this.priority = obj.priority; + this.title = obj.title; + this.body = obj.body; + this.date = obj.date; + this.readDate = obj.readDate; + this.deletedDate = obj.deletedDate; + } +} diff --git a/libs/vault/src/notifications/services/default-end-user-notification.service.spec.ts b/libs/vault/src/notifications/services/default-end-user-notification.service.spec.ts new file mode 100644 index 00000000000..ac4304998bc --- /dev/null +++ b/libs/vault/src/notifications/services/default-end-user-notification.service.spec.ts @@ -0,0 +1,193 @@ +import { TestBed } from "@angular/core/testing"; +import { firstValueFrom } from "rxjs"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { NotificationId, UserId } from "@bitwarden/common/types/guid"; +import { DefaultEndUserNotificationService } from "@bitwarden/vault"; + +import { FakeStateProvider, mockAccountServiceWith } from "../../../../common/spec"; +import { NotificationViewResponse } from "../models"; +import { NOTIFICATIONS } from "../state/end-user-notification.state"; + +describe("End User Notification Center Service", () => { + let fakeStateProvider: FakeStateProvider; + + const mockApiSend = jest.fn(); + + let testBed: TestBed; + + beforeEach(async () => { + mockApiSend.mockClear(); + + fakeStateProvider = new FakeStateProvider(mockAccountServiceWith("user-id" as UserId)); + + testBed = TestBed.configureTestingModule({ + imports: [], + providers: [ + DefaultEndUserNotificationService, + { + provide: StateProvider, + useValue: fakeStateProvider, + }, + { + provide: ApiService, + useValue: { + send: mockApiSend, + }, + }, + ], + }); + }); + + describe("notifications$", () => { + it("should return notifications from state when not null", async () => { + fakeStateProvider.singleUser.mockFor("user-id" as UserId, NOTIFICATIONS, [ + { + id: "notification-id" as NotificationId, + } as NotificationViewResponse, + ]); + + const { notifications$ } = testBed.inject(DefaultEndUserNotificationService); + + const result = await firstValueFrom(notifications$("user-id" as UserId)); + + expect(result.length).toBe(1); + expect(mockApiSend).not.toHaveBeenCalled(); + }); + + it("should return notifications API when state is null", async () => { + mockApiSend.mockResolvedValue({ + data: [ + { + id: "notification-id", + }, + ] as NotificationViewResponse[], + }); + + fakeStateProvider.singleUser.mockFor("user-id" as UserId, NOTIFICATIONS, null as any); + + const { notifications$ } = testBed.inject(DefaultEndUserNotificationService); + + const result = await firstValueFrom(notifications$("user-id" as UserId)); + + expect(result.length).toBe(1); + expect(mockApiSend).toHaveBeenCalledWith("GET", "/notifications", null, true, true); + }); + + it("should share the same observable for the same user", async () => { + const { notifications$ } = testBed.inject(DefaultEndUserNotificationService); + + const first = notifications$("user-id" as UserId); + const second = notifications$("user-id" as UserId); + + expect(first).toBe(second); + }); + }); + + describe("unreadNotifications$", () => { + it("should return unread notifications from state when read value is null", async () => { + fakeStateProvider.singleUser.mockFor("user-id" as UserId, NOTIFICATIONS, [ + { + id: "notification-id" as NotificationId, + readDate: null as any, + } as NotificationViewResponse, + ]); + + const { unreadNotifications$ } = testBed.inject(DefaultEndUserNotificationService); + + const result = await firstValueFrom(unreadNotifications$("user-id" as UserId)); + + expect(result.length).toBe(1); + expect(mockApiSend).not.toHaveBeenCalled(); + }); + }); + + describe("getNotifications", () => { + it("should call getNotifications returning notifications from API", async () => { + mockApiSend.mockResolvedValue({ + data: [ + { + id: "notification-id", + }, + ] as NotificationViewResponse[], + }); + const service = testBed.inject(DefaultEndUserNotificationService); + + await service.getNotifications("user-id" as UserId); + + expect(mockApiSend).toHaveBeenCalledWith("GET", "/notifications", null, true, true); + }); + }); + it("should update local state when notifications are updated", async () => { + mockApiSend.mockResolvedValue({ + data: [ + { + id: "notification-id", + }, + ] as NotificationViewResponse[], + }); + + const mock = fakeStateProvider.singleUser.mockFor( + "user-id" as UserId, + NOTIFICATIONS, + null as any, + ); + + const service = testBed.inject(DefaultEndUserNotificationService); + + await service.getNotifications("user-id" as UserId); + + expect(mock.nextMock).toHaveBeenCalledWith([ + expect.objectContaining({ + id: "notification-id" as NotificationId, + } as NotificationViewResponse), + ]); + }); + + describe("clear", () => { + it("should clear the local notification state for the user", async () => { + const mock = fakeStateProvider.singleUser.mockFor("user-id" as UserId, NOTIFICATIONS, [ + { + id: "notification-id" as NotificationId, + } as NotificationViewResponse, + ]); + + const service = testBed.inject(DefaultEndUserNotificationService); + + await service.clearState("user-id" as UserId); + + expect(mock.nextMock).toHaveBeenCalledWith([]); + }); + }); + + describe("markAsDeleted", () => { + it("should send an API request to mark the notification as deleted", async () => { + const service = testBed.inject(DefaultEndUserNotificationService); + + await service.markAsDeleted("notification-id" as NotificationId, "user-id" as UserId); + expect(mockApiSend).toHaveBeenCalledWith( + "DELETE", + "/notifications/notification-id/delete", + null, + true, + false, + ); + }); + }); + + describe("markAsRead", () => { + it("should send an API request to mark the notification as read", async () => { + const service = testBed.inject(DefaultEndUserNotificationService); + + await service.markAsRead("notification-id" as NotificationId, "user-id" as UserId); + expect(mockApiSend).toHaveBeenCalledWith( + "PATCH", + "/notifications/notification-id/read", + null, + true, + false, + ); + }); + }); +}); diff --git a/libs/vault/src/notifications/services/default-end-user-notification.service.ts b/libs/vault/src/notifications/services/default-end-user-notification.service.ts new file mode 100644 index 00000000000..517a968f8af --- /dev/null +++ b/libs/vault/src/notifications/services/default-end-user-notification.service.ts @@ -0,0 +1,104 @@ +import { Injectable } from "@angular/core"; +import { map, Observable, switchMap } from "rxjs"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { ListResponse } from "@bitwarden/common/models/response/list.response"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { filterOutNullish, perUserCache$ } from "../../utils/observable-utilities"; +import { EndUserNotificationService } from "../abstractions/end-user-notification.service"; +import { NotificationView, NotificationViewData, NotificationViewResponse } from "../models"; +import { NOTIFICATIONS } from "../state/end-user-notification.state"; + +/** + * A service for retrieving and managing notifications for end users. + */ +@Injectable() +export class DefaultEndUserNotificationService implements EndUserNotificationService { + constructor( + private stateProvider: StateProvider, + private apiService: ApiService, + ) {} + + notifications$ = perUserCache$((userId: UserId): Observable => { + return this.notificationState(userId).state$.pipe( + switchMap(async (notifications) => { + if (notifications == null) { + await this.fetchNotificationsFromApi(userId); + } + return notifications; + }), + filterOutNullish(), + map((notifications) => + notifications.map((notification) => new NotificationView(notification)), + ), + ); + }); + + unreadNotifications$ = perUserCache$((userId: UserId): Observable => { + return this.notifications$(userId).pipe( + map((notifications) => notifications.filter((notification) => notification.readDate == null)), + ); + }); + + async markAsRead(notificationId: any, userId: UserId): Promise { + await this.apiService.send("PATCH", `/notifications/${notificationId}/read`, null, true, false); + await this.getNotifications(userId); + } + + async markAsDeleted(notificationId: any, userId: UserId): Promise { + await this.apiService.send( + "DELETE", + `/notifications/${notificationId}/delete`, + null, + true, + false, + ); + await this.getNotifications(userId); + } + + upsert(notification: Notification): any {} + + async clearState(userId: UserId): Promise { + await this.updateNotificationState(userId, []); + } + + async getNotifications(userId: UserId) { + await this.fetchNotificationsFromApi(userId); + } + + /** + * Fetches the notifications from the API and updates the local state + * @param userId + * @private + */ + private async fetchNotificationsFromApi(userId: UserId): Promise { + const res = await this.apiService.send("GET", "/notifications", null, true, true); + const response = new ListResponse(res, NotificationViewResponse); + const notificationData = response.data.map((n) => new NotificationView(n)); + await this.updateNotificationState(userId, notificationData); + } + + /** + * Updates the local state with notifications and returns the updated state + * @param userId + * @param notifications + * @private + */ + private updateNotificationState( + userId: UserId, + notifications: NotificationViewData[], + ): Promise { + return this.notificationState(userId).update(() => notifications); + } + + /** + * Returns the local state for notifications + * @param userId + * @private + */ + private notificationState(userId: UserId) { + return this.stateProvider.getUser(userId, NOTIFICATIONS); + } +} diff --git a/libs/vault/src/notifications/state/end-user-notification.state.ts b/libs/vault/src/notifications/state/end-user-notification.state.ts new file mode 100644 index 00000000000..644c8e42429 --- /dev/null +++ b/libs/vault/src/notifications/state/end-user-notification.state.ts @@ -0,0 +1,15 @@ +import { Jsonify } from "type-fest"; + +import { NOTIFICATION_DISK, UserKeyDefinition } from "@bitwarden/common/platform/state"; + +import { NotificationViewData } from "../models"; + +export const NOTIFICATIONS = UserKeyDefinition.array( + NOTIFICATION_DISK, + "notifications", + { + deserializer: (notification: Jsonify) => + NotificationViewData.fromJSON(notification), + clearOn: ["logout", "lock"], + }, +); diff --git a/libs/vault/src/services/copy-cipher-field.service.spec.ts b/libs/vault/src/services/copy-cipher-field.service.spec.ts index 5a273c0828f..5b038376aee 100644 --- a/libs/vault/src/services/copy-cipher-field.service.spec.ts +++ b/libs/vault/src/services/copy-cipher-field.service.spec.ts @@ -136,10 +136,10 @@ describe("CopyCipherFieldService", () => { it("should get TOTP code when allowed from premium", async () => { billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); - totpService.getCode.mockResolvedValue("123456"); + totpService.getCode$.mockReturnValue(of({ code: "123456", period: 30 })); const result = await service.copy(valueToCopy, actionType, cipher, skipReprompt); expect(result).toBeTruthy(); - expect(totpService.getCode).toHaveBeenCalledWith(valueToCopy); + expect(totpService.getCode$).toHaveBeenCalledWith(valueToCopy); expect(platformUtilsService.copyToClipboard).toHaveBeenCalledWith("123456"); expect(billingAccountProfileStateService.hasPremiumFromAnySource$).toHaveBeenCalledWith( userId, @@ -148,10 +148,10 @@ describe("CopyCipherFieldService", () => { it("should get TOTP code when allowed from organization", async () => { cipher.organizationUseTotp = true; - totpService.getCode.mockResolvedValue("123456"); + totpService.getCode$.mockReturnValue(of({ code: "123456", period: 30 })); const result = await service.copy(valueToCopy, actionType, cipher, skipReprompt); expect(result).toBeTruthy(); - expect(totpService.getCode).toHaveBeenCalledWith(valueToCopy); + expect(totpService.getCode$).toHaveBeenCalledWith(valueToCopy); expect(platformUtilsService.copyToClipboard).toHaveBeenCalledWith("123456"); }); @@ -159,7 +159,7 @@ describe("CopyCipherFieldService", () => { billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(false)); const result = await service.copy(valueToCopy, actionType, cipher, skipReprompt); expect(result).toBeFalsy(); - expect(totpService.getCode).not.toHaveBeenCalled(); + expect(totpService.getCode$).not.toHaveBeenCalled(); expect(platformUtilsService.copyToClipboard).not.toHaveBeenCalled(); expect(billingAccountProfileStateService.hasPremiumFromAnySource$).toHaveBeenCalledWith( userId, @@ -170,7 +170,7 @@ describe("CopyCipherFieldService", () => { cipher.login.totp = null; const result = await service.copy(valueToCopy, actionType, cipher, skipReprompt); expect(result).toBeFalsy(); - expect(totpService.getCode).not.toHaveBeenCalled(); + expect(totpService.getCode$).not.toHaveBeenCalled(); expect(platformUtilsService.copyToClipboard).not.toHaveBeenCalled(); }); }); diff --git a/libs/vault/src/services/copy-cipher-field.service.ts b/libs/vault/src/services/copy-cipher-field.service.ts index 2805f3e7541..3f94b27cef8 100644 --- a/libs/vault/src/services/copy-cipher-field.service.ts +++ b/libs/vault/src/services/copy-cipher-field.service.ts @@ -124,7 +124,11 @@ export class CopyCipherFieldService { if (!(await this.totpAllowed(cipher))) { return false; } - valueToCopy = await this.totpService.getCode(valueToCopy); + const totpResponse = await firstValueFrom(this.totpService.getCode$(valueToCopy)); + if (!totpResponse?.code) { + return false; + } + valueToCopy = totpResponse.code; } this.platformUtilsService.copyToClipboard(valueToCopy); diff --git a/libs/vault/src/services/default-change-login-password.service.spec.ts b/libs/vault/src/services/default-change-login-password.service.spec.ts index 4805f298797..37123604e9a 100644 --- a/libs/vault/src/services/default-change-login-password.service.spec.ts +++ b/libs/vault/src/services/default-change-login-password.service.spec.ts @@ -131,13 +131,13 @@ describe("DefaultChangeLoginPasswordService", () => { const cipher = { type: CipherType.Login, login: Object.assign(new LoginView(), { - uris: [{ uri: "https://example.com" }], + uris: [{ uri: "https://example.com/" }], }), } as CipherView; const url = await service.getChangePasswordUrl(cipher); - expect(url).toBe("https://example.com"); + expect(url).toBe("https://example.com/"); }); it("should return the original URI when the well-known URL is not found", async () => { @@ -146,12 +146,42 @@ describe("DefaultChangeLoginPasswordService", () => { const cipher = { type: CipherType.Login, login: Object.assign(new LoginView(), { - uris: [{ uri: "https://example.com" }], + uris: [{ uri: "https://example.com/" }], }), } as CipherView; const url = await service.getChangePasswordUrl(cipher); - expect(url).toBe("https://example.com"); + expect(url).toBe("https://example.com/"); + }); + + it("should try the next URI if the first one fails", async () => { + mockApiService.nativeFetch.mockImplementation((request) => { + if ( + request.url.endsWith("resource-that-should-not-exist-whose-status-code-should-not-be-200") + ) { + return Promise.resolve(mockShouldNotExistResponse); + } + + if (request.url.endsWith(".well-known/change-password")) { + if (request.url.includes("working.com")) { + return Promise.resolve(mockWellKnownResponse); + } + return Promise.resolve(new Response("Not Found", { status: 404 })); + } + + throw new Error("Unexpected request"); + }); + + const cipher = { + type: CipherType.Login, + login: Object.assign(new LoginView(), { + uris: [{ uri: "https://no-wellknown.com/" }, { uri: "https://working.com/" }], + }), + } as CipherView; + + const url = await service.getChangePasswordUrl(cipher); + + expect(url).toBe("https://working.com/.well-known/change-password"); }); }); diff --git a/libs/vault/src/services/default-change-login-password.service.ts b/libs/vault/src/services/default-change-login-password.service.ts index 82f272f1ede..29818f95c0a 100644 --- a/libs/vault/src/services/default-change-login-password.service.ts +++ b/libs/vault/src/services/default-change-login-password.service.ts @@ -20,25 +20,31 @@ export class DefaultChangeLoginPasswordService implements ChangeLoginPasswordSer return null; } - // Find the first valid URL that is an HTTP or HTTPS URL - const url = cipher.login.uris + // Filter for valid URLs that are HTTP(S) + const urls = cipher.login.uris .map((m) => Utils.getUrl(m.uri)) - .find((m) => m != null && (m.protocol === "http:" || m.protocol === "https:")); + .filter((m) => m != null && (m.protocol === "http:" || m.protocol === "https:")); - if (url == null) { + if (urls.length === 0) { return null; } - const [reliable, wellKnownChangeUrl] = await Promise.all([ - this.hasReliableHttpStatusCode(url.origin), - this.getWellKnownChangePasswordUrl(url.origin), - ]); + for (const url of urls) { + const [reliable, wellKnownChangeUrl] = await Promise.all([ + this.hasReliableHttpStatusCode(url.origin), + this.getWellKnownChangePasswordUrl(url.origin), + ]); - if (!reliable || wellKnownChangeUrl == null) { - return url.origin; + // Some servers return a 200 OK for a resource that should not exist + // Which means we cannot trust the well-known URL is valid, so we skip it + // to avoid potentially sending users to a 404 page + if (reliable && wellKnownChangeUrl != null) { + return wellKnownChangeUrl; + } } - return wellKnownChangeUrl; + // No reliable well-known URL found, fallback to the first URL + return urls[0].href; } /** diff --git a/libs/vault/src/services/default-ssh-import-prompt.service.ts b/libs/vault/src/services/default-ssh-import-prompt.service.ts new file mode 100644 index 00000000000..c4e51dd3638 --- /dev/null +++ b/libs/vault/src/services/default-ssh-import-prompt.service.ts @@ -0,0 +1,109 @@ +import { Injectable } from "@angular/core"; +import { firstValueFrom } from "rxjs"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SshKeyApi } from "@bitwarden/common/vault/models/api/ssh-key.api"; +import { SshKeyData } from "@bitwarden/common/vault/models/data/ssh-key.data"; +import { DialogService, ToastService } from "@bitwarden/components"; +import { SshKeyPasswordPromptComponent } from "@bitwarden/importer-ui"; +import { import_ssh_key, SshKeyImportError, SshKeyView } from "@bitwarden/sdk-internal"; + +import { SshImportPromptService } from "./ssh-import-prompt.service"; + +/** + * Used to import ssh keys and prompt for their password. + */ +@Injectable() +export class DefaultSshImportPromptService implements SshImportPromptService { + constructor( + private dialogService: DialogService, + private toastService: ToastService, + private platformUtilsService: PlatformUtilsService, + private i18nService: I18nService, + ) {} + + async importSshKeyFromClipboard(): Promise { + const key = await this.platformUtilsService.readFromClipboard(); + + let isPasswordProtectedSshKey = false; + + let parsedKey: SshKeyView | null = null; + + try { + parsedKey = import_ssh_key(key); + } catch (e) { + const error = e as SshKeyImportError; + if (error.variant === "PasswordRequired" || error.variant === "WrongPassword") { + isPasswordProtectedSshKey = true; + } else { + this.toastService.showToast({ + variant: "error", + title: "", + message: this.i18nService.t(this.sshImportErrorVariantToI18nKey(error.variant)), + }); + return null; + } + } + + if (isPasswordProtectedSshKey) { + for (;;) { + const password = await this.getSshKeyPassword(); + if (password === "" || password == null) { + return null; + } + + try { + parsedKey = import_ssh_key(key, password); + break; + } catch (e) { + const error = e as SshKeyImportError; + if (error.variant !== "WrongPassword") { + this.toastService.showToast({ + variant: "error", + title: "", + message: this.i18nService.t(this.sshImportErrorVariantToI18nKey(error.variant)), + }); + return null; + } + } + } + } + + this.toastService.showToast({ + variant: "success", + title: "", + message: this.i18nService.t("sshKeyImported"), + }); + + return new SshKeyData( + new SshKeyApi({ + privateKey: parsedKey!.privateKey, + publicKey: parsedKey!.publicKey, + keyFingerprint: parsedKey!.fingerprint, + }), + ); + } + + private sshImportErrorVariantToI18nKey(variant: string): string { + switch (variant) { + case "ParsingError": + return "invalidSshKey"; + case "UnsupportedKeyType": + return "sshKeyTypeUnsupported"; + case "PasswordRequired": + case "WrongPassword": + return "sshKeyWrongPassword"; + default: + return "errorOccurred"; + } + } + + private async getSshKeyPassword(): Promise { + const dialog = this.dialogService.open(SshKeyPasswordPromptComponent, { + ariaModal: true, + }); + + return await firstValueFrom(dialog.closed); + } +} diff --git a/libs/vault/src/services/ssh-import-prompt.service.spec.ts b/libs/vault/src/services/ssh-import-prompt.service.spec.ts new file mode 100644 index 00000000000..49b2b898d7a --- /dev/null +++ b/libs/vault/src/services/ssh-import-prompt.service.spec.ts @@ -0,0 +1,111 @@ +import { MockProxy, mock } from "jest-mock-extended"; +import { BehaviorSubject } from "rxjs"; + +import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { SshKeyApi } from "@bitwarden/common/vault/models/api/ssh-key.api"; +import { SshKeyData } from "@bitwarden/common/vault/models/data/ssh-key.data"; +import { DialogService, ToastService } from "@bitwarden/components"; +import * as sdkInternal from "@bitwarden/sdk-internal"; + +import { DefaultSshImportPromptService } from "./default-ssh-import-prompt.service"; + +jest.mock("@bitwarden/sdk-internal"); + +const exampleSshKey = { + privateKey: "private_key", + publicKey: "public_key", + fingerprint: "key_fingerprint", +} as sdkInternal.SshKeyView; + +const exampleSshKeyData = new SshKeyData( + new SshKeyApi({ + publicKey: exampleSshKey.publicKey, + privateKey: exampleSshKey.privateKey, + keyFingerprint: exampleSshKey.fingerprint, + }), +); + +describe("SshImportPromptService", () => { + let sshImportPromptService: DefaultSshImportPromptService; + + let dialogService: MockProxy; + let toastService: MockProxy; + let platformUtilsService: MockProxy; + let i18nService: MockProxy; + + beforeEach(() => { + dialogService = mock(); + toastService = mock(); + platformUtilsService = mock(); + i18nService = mock(); + + sshImportPromptService = new DefaultSshImportPromptService( + dialogService, + toastService, + platformUtilsService, + i18nService, + ); + jest.clearAllMocks(); + }); + + describe("importSshKeyFromClipboard()", () => { + it("imports unencrypted ssh key", async () => { + jest.spyOn(sdkInternal, "import_ssh_key").mockReturnValue(exampleSshKey); + platformUtilsService.readFromClipboard.mockResolvedValue("ssh_key"); + expect(await sshImportPromptService.importSshKeyFromClipboard()).toEqual(exampleSshKeyData); + }); + + it("requests password for encrypted ssh key", async () => { + jest + .spyOn(sdkInternal, "import_ssh_key") + .mockImplementationOnce(() => { + throw { variant: "PasswordRequired" }; + }) + .mockImplementationOnce(() => exampleSshKey); + dialogService.open.mockReturnValue({ closed: new BehaviorSubject("password") } as any); + platformUtilsService.readFromClipboard.mockResolvedValue("ssh_key"); + + expect(await sshImportPromptService.importSshKeyFromClipboard()).toEqual(exampleSshKeyData); + expect(dialogService.open).toHaveBeenCalled(); + }); + + it("cancels when no password was provided", async () => { + jest.spyOn(sdkInternal, "import_ssh_key").mockImplementationOnce(() => { + throw { variant: "PasswordRequired" }; + }); + dialogService.open.mockReturnValue({ closed: new BehaviorSubject("") } as any); + platformUtilsService.readFromClipboard.mockResolvedValue("ssh_key"); + + expect(await sshImportPromptService.importSshKeyFromClipboard()).toEqual(null); + expect(dialogService.open).toHaveBeenCalled(); + }); + + it("passes through error on no password", async () => { + jest.spyOn(sdkInternal, "import_ssh_key").mockImplementationOnce(() => { + throw { variant: "UnsupportedKeyType" }; + }); + platformUtilsService.readFromClipboard.mockResolvedValue("ssh_key"); + + expect(await sshImportPromptService.importSshKeyFromClipboard()).toEqual(null); + expect(i18nService.t).toHaveBeenCalledWith("sshKeyTypeUnsupported"); + }); + + it("passes through error with password", async () => { + jest + .spyOn(sdkInternal, "import_ssh_key") + .mockClear() + .mockImplementationOnce(() => { + throw { variant: "PasswordRequired" }; + }) + .mockImplementationOnce(() => { + throw { variant: "UnsupportedKeyType" }; + }); + platformUtilsService.readFromClipboard.mockResolvedValue("ssh_key"); + dialogService.open.mockReturnValue({ closed: new BehaviorSubject("password") } as any); + + expect(await sshImportPromptService.importSshKeyFromClipboard()).toEqual(null); + expect(i18nService.t).toHaveBeenCalledWith("sshKeyTypeUnsupported"); + }); + }); +}); diff --git a/libs/vault/src/services/ssh-import-prompt.service.ts b/libs/vault/src/services/ssh-import-prompt.service.ts new file mode 100644 index 00000000000..aae5159895b --- /dev/null +++ b/libs/vault/src/services/ssh-import-prompt.service.ts @@ -0,0 +1,5 @@ +import { SshKeyData } from "@bitwarden/common/vault/models/data/ssh-key.data"; + +export abstract class SshImportPromptService { + abstract importSshKeyFromClipboard: () => Promise; +} diff --git a/libs/vault/tsconfig.json b/libs/vault/tsconfig.json index e1515183f22..6039dccd811 100644 --- a/libs/vault/tsconfig.json +++ b/libs/vault/tsconfig.json @@ -8,11 +8,13 @@ "@bitwarden/auth/common": ["../auth/src/common"], "@bitwarden/common/*": ["../common/src/*"], "@bitwarden/components": ["../components/src"], + "@bitwarden/importer-ui": ["../importer/src/components"], "@bitwarden/generator-components": ["../tools/generator/components/src"], "@bitwarden/generator-core": ["../tools/generator/core/src"], "@bitwarden/generator-history": ["../tools/generator/extensions/history/src"], "@bitwarden/generator-legacy": ["../tools/generator/extensions/legacy/src"], "@bitwarden/generator-navigation": ["../tools/generator/extensions/navigation/src"], + "@bitwarden/vault-export-core": ["../tools/export/vault-export/vault-export-core/src"], "@bitwarden/key-management": ["../key-management/src"], "@bitwarden/platform": ["../platform/src"], "@bitwarden/ui-common": ["../ui/common/src"], diff --git a/package-lock.json b/package-lock.json index ab526f2730b..eaf5c0f24ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.107", + "@bitwarden/sdk-internal": "0.2.0-main.124", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", @@ -43,7 +43,7 @@ "commander": "11.1.0", "core-js": "3.40.0", "form-data": "4.0.1", - "https-proxy-agent": "7.0.5", + "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jquery": "3.7.1", "jsdom": "26.0.0", @@ -58,7 +58,6 @@ "ngx-toastr": "19.0.0", "node-fetch": "2.6.12", "node-forge": "1.3.1", - "nord": "0.2.1", "oidc-client-ts": "2.4.1", "open": "8.4.2", "papaparse": "5.5.2", @@ -97,7 +96,7 @@ "@storybook/theming": "8.5.2", "@storybook/web-components-webpack5": "8.5.2", "@types/argon2-browser": "1.18.4", - "@types/chrome": "0.0.280", + "@types/chrome": "0.0.306", "@types/firefox-webext-browser": "120.0.4", "@types/inquirer": "8.2.10", "@types/jest": "29.5.12", @@ -190,11 +189,11 @@ }, "apps/browser": { "name": "@bitwarden/browser", - "version": "2025.2.2" + "version": "2025.3.0" }, "apps/cli": { "name": "@bitwarden/cli", - "version": "2025.2.0", + "version": "2025.3.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@koa/multer": "3.0.2", @@ -205,7 +204,7 @@ "chalk": "4.1.2", "commander": "11.1.0", "form-data": "4.0.1", - "https-proxy-agent": "7.0.5", + "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jsdom": "26.0.0", "jszip": "3.10.1", @@ -230,7 +229,7 @@ }, "apps/desktop": { "name": "@bitwarden/desktop", - "version": "2025.2.2", + "version": "2025.3.0", "hasInstallScript": true, "license": "GPL-3.0" }, @@ -244,7 +243,7 @@ }, "apps/web": { "name": "@bitwarden/web-vault", - "version": "2025.2.2" + "version": "2025.3.0" }, "libs/admin-console": { "name": "@bitwarden/admin-console", @@ -760,6 +759,16 @@ "@types/send": "*" } }, + "node_modules/@angular-devkit/build-angular/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -881,6 +890,20 @@ "node": ">= 6" } }, + "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", @@ -2091,6 +2114,16 @@ "semver": "bin/semver.js" } }, + "node_modules/@angular/build/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/@angular/build/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2136,6 +2169,20 @@ "node": ">= 6" } }, + "node_modules/@angular/build/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@angular/build/node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", @@ -4651,10 +4698,9 @@ "link": true }, "node_modules/@bitwarden/sdk-internal": { - "version": "0.2.0-main.107", - "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.107.tgz", - "integrity": "sha512-xpOF6NAS0/em3jFBv4FI1ASy1Nuc7I1v41TVmG56wS+80y+NH1RnfGjp+a+XiO7Xxh3jssrxmjzihJjWQQA0rg==", - "license": "GPL-3.0" + "version": "0.2.0-main.124", + "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.124.tgz", + "integrity": "sha512-7F+DlPFng/thT4EVIQk2tRC7kff6G2B7alHAIxBdioJc9vE64Z5R5pviUyMZzqLnA5e9y8EnQdtWsQzUkHxisQ==" }, "node_modules/@bitwarden/send-ui": { "resolved": "libs/tools/send/send-ui", @@ -10905,9 +10951,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.0.280", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.280.tgz", - "integrity": "sha512-AotSmZrL9bcZDDmSI1D9dE7PGbhOur5L0cKxXd7IqbVizQWCY4gcvupPUVsQ4FfDj3V2tt/iOpomT9EY0s+w1g==", + "version": "0.0.306", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.306.tgz", + "integrity": "sha512-95kgcqvTNcaZCXmx/kIKY6uo83IaRNT3cuPxYqlB2Iu+HzKDCP4t7TUe7KhJijTdibcvn+SzziIcfSLIlgRnhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21273,12 +21319,12 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -24155,19 +24201,6 @@ "node": ">= 14" } }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/jsdom/node_modules/tough-cookie": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.1.tgz", @@ -28021,12 +28054,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/nord": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/nord/-/nord-0.2.1.tgz", - "integrity": "sha512-/AD7JGJbcp1pB5XwYkJyivqdeXofUP5u2lkif6vLGLc+SsV9OCC0JFNpVwM5pqHuFqbyojRt6xILuidJOwwJDQ==", - "license": "(Apache-2.0 AND CC-BY-SA-4.0)" - }, "node_modules/normalize-package-data": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", diff --git a/package.json b/package.json index cb941238fc2..943fde5fcf3 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@storybook/theming": "8.5.2", "@storybook/web-components-webpack5": "8.5.2", "@types/argon2-browser": "1.18.4", - "@types/chrome": "0.0.280", + "@types/chrome": "0.0.306", "@types/firefox-webext-browser": "120.0.4", "@types/inquirer": "8.2.10", "@types/jest": "29.5.12", @@ -154,7 +154,7 @@ "@angular/platform-browser": "18.2.13", "@angular/platform-browser-dynamic": "18.2.13", "@angular/router": "18.2.13", - "@bitwarden/sdk-internal": "0.2.0-main.107", + "@bitwarden/sdk-internal": "0.2.0-main.124", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "3.0.2", @@ -173,7 +173,7 @@ "commander": "11.1.0", "core-js": "3.40.0", "form-data": "4.0.1", - "https-proxy-agent": "7.0.5", + "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", "jquery": "3.7.1", "jsdom": "26.0.0", @@ -188,7 +188,6 @@ "ngx-toastr": "19.0.0", "node-fetch": "2.6.12", "node-forge": "1.3.1", - "nord": "0.2.1", "oidc-client-ts": "2.4.1", "open": "8.4.2", "papaparse": "5.5.2",