diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index de28b210887..081fecf1310 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -34,8 +34,11 @@ libs/common/src/models/export @bitwarden/team-tools-dev libs/common/src/tools @bitwarden/team-tools-dev libs/importer @bitwarden/team-tools-dev libs/tools @bitwarden/team-tools-dev -bitwarden_license/bit-web/src/app/tools @bitwarden/team-tools-dev -bitwarden_license/bit-common/src/tools @bitwarden/team-tools-dev + +## Dirt (Data Insights & Reporting) team files ## +apps/web/src/app/dirt @bitwarden/team-data-insights-and-reporting-dev +bitwarden_license/bit-common/src/dirt @bitwarden/team-data-insights-and-reporting-dev +bitwarden_license/bit-web/src/app/dirt @bitwarden/team-data-insights-and-reporting-dev ## Localization/Crowdin (Platform and Tools team) apps/browser/src/_locales @bitwarden/team-tools-dev @bitwarden/team-platform-dev @@ -182,5 +185,8 @@ apps/web/src/locales/en/messages.json **/entrypoint.sh ## Overrides -# tsconfig files are potentially dangerous and will be reviewed by platform to prevent misconfigurations +# For the time being platform owns tsconfig and jest config +# These overrides will be removed after Nx is implemented +# To track that effort please see https://bitwarden.atlassian.net/browse/PM-21636 **/tsconfig.json @bitwarden/team-platform-dev +**/jest.config.js @bitwarden/team-platform-dev diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 91b4ac86328..d0066ddd7ba 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -51,6 +51,13 @@ commitMessagePrefix: "[deps] BRE:", addLabels: ["hold"], }, + { + // By default, we send patch updates to the Dependency Dashboard and do not generate a PR. + // We want to generate PRs for a select number of dependencies to ensure we stay up to date on these. + matchPackageNames: ["browserslist", "electron", "rxjs", "typescript", "webpack"], + matchUpdateTypes: ["patch"], + dependencyDashboardApproval: false, + }, { // Disable major and minor updates for TypeScript and Zone.js because they are managed by Angular. matchPackageNames: ["typescript", "zone.js"], @@ -129,6 +136,8 @@ { matchPackageNames: [ "@angular-eslint/schematics", + "@typescript-eslint/rule-tester", + "@typescript-eslint/utils", "angular-eslint", "eslint-config-prettier", "eslint-import-resolver-typescript", @@ -213,7 +222,6 @@ "@types/chrome", "@types/firefox-webext-browser", "@types/glob", - "@types/jquery", "@types/lowdb", "@types/node", "@types/node-forge", @@ -303,6 +311,7 @@ "@angular/platform-browser", "@angular/platform", "@angular/router", + "axe-playwright", "@compodoc/compodoc", "@ng-select/ng-select", "@storybook/addon-a11y", @@ -311,6 +320,7 @@ "@storybook/addon-essentials", "@storybook/addon-interactions", "@storybook/addon-links", + "@storybook/test-runner", "@storybook/addon-themes", "@storybook/angular", "@storybook/manager-api", @@ -319,9 +329,7 @@ "autoprefixer", "bootstrap", "chromatic", - "jquery", "ngx-toastr", - "popper.js", "react", "react-dom", "remark-gfm", diff --git a/.github/workflows/build-browser-target.yml b/.github/workflows/build-browser-target.yml index 6f05cb71934..a2ae48d419b 100644 --- a/.github/workflows/build-browser-target.yml +++ b/.github/workflows/build-browser-target.yml @@ -8,10 +8,9 @@ name: Build Browser on PR Target on: pull_request_target: - types: [opened, synchronize] - branches-ignore: - - 'l10n_master' - - 'cf-pages' + types: [opened, synchronize, reopened] + branches: + - main paths: - 'apps/browser/**' - 'libs/**' diff --git a/.github/workflows/build-cli-target.yml b/.github/workflows/build-cli-target.yml index f817046ff30..6b493d4e6d9 100644 --- a/.github/workflows/build-cli-target.yml +++ b/.github/workflows/build-cli-target.yml @@ -8,10 +8,9 @@ name: Build CLI on PR Target on: pull_request_target: - types: [opened, synchronize] - branches-ignore: - - 'l10n_master' - - 'cf-pages' + types: [opened, synchronize, reopened] + branches: + - main paths: - 'apps/cli/**' - 'libs/**' diff --git a/.github/workflows/build-desktop-target.yml b/.github/workflows/build-desktop-target.yml index 65772223722..fa21b3fe5d9 100644 --- a/.github/workflows/build-desktop-target.yml +++ b/.github/workflows/build-desktop-target.yml @@ -9,10 +9,9 @@ name: Build Desktop on PR Target on: pull_request_target: - types: [opened, synchronize] - branches-ignore: - - 'l10n_master' - - 'cf-pages' + types: [opened, synchronize, reopened] + branches: + - main paths: - 'apps/desktop/**' - 'libs/**' diff --git a/.github/workflows/build-web-target.yml b/.github/workflows/build-web-target.yml index 8f06d066d34..ca10e6d46f2 100644 --- a/.github/workflows/build-web-target.yml +++ b/.github/workflows/build-web-target.yml @@ -8,10 +8,9 @@ name: Build Web on PR Target on: pull_request_target: - types: [opened, synchronize] - branches-ignore: - - 'l10n_master' - - 'cf-pages' + types: [opened, synchronize, reopened] + branches: + - main paths: - 'apps/web/**' - 'libs/**' diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 630e1e55682..275b867390e 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -291,7 +291,7 @@ jobs: - name: Install Cosign if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 + uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2 - name: Sign image with Cosign if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index f436f1b3760..47f3b310504 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -73,7 +73,7 @@ jobs: run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@8a12962215a66cd05b1ac5b0f1c08768d1aab155 # v11.25.0 + uses: chromaui/action@e8cc4c31775280b175a3c440076c00d19a9014d7 # v11.28.2 with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 32907699747..2fc035ec038 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -22,7 +22,7 @@ jobs: crowdin_project_id: "308189" steps: - name: Generate GH App token - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.github/workflows/repository-management.yml b/.github/workflows/repository-management.yml index 06daf70d7c9..8ab74adf543 100644 --- a/.github/workflows/repository-management.yml +++ b/.github/workflows/repository-management.yml @@ -66,7 +66,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Generate GH App token - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} @@ -115,7 +115,7 @@ jobs: version: ${{ inputs.version_number_override }} - name: Generate GH App token - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} @@ -452,7 +452,7 @@ jobs: - setup steps: - name: Generate GH App token - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index 77b66ba8bf1..585115ef6dd 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -7,8 +7,14 @@ on: - "main" - "rc" - "hotfix-rc" + pull_request: + types: [opened, synchronize, reopened] + branches-ignore: + - main pull_request_target: - types: [opened, synchronize] + types: [opened, synchronize, reopened] + branches: + - "main" jobs: check-run: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6411337f6e9..64cc86f1db6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ on: - "rc" - "hotfix-rc-*" pull_request: - types: [opened, synchronize] + types: [ opened, synchronize ] jobs: @@ -58,7 +58,7 @@ jobs: run: npm test -- --coverage --maxWorkers=3 - name: Report test results - uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1 + uses: dorny/test-reporter@6e6a65b7a0bd2c9197df7d0ae36ac5cee784230c # v2.0.0 if: ${{ github.event.pull_request.head.repo.full_name == github.repository && !cancelled() }} with: name: Test Results @@ -66,11 +66,14 @@ jobs: reporter: jest-junit fail-on-error: true - - name: Upload coverage to codecov.io - uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303 # v5.1.2 - - name: Upload results to codecov.io - uses: codecov/test-results-action@4e79e65778be1cecd5df25e14af1eafb6df80ea9 # v1.0.2 + uses: codecov/test-results-action@f2dba722c67b86c6caa034178c6e4d35335f6706 # v1.1.0 + + - name: Upload test coverage + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + with: + name: jest-coverage + path: ./coverage/lcov.info rust: name: Run Rust tests on ${{ matrix.os }} @@ -148,7 +151,37 @@ jobs: working-directory: ./apps/desktop/desktop_native run: cargo llvm-cov --all-features --lcov --output-path lcov.info --workspace --no-cfg-coverage - - name: Upload to codecov.io - uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 + - name: Upload test coverage + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: - files: ./apps/desktop/desktop_native/lcov.info + name: rust-coverage + path: ./apps/desktop/desktop_native/lcov.info + + upload-codecov: + name: Upload to Codecov + runs-on: ubuntu-22.04 + needs: + - testing + - rust-coverage + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Download jest coverage + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: jest-coverage + path: ./ + + - name: Download rust coverage + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: rust-coverage + path: ./apps/desktop/desktop_native + + - name: Upload coverage to codecov.io + uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2 + with: + files: | + ./lcov.info + ./apps/desktop/desktop_native/lcov.info diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index 9431eab37c5..e8bd1dde246 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Generate GH App token - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: app-id: ${{ secrets.BW_GHAPP_ID }} diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 6bd28cfe809..a948fce0428 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -26,6 +26,9 @@ const preview: Preview = { wrapperDecorator, ], parameters: { + a11y: { + element: "#storybook-root", + }, controls: { matchers: { color: /(background|color)$/i, diff --git a/.storybook/test-runner.ts b/.storybook/test-runner.ts new file mode 100644 index 00000000000..208adf96214 --- /dev/null +++ b/.storybook/test-runner.ts @@ -0,0 +1,47 @@ +import { type TestRunnerConfig } from "@storybook/test-runner"; +import { injectAxe, checkA11y } from "axe-playwright"; + +const testRunnerConfig: TestRunnerConfig = { + setup() {}, + + async preVisit(page, context) { + return await injectAxe(page); + }, + + async postVisit(page, context) { + await page.waitForSelector("#storybook-root"); + // https://github.com/abhinaba-ghosh/axe-playwright#parameters-on-checka11y-axerun + await checkA11y( + // Playwright page instance. + page, + + // context + "#storybook-root", + + // axeOptions, see https://www.deque.com/axe/core-documentation/api-documentation/#parameters-axerun + { + detailedReport: true, + detailedReportOptions: { + // Includes the full html for invalid nodes + html: true, + }, + verbose: false, + }, + + // skipFailures + false, + + // reporter "v2" is terminal reporter, "html" writes results to file + "v2", + + // axeHtmlReporterOptions + // NOTE: set reporter param (above) to "html" to activate these options + { + outputDir: "reports/a11y", + reportFileName: `${context.id}.html`, + }, + ); + }, +}; + +export default testRunnerConfig; diff --git a/angular.json b/angular.json index 665d810cf4e..87ee7dc57b2 100644 --- a/angular.json +++ b/angular.json @@ -6,6 +6,32 @@ "analytics": false }, "projects": { + "bit-web": { + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + } + }, + "root": "bitwarden_license/bit-web", + "sourceRoot": "bitwarden_license/bit-web/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/web", + "index": "apps/web/src/index.html", + "main": "bitwarden_license/bit-web/src/app/main.ts", + "polyfills": "apps/web/src/polyfills.ts", + "tsConfig": "bitwarden_license/bit-web/tsconfig.json", + "assets": ["apps/web/src/favicon.ico"], + "styles": [], + "scripts": [] + } + } + } + }, "web": { "projectType": "application", "schematics": { @@ -22,8 +48,8 @@ "options": { "outputPath": "dist/web", "index": "apps/web/src/index.html", - "main": "apps/web/src/app/main.ts", - "polyfills": "apps/web/src/app/polyfills.ts", + "main": "apps/web/src/main.ts", + "polyfills": "apps/web/src/polyfills.ts", "tsConfig": "apps/web/tsconfig.json", "assets": ["apps/web/src/favicon.ico"], "styles": [], diff --git a/apps/browser/package.json b/apps/browser/package.json index 9ed3c807c11..6237d91d4db 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.4.0", + "version": "2025.5.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/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index c2f3c72f281..cfea18c24d2 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 3550ec52462..20b7ae11103 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Cihaz güvənlidir" }, + "trustOrganization": { + "message": "Təşkilata güvən" + }, + "trust": { + "message": "Güvən" + }, + "doNotTrust": { + "message": "Güvənmə" + }, + "organizationNotTrusted": { + "message": "Təşkilata güvənilmir" + }, + "emergencyAccessTrustWarning": { + "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal müraciəti icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" + }, + "orgTrustWarning": { + "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu təşkilatın üzvüsünüzsə, hesab geri qaytarma fəaldırsa və aşağıda görünən barmaq izi təşkilatın barmaq izi ilə uyuşursa davam edin." + }, + "orgTrustWarning1": { + "message": "Bu təşkilat, sahib olduğu Müəssisə siyasəti ilə sizi hesabın qaytarılması prosesinə yazdıracaq. Yazılma, təşkilat inzibatçılarının parolunuzu dəyişdirməsinə imkan verəcək. Yalnız bu təşkilatı tanıyırsınızsa və aşağıda görünən barmaq izi ifadəsi, təşkilatın barmaq izi ifadəsi ilə uyuşursa davam edin." + }, + "trustUser": { + "message": "İstifadəçiyə güvən" + }, "sendsNoItemsTitle": { "message": "Aktiv \"Send\" yoxdur", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Bu qoşmanı birdəfəlik silmək istədiyinizə əminsiniz?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Vacib bildiriş" - }, - "setupTwoStepLogin": { - "message": "İki addımlı girişi qur" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden, 2025-ci ilin Fevral ayından etibarən yeni cihazlardan gələn girişləri doğrulamaq üçün hesabınızın e-poçtuna bir kod göndərəcək." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Hesabınızı qorumaq üçün alternativ bir yol kimi iki addımlı girişi qura və ya e-poçtunuzu müraciət edə biləcəyiniz e-poçtla dəyişdirə bilərsiniz." - }, - "remindMeLater": { - "message": "Daha sonra xatırlat" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "$EMAIL$ e-poçtunuza güvənli şəkildə müraciət edə bilirsiniz?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Xeyr, edə bilmirəm" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Bəli, e-poçtuma güvənli şəkildə müraciət edə bilirəm" - }, - "turnOnTwoStepLogin": { - "message": "İki addımlı girişi işə sal" - }, - "changeAcctEmail": { - "message": "Hesabın e-poçtunu dəyişdir" - }, "extensionWidth": { "message": "Uzantı eni" }, @@ -5202,10 +5211,10 @@ "message": "Riskli parolları dəyişdir" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Seyf seçimləri" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Seyf, yalnız parollarızı yox, həm də daha çoxunu qoruyur. Giriş məlumatlarınızı, kimlikləri, kartları və notları burada güvənli şəkildə saxlayın." }, "introCarouselLabel": { "message": "Bitwarden-ə xoş gəlmisiniz" @@ -5235,48 +5244,67 @@ "message": "Bitwarden mobil, brauzer və masaüstü tətbiqləri ilə limitsiz cihaz arasında limitsiz parol saxlayın." }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Mövcud parolları daxilə köçür" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Giriş məlumatlarını əllə daxil etmədən daha tez daxilə köçürmək üçün \"Daxilə köçürücü\"nü istifadə edin." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "İndi daxilə köçür" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Seyfinizə xoş gəlmisiniz!" }, "hasItemsVaultNudgeBody": { - "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" + "message": "Hazırkı səhifə üçün elementləri avto-doldurun\nAsan müraciət üçün sevimli elementlər\nSeyfinizdə başqa elementləri axtarın" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Avto-doldurma ilə vaxta qənaət edin" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Problemsiz onlayn ödəniş" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Kartlarla, ödəniş xanalarını təhlükəsiz və doğru şəkildə avtomatik doldurun." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Hesab yaratmanı sadələşdirin" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Kimliklərinizlə, uzun qeydiyyat və ya əlaqə xanalarını daha tez avtomatik doldurun." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Həssas datalarınızı güvənli şəkildə saxlayın" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas dataları təhlükəsiz saxlayın." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Gəlişdirici dostu SSH müraciəti" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 20c5bb8ff35..cfe2f54b6a7 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Давераная прылада" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Няма актыўных Send'аў", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 2bc42c0e6c9..cd6ff6dbbc8 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Устройството е доверено" }, + "trustOrganization": { + "message": "Даване на доверие на организацията" + }, + "trust": { + "message": "Даване на доверие" + }, + "doNotTrust": { + "message": "Да не се дава доверие" + }, + "organizationNotTrusted": { + "message": "Организацията не е доверена" + }, + "emergencyAccessTrustWarning": { + "message": "С оглед на сигурността на акаунта Ви, потвърдете само, ако сте дали на този потребител достъп за спешни случаи и ако отпечатъкът му съвпада с това, което се вижда в акаунта му" + }, + "orgTrustWarning": { + "message": "С оглед на сигурността на акаунта Ви, продължете само, ако сте член на тази организация, ако възстановяването на акаунта Ви е включено и ако отпечатъкът показан по-долу съвпада с този на организацията." + }, + "orgTrustWarning1": { + "message": "Тази организация има политика от плана за големи организации, която ще Ви включи в схемата за възстановяване на акаунти. Това включване ще позволи на администраторите да променят паролата Ви. Продължете само, ако разпознавате тази организация и уникалната фраза показана по-долу съвпада с отпечатъка на организацията." + }, + "trustUser": { + "message": "Даване на доверие на потребителя" + }, "sendsNoItemsTitle": { "message": "Няма активни Изпращания", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Сваляне на Битуорден" + }, + "downloadBitwardenOnAllDevices": { + "message": "Сваляне на Битуорден на всички устройства" + }, + "getTheMobileApp": { + "message": "Свалете мобилното приложение" + }, + "getTheMobileAppDesc": { + "message": "Разполагайте с паролите си дори когато сте в движение, с мобилното приложение на Битуорден." + }, + "getTheDesktopApp": { + "message": "Свалете настолното приложение" + }, + "getTheDesktopAppDesc": { + "message": "Използвайте трезора си без браузър. Можете да настроите отключване с биометрични данни, за да ускорите отключването както в настолното приложение, така и в добавката за браузъра." + }, + "downloadFromBitwardenNow": { + "message": "Свалете от bitwarden.com сега" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Наистина ли искате да изтриете завинаги този прикачен файл?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Бета" }, - "importantNotice": { - "message": "Важно съобщение" - }, - "setupTwoStepLogin": { - "message": "Настройте двустепенно удостоверяване" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Битуорден ще изпрати код до е-пощата Ви, за потвърждаване на вписването от нови устройства. Това ще започне от февруари 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Можете да настроите двустепенно удостоверяване, като различен метод на защита, или ако е необходимо да промените е-пощата си с такава, до която имате достъп." - }, - "remindMeLater": { - "message": "Напомнете ми по-късно" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Имате ли сигурен достъп до е-пощата си – $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Не, нямам" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Да, имам достъп до е-пощата си" - }, - "turnOnTwoStepLogin": { - "message": "Включване на двустепенното удостоверяване" - }, - "changeAcctEmail": { - "message": "Промяна на е-пощата" - }, "extensionWidth": { "message": "Ширина на разширението" }, @@ -5250,33 +5259,52 @@ "message": "Елементи за авт. попълване в текущата страница\nЛюбими елементи за лесен достъп\nПотърсете в трезора си за нещо друго" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Спестете време с автоматично попълване" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Добавете", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "уеб сайт", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": ", за да може тези данни за вписване да се появяват като предложение за автоматично попълване.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Безпроблемни плащания" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "С възможността за запазване на карти, можете лесно да ги попълвате автоматично във формулярите – сигурно и точно." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Опростено създаване на акаунти" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "С възможността за запазване на самоличности, можете лесно да попълвате автоматично дълги формуляри за регистрация или връзка с уеб сайт." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Пазете тайните си на сигурно място" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "С възможността за запазване на бележки, можете да съхранявате тайна информация, като например банкови и застрахователни данни." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Улеснен достъп за разработчици чрез SSH" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Съхранявайте ключове и използвайте връзка чрез SSH агента, за бързо и шифровано удостоверяване.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Научете повече относно SSH-агента", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index c14d5308a6b..5ec63e71809 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index eaa9ba863e0..66f8e5db4ae 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index bbf6ccb9c41..840304621ea 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -189,7 +189,7 @@ "message": "Copia notes" }, "copy": { - "message": "Copy", + "message": "Copia", "description": "Copy to clipboard" }, "fill": { @@ -1043,10 +1043,10 @@ "message": "Llista els elements d'identitat de la pestanya de la pàgina per facilitar l'autoemplenat." }, "clickToAutofillOnVault": { - "message": "Feu clic als elements per emplenar automàticament a la vista de la caixa forta" + "message": "Feu clic als elements per emplenar automàticament en la vista de la caixa forta" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Feu clic als elements del suggeriment d'emplenament automàtic per omplir-los" }, "clearClipboard": { "message": "Buida el porta-retalls", @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositiu de confiança" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No hi ha Sends actius", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Esteu segur que voleu suprimir definitivament aquest adjunt?" }, @@ -4902,10 +4947,10 @@ "message": "Amaga el recompte de caràcters" }, "itemsInTrash": { - "message": "Items in trash" + "message": "Elements a la paperera" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "No hi ha cap element a la paperera" }, "noItemsInTrashDesc": { "message": "Items you delete will appear here and be permanently deleted after 30 days" @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Noticia important" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Recorda-m'ho més tard" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, jo no" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Activa l'inici de sessió en dos passos" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Amplada d'extensió" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index dfbc0acea76..51c592b00b0 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Zařízení zařazeno mezi důvěryhodné" }, + "trustOrganization": { + "message": "Důvěřovat organizaci" + }, + "trust": { + "message": "Důvěřovat" + }, + "doNotTrust": { + "message": "Nedůvěřovat" + }, + "organizationNotTrusted": { + "message": "Organizace není důvěryhodná" + }, + "emergencyAccessTrustWarning": { + "message": "Pro zabezpečení Vašeho účtu potvrďte jen v případě, že jste tomuto uživateli udělili nouzový přístup a jeho otisk prstu odpovídá tomu, co je zobrazeno v jeho účtu." + }, + "orgTrustWarning": { + "message": "Pro zabezpečení Vašeho účtu pokračujte jen v případě, že jste členem této organizace, máte povoleno obnovení účtu a zobrazený otisk prstu níže odpovídá otisku prstu organizace." + }, + "orgTrustWarning1": { + "message": "Tato organizace má firemní zásady, které Vás zapíšou do obnovy účtu. Zápis umožní správcům organizace změnit Vaše heslo. Pokračujte jen v případě, že znáte tuto organizaci a fráze otisku prstu zobrazenou níže odpovídá otisku prstu organizace." + }, + "trustUser": { + "message": "Důvěřovat uživateli" + }, "sendsNoItemsTitle": { "message": "Žádná aktivní Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Stáhnout Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Stáhnout Bitwarden na všech zařízeních" + }, + "getTheMobileApp": { + "message": "Získejte mobilní aplikaci" + }, + "getTheMobileAppDesc": { + "message": "Přistupujte k Vašim heslům pomocí mobilní aplikace Bitwarden." + }, + "getTheDesktopApp": { + "message": "Získejte desktopovou aplikaci" + }, + "getTheDesktopAppDesc": { + "message": "Přistupujte k Vašemu trezoru bez prohlížeče a poté nastavte odemknutí s biometrikou jak v desktopové aplikaci, tak v rozšíření prohlížeče." + }, + "downloadFromBitwardenNow": { + "message": "Stáhnout z bitwarden.com nyní" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Opravdu chcete tuto přílohu navždy smazat?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Důležité upozornění" - }, - "setupTwoStepLogin": { - "message": "Nastavit dvoufázové přihlášení" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden odešle kód na e-mail Vašeho účtu pro ověření přihlášení z nových zařízení počínaje únorem 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Dvoufázové přihlášení můžete nastavit jako alternativní způsob ochrany Vašeho účtu nebo změnit svůj e-mail na ten, k němuž můžete přistupovat." - }, - "remindMeLater": { - "message": "Připomenout později" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Máte spolehlivý přístup ke svému e-mailu $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Ne, nemám" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ano, ke svému e-mailu mám přístup" - }, - "turnOnTwoStepLogin": { - "message": "Zapnout dvoufázové přihlášení" - }, - "changeAcctEmail": { - "message": "Změnit e-mail účtu" - }, "extensionWidth": { "message": "Šířka rozšíření" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Ušetřete čas s automatickým vyplňováním" }, - "newLoginNudgeBody": { - "message": "Zahrne webovou stránku, takže se toto přihlášení objeví jako návrh automatického vyplňování." + "newLoginNudgeBodyOne": { + "message": "Zahrne", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "webovou stránku, ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "takže se toto přihlášení objeví jako návrh automatického vyplňování.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Bezproblémová online pokladna" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Přístup SSH pro vývojáře" }, - "newSshNudgeBody": { - "message": "Uložte své klíče a připojte se k SSH agentovi pro rychlé a šifrované ověření." + "newSshNudgeBodyOne": { + "message": "Uložte své klíče a připojte se k SSH agentovi pro rychlé a šifrované ověření.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Další informace o SSH agentovi", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 5fa135a929d..8c0b1d97f60 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "A oes gennych chi fynediad dibynadwy i'ch ebost, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nac oes" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Oes, mae gen i fynediad dibynadwy i fy ebost" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index f1c55f3557d..3887e291334 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Enhed betroet" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Ingen aktive Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Sikker på, at denne vedhæftning skal slettes permanent?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Vigtig notits" - }, - "setupTwoStepLogin": { - "message": "Opsæt totrins-login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Startende i februar 2025, sender Bitwarden en kode til kontoe-mailadressen for at bekræfte logins fra nye enheder." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Man kan opsætte totrins-login som en alternativ måde at beskytte sin konto på eller ændre sin e-mail til en, man kan tilgå." - }, - "remindMeLater": { - "message": "Påmind senere" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Er der pålidelig adgang til e-mailadressen, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nej, jeg gør ikke" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ja, e-mailadressen kan pålideligt tilgås" - }, - "turnOnTwoStepLogin": { - "message": "Slå totrins-login til" - }, - "changeAcctEmail": { - "message": "Skift kontoe-mailadresse" - }, "extensionWidth": { "message": "Udvidelsesbredde" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 251a0323c60..a7871f6ebca 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -620,7 +620,7 @@ } }, "website": { - "message": "Webseite" + "message": "Website" }, "toggleVisibility": { "message": "Sichtbarkeit umschalten" @@ -3173,7 +3173,7 @@ "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { - "message": "Webseite: $WEBSITE$. Von Bitwarden generiert.", + "message": "Website: $WEBSITE$. Von Bitwarden generiert.", "description": "Displayed with the address on the forwarding service's configuration screen.", "placeholders": { "WEBSITE": { @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Gerät wird vertraut" }, + "trustOrganization": { + "message": "Organisation vertrauen" + }, + "trust": { + "message": "Vertrauen" + }, + "doNotTrust": { + "message": "Nicht vertrauen" + }, + "organizationNotTrusted": { + "message": "Organisation ist nicht vertrauenswürdig" + }, + "emergencyAccessTrustWarning": { + "message": "Bestätige zur Sicherheit deines Kontos nur, wenn du den Notfallzugriff diesem Benutzer gewährt hast und sein Fingerabdruck mit dem übereinstimmt, was in seinem Konto angezeigt wird" + }, + "orgTrustWarning": { + "message": "Fahre zur Sicherheit deines Kontos nur fort, wenn du ein Mitglied dieser Organisation bist, die Kontowiederherstellung aktiviert hast und der unten angezeigte Fingerabdruck mit dem Fingerabdruck der Organisation übereinstimmt." + }, + "orgTrustWarning1": { + "message": "Diese Organisation hat eine Unternehmensrichtlinie, die dich für die Kontowiederherstellung registriert. Die Registrierung wird es den Administratoren der Organisation erlauben, dein Passwort zu ändern. Fahre nur fort, wenn du diese Organisation kennst und die unten angezeigte Fingerabdruck-Phrase mit der der Organisation übereinstimmt." + }, + "trustUser": { + "message": "Benutzer vertrauen" + }, "sendsNoItemsTitle": { "message": "Keine aktiven Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Bitwarden herunterladen" + }, + "downloadBitwardenOnAllDevices": { + "message": "Bitwarden auf allen Geräten herunterladen" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Bist du sicher, dass du diesen Anhang dauerhaft löschen möchtest?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Wichtiger Hinweis" - }, - "setupTwoStepLogin": { - "message": "Zwei-Faktor-Authentifizierung einrichten" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Ab Februar 2025 wird Bitwarden einen Code an deine Konto-E-Mail-Adresse senden, um Anmeldungen von neuen Geräten zu verifizieren." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Du kannst die Zwei-Faktor-Authentifizierung als eine alternative Methode einrichten, um dein Konto zu schützen, oder deine E-Mail-Adresse zu einer anderen ändern, auf die du zugreifen kannst." - }, - "remindMeLater": { - "message": "Erinnere mich später" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Hast du zuverlässigen Zugriff auf deine E-Mail-Adresse $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nein, habe ich nicht" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ja, ich kann zuverlässig auf meine E-Mails zugreifen" - }, - "turnOnTwoStepLogin": { - "message": "Zwei-Faktor-Authentifizierung aktivieren" - }, - "changeAcctEmail": { - "message": "E-Mail-Adresse des Kontos ändern" - }, "extensionWidth": { "message": "Breite der Erweiterung" }, @@ -5202,10 +5211,10 @@ "message": "Gefährdetes Passwort ändern" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Tresoroptionen" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Der Tresor schützt mehr als nur deine Passwörter. Speicher hier sicher Zugangsdaten, Ausweise, Karten und Notizen." }, "introCarouselLabel": { "message": "Willkommen bei Bitwarden" @@ -5235,48 +5244,67 @@ "message": "Speicher eine unbegrenzte Anzahl von Passwörtern auf unbegrenzt vielen Geräten mit Bitwarden-Apps für Smartphones, Browser und Desktop." }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Vorhandene Passwörter importieren" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Verwende den Importer, um Zugangsdaten schnell zu Bitwarden zu übertragen, ohne sie manuell hinzuzufügen." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Jetzt importieren" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Willkommen in deinem Tresor!" }, "hasItemsVaultNudgeBody": { - "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" + "message": "Auto-Ausfüllen-Einträge für die aktuelle Seite\nFavoriten-Einträge für einfachen Zugriff\nDurchsuche deinen Tresor nach etwas anderem" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Spare Zeit mit Auto-Ausfüllen" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Füge eine", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "hinzu, damit diese Zugangsdaten als Auto-Ausfüllen-Vorschlag erscheinen.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Nahtlose Online-Kaufabwicklung" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Mit Karten kannst du Zahlungsformulare sicher und präzise einfach automatisch ausfüllen." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Erstellung von Konten vereinfachen" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Mit Identitäten kannst du lange Registrierungs- oder Kontaktformulare schnell automatisch ausfüllen." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Bewahre deine sensiblen Daten sicher auf" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Mit Notizen speicherst du sensible Daten wie Bank- oder Versicherungs-Informationen." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Entwickler-freundlicher SSH-Zugriff" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Speicher deine Schlüssel und verbinden dich mit dem SSH-Agenten für eine schnelle und verschlüsselte Authentifizierung.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Erfahre mehr über den SSH-Agenten", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 691f546b327..122af181349 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -189,7 +189,7 @@ "message": "Αντιγραφή σημειώσεων" }, "copy": { - "message": "Copy", + "message": "Αντιγραφή", "description": "Copy to clipboard" }, "fill": { @@ -383,7 +383,7 @@ "message": "Επεξεργασία φακέλου" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Επεξεργασία φακέλου: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -1477,7 +1477,7 @@ "message": "Εισάγετε το κλειδί ασφαλείας στη θύρα USB του υπολογιστή σας. Αν έχει κουμπί, πατήστε το." }, "openInNewTab": { - "message": "Open in new tab" + "message": "Άνοιγμα σε νέα καρτέλα" }, "webAuthnAuthenticate": { "message": "Ταυτοποίηση WebAuthn" @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Αξιόπιστη συσκευή" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Κανένα ενεργό Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Είστε σίγουροι ότι θέλετε να διαγράψετε οριστικά αυτό το συνημμένο;" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta (Δοκιμαστική)" }, - "importantNotice": { - "message": "Σημαντική ειδοποίηση" - }, - "setupTwoStepLogin": { - "message": "Ρύθμιση σύνδεσης δύο βημάτων" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Το Bitwarden θα στείλει έναν κωδικό στο ηλ. ταχυδρομείο του λογαριασμού σας για να επαληθεύσει τις συνδέσεις από τις νέες συσκευές που ξεκινούν τον Φεβρουάριο του 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Μπορείτε να ορίσετε σύνδεση δύο βημάτων ως εναλλακτικό τρόπο προστασίας του λογαριασμού σας ή να αλλάξετε το ηλ. ταχυδρομείο σας σε ένα που μπορείτε να έχετε πρόσβαση." - }, - "remindMeLater": { - "message": "Υπενθύμιση αργότερα" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Έχετε αξιόπιστη πρόσβαση στο ηλ. ταχυδρομείο σας, $EMAIL$;", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Όχι, δεν έχω" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ναι, μπορώ να συνδεθώ αξιόπιστα στο ηλ. ταχυδρομείο μου" - }, - "turnOnTwoStepLogin": { - "message": "Ενεργοποίηση σύνδεσης δύο βημάτων" - }, - "changeAcctEmail": { - "message": "Αλλαγή ηλ. ταχυδρομείου λογαριασμού" - }, "extensionWidth": { "message": "Πλάτος εφαρμογής" }, @@ -5160,10 +5169,10 @@ "message": "The password you entered is incorrect." }, "importSshKey": { - "message": "Import" + "message": "Εισαγωγή" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Επιβεβαίωση κωδικού πρόσβασης" }, "enterSshKeyPasswordDesc": { "message": "Enter the password for the SSH key." @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 81c603d44a8..4a3f3a08d5f 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1115,24 +1115,26 @@ } } }, - "loginSaveConfirmation": { - "message": "$ITEMNAME$ saved to Bitwarden.", - "placeholders": { - "itemName": { - "content": "$1" - } - }, + "notificationLoginSaveConfirmation": { + "message": "saved to Bitwarden.", "description": "Shown to user after item is saved." }, - "loginUpdatedConfirmation": { - "message": "$ITEMNAME$ updated in Bitwarden.", - "placeholders": { - "itemName": { - "content": "$1" - } - }, + "notificationLoginUpdatedConfirmation": { + "message": "updated in Bitwarden.", "description": "Shown to user after item is updated." }, + "selectItemAriaLabel": { + "message": "Select $ITEMTYPE$, $ITEMNAME$", + "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", + "placeholders": { + "itemType": { + "content": "$1" + }, + "itemName": { + "content": "$2" + } + } + }, "saveAsNewLoginAction": { "message": "Save as new login", "description": "Button text for saving login details as a new entry." @@ -1141,6 +1143,10 @@ "message": "Update login", "description": "Button text for updating an existing login entry." }, + "unlockToSave": { + "message": "Unlock to save this login", + "description": "User prompt to take action in order to save the login they just entered." + }, "saveLogin": { "message": "Save login", "description": "Prompt asking the user if they want to save their login details." @@ -1616,6 +1622,24 @@ "autofillSuggestionsSectionTitle": { "message": "Autofill suggestions" }, + "autofillSpotlightTitle": { + "message": "Easily find autofill suggestions" + }, + "autofillSpotlightDesc": { + "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + }, + "turnOffBrowserAutofill": { + "message": "Turn off $BROWSER$ autofill", + "placeholders": { + "browser": { + "content": "$1", + "example": "Chrome" + } + } + }, + "turnOffAutofill": { + "message": "Turn off autofill" + }, "showInlineMenuLabel": { "message": "Show autofill suggestions on form fields" }, @@ -2226,15 +2250,6 @@ "vaultTimeoutAction1": { "message": "Timeout action" }, - "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" - }, - "newCustomizationOptionsCalloutContent": { - "message": "Customize your vault experience with quick copy actions, compact mode, and more!" - }, - "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" - }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -3591,6 +3606,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4515,6 +4554,33 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, + "getItOnGooglePlay": { + "message": "Get it on Google Play" + }, + "downloadOnTheAppStore": { + "message": "Download on the App Store" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5138,42 +5204,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5261,6 +5291,9 @@ "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." }, + "nudgeBadgeAria": { + "message": "1 notification" + }, "emptyVaultNudgeTitle": { "message": "Import existing passwords" }, @@ -5273,14 +5306,32 @@ "hasItemsVaultNudgeTitle": { "message": "Welcome to your vault!" }, - "hasItemsVaultNudgeBody": { - "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" + "hasItemsVaultNudgeBodyOne": { + "message": "Autofill items for the current page" + }, + "hasItemsVaultNudgeBodyTwo": { + "message": "Favorite items for easy access" + }, + "hasItemsVaultNudgeBodyThree": { + "message": "Search your vault for something else" }, "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5303,7 +5354,17 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "noPermissionsViewPage": { + "message": "You do not have permissions to view this page. Try logging in with a different account." } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 1e0def93584..e91c653721c 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organisation" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organisation is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organisation, have account recovery enabled, and the fingerprint displayed below matches the organisation's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organisation has an Enterprise policy that will enrol you in account recovery. Enrolment will allow organisation administrators to change your password. Only proceed if you recognise this organisation and the fingerprint phrase displayed below matches the organisation's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 380eab31eda..94c929c6999 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organisation" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organisation is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organisation, have account recovery enabled, and the fingerprint displayed below matches the organisation's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organisation has an Enterprise policy that will enrol you in account recovery. Enrolment will allow organisation administrators to change your password. Only proceed if you recognise this organisation and the fingerprint phrase displayed below matches the organisation's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 76401c685ad..2950f838c9c 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositivo de confianza" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "¿Estás seguro de que deseas eliminar permanentemente este adjunto?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Aviso importante" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Recuérdame más tarde" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "¿Tienes acceso fiable a tu correo electrónico, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, no lo tengo" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Sí, puedo acceder a mi correo electrónico de forma fiable" - }, - "turnOnTwoStepLogin": { - "message": "Activar inicio de sesión en dos pasos" - }, - "changeAcctEmail": { - "message": "Cambiar la cuenta de correo electrónico" - }, "extensionWidth": { "message": "Ancho de extensión" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index f76adcc27e2..5a51598a4f8 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Seade on usaldusväärne" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index cd3d58896d4..73053b8597b 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index b8f8d2ccdbf..6f6ccecdd34 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "دستگاه مورد اعتماد است" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index c3f48b1df3b..747ac8ccd57 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Laitteeseen luotettu" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Aktiivisia Sendejä ei ole", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Haluatko varmasti poistaa liitteen pysyvästi?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Tärkeä ilmoitus" - }, - "setupTwoStepLogin": { - "message": "Määritä kaksivaiheinen kirjautuminen" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden lähettää tilisi sähköpostiosoitteeseen koodin, jolla voit vahvistaa kirjautumiset uusista laitteista helmikuusta 2025 alkaen." - }, - "newDeviceVerificationNoticeContentPage2": { - "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" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Onko sinulla luotettava pääsy sähköpostiisi, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Ei ole" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Kyllä on" - }, - "turnOnTwoStepLogin": { - "message": "Ota kaksivaiheinen kirjautuminen käyttöön" - }, - "changeAcctEmail": { - "message": "Muuta tilin sähköpostiosoitetta" - }, "extensionWidth": { "message": "Laajennuksen leveys" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index d01670a2353..5f84ec1905a 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index b8c4fa9d011..cae2125eb4e 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Appareil de confiance" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Pas de Send actif", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Êtes-vous sûr de vouloir supprimer définitivement cette pièce jointe ?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Avis important" - }, - "setupTwoStepLogin": { - "message": "Configurer l'identification à deux facteurs" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden enverra un code au courriel de votre compte pour vérifier les connexions depuis de nouveaux appareils à partir de février 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Vous pouvez configurer l'identification à deux facteurs comme un moyen alternatif de protéger votre compte ou de changer votre adresse courriel à une autre à laquelle vous pouvez accéder." - }, - "remindMeLater": { - "message": "Me le rappeler plus tard" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Avez-vous un accès fiable à votre courriel $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Non, je ne l'ai pas" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Oui, je peux accéder à mon courriel de manière fiable" - }, - "turnOnTwoStepLogin": { - "message": "Activer l'identification à deux facteurs" - }, - "changeAcctEmail": { - "message": "Changer le courriel du compte" - }, "extensionWidth": { "message": "Largeur de l'extension" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 40823d54799..8adbe560b22 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositivo de confianza" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Sen Sends activos", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Estás seguro de que queres eliminar permanentemente este anexo?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Aviso importante" - }, - "setupTwoStepLogin": { - "message": "Configurar verificación en dous pasos" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "A partir de febreiro de 2025 Bitwarden comezará a enviar correos con códigos de verificación para confirmar novos inicios de sesión á túa conta." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Podes configurar a verificación en 2 pasos como alternativa para protexer a túa conta ou cambiar o enderezo electrónico a un ó que teñas acceso." - }, - "remindMeLater": { - "message": "Lembrarmo máis tarde" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Tes acceso fiable ó teu correo? ($EMAIL$)", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Non, non o teño" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Si, teño acceso fiable ó meu correo" - }, - "turnOnTwoStepLogin": { - "message": "Activar verificación en dous pasos" - }, - "changeAcctEmail": { - "message": "Mudar de correo electrónico" - }, "extensionWidth": { "message": "Ancho da extensión" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index a41386d9494..759429f285a 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "מכשיר מהימן" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "אין סֵנְדים פעילים", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "האם אתה בטוח שברצונך למחוק לצמיתות צרופה זו?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "בטא" }, - "importantNotice": { - "message": "הודעה חשובה" - }, - "setupTwoStepLogin": { - "message": "הגדר כניסה דו־שלבית" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden ישלח קוד לדוא\"ל החשבון שלך כדי לאמת כניסות ממכשירים חדשים החל מפברואר 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "אתה יכול להגדיר כניסה דו־שלבית כדרך חלופית להגן על החשבון שלך או לשנות את הדוא\"ל שלך לאחד שאתה יכול לגשת אליו." - }, - "remindMeLater": { - "message": "הזכר לי מאוחר יותר" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "יש לך גישה מהימנה לדוא\"ל שלך, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "לא, אין לי" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "כן, אני יכול לגשת לדוא\"ל שלי באופן מהימן" - }, - "turnOnTwoStepLogin": { - "message": "הפעל כניסה דו־שלבית" - }, - "changeAcctEmail": { - "message": "שנה את דוא\"ל החשבון" - }, "extensionWidth": { "message": "רוחב הרחבה" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index d4fff520b87..f6ce3f6536a 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "विश्वसनीय संगठन" + }, + "trust": { + "message": "भरोसा करें" + }, + "doNotTrust": { + "message": "भरोसा न करें" + }, + "organizationNotTrusted": { + "message": "संगठन पर भरोसा नहीं है" + }, + "emergencyAccessTrustWarning": { + "message": "अपने खाते की सुरक्षा के लिए, केवल तभी पुष्टि करें जब आपने इस उपयोगकर्ता को आपातकालीन पहुँच प्रदान की हो और उनका फिंगरप्रिंट उनके खाते में प्रदर्शित फिंगरप्रिंट से मेल खाता हो" + }, + "orgTrustWarning": { + "message": "अपने खाते की सुरक्षा के लिए, केवल तभी आगे बढ़ें जब आप इस संगठन के सदस्य हों, खाता पुनर्प्राप्ति सक्षम हो, तथा नीचे प्रदर्शित फिंगरप्रिंट संगठन के फिंगरप्रिंट से मेल खाता हो।" + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "उपयोगकर्ता पर भरोसा रखें" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "महत्वपूर्ण सूचना" - }, - "setupTwoStepLogin": { - "message": "टू-स्टेप लॉगइन" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "बाद में मुझे याद कराएं" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "नहीं, मैं नहीं" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "हाँ, मैं आराम से अपना ईमेल देख सकता हूँ" - }, - "turnOnTwoStepLogin": { - "message": "टू-स्टेप लॉगइन सक्षम करें" - }, - "changeAcctEmail": { - "message": "अकाउंट का ईमेल बदलें" - }, "extensionWidth": { "message": "Extension width" }, @@ -5250,10 +5259,22 @@ "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "स्वतः भरण से समय बचाएँ" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index f3e4bd840c7..205fa70dc32 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Uređaj pouzdan" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Nema aktivnih Sendova", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Sigurno želiš trajno izbrisati ovaj privitak?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Važna napomena" - }, - "setupTwoStepLogin": { - "message": "Postavi dvostruku autentifikaciju" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden će, počevši od veljače 2025., za provjeru prijava s novih uređaja poslati kôd na e-poštu tvog računa." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Prijavu dvostrukom autentifikacijom možeš postaviti kao alternativni način zaštite svog računa ili promijeni svoju e-poštu u onu kojoj možeš pristupiti." - }, - "remindMeLater": { - "message": "Podsjeti me kasnije" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Imaš li pouzdan pristup svojoj e-pošti: $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Ne, nemam" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Da, pouzdano mogu pristupiti svojoj e-pošti" - }, - "turnOnTwoStepLogin": { - "message": "Uključi prijavu dvostrukom autentifikacijom" - }, - "changeAcctEmail": { - "message": "Promjeni e-poštu računa" - }, "extensionWidth": { "message": "Širina proširenja" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 07161af5727..89ca99c51f7 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Az eszköz megbízható." }, + "trustOrganization": { + "message": "Bizalmi szervezet" + }, + "trust": { + "message": "Bizalom" + }, + "doNotTrust": { + "message": "Nincs bizalom" + }, + "organizationNotTrusted": { + "message": "A szervezet nem megbízható." + }, + "emergencyAccessTrustWarning": { + "message": "A fiók biztonság érdekében csak akkor erősítsük meg, ha vészhelyzeti hozzáférést biztosítottunk ehhez a felhasználóhoz és az ujjlenyomata megegyezik a fiókjukban megjelenítettekkel." + }, + "orgTrustWarning": { + "message": "A fiók biztonsága érdekében csak akkor folytassuk, ha tagja vagyunk ennek a szervezetnek, engedélyezve van a fiók helyreállítása és az alább megjelenített ujjlenyomat megegyezik a szervezet ujjlenyomatával." + }, + "orgTrustWarning1": { + "message": "Ennek a szervezetnek van egy vállalati szabályzata, amely regisztrál bennünket a fiók helyreállítási szolgáltatásba. A regisztráció lehetővé teszi a szervezet rendszergazdái számára, hogy megváltoztassák a jelszavunkat. Csak akkor folytassuk, ha felismerjük ezt a szervezetet és az alább megjelenített ujjlenyomat-kifejezés megegyezik a szervezet ujjlenyomatával." + }, + "trustUser": { + "message": "Megbízható felhasználó" + }, "sendsNoItemsTitle": { "message": "Nincsenek natív Send elemek.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Bitwarden letöltése" + }, + "downloadBitwardenOnAllDevices": { + "message": "Bitwarden letöltése minden eszközön" + }, + "getTheMobileApp": { + "message": "Mobilalkalmazás beszerzése" + }, + "getTheMobileAppDesc": { + "message": "Útközben is hozzáférhetünk a jelszabkhoz a Bitwarden mobilalkalmazással." + }, + "getTheDesktopApp": { + "message": "Asztali alkalmazás beszerzése" + }, + "getTheDesktopAppDesc": { + "message": "Hozzáférhetünk a széfhez böngésző nélkül, majd állítsuk be a feloldást biometrikus adatokkal, hogy felgyorsítsuk a feloldást mind az asztali alkalmazásban, mind a böngésző bővítményben." + }, + "downloadFromBitwardenNow": { + "message": "Letöltés most a bitwarden.com webhelyről" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Biztosan véglegesen törlésre kerüljön ez a melléklet?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Béta" }, - "importantNotice": { - "message": "Fontos megjegyzés" - }, - "setupTwoStepLogin": { - "message": "Kétlépéses bejelentkezés beüzemelése" - }, - "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." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "A fiók védelmének alternatív módjaként beállíthatunk kétlépcsős bejelentkezést vagy módosíthatjuk az email címet egy elérhetőre." - }, - "remindMeLater": { - "message": "Emlékeztetés később" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Megbízható a hozzáférés $EMAIL$ email címhez?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nem, nem érem el" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Igen, megbízhatóan hozzáférek az emailjeimhez" - }, - "turnOnTwoStepLogin": { - "message": "Kétlépéses bejelentkezés bekapcsolása" - }, - "changeAcctEmail": { - "message": "Fiók email cím megváltoztatása" - }, "extensionWidth": { "message": "Kiterjesztés szélesség" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Idő megtakarítás automatikus kitöltéssel" }, - "newLoginNudgeBody": { - "message": "Adjunk meg egy webhelyet, hogy ez a bejelentkezési név automatikusan kitöltendő javaslatként jelenjen meg." + "newLoginNudgeBodyOne": { + "message": "Bevonás:", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Webhely", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "így ez a bejelentkezés automatikus kitöltési javaslatként jelenik meg.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Zökkenőmentes online fizetés" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Fejlesztőbarát SSH hozzáférés" }, - "newSshNudgeBody": { - "message": "Tároljuk a kulcsokat és csatlakozzunk az SSH-ügynökhöz a gyors, titkosított hitelesítéshez." + "newSshNudgeBodyOne": { + "message": "Tároljuk el a kulcsokat és csatlakozzunk az SSH ügynökhöz a gyors, titkosított hitelesítéshez.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "További információ az SSH ügynökről", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 5c77c54ecf4..42363532e5e 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo Bitwarden" }, "extName": { "message": "Pengelola Sandi Bitwarden", @@ -887,7 +887,7 @@ "message": "Ikuti langkah-langkah di bawah untuk menyelesaikan log masuk." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Ikuti langkah-langkah berikut untuk menyelesaikan kegiatan masuk dengan kunci keamanan Anda." }, "restartRegistration": { "message": "Mulai ulang pendaftaran" @@ -1063,7 +1063,7 @@ "message": "Iya, Simpan Sekarang" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Lihat $ITEMNAME$, buka di jendela baru", "placeholders": { "itemName": { "content": "$1" @@ -1072,14 +1072,14 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Sunting sebelum menyimpan", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Pemberitahuan baru" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Pemberitahuan baru", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1089,7 +1089,7 @@ } }, "loginSaveConfirmation": { - "message": "$ITEMNAME$ saved to Bitwarden.", + "message": "$ITEMNAME$ disimpan ke Bitwarden.", "placeholders": { "itemName": { "content": "$1" @@ -1098,7 +1098,7 @@ "description": "Shown to user after item is saved." }, "loginUpdatedConfirmation": { - "message": "$ITEMNAME$ updated in Bitwarden.", + "message": "$ITEMNAME$ diperbarui di Bitwarden.", "placeholders": { "itemName": { "content": "$1" @@ -1115,11 +1115,11 @@ "description": "Button text for updating an existing login entry." }, "saveLogin": { - "message": "Save login", + "message": "Simpan log masuk", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Perbarui log masuk yang sudah ada", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1131,7 +1131,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Bagus! Anda telah mengambil langkah-langkah untuk membuat Anda dan $ORGANIZATION$ lebih aman.", "placeholders": { "organization": { "content": "$1" @@ -1140,7 +1140,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Terima kasih telah membuat $ORGANIZATION$ menjadi lebih aman. Anda memiliki $TASK_COUNT$ kata sandi lagi untuk diperbarui.", "placeholders": { "organization": { "content": "$1" @@ -1152,7 +1152,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Ubah kata sandi selanjutnya", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -2355,7 +2355,7 @@ "message": "Kebijakan Privasi" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Kata sandi baru Anda tidak boleh sama dengan kata sandi Anda yang sekarang." }, "hintEqualsPassword": { "message": "Petunjuk kata sandi Anda tidak boleh sama dengan kata sandi Anda." @@ -2552,10 +2552,10 @@ "message": "Ubah lebih cepat kata sandi yang berrisiko" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Perbarui pengaturan Anda sehingga Anda dapat dengan cepat mengisi otomatis kata sandi Anda dan menghasilkan kata sandi baru" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Tinjau ulang info masuk yang berpotensi bahaya" }, "reviewAtRiskPasswords": { "message": "Tinjau kata sandi yang berrisiko" @@ -2565,30 +2565,30 @@ "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Gambaran daftar info masuk yang berpotensi bahaya." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Hasilkan kata sandi yang kuat dan unik dengan cepat dengan menu isi otomatis Bitwarden pada situs yang berpotensi bahaya.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Gambaran dari menu isi otomatis Bitwarden yang menampilkan kata sandi yang dihasilkan." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Perbarui di Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden akan meminta Anda untuk memperbarui kata sandi di pengelola sandi.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Gambaran dari pemberitahuan Bitwarden yang meminta pengguna untuk memperbarui info masuk." }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Nyalakan isi otomatis" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Telah menyalakan isi otomatis" }, "dismiss": { "message": "Tutup" @@ -3038,7 +3038,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "Hanya benda-benda brankas satuan termasuk lampiran yang terhubung dengan $EMAIL$ yang akan diekspor. Benda brankas organisasi tidak akan disertakan", "placeholders": { "email": { "content": "$1", @@ -3068,7 +3068,7 @@ "message": "Bitwarden tidak bisa mendekripsi butir brankas yang tercantum di bawah." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Hubungi layanan pelanggan", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Perangkat dipercaya" }, + "trustOrganization": { + "message": "Percayai organisasi" + }, + "trust": { + "message": "Percayai" + }, + "doNotTrust": { + "message": "Jangan percayai" + }, + "organizationNotTrusted": { + "message": "Organisasi tidak tepercaya" + }, + "emergencyAccessTrustWarning": { + "message": "Demi keamanan akun Anda, hanya konfirmasi jika Anda telah memberikan akses darurat ke pengguna ini dan sidik jari mereka cocok dengan apa yang ditampilkan pada akun mereka" + }, + "orgTrustWarning": { + "message": "Demi keamanan akun Anda, hanya lanjutkan apabila Anda adalah anggota dari organisasi ini, pemulihan akun telah aktif, dan sidik jari yang ditampilkan berikut cocok dengan sidik jari organisasi." + }, + "orgTrustWarning1": { + "message": "Organisasi ini memiliki kebijakan perusahaan yang akan mendaftarkan Anda pada pemulihan akun. Pendaftaran ini akan membolehkan pengelola organisasi untuk mengubah kata sandi Anda. Hanya lanjutkan jika Anda mengenali organisasi ini dan frasa sidik jari yang ditampilkan berikut cocok dengan sidik jari organisasi." + }, + "trustUser": { + "message": "Percayai pengguna" + }, "sendsNoItemsTitle": { "message": "Tidak ada Send yang aktif", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4304,7 +4328,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Lihat benda - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4328,7 +4352,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Isi otomatis - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Unduh Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Unduh Bitwarden" + }, + "getTheMobileApp": { + "message": "Dapatkan aplikasi ponsel" + }, + "getTheMobileAppDesc": { + "message": "Akses kata sandi Anda di perjalanan dengan aplikasi ponsel Bitwarden." + }, + "getTheDesktopApp": { + "message": "Dapatkan aplikasi desktop" + }, + "getTheDesktopAppDesc": { + "message": "Akses brankas Anda tanpa sebuah peramban, kemudian atur buka dengan biometrik untuk mempercepat membuka di aplikasi desktop dan ekstensi peramban." + }, + "downloadFromBitwardenNow": { + "message": "Unduh dari bitwarden.com sekarang" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Apakah Anda yakin ingin menghapus lampiran ini selamanya?" }, @@ -4732,10 +4777,10 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Urutkan URI situs web. Gunakan tombol panah untuk memindahkan benda ke atas atau ke bawah." }, "reorderFieldUp": { - "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ dipindah ke atas, terletak di $INDEX$ dari $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4752,13 +4797,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Pilih koleksi untuk ditetapkan" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 benda akan dipindahkan selamanya ke organisasi terpilih. Anda tidak akan lagi memiliki benda ini." }, "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$ benda akan dipindahkan selamanya ke organisasi terpilih. Anda tidak akan lagi memiliki benda-benda tersebut.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4767,7 +4812,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 benda akan dipindahkan selamanya ke $ORG$. Anda tidak akan lagi memiliki benda ini.", "placeholders": { "org": { "content": "$1", @@ -4776,7 +4821,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ benda akan dipindahkan selamanya ke $ORG$. Anda tidak akan lagi memiliki benda-benda tersebut.", "placeholders": { "personal_items_count": { "content": "$1", @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Pemberitahuan penting" - }, - "setupTwoStepLogin": { - "message": "Siapkan log masuk dua langkah" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden akan mengirim suatu kode ke akun surel Anda untuk memverifikasi log masuk dari perangkat baru sejak Februari 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Anda dapat menyiapkan log masuk dua langkah sebagai cara alternatif untuk melindungi akun Anda atau mengubah surel Anda ke yang bisa Anda akses." - }, - "remindMeLater": { - "message": "Ingatkan saya nanti" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Apakah Anda punya akses yang handal ke surel Anda, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Tidak" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ya, saya dapat mengakses surel saya secara handla" - }, - "turnOnTwoStepLogin": { - "message": "Nyalakan log masuk dua langkah" - }, - "changeAcctEmail": { - "message": "Ubah surel akun" - }, "extensionWidth": { "message": "Lebar ekstensi" }, @@ -5252,31 +5261,50 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Situs web", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "agar info masuk ini muncul sebagai saran pengisian otomatis.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Pembayaran daring yang lancar" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Dengan kartu, isi otomatis dengan mudah formulir pembayaran secara aman dan akurat." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Sederhanakan pembuatan akun" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Dengan identitas, isi otomatis dengan cepat formulir pendaftaran atau kontrak yang panjang." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Menjaga data sensitif Anda tetap aman" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Dengan catatan, simpan secara aman data sensitif seperti rincian perbankan atau asuransi." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Akses SSH yang ramah pengembang" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Simpan kunci-kunci Anda dan sambungkan dengan agen SSH untuk otentikasi yang cepat dan terenkripsi.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Pelajari lebih lanjut tentang agen SSH", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 724416cdcde..272149b8e99 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositivo fidato" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Nessun Send attivo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Sei sicuro di voler eliminare definitivamente questo allegato?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Avviso importante" - }, - "setupTwoStepLogin": { - "message": "Imposta accesso in due passaggi" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden invierà un codice all'email del tuo account per verificare gli accessi da nuovi dispositivi a partire da febbraio 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Puoi impostare l'accesso in due passaggi come modo alternativo per proteggere il tuo account, o cambiare la tua e-mail in una alla quale puoi accedere." - }, - "remindMeLater": { - "message": "Ricordamelo più tardi" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Riesci ancora ad accedere a questa email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, non riesco" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Sì, riesco ad accedere a questa email" - }, - "turnOnTwoStepLogin": { - "message": "Attiva accesso in due passaggi" - }, - "changeAcctEmail": { - "message": "Cambia l'email dell'account" - }, "extensionWidth": { "message": "Larghezza estensione" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index be70cd7d939..e3340789813 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "信頼されたデバイス" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "アクティブな Send なし", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "この添付ファイルを完全に削除してもよろしいですか?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "ベータ" }, - "importantNotice": { - "message": "重要なお知らせ" - }, - "setupTwoStepLogin": { - "message": "2段階認証を設定する" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden は2025年2月以降、新しいデバイスからのログイン時にアカウントのメールアドレスに確認コードを送信します。" - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "代わりに2段階認証によるログインでアカウントを保護するか、メールアドレスをあなたがアクセスできるものに変更できます。" - }, - "remindMeLater": { - "message": "後で再通知" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "メールアドレス $EMAIL$ は、確実にアクセスできるものですか?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "いいえ、違います。" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "はい、メールアドレスには私が確実にアクセスできます" - }, - "turnOnTwoStepLogin": { - "message": "2段階認証によるログインを有効にする" - }, - "changeAcctEmail": { - "message": "アカウントのメールアドレスを変更する" - }, "extensionWidth": { "message": "拡張機能の幅" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index bb4a9be2a6c..19cde10e9b8 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 408727f7ec8..ebf5fb14653 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 01cb0fbf7c3..37e08f7bd56 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "신뢰할 수 있는 장치" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "활성화된 Send없음", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "정말로 이 첨부파일을 영구적으로 삭제하시겠습니까?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "베타" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "확장 폭" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 51879334614..8da6c4c7c28 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Patikimas įrenginys" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Nėra aktyvų „Sends“", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Ar tikrai norite negrįžtamai ištrinti šį priedą?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 6c39d9ff3e6..280c10ad2c4 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -2008,7 +2008,7 @@ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { - "message": "Tiešs" + "message": "Tieši" }, "startsWith": { "message": "Sākas ar" @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Ierīce ir uzticama" }, + "trustOrganization": { + "message": "Uzticēties apvienībai" + }, + "trust": { + "message": "Uzticēties" + }, + "doNotTrust": { + "message": "Neuzticēties" + }, + "organizationNotTrusted": { + "message": "Apvienība nav uzticama" + }, + "emergencyAccessTrustWarning": { + "message": "Lai nodrošinātu sava konta drošību, jāapstiprina tikai tad, ja šim lietotājam ir nodrošināta ārkārtas piekļuve un tā pirkstu nospiedums atbilsta tam, kas ir attēlots tā kontā" + }, + "orgTrustWarning": { + "message": "Lai nodrošinātu sava konta drošību, jāturpina tikai tad, ja esi šīs apvienības dalībnieks, ir iespējota konta atkope un zemāk attēlotais pirkstu nospiedums atbilst apvienības pirkstu nospiedumam." + }, + "orgTrustWarning1": { + "message": "Šai apvienībai ir uzņēmējdarbības pamatnostādne, kas Tevi iekļaus konta atkopē. Iekļaušana ļaus apvienības pārvaldītājiem nomainīt Tavu paroli. Turpini tikai tad, ja zini šo apvienību un zemāk attēlotā pirkstu nospieduma vārdkopa atbilst apvienības pirkstu nospiedumam!" + }, + "trustUser": { + "message": "Uzticēties lietotājam" + }, "sendsNoItemsTitle": { "message": "Nav spēkā esošu Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Lejupielādē Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Lejupielādē Bitwarden visās ierīcēs" + }, + "getTheMobileApp": { + "message": "Iegūsti viedierīču lietotni" + }, + "getTheMobileAppDesc": { + "message": "Piekļūsti savām parolēm kustībā ar Bitwarden viedierīču lietotni!" + }, + "getTheDesktopApp": { + "message": "Iegūsti darbvirsmas lietotni" + }, + "getTheDesktopAppDesc": { + "message": "Piekļūsti savai glabātavai bez pārlūka, tad iestati atslēgšanu ar biometriju, lai paātrinātu atslēgšanu gan darbvirsmas lietotnē, gan pārlūka paplašinājumā!" + }, + "downloadFromBitwardenNow": { + "message": "Lejupielādē no bitwarden.com tagad" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Vai tiešām neatgriezeniski izdzēst šo pielikumu?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Svarīgs paziņojums" - }, - "setupTwoStepLogin": { - "message": "Iestatīt divpakāpju pieteikšanos" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden, sākot ar 2025. gada februāri, nosūtīs kodu uz konta e-pasta adresi, lai apliecinātu pieteikšanos no jaunām ierīcēm." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Var iestatīt divpakāpju pieteikšanos kā citu veidu, kā aizsargāt savu kontu, vai iestatīt savu e-pasta adresi uz tādu, kurai ir piekļuve." - }, - "remindMeLater": { - "message": "Atgādināt man vēlāk" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Vai ir uzticama piekļuve savai e-pasta adresei $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nē, nav" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Jā, varu uzticami piekļūt savam e-pastam" - }, - "turnOnTwoStepLogin": { - "message": "Ieslēgt divpakāpju pieteikšanos" - }, - "changeAcctEmail": { - "message": "Mainīt konta e-pasta adresi" - }, "extensionWidth": { "message": "Paplašinājuma platums" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Laika ietaupīšana ar automātisko aizpildi" }, - "newLoginNudgeBody": { - "message": "Iekļauj tīmekļvietni, lai šis pieteikšanās vienums parādītos kā automātiskās aizpildes ieteikums!" + "newLoginNudgeBodyOne": { + "message": "Iekļauj", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "tīmekļvietni,", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "lai šis pieteikšanās vienums parādītos kā automātiskās aizpildes ieteikums!", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Plūdena apmaksa tiešsaistē" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Izstrādātājiem draudzīga SSH piekļuve" }, - "newSshNudgeBody": { - "message": "Glabā savas atslēgas un savienojies ar SSH aģentu ātrai, šifrētai autentificēšanai!" + "newSshNudgeBodyOne": { + "message": "Glabā savas atslēgas un savienojies ar SSH aģentu ātrai, šifrētai autentificēšanai!", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Uzzināt vairāk par SSH aģentu", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 15d35d29c76..be6bb7d6eb1 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 8dee37bfcb8..0654f92164a 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index f3d87aaa067..5d6016a8217 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Bitwarden-logo" }, "extName": { "message": "Bitwarden passordbehandler", @@ -17,7 +17,7 @@ "message": "Logg på eller opprett en ny konto for å få tilgang til ditt sikre hvelv." }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "Invitasjon akseptert" }, "createAccount": { "message": "Opprett en konto" @@ -29,7 +29,7 @@ "message": "Logg inn med passnøkkel" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Bruk singulær pålogging" }, "welcomeBack": { "message": "Velkommen tilbake" @@ -38,7 +38,7 @@ "message": "Velg et sterkt passord" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "Fullfør opprettelsen av kontoen din ved å bestemme et passord" }, "enterpriseSingleSignOn": { "message": "Bedriftsinnlogging (SSO)" @@ -59,10 +59,10 @@ "message": "Hovedpassord" }, "masterPassDesc": { - "message": "Superpassordet er passordet du bruker for å få tilgang til hvelvet ditt. Det er veldig viktig at du aldri glemmer ditt superpassord. Det er ingen måter å få tilbake passordet på dersom du noensinne skulle klare å glemme det." + "message": "Hovedpassordet er passordet du bruker for å få tilgang til hvelvet ditt. Det er veldig viktig at du aldri glemmer hovedpassordet ditt. Det er ingen måter å få tilbake passordet på dersom du skulle klare å glemme det." }, "masterPassHintDesc": { - "message": "Et hint for superpassordet kan hjelpe deg med å huske på passordet dersom du skulle glemme det." + "message": "Et hint for hovedpassordet kan hjelpe deg med å huske passordet dersom du skulle glemme det." }, "masterPassHintText": { "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", @@ -84,7 +84,7 @@ "message": "Et hint for hovedpassordet (valgfritt)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Passordstyrke-score: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -132,7 +132,7 @@ "message": "Kopier passordet" }, "copyPassphrase": { - "message": "Copy passphrase" + "message": "Kopier passordfrase" }, "copyNote": { "message": "Kopier notatet" @@ -189,7 +189,7 @@ "message": "Kopiér notater" }, "copy": { - "message": "Copy", + "message": "Kopier", "description": "Copy to clipboard" }, "fill": { @@ -264,10 +264,10 @@ "message": "Be om passordhint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "Skriv inn e-postadressen til kontoen din, så får du tilsendt et hint om passordet ditt" }, "getMasterPasswordHint": { - "message": "Få et hint om superpassordet" + "message": "Få et hint om hovedpassordet" }, "continue": { "message": "Fortsett" @@ -303,7 +303,7 @@ "message": "Learn more about how to use Bitwarden on the Help Center." }, "continueToBrowserExtensionStore": { - "message": "Continue to browser extension store?" + "message": "Vil du fortsette til nettleserutvidelsesbutikken?" }, "continueToBrowserExtensionStoreDesc": { "message": "Help others find out if Bitwarden is right for them. Visit your browser's extension store and leave a rating now." @@ -344,7 +344,7 @@ "message": "Bitwarden-autentiserer" }, "continueToAuthenticatorPageDesc": { - "message": "Bitwarden Authenticator allows you to store authenticator keys and generate TOTP codes for 2-step verification flows. Learn more on the bitwarden.com website" + "message": "Med Bitwarden Authenticator kan du lagre autentiseringsnøkler og generere TOTP-koder for 2-trinnspålogging. Les mer på nettstedet bitwarden.com" }, "bitwardenSecretsManager": { "message": "Bitwarden Secrets Manager" @@ -359,7 +359,7 @@ "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." }, "freeBitwardenFamilies": { - "message": "Free Bitwarden Families" + "message": "Gratis Bitwarden-familier" }, "freeBitwardenFamiliesPageDesc": { "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." @@ -383,7 +383,7 @@ "message": "Rediger mappen" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Rediger mappe: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -635,10 +635,10 @@ "message": "Opplåsingsalternativer" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Sett opp en opplåsingsmetode for å endre tidsavbruddshandlingen for hvelvet." }, "unlockMethodNeeded": { - "message": "Set up an unlock method in Settings" + "message": "Sett opp en opplåsingsmetode i Innstillinger" }, "sessionTimeoutHeader": { "message": "Tidsavbrudd for økten" @@ -656,7 +656,7 @@ "message": "Nettleseren din støtter ikke kopiering til utklippstavlen på noe enkelt vis. Prøv å kopiere det manuelt i stedet." }, "verifyYourIdentity": { - "message": "Verify your identity" + "message": "Bekreft identiteten din" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -693,7 +693,7 @@ } }, "invalidMasterPassword": { - "message": "Ugyldig superpassord" + "message": "Ugyldig hovedpassord" }, "vaultTimeout": { "message": "Tidsavbrudd i hvelvet" @@ -790,7 +790,7 @@ } }, "masterPassDoesntMatch": { - "message": "Superpassord-bekreftelsen er ikke samsvarende." + "message": "Bekreftelsen på hovedpassordet samsvarer ikke." }, "newAccountCreated": { "message": "Din nye konto har blitt opprettet! Du kan nå logge på." @@ -808,7 +808,7 @@ "message": "Du kan lukke dette vinduet" }, "masterPassSent": { - "message": "Vi har sendt deg en E-post med hintet til superpassordet." + "message": "Vi har sendt deg en e-post med hintet til hovedpassordet." }, "verificationCodeRequired": { "message": "En verifiseringskode er påkrevd." @@ -842,7 +842,7 @@ "message": "Scan authenticator QR code from current webpage" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "Gjør 2-trinnsbekreftelse sømløs" }, "totpHelper": { "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." @@ -872,22 +872,22 @@ "message": "Logg inn på Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Skriv inn koden du har fått tilsendt på e-post" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Skriv inn koden fra autentiseringsappen din" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Trykk på YubiKey-en for å autentisere" }, "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": "Følg trinnene nedenfor for å fullføre innloggingen." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Følg trinnene nedenfor for å fullføre innloggingen med sikkerhetsnøkkelen din." }, "restartRegistration": { "message": "Start registreringen på nytt" @@ -911,7 +911,7 @@ "message": "Nei" }, "location": { - "message": "Location" + "message": "Sted" }, "unexpectedError": { "message": "En uventet feil har oppstått." @@ -1016,7 +1016,7 @@ "message": "Spør om å legge til innlogging" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "Innstillinger for hvelvlagring" }, "addLoginNotificationDesc": { "message": "\"Legg til innlogging\"-beskjeden ber deg automatisk om å lagre nye innlogginger til hvelvet ditt hver gang du logger på dem for første gang." @@ -1025,7 +1025,7 @@ "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Alltid vis kort som auto-utfyllingsforslag i Hvelv-visningen" }, "showCardsCurrentTab": { "message": "Vis kort på fanesiden" @@ -1034,7 +1034,7 @@ "message": "Vis kortelementer på fanesiden for lett auto-utfylling." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Alltid vis identiteter som auto-utfyllingsforslag i Hvelv-visningen" }, "showIdentitiesCurrentTab": { "message": "Vis identiteter på fanesiden" @@ -1043,10 +1043,10 @@ "message": "Vis identitetselementer på fanesiden for enkel auto-utfylling." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Klikk på gjenstander som skal auto-utfylles i Hvelv-visningen" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Klikk på gjenstander i auto-utfyllingsforslagene for å utfylle" }, "clearClipboard": { "message": "Tøm utklippstavlen", @@ -1063,7 +1063,7 @@ "message": "Ja, lagre nå" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Vis $ITEMNAME$, åpnes i nytt vindu", "placeholders": { "itemName": { "content": "$1" @@ -1072,14 +1072,14 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Rediger før du lagrer", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nytt varsel" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nytt varsel", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1089,7 +1089,7 @@ } }, "loginSaveConfirmation": { - "message": "$ITEMNAME$ saved to Bitwarden.", + "message": "$ITEMNAME$ ble lagret i Bitwarden.", "placeholders": { "itemName": { "content": "$1" @@ -1098,7 +1098,7 @@ "description": "Shown to user after item is saved." }, "loginUpdatedConfirmation": { - "message": "$ITEMNAME$ updated in Bitwarden.", + "message": "$ITEMNAME$ ble oppdatert i Bitwarden.", "placeholders": { "itemName": { "content": "$1" @@ -1107,27 +1107,27 @@ "description": "Shown to user after item is updated." }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Lagre som ny pålogging", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Oppdater pålogging", "description": "Button text for updating an existing login entry." }, "saveLogin": { - "message": "Save login", + "message": "Lagre pålogging", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Oppdater eksisterende pålogging", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "Påloggingen ble lagret", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "Påloggingen ble oppdatert", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { @@ -1156,7 +1156,7 @@ "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Error saving", + "message": "Feil under lagring", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { @@ -1173,7 +1173,7 @@ "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." }, "enableUsePasskeys": { - "message": "Ask to save and use passkeys" + "message": "Spør om å lagre og bruke passnøkler" }, "usePasskeysDesc": { "message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts." @@ -1200,7 +1200,7 @@ "message": "Bruk et sekundært klikk for å få tilgang til passordgenerering og samsvarende innlogginger for nettsiden. " }, "contextMenuItemDescAlt": { - "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + "message": "Bruk et andre klikk for å få tilgang til passordgenerering og samsvarende pålogginger for nettstedet. Gjelder for alle innloggede kontoer." }, "defaultUriMatchDetection": { "message": "Standard URI-samsvarsgjenkjenning", @@ -1227,7 +1227,7 @@ "description": "Light color" }, "exportFrom": { - "message": "Export from" + "message": "Eksporter fra" }, "exportVault": { "message": "Eksporter hvelvet" @@ -1257,7 +1257,7 @@ "message": "Account restricted" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "«Filpassord» og «Bekreft filpassord» stemmer ikke overens." }, "warning": { "message": "ADVARSEL", @@ -1280,7 +1280,7 @@ "message": "Kontokrypteringsnøkler er unike for hver Bitwarden sin brukerkonto, og du kan ikke importere en kryptert eksport til en annen konto." }, "exportMasterPassword": { - "message": "Skriv inn ditt superpassord for å eksportere dine hvelvdataer." + "message": "Skriv inn hovedpassordet ditt for å eksportere dine hvelvdataer." }, "shared": { "message": "Delt" @@ -1422,7 +1422,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Alt for bare $PRICE$ per år!", "placeholders": { "price": { "content": "$1", @@ -1449,7 +1449,7 @@ "message": "Et Premium-medlemskap er påkrevd for å bruke denne funksjonen." }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Tidsavbrudd for autentisering" }, "authenticationSessionTimedOut": { "message": "The authentication session timed out. Please restart the login process." @@ -1464,26 +1464,26 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Ikke spør igjen på denne enheten på 30 dager" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Velg en annen metode", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Bruk gjenopprettingskoden din" }, "insertU2f": { "message": "Sett din sikkerhetsnøkkel inn i din datamaskins USB-uttak. Dersom den har en knapp, trykk på den." }, "openInNewTab": { - "message": "Open in new tab" + "message": "Åpne i ny fane" }, "webAuthnAuthenticate": { "message": "Autentiser WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Les sikkerhetsnøkkel" }, "awaitingSecurityKeyInteraction": { "message": "Awaiting security key interaction..." @@ -1501,7 +1501,7 @@ "message": "Alternativer for 2-trinnsinnlogging" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Velg 2-trinnspåloggingsmetode" }, "recoveryCodeDesc": { "message": "Har du mistet tilgang til alle dine 2-trinnsleverandører? Bruk din gjenopprettingskode til å fjerne alle 2-trinnsleverandører fra din konto." @@ -1513,17 +1513,17 @@ "message": "Autentiseringsapp" }, "authenticatorAppDescV2": { - "message": "Enter a code generated by an authenticator app like Bitwarden Authenticator.", + "message": "Skriv inn en kode generert av en autentiseringsapp som Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { - "message": "Yubico OTP Security Key" + "message": "Yubico OTP-sikkerhetsnøkkel" }, "yubiKeyDesc": { "message": "Bruk en YubiKey for å få tilgang til kontoen din. Virker med enheter av typene YubiKey 4, 4 Nano, 4C, og NEO." }, "duoDescV2": { - "message": "Enter a code generated by Duo Security.", + "message": "Skriv inn en kode generert av Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { @@ -1602,7 +1602,7 @@ "message": "Vis forslag når ikonet er valgt" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "Gjelder for alle innloggede kontoer." }, "turnOffBrowserBuiltInPasswordManagerSettings": { "message": "Skru av din nettlesers innebygde passordbehandler for å unngå konflikter." @@ -1615,15 +1615,15 @@ "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { - "message": "When field is selected (on focus)", + "message": "Når et felt er valgt (ved fokus)", "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "When autofill icon is selected", + "message": "Når auto-utfyllingsikonet er valgt", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Autofill on page load" + "message": "Auto-utfyll ved sideinnlasting" }, "enableAutoFillOnPageLoad": { "message": "Aktiver auto-utfylling ved sideinnlastning" @@ -1695,7 +1695,7 @@ "message": "Dra for å sortere" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Dra for å omorganisere" }, "cfTypeText": { "message": "Tekst" @@ -2107,7 +2107,7 @@ "message": "Svakt hovedpassord" }, "weakMasterPasswordDesc": { - "message": "Superpassordet du har valgt er svakt. Du bør bruke et sterkt superpassord (eller en passordfrase) for å sikre Bitwarden-kontoen din på en forsvarlig måte. Er du sikker på at du vil bruke dette superpassordet?" + "message": "Hovedpassordet du har valgt er svakt. Du bør bruke et sterkt hovedpassord (eller en passordfrase) for å sikre Bitwarden-kontoen din på en forsvarlig måte. Er du sikker på at du vil bruke dette hovedpassordet?" }, "pin": { "message": "PIN", @@ -2191,7 +2191,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": "Tilpasning av hvelv" }, "vaultTimeoutAction": { "message": "Handling ved tidsavbrudd i hvelvet" @@ -2200,13 +2200,13 @@ "message": "Handling ved tidsavbrudd" }, "newCustomizationOptionsCalloutTitle": { - "message": "New customization options" + "message": "Nye tilpasningsmuligheter" }, "newCustomizationOptionsCalloutContent": { "message": "Customize your vault experience with quick copy actions, compact mode, and more!" }, "newCustomizationOptionsCalloutLink": { - "message": "View all Appearance settings" + "message": "Vis alle utseendesinnstillinger" }, "lock": { "message": "Lås", @@ -2364,7 +2364,7 @@ "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "Feil ved oppdatering av tilgangssjetongen" }, "errorRefreshingAccessTokenDesc": { "message": "No refresh token or API keys found. Please try logging out and logging back in." @@ -2406,7 +2406,7 @@ "message": "Kontoen eksisterer ikke" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Biometrisk nøkkel samsvarer ikke" }, "nativeMessagingWrongUserKeyDesc": { "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." @@ -2424,10 +2424,10 @@ "message": "Biometri i nettleseren støttes ikke på denne enheten." }, "biometricsNotUnlockedTitle": { - "message": "User locked or logged out" + "message": "Brukeren er låst eller avlogget" }, "biometricsNotUnlockedDesc": { - "message": "Please unlock this user in the desktop application and try again." + "message": "Vennligst lås opp denne brukeren i skrivebordsprogrammet og prøv igjen." }, "biometricsNotAvailableTitle": { "message": "Biometrisk opplåsing er utilgjengelig" @@ -2460,7 +2460,7 @@ "message": "En virksomhetsregel påvirker dine eierskapsinnstillinger." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "En organisasjonsretningslinje har blokkert import av gjenstander til ditt individuelle hvelv." }, "domainsTitle": { "message": "Domener", @@ -2470,7 +2470,7 @@ "message": "Blokkerte domener" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Finn ut mer om blokkerte domener" }, "excludedDomains": { "message": "Ekskluderte domener" @@ -2485,16 +2485,16 @@ "message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Auto-utfylling er blokkert for dette nettstedet." }, "autofillBlockedNoticeGuidance": { "message": "Endre dette i innstillingene" }, "change": { - "message": "Change" + "message": "Endre" }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Endre passord - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2575,7 +2575,7 @@ "message": "Illustration of the Bitwarden autofill menu displaying a generated password." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Oppdater i Bitwarden" }, "updateInBitwardenSlideDesc": { "message": "Bitwarden will then prompt you to update the password in the password manager.", @@ -2585,13 +2585,13 @@ "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Skru på auto-utfylling" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Skrudde på auto-utfylling" }, "dismiss": { - "message": "Dismiss" + "message": "Avvis" }, "websiteItemLabel": { "message": "Nettsted $number$ (URİ)", @@ -2843,7 +2843,7 @@ "message": "Forespørsel om hovedpassord på nytt" }, "passwordConfirmation": { - "message": "Hovedpassord bekreftelse" + "message": "Hovedpassord-bekreftelse" }, "passwordConfirmationDesc": { "message": "Denne handlingen er beskyttet. For å fortsette, skriv inn hovedpassordet på nytt for å bekrefte identiteten din." @@ -2929,7 +2929,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "Maks $HOURS$ time(r) og $MINUTES$ minutt(er).", "placeholders": { "hours": { "content": "$1", @@ -3217,7 +3217,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ avslo forespørselen din: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3251,7 +3251,7 @@ } }, "forwarderNoUrl": { - "message": "Invalid $SERVICENAME$ url.", + "message": "Ugyldig $SERVICENAME$-url.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -3366,7 +3366,7 @@ "message": "Et varsel er sendt til enheten din." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Lås opp Bitwarden på enheten din eller på" }, "notificationSentDeviceAnchor": { "message": "nett-app" @@ -3444,7 +3444,7 @@ "message": "Innstillinger for auto-utfylling" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Auto-utfyllingshurtigtast(er)" }, "autofillKeyboardShortcutUpdateLabel": { "message": "Endre snarvei" @@ -3456,7 +3456,7 @@ "message": "Auto-utfyll tastatursnarvei" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Snarveien for auto-utfyllingspålogging er ikke angitt. Endre dette i nettleserens innstillinger." }, "autofillLoginShortcutText": { "message": "Autoutfyll-snarveien for pålogging er $COMMAND$. Håndter alle snarveiene i nettleserens innstillinger.", @@ -3489,7 +3489,7 @@ "message": "Enhetsgodkjennelse kreves" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Velg en godkjenningsmetode nedenfor" }, "rememberThisDevice": { "message": "Husk denne enheten" @@ -3556,7 +3556,7 @@ "message": "Innlogging godkjent" }, "userEmailMissing": { - "message": "User email missing" + "message": "Brukerens e-postadresse mangler" }, "activeUserEmailNotFoundLoggingYouOut": { "message": "Active user email not found. Logging you out." @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Enheten er betrodd" }, + "trustOrganization": { + "message": "Stol på organisasjon" + }, + "trust": { + "message": "Stol på" + }, + "doNotTrust": { + "message": "Ikke stol på" + }, + "organizationNotTrusted": { + "message": "Organisasjonen har ikke blitt stolt på" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Stol på brukler" + }, "sendsNoItemsTitle": { "message": "Ingen aktive Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3627,17 +3651,17 @@ } }, "multipleInputEmails": { - "message": "1 or more emails are invalid" + "message": "1 eller flere e-postadresser er ugyldige" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "Inndataen kan ikke bare inneholde tomrom.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { "message": "Inndataen er ikke en E-postadresse." }, "fieldsNeedAttention": { - "message": "$COUNT$ field(s) above need your attention.", + "message": "$COUNT$ felt(er) ovenfor trenger din oppmerksomhet.", "placeholders": { "count": { "content": "$1", @@ -3704,7 +3728,7 @@ "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Skru av/på sidenavigering" }, "skipToContent": { "message": "Hopp frem til innholdet" @@ -3714,7 +3738,7 @@ "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { - "message": "Toggle Bitwarden autofill menu", + "message": "Skru på/av Bitwardens auto-utfyllmeny", "description": "Screen reader and tool tip label for the overlay button" }, "bitwardenVault": { @@ -3722,11 +3746,11 @@ "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { - "message": "Unlock your account to view matching logins", + "message": "Lås opp kontoen din for å se samsvarende pålogginger", "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Lås opp kontoen din for å vise auto-utfyllingsforslag", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3734,11 +3758,11 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Lås opp kontoen din, åpnes i et nytt vindu", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "Tidsbasert engangskode for bekreftelse av passord", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { @@ -3746,7 +3770,7 @@ "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { - "message": "Fill credentials for", + "message": "Fyll ut innloggingsdetaljer for", "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { @@ -3770,7 +3794,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Legg til ny hvelvpåloggingsgjenstand, åpnes i et nytt vindu", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -3778,7 +3802,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Legg til ny hvelvkortgjenstand, åpnes i et nytt vindu", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -3786,11 +3810,11 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Add new vault identity item, opens in a new window", + "message": "Legg til ny hvelvinnstillingsgjenstand, åpnes i et nytt vindu", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Bitwarden autofill menu available. Press the down arrow key to select.", + "message": "Bitwarden-autoutfyllingsmenyen er tilgjengelig. Trykk på «Piltast ned»-knappen for å velge.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -3879,16 +3903,16 @@ "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." }, "duoRequiredForAccount": { - "message": "Duo two-step login is required for your account." + "message": "Duo-totrinnspålogging er påkrevd for kontoen din." }, "popoutExtension": { - "message": "Popout extension" + "message": "Sprett ut utvidelse" }, "launchDuo": { "message": "Start Duo" }, "importFormatError": { - "message": "Data is not formatted correctly. Please check your import file and try again." + "message": "Dataene er ikke formatert riktig. Sjekk importfilen og prøv på nytt." }, "importNothingError": { "message": "Ingenting ble importert." @@ -3897,7 +3921,7 @@ "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." }, "invalidFilePassword": { - "message": "Invalid file password, please use the password you entered when you created the export file." + "message": "Ugyldig filpassord, vennligst bruk passordet du skrev inn da du opprettet eksportfilen." }, "destination": { "message": "Destinasjon" @@ -3953,7 +3977,7 @@ "message": "Bekreft hvelvimportering" }, "confirmVaultImportDesc": { - "message": "This file is password-protected. Please enter the file password to import data." + "message": "Denne filen er passordbeskyttet. Vennligst skriv inn filpassordet for å importere data." }, "confirmFilePassword": { "message": "Bekreft filpassord" @@ -3980,19 +4004,19 @@ "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "Vil du logge inn med passnøkkel?" }, "passkeyAlreadyExists": { - "message": "A passkey already exists for this application." + "message": "En passnøkkel finnes allerede for dette programmet." }, "noPasskeysFoundForThisApplication": { - "message": "No passkeys found for this application." + "message": "Ingen passnøkler ble funnet for dette programmet." }, "noMatchingPasskeyLogin": { "message": "Du har ikke en samsvarende innlogging for dette nettstedet." }, "noMatchingLoginsForSite": { - "message": "No matching logins for this site" + "message": "Ingen samsvarende pålogginger for dette nettstedet" }, "searchSavePasskeyNewLogin": { "message": "Søk eller lagre passnøkkelen som en ny innlogging" @@ -4007,16 +4031,16 @@ "message": "Lagre passnøkkelen som en ny pålogging" }, "chooseCipherForPasskeySave": { - "message": "Choose a login to save this passkey to" + "message": "Velg en pålogging å lagre denne passnøkkelen til" }, "chooseCipherForPasskeyAuth": { - "message": "Choose a passkey to log in with" + "message": "Velg en passnøkkel å logge inn med" }, "passkeyItem": { "message": "Passkode-gjenstand" }, "overwritePasskey": { - "message": "Overwrite passkey?" + "message": "Vil du overskrive passnøkkelen?" }, "overwritePasskeyAlert": { "message": "This item already contains a passkey. Are you sure you want to overwrite the current passkey?" @@ -4025,7 +4049,7 @@ "message": "Funksjonen støttes ikke ennå" }, "yourPasskeyIsLocked": { - "message": "Authentication required to use passkey. Verify your identity to continue." + "message": "Autentisering kreves for å bruke passnøkkel. Bekreft identiteten din for å fortsette." }, "multifactorAuthenticationCancelled": { "message": "Multifaktorautentisering ble avbrutt" @@ -4061,7 +4085,7 @@ "message": "LastPass-multifaktorautentisering kreves" }, "lastPassMFADesc": { - "message": "Enter your one-time passcode from your authentication app" + "message": "Skriv inn engangs-passkoden fra autentiseringsappen din" }, "lastPassOOBDesc": { "message": "Approve the login request in your authentication app or enter a one-time passcode." @@ -4113,7 +4137,7 @@ "message": "Aktiv konto" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Bitwarden-konto" }, "availableAccounts": { "message": "Tilgjengelige kontoer" @@ -4195,7 +4219,7 @@ "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { - "message": "Unable to set Bitwarden as the default password manager", + "message": "Klarte ikke å sette Bitwarden som standard passordbehandler", "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "privacyPermissionAdditionNotGrantedDescription": { @@ -4207,7 +4231,7 @@ "description": "Button text for the setting that allows overriding the default browser autofill settings" }, "saveCipherAttemptSuccess": { - "message": "Credentials saved successfully!", + "message": "Legitimasjonen ble vellykket lagret!", "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { @@ -4215,7 +4239,7 @@ "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { - "message": "Credentials updated successfully!", + "message": "Legitimasjonen ble vellykket oppdatert!", "description": "Notification message for when updating credentials has succeeded." }, "passwordUpdated": { @@ -4233,7 +4257,7 @@ "message": "Fjern passordnøkkel" }, "passkeyRemoved": { - "message": "Passkey removed" + "message": "Passnøkkelen ble fjernet" }, "autofillSuggestions": { "message": "Autoutfyllingsforslag" @@ -4242,16 +4266,16 @@ "message": "Foreslåtte gjenstander" }, "autofillSuggestionsTip": { - "message": "Save a login item for this site to autofill" + "message": "Lagre en påloggingsgjenstand for dette nettstedet for å auto-utfylle" }, "yourVaultIsEmpty": { "message": "Hvelvet ditt er tomt" }, "noItemsMatchSearch": { - "message": "No items match your search" + "message": "Ingen gjenstander samsvarer med søket ditt" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "Tøm filtrene eller prøv et annet søkeuttrykk" }, "copyInfoTitle": { "message": "Kopiér info - $ITEMNAME$", @@ -4304,7 +4328,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Vis gjenstand - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4328,7 +4352,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Auto-utfyll - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4342,7 +4366,7 @@ } }, "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "message": "Kopier $FIELD$, $VALUE$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { @@ -4362,7 +4386,7 @@ "message": "Legg til i samlinger" }, "copyEmail": { - "message": "Copy email" + "message": "Kopier e-postadresse" }, "copyPhone": { "message": "Kopiér telefonnummer" @@ -4371,7 +4395,7 @@ "message": "Kopiér adresse" }, "adminConsole": { - "message": "Admin Console" + "message": "Administrasjonskonsoll" }, "accountSecurity": { "message": "Kontosikkerhet" @@ -4431,7 +4455,7 @@ "message": "Gjenstandens navn" }, "organizationIsDeactivated": { - "message": "Organization is deactivated" + "message": "Organisasjonen er deaktivert" }, "owner": { "message": "Eier" @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -4501,7 +4546,7 @@ "message": "Filtre" }, "filterVault": { - "message": "Filter vault" + "message": "Filtrer hvelv" }, "filterApplied": { "message": "Ett filter er benyttet" @@ -4597,7 +4642,7 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Vil du auto-utfylle ved sideinnlasting?" }, "cardExpiredTitle": { "message": "Utløpt kort" @@ -4681,7 +4726,7 @@ "message": "Bruk tekstfelter for data som sikkerhetsspørsmål" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Bruk skjulte felter for sensitive data, for eksempel passord" }, "checkBoxHelpText": { "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" @@ -4848,7 +4893,7 @@ "message": "Kontohandlinger" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Vis antall auto-utfyllingsforslag for pålogging på utvidelsesikonet" }, "showQuickCopyActions": { "message": "Vis hurtigkopieringshandlinger i hvelvet" @@ -4920,22 +4965,22 @@ "message": "Slett for alltid" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Du har ikke tillatelse til å redigere denne gjenstanden" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrisk opplåsing er ikke tilgjengelig fordi PIN-kode eller passord kreves først." }, "biometricsStatusHelptextHardwareUnavailable": { "message": "Biometrisk opplåsing er utilgjengelig for øyeblikket." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrisk opplåsing er ikke tilgjengelig på grunn av feilkonfigurerte systemfiler." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrisk opplåsing er ikke tilgjengelig på grunn av feilkonfigurerte systemfiler." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Biometrisk opplåsing er ikke tilgjengelig fordi Bitwarden-skrivebordsappen er lukket." }, "biometricsStatusHelptextNotEnabledInDesktop": { "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", @@ -4961,7 +5006,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Lagre til Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -4985,7 +5030,7 @@ "description": "Represents the @ key in screen reader content as a readable word" }, "hashSignCharacterDescriptor": { - "message": "Hash sign", + "message": "Hashtag-symbol", "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { @@ -5029,7 +5074,7 @@ "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "Equals", + "message": "Er lik", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { @@ -5049,7 +5094,7 @@ "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { - "message": "Pipe", + "message": "Rør", "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Viktig melding" - }, - "setupTwoStepLogin": { - "message": "Sett opp 2-trinnspålogging" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Minn meg på det senere" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nei, det gjør jeg ikke" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Slå på 2-trinnsinnlogging" - }, - "changeAcctEmail": { - "message": "Endre kontoens E-postadresse" - }, "extensionWidth": { "message": "Utvidelsens bredde" }, @@ -5157,31 +5166,31 @@ "message": "Ekstra bred" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Passordet du skrev inn er feil." }, "importSshKey": { - "message": "Import" + "message": "Importer" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Bekreft passordet" }, "enterSshKeyPasswordDesc": { "message": "Enter the password for the SSH key." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Skriv inn passord" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH-nøkkelen er ugyldig" }, "sshKeyTypeUnsupported": { "message": "The SSH key type is not supported" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Importer nøkkel fra utklippstavlen" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH-nøkkelen ble vellykket importert" }, "cannotRemoveViewOnlyCollections": { "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", @@ -5202,22 +5211,22 @@ "message": "Change at-risk password" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Hvelvinnstillinger" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Velkommen til Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Sikkerhet, prioritert" }, "securityPrioritizedBody": { "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Rask og enkel pålogging" }, "quickLoginBody": { "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." @@ -5229,31 +5238,43 @@ "message": "Use the generator to create and save strong, unique passwords for all your accounts." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Dine data, når og hvor du trenger dem" }, "secureDevicesBody": { "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importer eksisterende passord" }, "emptyVaultNudgeBody": { "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importér nå" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Velkommen til hvelvet ditt!" }, "hasItemsVaultNudgeBody": { "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Spar tid med auto-utfylling" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5262,21 +5283,28 @@ "message": "With cards, easily autofill payment forms securely and accurately." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Forenkle oppretting av kontoer" }, "newIdentityNudgeBody": { "message": "With identities, quickly autofill long registration or contact forms." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Beskytt dine sensitive data" }, "newNoteNudgeBody": { "message": "With notes, securely store sensitive data like banking or insurance details." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Utviklervennlig SSH-tilgang" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 2934c5da3fd..1f8debfdde9 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Vertrouwd apparaat" }, + "trustOrganization": { + "message": "Organisatie vertrouwen" + }, + "trust": { + "message": "Vertrouwen" + }, + "doNotTrust": { + "message": "Niet vertrouwen" + }, + "organizationNotTrusted": { + "message": "Organisatie is niet vertrouwd" + }, + "emergencyAccessTrustWarning": { + "message": "Bevestig, voor de veiligheid van je account, alleen als je noodtoegang hebt verleend aan deze gebruiker en de vingerafdruk voldoet aan wat er in hun account wordt weergegeven" + }, + "orgTrustWarning": { + "message": "Ga, voor de veiligheid van je account, alleen verder als je lid bent van deze organisatie, accountherstel hebt ingeschakeld en de hieronder weergegeven vingerafdruk overeenkomt met de vingerafdruk van de organisatie." + }, + "orgTrustWarning1": { + "message": "Deze organisatie heeft een Enterprise-beleid dat je inschrijft voor accountherstel. Inschrijving stelt beheerders van de organisatie in staat om je wachtwoord te wijzigen. Ga alleen verder als je deze organisatie herkent en de vingerafdrukzin die hieronder wordt weergegeven overeenkomt met de vingerafdruk van de organisatie." + }, + "trustUser": { + "message": "Gebruiker vertrouwen" + }, "sendsNoItemsTitle": { "message": "Geen actieve Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Bitwarden downloaden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Bitwarden op alle apparaten downloaden" + }, + "getTheMobileApp": { + "message": "De mobiele app downloaden" + }, + "getTheMobileAppDesc": { + "message": "Toegang tot je wachtwoorden onderweg met de mobiele Bitwarden-app." + }, + "getTheDesktopApp": { + "message": "De desktop-app downloaden" + }, + "getTheDesktopAppDesc": { + "message": "Toegang tot je kluis zonder browser, vervolgens ontgrendelen met biometrische gegevens om sneller te ontgrendelen in zowel de desktopapp als browserextensie." + }, + "downloadFromBitwardenNow": { + "message": "Nu van bitwarden.com downloaden" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Weet je zeker dat je deze bijlage definitief wilt verwijderen?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Belangrijke mededeling" - }, - "setupTwoStepLogin": { - "message": "Tweestapsaanmelding instellen" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Vanaf februari 2025 stuurt Bitwarden een code naar het e-mailadres van je account om inloggen op nieuwe apparaten te verifiëren." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Je kunt tweestapsaanmelding instellen als een alternatieve manier om je account te beschermen of je e-mailadres te veranderen naar een waar je toegang toe hebt." - }, - "remindMeLater": { - "message": "Herinner me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Heb je betrouwbare toegang tot je e-mail, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nee, dat heb ik niet" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Ja, ik heb betrouwbare toegang tot mijn e-mail" - }, - "turnOnTwoStepLogin": { - "message": "Tweestapsaanmelding inschakelen" - }, - "changeAcctEmail": { - "message": "E-mailadres van het account veranderen" - }, "extensionWidth": { "message": "Extensiebreedte" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Tijd besparen met automatisch aanvullen" }, - "newLoginNudgeBody": { - "message": "Voeg een website toe zodat deze login wordt weergegeven als een automatische invulsuggestie." + "newLoginNudgeBodyOne": { + "message": "Voeg een", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "toe zodat deze login wordt weergegeven als een automatische invulsuggestie.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Naadloos online afrekenen" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Ontwikkelaars-vriendelijke SSH-toegang" }, - "newSshNudgeBody": { - "message": "Sla je sleutels op en verbind met de SSH-agent voor snelle, versleutelde authenticatie." + "newSshNudgeBodyOne": { + "message": "Sla je sleutels op en verbind met de SSH-agent voor snelle, versleutelde authenticatie.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Meer informatie over SSH-agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 042cafb0300..c551282e727 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Zaufano urządzeniu" }, + "trustOrganization": { + "message": "Zaufaj organizacji" + }, + "trust": { + "message": "Zaufaj" + }, + "doNotTrust": { + "message": "Nie ufaj" + }, + "organizationNotTrusted": { + "message": "Organizacja nie jest zaufana" + }, + "emergencyAccessTrustWarning": { + "message": "Dla bezpieczeństwa Twojego konta potwierdź tylko, jeśli przyznano temu użytkownikowi dostęp awaryjny i jego odcisk palca pasuje do tego, co widnieje na jego koncie" + }, + "orgTrustWarning": { + "message": "Dla zapewnienia bezpieczeństwa konta kontynuuj tylko wtedy, gdy jesteś członkiem tej organizacji, włączono odzyskiwanie konta, a odcisk palca wyświetlany poniżej pasuje do odcisku palca organizacji." + }, + "orgTrustWarning1": { + "message": "Polityka korporacyjna tej organizacji umożliwia zapisanie Cię do programu odzyskiwania kont. Rejestracja umożliwi administratorom organizacji zmianę Twojego hasła. Możesz kontynuować tylko wtedy, gdy znasz tę organizację, a odcisk palca pokazany poniżej pasuje do odcisku palca tej organizacji." + }, + "trustUser": { + "message": "Zaufaj użytkownikowi" + }, "sendsNoItemsTitle": { "message": "Brak aktywnych wysyłek", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Pobierz Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Pobierz Bitwarden na wszystkich urządzeniach" + }, + "getTheMobileApp": { + "message": "Pobierz aplikację mobilną" + }, + "getTheMobileAppDesc": { + "message": "Uzyskaj dostęp do haseł przy pomocy aplikacji mobilnej Bitwarden." + }, + "getTheDesktopApp": { + "message": "Pobierz aplikację desktopową" + }, + "getTheDesktopAppDesc": { + "message": "Uzyskaj dostęp do sejfu bez przeglądarki, a następnie ustaw odblokowanie biometryczne, aby przyspieszyć odblokowanie zarówno w aplikacji desktopowej, jak i w rozszerzeniu przeglądarki." + }, + "downloadFromBitwardenNow": { + "message": "Pobierz teraz z bitwarden.com" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Czy na pewno chcesz trwale usunąć ten załącznik?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Ważna informacja" - }, - "setupTwoStepLogin": { - "message": "Skonfiguruj dwustopniowe logowanie" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden wyśle kod na Twój adres e-mail w celu zweryfikowania logowania z nowych urządzeń, począwszy od lutego 2025 r." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Możesz skonfigurować dwustopniowe logowanie jako alternatywny sposób ochrony konta lub zmienić swój adres e-mail, do którego masz dostęp." - }, - "remindMeLater": { - "message": "Przypomnij mi później" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Czy masz pewny dostęp do swojego adresu e-mail, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nie, nie mam" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Tak, mam pewny dostęp do mojego adresu e-mail" - }, - "turnOnTwoStepLogin": { - "message": "Włącz dwustopniowe logowanie" - }, - "changeAcctEmail": { - "message": "Zmień adres e-mail konta" - }, "extensionWidth": { "message": "Szerokość rozszerzenia" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Oszczędzaj czas dzięki autouzupełnianiu" }, - "newLoginNudgeBody": { - "message": "Dołącz stronę internetową, aby ten login pojawił się jako sugestia autouzupełniania." + "newLoginNudgeBodyOne": { + "message": "Dołącz", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "stronę internetową, ", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "aby ten login pojawił się jako sugestia autouzupełniania.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Bezproblemowe zamówienia online" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Przyjazny dla deweloperów dostęp SSH" }, - "newSshNudgeBody": { - "message": "Przechowuj swoje klucze i połącz się z agentem SSH dla szybkiego, szyfrowanego uwierzytelniania." + "newSshNudgeBodyOne": { + "message": "Przechowuj swoje klucze i połącz się z agentem SSH dla szybkiego, szyfrowanego uwierzytelniania.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Dowiedz się więcej o agencie SSH", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index c4fb561b5be..65ef99cd95e 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -200,19 +200,19 @@ "message": "Autopreencher" }, "autoFillLogin": { - "message": "Preenchimento automático ‘login’" + "message": "Preencher login automaticamente" }, "autoFillCard": { - "message": "Preenchimento automático cartão" + "message": "Preencher cartão automaticamente" }, "autoFillIdentity": { - "message": "Preenchimento automático identidade" + "message": "Preencher identidade automaticamente" }, "fillVerificationCode": { "message": "Preencher o código de verificação" }, "fillVerificationCodeAria": { - "message": "Preencher o código de verificação", + "message": "Preencher código de verificação", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -830,7 +830,7 @@ } }, "autofillError": { - "message": "Não é possível auto-preencher o item selecionado nesta página. Em alternativa, copie e cole a informação." + "message": "Não é possível preencher automaticamente o item selecionado nesta página. Em vez disso, copie e cole a informação." }, "totpCaptureError": { "message": "Não foi possível escanear o código QR a partir da página atual" @@ -1025,7 +1025,7 @@ "message": "Pedir para adicionar um item se um não for encontrado no seu cofre. Aplica-se a todas as contas logadas." }, "showCardsInVaultViewV2": { - "message": "Sempre mostrar cartões como sugestões de preenchimento automático na Tela do Cofre" + "message": "Sempre mostrar cartões como sugestões de preenchimento automático na tela do Cofre" }, "showCardsCurrentTab": { "message": "Mostrar cartões em páginas com guias." @@ -1043,10 +1043,10 @@ "message": "Liste os itens de identidade na aba atual para facilitar preenchimento automático." }, "clickToAutofillOnVault": { - "message": "Clique em itens para autopreencher na Tela do Cofre" + "message": "Clique em itens na tela do Cofre para preencher automaticamente" }, "clickToAutofill": { - "message": "Selecione itens sugeridos pelo autopreenchimento" + "message": "Selecione o item para preenchê-lo automaticamente" }, "clearClipboard": { "message": "Limpar Área de Transferência", @@ -1185,7 +1185,7 @@ "message": "Atualizar" }, "notificationUnlockDesc": { - "message": "Desbloqueie o seu cofre do Bitwarden para concluir a solicitação de autopreenchimento." + "message": "Desbloqueie o seu cofre do Bitwarden para concluir a solicitação de preenchimento automático." }, "notificationUnlock": { "message": "Desbloquear" @@ -1203,7 +1203,7 @@ "message": "Use um clique secundário para acessar a geração de senha e os logins correspondentes para o site. Aplica-se a todas as contas logadas." }, "defaultUriMatchDetection": { - "message": "Detecção de Correspondência de URI Padrão", + "message": "Detecção de correspondência de URI padrão", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { @@ -1626,7 +1626,7 @@ "message": "Preenchimento automático ao carregar a página" }, "enableAutoFillOnPageLoad": { - "message": "Auto-preencher ao carregar a página" + "message": "Preencher automaticamente ao carregar a página" }, "enableAutoFillOnPageLoadDesc": { "message": "Se um formulário de login for detectado, realizar automaticamente um auto-preenchimento quando a página web carregar." @@ -1644,19 +1644,19 @@ "message": "Configuração de autopreenchimento padrão para itens de credenciais" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Depois de habilitar o Auto-preenchimento ao carregar a página, você pode habilitar ou desabilitar o recurso para itens de credenciais individuais. Esta é a configuração padrão para itens de credenciais que não são configurados separadamente." + "message": "Você pode desativar o preenchimento automático no carregamento da página para credenciais individuais na tela de Editar do item." }, "itemAutoFillOnPageLoad": { - "message": "Auto-preencher no Carregamento da Página (se ativado nas Opções)" + "message": "Preencher automaticamente ao carregar a página (se configurado nas Opções)" }, "autoFillOnPageLoadUseDefault": { "message": "Usar configuração padrão" }, "autoFillOnPageLoadYes": { - "message": "Auto-preencher ao carregar a página" + "message": "Preencher automaticamente ao carregar a página" }, "autoFillOnPageLoadNo": { - "message": "Não auto-preencher ao carregar a página" + "message": "Não preencher automaticamente ao carregar a página" }, "commandOpenPopup": { "message": "Abrir pop-up do cofre" @@ -1668,10 +1668,10 @@ "message": "Preencher automaticamente o último login utilizado para o site atual" }, "commandAutofillCardDesc": { - "message": "Preenchimento automático do último cartão utilizado para o site atual" + "message": "Preencher automaticamente o último cartão utilizado para o site atual" }, "commandAutofillIdentityDesc": { - "message": "Autopreencher a última identidade usada para o site atual" + "message": "Preencher automaticamente a última identidade usada para o site atual" }, "commandGeneratePasswordDesc": { "message": "Gerar e copiar uma nova senha aleatória para a área de transferência." @@ -2244,16 +2244,16 @@ "message": "Confirmação de Ação de Tempo Limite" }, "autoFillAndSave": { - "message": "Autopreencher e Salvar" + "message": "Preencher automaticamente e salvar" }, "fillAndSave": { "message": "Preencher e salvar" }, "autoFillSuccessAndSavedUri": { - "message": "Item Auto-Preenchido e URI Salvo" + "message": "Item preenchido automaticamente e URI salva" }, "autoFillSuccess": { - "message": "Item Auto-Preenchido" + "message": "Item preenchido automaticamente " }, "insecurePageWarning": { "message": "Aviso: Esta é uma página HTTP não segura, e qualquer informação que você enviar poderá ser interceptada e modificada por outras pessoas. Este login foi originalmente salvo em uma página segura (HTTPS)." @@ -2482,10 +2482,10 @@ "message": "O Bitwarden não irá pedir para salvar os detalhes de credencial para estes domínios. Você deve atualizar a página para que as alterações entrem em vigor." }, "blockedDomainsDesc": { - "message": "\"Autopreencher\" e outros recursos podem não estar disponíveis para estes sites. Atualize a página para que as mudanças surtam efeito." + "message": "O preenchimento automático e outros recursos podem não estar disponíveis para estes sites. Atualize a página para que as mudanças surtam efeito." }, "autofillBlockedNoticeV2": { - "message": "\"Auto completar\" está bloqueado para este site." + "message": "O preenchimento automático está bloqueado para este site." }, "autofillBlockedNoticeGuidance": { "message": "Altere isso em configurações" @@ -3420,10 +3420,10 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Suas políticas de organização ativaram o autopreenchimento ao carregar a página." + "message": "Suas políticas de organização ativaram o preenchimento automático ao carregar a página." }, "howToAutofill": { - "message": "Como autopreencher" + "message": "Como preencher automaticamente" }, "autofillSelectInfoWithCommand": { "message": "Selecione um item desta tela, use o atalho $COMMAND$, ou explore outras opções nas configurações.", @@ -3441,10 +3441,10 @@ "message": "Entendi" }, "autofillSettings": { - "message": "Configurações de autopreenchimento" + "message": "Configurações de preenchimento automático" }, "autofillKeyboardShortcutSectionTitle": { - "message": "Autofill shortcut" + "message": "Atalho de preenchimento automático" }, "autofillKeyboardShortcutUpdateLabel": { "message": "Alterar atalho" @@ -3453,13 +3453,13 @@ "message": "Gerenciar atalhos" }, "autofillShortcut": { - "message": "Atalho para autopreenchimento" + "message": "Atalho de teclado para preenchimento automático" }, "autofillLoginShortcutNotSet": { - "message": "O atalho de acesso ao preenchimento automático não está definido. Altere isso nas configurações do navegador." + "message": "O atalho do preenchimento automático não está definido. Altere isso nas configurações do navegador." }, "autofillLoginShortcutText": { - "message": "O atalho de login de preenchimento automático é $COMMAND$. Gerencie todos os atalhos nas configurações do navegador.", + "message": "O atalho de preenchimento automático é $COMMAND$. Gerencie todos os atalhos nas configurações do navegador.", "placeholders": { "command": { "content": "$1", @@ -3468,7 +3468,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Atalho padrão de autopreenchimento: $COMMAND$.", + "message": "Atalho padrão de preenchimento automático: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositivo confiável" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Nenhum Send ativo", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3692,11 +3716,11 @@ "message": "Alias do domínio" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Os itens com confirmação de senha mestra não podem ser auto-preenchidos ao carregar a página. O carregamento da página será desativado.", + "message": "Os itens com confirmação de senha mestra não podem ser preenchidos automaticamente ao carregar a página. O preenchimento automático ao carregar a página será desativado.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "Definir preenchimento automático ao carregar página para usar a configuração padrão.", + "message": "O preenchimento automático ao carregar a página está usando a configuração padrão.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -3710,15 +3734,15 @@ "message": "Ir para o conteúdo" }, "bitwardenOverlayButton": { - "message": "Botão de Menu de Autopreenchimento Bitwarden", + "message": "Botão de menu de preenchimento automático do Bitwarden", "description": "Page title for the iframe containing the overlay button" }, "toggleBitwardenVaultOverlay": { - "message": "Alternar menu de autopreenchimento do Bitwarden", + "message": "Ativar menu de preenchimento automático do Bitwarden", "description": "Screen reader and tool tip label for the overlay button" }, "bitwardenVault": { - "message": "Menu de autopreenchimento Bitwarden", + "message": "Menu de preenchimento automático do Bitwarden", "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { @@ -3738,11 +3762,11 @@ "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Código de Verificação TOTP", + "message": "Código de verificação TOTP", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Tempo até expirar o código", + "message": "Tempo até o código expirar", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { @@ -3790,7 +3814,7 @@ "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Menu de autopreenchimento do Bitwarden disponível. Pressione a tecla de seta para baixo para selecionar.", + "message": "Menu de preenchimento automático do Bitwarden disponível. Pressione a tecla de seta para baixo para selecionar.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -4167,7 +4191,7 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Alterar as configurações de autopreenchimento e gerenciamento de senhas do seu navegador.", + "message": "Altere as configurações de preenchimento automático e gerenciamento de senhas do seu navegador.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { @@ -4175,7 +4199,7 @@ "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Alterar as configurações de autopreenchimento e gerenciamento de senhas do seu navegador.", + "message": "Altere as configurações de preenchimento automático e gerenciamento de senhas do seu navegador.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { @@ -4187,7 +4211,7 @@ "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { - "message": "Ignorar esta opção pode causar conflitos entre o menu de autopreenchimento do Bitwarden e o do seu navegador.", + "message": "Ignorar esta opção pode causar conflitos entre o menu de preenchimento automático do Bitwarden e o do seu navegador.", "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { @@ -4318,7 +4342,7 @@ } }, "autofillTitle": { - "message": "Auto-preenchimento - $ITEMNAME$", + "message": "Preencher automaticamente - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4328,7 +4352,7 @@ } }, "autofillTitleWithField": { - "message": "Autocompletar - $ITEMNAME$ - $FIELD$", + "message": "Preencher automaticamente - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Tem certeza de que deseja excluir este anexo permanentemente?" }, @@ -4544,7 +4589,7 @@ "message": "Chave do autenticador" }, "autofillOptions": { - "message": "Opções de autopreenchimento" + "message": "Opções de preenchimento automático" }, "websiteUri": { "message": "Site (URI)" @@ -4597,7 +4642,7 @@ } }, "autoFillOnPageLoad": { - "message": "Preenchimento automático ao carregar a página?" + "message": "Preencher automaticamente ao carregar a página?" }, "cardExpiredTitle": { "message": "Cartão expirado" @@ -4687,7 +4732,7 @@ "message": "Use caixas de seleção se gostaria de preencher automaticamente a caixa de seleção de um formulário, como um e-mail de lembrança" }, "linkedHelpText": { - "message": "Use um campo vinculado quando estiver enfrentando problemas com o auto-preenchimento com um site específico." + "message": "Use um campo vinculado quando estiver enfrentando problemas com o preenchimento automático com um site específico." }, "linkedLabelHelpText": { "message": "Digite o Id html do campo, nome, nome aria-label, ou espaço reservado." @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Aviso importante" - }, - "setupTwoStepLogin": { - "message": "Configurar login em duas etapas" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden enviará um código para o seu e-mail para verificar novos dispositivos a partir de fevereiro de 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Você pode configurar o login em duas etapas como uma forma alternativa de proteger sua conta ou mudar seu e-mail para um que você possa acessar." - }, - "remindMeLater": { - "message": "Lembre-me depois" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Você tem acesso ao seu e-mail, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Não tenho" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Sim, posso acessar meu e-mail de forma confiável" - }, - "turnOnTwoStepLogin": { - "message": "Ativar login em duas etapas" - }, - "changeAcctEmail": { - "message": "Alterar e-mail" - }, "extensionWidth": { "message": "Largura da janela" }, @@ -5220,7 +5229,7 @@ "message": "Login rápido e fácil" }, "quickLoginBody": { - "message": "Ative o desbloqueio por biometria e o autopreenchimento para acessar suas contas sem digitar uma única letra." + "message": "Ative o desbloqueio por biometria e o preenchimento automático para acessar suas contas sem digitar uma única letra." }, "secureUser": { "message": "Melhore seus logins de nível" @@ -5247,25 +5256,37 @@ "message": "Welcome to your vault!" }, "hasItemsVaultNudgeBody": { - "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" + "message": "Preencha automaticamente items para a página atual\nFavorite itens para acesso rápido\nPesquise seu cofre por outras coisas" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Seja mais rápido com o preenchimento automático" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Preencha automaticamente formulários de pagamento com cartões de forma segura e precisa." }, "newIdentityNudgeTitle": { "message": "Simplify creating accounts" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Preencha automaticamente formulários longos de registro ou contato de forma rápida." }, "newNoteNudgeTitle": { "message": "Keep your sensitive data safe" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 0af5cb2d13f..4b587672633 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispositivo de confiança" }, + "trustOrganization": { + "message": "Confiar na organização" + }, + "trust": { + "message": "Confiar" + }, + "doNotTrust": { + "message": "Não confiar" + }, + "organizationNotTrusted": { + "message": "A organização não é de confiança" + }, + "emergencyAccessTrustWarning": { + "message": "Para segurança da sua conta, confirme apenas se tiver concedido acesso de emergência a este utilizador e se a sua impressão digital corresponder à que é apresentada na sua conta" + }, + "orgTrustWarning": { + "message": "Para segurança da sua conta, prossiga apenas se for membro desta organização, tiver a recuperação de conta ativada e a impressão digital apresentada abaixo corresponder à impressão digital da organização." + }, + "orgTrustWarning1": { + "message": "Esta organização tem uma política empresarial que o registará na recuperação de conta. A inscrição permitirá que os administradores da organização alterem a sua palavra-passe. Avance apenas se reconhecer esta organização e se a frase de impressão digital apresentada abaixo corresponder à impressão digital da organização." + }, + "trustUser": { + "message": "Confiar no utilizador" + }, "sendsNoItemsTitle": { "message": "Sem Sends ativos", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Descarregar o Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Descarregue o Bitwarden em todos os dispositivos" + }, + "getTheMobileApp": { + "message": "Obtenha a app móvel" + }, + "getTheMobileAppDesc": { + "message": "Aceda às suas palavras-passe em qualquer lugar com a app móvel Bitwarden." + }, + "getTheDesktopApp": { + "message": "Obtenha a app para computador" + }, + "getTheDesktopAppDesc": { + "message": "Aceda ao seu cofre sem um navegador e, em seguida, configure o desbloqueio com biometria para acelerar o desbloqueio na app para computador e na extensão do navegador." + }, + "downloadFromBitwardenNow": { + "message": "Descarregue já a partir de bitwarden.com" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Tem a certeza de que pretende eliminar permanentemente este anexo?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Aviso importante" - }, - "setupTwoStepLogin": { - "message": "Definir a verificação de dois passos" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "O Bitwarden enviará um código para o e-mail da sua conta para verificar as credenciais de novos dispositivos a partir de fevereiro de 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Pode configurar a verificação de dois passos como forma alternativa de proteger a sua conta ou alterar o seu e-mail para um a que possa aceder." - }, - "remindMeLater": { - "message": "Lembrar-me mais tarde" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Tem um acesso fiável ao seu e-mail, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Não, não tenho" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Sim, consigo aceder de forma fiável ao meu e-mail" - }, - "turnOnTwoStepLogin": { - "message": "Ativar a verificação de dois passos" - }, - "changeAcctEmail": { - "message": "Alterar o e-mail da conta" - }, "extensionWidth": { "message": "Largura da extensão" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Poupe tempo com o preenchimento automático" }, - "newLoginNudgeBody": { - "message": "Inclua um site para que esta credencial apareça como uma sugestão de preenchimento automático." + "newLoginNudgeBodyOne": { + "message": "Inclua um", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "site", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "para que esta credencial apareça como uma sugestão de preenchimento automático.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Pagamentos online sem problemas" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Acesso SSH de fácil utilização pelos programadores" }, - "newSshNudgeBody": { - "message": "Guarde as suas chaves e ligue-se ao agente SSH para uma autenticação rápida e encriptada." + "newSshNudgeBodyOne": { + "message": "Guarde as suas chaves e ligue-se ao agente SSH para uma autenticação rápida e encriptada.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Saiba mais sobre o agente SSH", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index bf08e0969b2..648c2e06d53 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dispozitiv de încredere" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index f6343f6d2bb..ebf053af3b6 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Доверенное устройство" }, + "trustOrganization": { + "message": "Доверенная организация" + }, + "trust": { + "message": "Доверять" + }, + "doNotTrust": { + "message": "Не доверять" + }, + "organizationNotTrusted": { + "message": "Организации не доверяют" + }, + "emergencyAccessTrustWarning": { + "message": "В целях обеспечения безопасности вашего аккаунта подтверждайте только в том случае, если вы предоставили этому пользователю экстренный доступ и его отпечаток совпадает с отображаемым в его аккаунте" + }, + "orgTrustWarning": { + "message": "В целях обеспечения безопасности вашего аккаунта продолжайте только в том случае, если вы являетесь членом этой организации, у вас включено восстановление аккаунта, а отображаемый ниже отпечаток совпадает с отпечатком организации." + }, + "orgTrustWarning1": { + "message": "В этой организации действует политика, которая позволит вам участвовать в восстановлении аккаунта. Регистрация позволит администраторам организации изменить ваш пароль. Продолжайте, только если вы знаете эту организацию и фраза отпечатков, показанная ниже, совпадает с отпечатками организации." + }, + "trustUser": { + "message": "Доверенный пользователь" + }, "sendsNoItemsTitle": { "message": "Нет активных Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Скачать Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Скачать Bitwarden на все устройства" + }, + "getTheMobileApp": { + "message": "Скачать мобильное приложение" + }, + "getTheMobileAppDesc": { + "message": "Доступ к вашим паролям через мобильное приложение Bitwarden." + }, + "getTheDesktopApp": { + "message": "Скачать приложение для компьютера" + }, + "getTheDesktopAppDesc": { + "message": "Получите доступ к хранилищу без браузера, затем настройте разблокировку с помощью биометрии для ускорения разблокировки в приложении для компьютера и расширении браузера." + }, + "downloadFromBitwardenNow": { + "message": "Скачать с bitwarden.com" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Вы уверены, что хотите навсегда удалить это вложение?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Важное уведомление" - }, - "setupTwoStepLogin": { - "message": "Настроить двухэтапную аутентификацию" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Начиная с февраля 2025 года Bitwarden будет отправлять код на электронную почту вашего аккаунта для подтверждения авторизации с новых устройств." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "В качестве альтернативного способа защиты учетной записи вы можете настроить двухэтапную аутентификацию или сменить электронную почту на ту, к которой вы можете получить доступ." - }, - "remindMeLater": { - "message": "Напомнить позже" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Есть ли у вас надежный доступ к электронной почте $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Нет, не знаю" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Да, я имею надежный доступ к своей электронной почте" - }, - "turnOnTwoStepLogin": { - "message": "Включить двухэтапную аутентификацию" - }, - "changeAcctEmail": { - "message": "Изменить email аккаунта" - }, "extensionWidth": { "message": "Ширина расширения" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Экономьте время с помощью автозаполнения" }, - "newLoginNudgeBody": { - "message": "Включите сайт, чтобы этот логин отображался в качестве предложения для автозаполнения." + "newLoginNudgeBodyOne": { + "message": "Включите", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "сайт", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "чтобы этот логин отображался в качестве предложения для автозаполнения.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Оформление заказа через интернет" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Удобный для разработчиков SSH-доступ" }, - "newSshNudgeBody": { - "message": "Храните свои ключи и подключайтесь с помощью агента SSH для быстрой и зашифрованной аутентификации." + "newSshNudgeBodyOne": { + "message": "Храните свои ключи и подключайтесь с помощью агента SSH для быстрой и зашифрованной аутентификации.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Узнайте больше об агенте SSH", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index a5f7e772505..87443d89615 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 5f65633e44c..81ac2a23620 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Dôveryhodné zariadenie" }, + "trustOrganization": { + "message": "Dôverovať organizácii" + }, + "trust": { + "message": "Dôverovať" + }, + "doNotTrust": { + "message": "Nedôverovať" + }, + "organizationNotTrusted": { + "message": "Organizácia nie je dôveryhodná" + }, + "emergencyAccessTrustWarning": { + "message": "Pre bezpečnosť vášho účtu stačí overiť, ze ste tomuto používateľovi udelili núdzový pristúp, a že odtlačok sa zhoduje s odtlačkom zobrazenom v používateľovom účte" + }, + "orgTrustWarning": { + "message": "Pre bezpečnosť vášho účtu pokračujte, iba ak ste členom organizácie, máte povolenú obnovu účtu a odtlačok sa zhoduje s odtlačkom organizácie." + }, + "orgTrustWarning1": { + "message": "Táto organizácia má pravidlá spoločnosti, ktoré vás zaregistrujú do obnovy účtu. Zápis umožní správcom organizácie zmeniť vaše heslo. Pokračujte len vtedy, ak túto organizáciu poznáte a nižšie zobrazená fráza odtlačku prsta sa zhoduje s odtlačkom prsta organizácie." + }, + "trustUser": { + "message": "Dôverovať používateľovi" + }, "sendsNoItemsTitle": { "message": "Žiadne aktívne Sendy", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Stiahnuť Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Stiahnuť Bitwarden na všetky zariadenia" + }, + "getTheMobileApp": { + "message": "Získajte mobilnú aplikáciu" + }, + "getTheMobileAppDesc": { + "message": "Majte prístup k heslám na cestách pomocou mobilnej aplikácie Bitwarden." + }, + "getTheDesktopApp": { + "message": "Získať desktopovú aplikáciu" + }, + "getTheDesktopAppDesc": { + "message": "Pristupujte k trezoru bez prehliadača, a potom nastavte odomykanie pomocou biometrie, aby ste urýchlili odomykanie v desktopovej aplikácii aj v rozšírení prehliadača." + }, + "downloadFromBitwardenNow": { + "message": "Stiahnuť teraz z bitwarden.com" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Naozaj chcete natrvalo odstrániť túto prílohu?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Dôležité upozornenie" - }, - "setupTwoStepLogin": { - "message": "Nastavenie dvojstupňového prihlásenia" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden vám od februára 2025 pošle na e-mail vášho účtu kód na overenie prihlásenia z nových zariadení." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Ako alternatívny spôsob ochrany svojho účtu môžete nastaviť dvojstupňové prihlásenie alebo zmeniť e-mail na taký, ku ktorému máte prístup." - }, - "remindMeLater": { - "message": "Pripomenúť neskôr" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Máte zaručený prístup k e-mailu $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Nie, nemám" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Áno, mám zaručený prístup k e-mailu" - }, - "turnOnTwoStepLogin": { - "message": "Zapnúť dvojstupňové prihlásenie" - }, - "changeAcctEmail": { - "message": "Zmeniť e-mail účtu" - }, "extensionWidth": { "message": "Šírka rozšírenia" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Ušetrite čas s automatickým vypĺňaním" }, - "newLoginNudgeBody": { - "message": "Zadajte webovú stránku, aby sa tieto prihlasovacie údaje zobrazili ako návrh na automatické vyplnenie." + "newLoginNudgeBodyOne": { + "message": "Zahrnúť", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "webstránku", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "aby sa tieto prihlasovacie údaje zobrazili ako návrh na automatické vyplnenie.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Bezproblémová online registrácia" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Prístup SSH vhodný pre vývojárov" }, - "newSshNudgeBody": { - "message": "Uložte si kľúče a pripojte sa pomocou agenta SSH na rýchle šifrované overovanie." + "newSshNudgeBodyOne": { + "message": "Uložte si kľúče a pripojte sa pomocou agenta SSH na rýchle šifrované overovanie.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Viac informácií o agentovi SSH", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index c7585878d8a..7bc5abe9e0f 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index a5b18b0da21..55ecd18295b 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Уређај поуздан" }, + "trustOrganization": { + "message": "Повери организацију" + }, + "trust": { + "message": "Повери" + }, + "doNotTrust": { + "message": "Не повери" + }, + "organizationNotTrusted": { + "message": "Организација није поверљива" + }, + "emergencyAccessTrustWarning": { + "message": "За сигурност вашег налога, потврдите само ако сте добили хитни приступ овом кориснику и њиховим отискама одговарају оно што се приказује на њиховом налогу" + }, + "orgTrustWarning": { + "message": "За сигурност вашег рачуна, наставите само ако сте члан ове организације, омогућили опоравак рачуна и отисак који се приказује испод одговара прстима организације." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Повери кориснику" + }, "sendsNoItemsTitle": { "message": "Нема активних Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Да ли сте сигурни да желите да трајно избришете овај прилог?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Бета" }, - "importantNotice": { - "message": "Важно обавештење" - }, - "setupTwoStepLogin": { - "message": "Поставити дво-степенску пријаву" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden ће послати кôд на имејл вашег налога за верификовање пријављивања са нових уређаја почевши од фебруара 2025." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Можете да подесите пријаву у два корака као алтернативни начин да заштитите свој налог или да промените свој имејл у један који можете да приступите." - }, - "remindMeLater": { - "message": "Подсети ме касније" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Да ли имате поуздан приступ својим имејлом, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Не, ненам" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Да, могу поуздано да приступим овим имејлом" - }, - "turnOnTwoStepLogin": { - "message": "Упалити дво-степенску пријаву" - }, - "changeAcctEmail": { - "message": "Променити имејл налога" - }, "extensionWidth": { "message": "Ширина додатка" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Уштедите време са ауто-пуњењем" }, - "newLoginNudgeBody": { - "message": "Укључите веб страницу тако да се ова пријава појављује као предлог за ауто-пуњење." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Лак SSH приступ" }, - "newSshNudgeBody": { - "message": "Чувајте кључеве и повежите се са SSH агент за брзу, шифровану аутентификацију." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 27443c64140..16f28c3f5ed 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Enhet betrodd" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Inga aktiva Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 99a09c75d41..535bc2c7750 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index f6c8a9f0584..43a940196aa 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Device trusted" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "No active Sends", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Important notice" - }, - "setupTwoStepLogin": { - "message": "Set up two-step login" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Remind me later" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "No, I do not" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Yes, I can reliably access my email" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Change account email" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 052941f2281..d97b023a695 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Cihaza güvenildi" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Güvenme" + }, + "organizationNotTrusted": { + "message": "Kuruluş güvenilir değil" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Aktif Send yok", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Bitwarden’ı indirin" + }, + "downloadBitwardenOnAllDevices": { + "message": "Bitwarden’ı tüm cihazlarınıza indirin" + }, + "getTheMobileApp": { + "message": "Mobil uygulamayı indirin" + }, + "getTheMobileAppDesc": { + "message": "Parolalarınıza Bitwarden mobil uygulaması sayesinde her yerden ulaşın." + }, + "getTheDesktopApp": { + "message": "Masaüstü uygulamasını indirin" + }, + "getTheDesktopAppDesc": { + "message": "Kasanıza tarayıcıyı kullanmadan erişin, biyometri ile kilit açmayı etkinleştirerek hem masaüstü uygulamasından hem de tarayıcı uzantısından kilit açmayı geliştirin." + }, + "downloadFromBitwardenNow": { + "message": "Şimdi bitwarden.com’dan indirin" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Bu dosyayı kalıcı olarak silmek istediğinizden emin misiniz?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Önemli uyarı" - }, - "setupTwoStepLogin": { - "message": "İki adımlı girişi ayarla" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Şubat 2025 itibarıyla Bitwarden, yeni cihazlardan yeni girişleri doğrulamanız için e-posta adresinize bir kod gönderecektir." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Hesabınızı korumanın alternatif bir yolu olarak iki adımlı girişi etkinleştirebilirsiniz. Aksi halde e-posta adresinizin doğru olduğundan emin olmalısınız." - }, - "remindMeLater": { - "message": "Daha sonra hatırlat" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "$EMAIL$ adresinize sağlıklı bir şekilde erişebiliyor musunuz?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Hayır, erişemiyorum" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Evet, e-postalarıma sağlıklı bir şekilde erişebiliyorum" - }, - "turnOnTwoStepLogin": { - "message": "İki adımlı girişi etkinleştir" - }, - "changeAcctEmail": { - "message": "Hesap e-postasını değiştir" - }, "extensionWidth": { "message": "Uzantı genişliği" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Otomatik doldurmayla zaman kazanın" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Bu hesabın otomatik doldurma önerisi olarak görünmesi için bir", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "web sitesi", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "ekleyin.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Kesintisiz çevrimiçi alışveriş" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 7b62690d03c..8de8ba8a97b 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -1072,7 +1072,7 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Редагувати перед збереженням", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { @@ -1115,11 +1115,11 @@ "description": "Button text for updating an existing login entry." }, "saveLogin": { - "message": "Save login", + "message": "Зберегти запис", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Оновити наявний запис", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Довірений пристрій" }, + "trustOrganization": { + "message": "Довіряти організації" + }, + "trust": { + "message": "Довіряти" + }, + "doNotTrust": { + "message": "Не довіряти" + }, + "organizationNotTrusted": { + "message": "Це не довірена організація" + }, + "emergencyAccessTrustWarning": { + "message": "Щоб захистити свій обліковий запис, підтверджуйте лише якщо ви надали цьому користувачу екстрений доступ, і його цифровий відбиток збігається з показаним в його обліковому записі." + }, + "orgTrustWarning": { + "message": "Щоб захистити свій обліковий запис, продовжуйте лише якщо ви є учасником цієї організації, маєте ввімкнене відновлення облікового запису, і показаний нижче цифровий відбиток збігається з відбитком організації." + }, + "orgTrustWarning1": { + "message": "Ця організація має політику компанії, яка розгорне для вас відновлення облікового запису. Розгортання дасть змогу адміністраторам організації змінювати ваш пароль. Продовжуйте тільки якщо ви впізнаєте організацію і наведена нижче фраза відбитка відповідає відбитку організації." + }, + "trustUser": { + "message": "Довіряти користувачу" + }, "sendsNoItemsTitle": { "message": "Немає активних відправлень", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Завантажити Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Завантажити Bitwarden на всіх пристроях" + }, + "getTheMobileApp": { + "message": "Отримати програму для мобільного пристрою" + }, + "getTheMobileAppDesc": { + "message": "Користуйтеся своїми паролями звідусіль за допомогою програми Bitwarden для мобільних пристроїв." + }, + "getTheDesktopApp": { + "message": "Отримати програму для комп'ютера" + }, + "getTheDesktopAppDesc": { + "message": "Користуйтеся сховищем без браузера, налаштуйте біометричне розблокування, щоб спростити доступ у програмі на комп'ютері та в розширенні браузера." + }, + "downloadFromBitwardenNow": { + "message": "Завантажити з bitwarden.com" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Ви дійсно хочете остаточно видалити це вкладення?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Бета" }, - "importantNotice": { - "message": "Важлива інформація" - }, - "setupTwoStepLogin": { - "message": "Налаштувати двоетапну перевірку" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden надсилатиме код підтвердження на електронну пошту вашого облікового запису під час входу з нових пристроїв, починаючи з лютого 2025 року." - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "Ви можете налаштувати двоетапну перевірку як альтернативний спосіб захисту свого облікового запису, або змінити електронну пошту на таку, до якої ви маєте доступ." - }, - "remindMeLater": { - "message": "Нагадати пізніше" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Ви маєте постійний доступ до своєї електронної пошти $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Ні, не маю" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Так, я маю постійний доступ до своєї електронної пошти" - }, - "turnOnTwoStepLogin": { - "message": "Увімкнути двоетапну перевірку" - }, - "changeAcctEmail": { - "message": "Змінити адресу е-пошти" - }, "extensionWidth": { "message": "Ширина вікна розширення" }, @@ -5202,10 +5211,10 @@ "message": "Змінити ризикований пароль" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Параметри сховища" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Сховище захищає не лише ваші паролі. Безпечно зберігайте дані для входу, посвідчення, картки й нотатки." }, "introCarouselLabel": { "message": "Вітаємо в Bitwarden" @@ -5235,48 +5244,67 @@ "message": "Зберігайте скільки завгодно паролів на необмеженій кількості пристроїв, використовуючи Bitwarden для мобільних пристроїв, браузерів та комп'ютерів." }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Імпортуйте наявні паролі" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Скористайтеся інструментом імпортування, щоб швидко перенести записи до Bitwarden, а не додавати їх вручну." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Імпортувати" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Вітаємо у вашому сховищі!" }, "hasItemsVaultNudgeBody": { - "message": "Autofill items for the current page\nFavorite items for easy access\nSearch your vault for something else" + "message": "Автозаповнення на відкритій сторінці\nОбрані записи для легкого доступу\nПошук будь-яких даних у сховищі" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Заощаджуйте час з автозаповненням" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Включити", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Вебсайт", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "щоб цей запис з'являвся у пропозиціях автозаповнення.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Швидке оформлення замовлень" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "За допомогою записів для карток можна безпечно й точно заповнювати платіжні форми." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Спростіть створення облікових записів" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "За допомогою записів для посвідчень можна швидко заповнювати форми реєстрації чи контактів." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Захистіть свої конфіденційні дані" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "За допомогою нотаток можна надійно зберігати конфіденційні дані, як-от банківську інформацію або страхування." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "SSH-доступ для розробників" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Зберігайте свої ключі та під'єднуйтеся за допомогою SSH-агента для швидкої зашифрованої автентифікації.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Докладніше про SSH-агента", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 280a590033a..ec9dc82e6ca 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "Thiết bị tin cậy" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "Không có mục Gửi nào đang hoạt động", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "Bạn có chắc chắn muốn xóa vĩnh viễn tệp đính kèm này không?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta" }, - "importantNotice": { - "message": "Thông báo quan trọng" - }, - "setupTwoStepLogin": { - "message": "Thiết lập đăng nhập hai bước" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 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." - }, - "remindMeLater": { - "message": "Nhắc sau" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "Do you have reliable access to your email, $EMAIL$?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "Không, tôi không có" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "Có, tôi có quyền truy cập email này" - }, - "turnOnTwoStepLogin": { - "message": "Turn on two-step login" - }, - "changeAcctEmail": { - "message": "Đổi email tài khoản" - }, "extensionWidth": { "message": "Extension width" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 521c72a2fb5..a453fe8580a 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -1131,7 +1131,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "干得好!您采取了使您和 $ORGANIZATION$ 更加安全的措施。", + "message": "干得好!您采取了使您和 $ORGANIZATION$ 更加安全的步骤。", "placeholders": { "organization": { "content": "$1" @@ -2187,7 +2187,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'" }, "useGeneratorHelpTextPartTwo": { - "message": "创建一个强大且唯一的密码", + "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'" }, "vaultCustomization": { @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "设备已信任" }, + "trustOrganization": { + "message": "信任组织" + }, + "trust": { + "message": "信任" + }, + "doNotTrust": { + "message": "不信任" + }, + "organizationNotTrusted": { + "message": "组织未被信任" + }, + "emergencyAccessTrustWarning": { + "message": "为了您的账户安全,确认前请先确认:您已授予该用户紧急访问权限,以及其指纹与其账户中显示的指纹相匹配" + }, + "orgTrustWarning": { + "message": "为了您的账户安全,继续前请先确认:您是启用了账户恢复功能的该组织的成员,以及下方显示的指纹与此组织的指纹相匹配。" + }, + "orgTrustWarning1": { + "message": "此组织有一个企业策略,将为您注册账户恢复。注册后将允许组织管理员更改您的主密码。继续前请先确认:您认识此组织,以及下方显示的指纹短语与此组织的指纹相匹配。" + }, + "trustUser": { + "message": "信任用户" + }, "sendsNoItemsTitle": { "message": "没有活跃的 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "下载 Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "在所有设备上下载 Bitwarden" + }, + "getTheMobileApp": { + "message": "获取移动 App" + }, + "getTheMobileAppDesc": { + "message": "使用 Bitwarden 移动 App,随时随地访问您的密码。" + }, + "getTheDesktopApp": { + "message": "获取桌面 App" + }, + "getTheDesktopAppDesc": { + "message": "不使用浏览器访问您的密码库,然后设置生物识别解锁,从而在桌面 App 和浏览器扩展中实现快速解锁。" + }, + "downloadFromBitwardenNow": { + "message": "立即从 bitwarden.com 下载" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "您确定要永久删除此附件吗?" }, @@ -4603,7 +4648,7 @@ "message": "过期的支付卡" }, "cardExpiredMessage": { - "message": "如果您的支付卡已续期,请更新该卡的信息。" + "message": "如果您的支付卡已续期,请更新该卡的信息" }, "cardDetails": { "message": "支付卡详细信息" @@ -5111,42 +5156,6 @@ "beta": { "message": "Beta 版" }, - "importantNotice": { - "message": "重要通知" - }, - "setupTwoStepLogin": { - "message": "设置两步登录" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "从 2025 年 02 月起,当有来自新设备的登录时,Bitwarden 将向您的账户电子邮箱发送验证码。" - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "您可以设置两步登录作为保护账户的替代方法,或将您的电子邮箱更改为您可以访问的电子邮箱。" - }, - "remindMeLater": { - "message": "稍后提醒我" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "您可以正常访问您的电子邮箱 $EMAIL$ 吗?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "不,我不能" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "是的,我可以正常访问我的电子邮箱" - }, - "turnOnTwoStepLogin": { - "message": "启用两步登录" - }, - "changeAcctEmail": { - "message": "更改账户电子邮箱" - }, "extensionWidth": { "message": "扩展宽度" }, @@ -5250,33 +5259,52 @@ "message": "自动填充项目用于当前页面\n收藏夹项目用于轻松访问\n搜索密码库用于其他目的" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "使用自动填充节省时间" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "无缝在线结账" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "使用支付卡,安全准确地轻松自动填充付款表单。" }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "简化账户的创建" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "使用身份,快速自动填充冗长的注册或联系表单。" }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "保持您的敏感数据的安全" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "使用笔记,安全地存储敏感数据,例如银行或保险详细信息。" }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "开发人员友好的 SSH 访问权限" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "存储您的密钥并与 SSH 代理连接,以进行快速、加密的身份验证。", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "进一步了解 SSH 代理", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index d122f7abab2..ddea3dd7fc6 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -189,7 +189,7 @@ "message": "複製備註" }, "copy": { - "message": "Copy", + "message": "複製", "description": "Copy to clipboard" }, "fill": { @@ -541,7 +541,7 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "企業原則之要求已在你的產生器選項中生效", + "message": "企業原則之要求已在您的產生器選項中生效。", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { @@ -799,7 +799,7 @@ "message": "您已成功建立新帳號!" }, "youHaveBeenLoggedIn": { - "message": "你已經登入!" + "message": "您已經登入!" }, "youSuccessfullyLoggedIn": { "message": "登入成功" @@ -860,7 +860,7 @@ "message": "已登出" }, "loggedOutDesc": { - "message": "你已經登出了你的帳號。" + "message": "您已經登出了您的帳號。" }, "loginExpired": { "message": "您的登入階段已過期。" @@ -872,7 +872,7 @@ "message": "登入 Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "輸入傳送到您電子郵件信箱的驗證碼" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Enter the code from your authenticator app" @@ -1076,7 +1076,7 @@ "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "新通知" }, "labelWithNotification": { "message": "$LABEL$: New notification", @@ -1477,13 +1477,13 @@ "message": "將您的安全鑰匙插入電腦的 USB 連接埠,然後觸摸其按鈕(如有的話)。" }, "openInNewTab": { - "message": "Open in new tab" + "message": "在新分頁中開啟" }, "webAuthnAuthenticate": { "message": "驗證 WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "讀取安全金鑰" }, "awaitingSecurityKeyInteraction": { "message": "Awaiting security key interaction..." @@ -1501,7 +1501,7 @@ "message": "兩步驟登入選項" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "選擇兩步驟登入方法" }, "recoveryCodeDesc": { "message": "無法使用任何雙因素提供程式嗎?請使用您的復原碼以停用您帳戶的所有雙因素提供程式。" @@ -1605,7 +1605,7 @@ "message": "適用於所有已登入的帳戶。" }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "關閉你的瀏覽器內建密碼管理器設定以避免衝突。" + "message": "關閉您的瀏覽器內建密碼管理器設定以避免衝突。" }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "編輯瀏覽器設定" @@ -1695,7 +1695,7 @@ "message": "透過拖曳來排序" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "拖曳以重新排序" }, "cfTypeText": { "message": "文字型" @@ -3564,6 +3564,30 @@ "deviceTrusted": { "message": "裝置已信任" }, + "trustOrganization": { + "message": "Trust organization" + }, + "trust": { + "message": "Trust" + }, + "doNotTrust": { + "message": "Do not trust" + }, + "organizationNotTrusted": { + "message": "Organization is not trusted" + }, + "emergencyAccessTrustWarning": { + "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + }, + "orgTrustWarning": { + "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + }, + "orgTrustWarning1": { + "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + }, + "trustUser": { + "message": "Trust user" + }, "sendsNoItemsTitle": { "message": "沒有可用的 Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4488,6 +4512,27 @@ } } }, + "downloadBitwarden": { + "message": "Download Bitwarden" + }, + "downloadBitwardenOnAllDevices": { + "message": "Download Bitwarden on all devices" + }, + "getTheMobileApp": { + "message": "Get the mobile app" + }, + "getTheMobileAppDesc": { + "message": "Access your passwords on the go with the Bitwarden mobile app." + }, + "getTheDesktopApp": { + "message": "Get the desktop app" + }, + "getTheDesktopAppDesc": { + "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + }, + "downloadFromBitwardenNow": { + "message": "Download from bitwarden.com now" + }, "permanentlyDeleteAttachmentConfirmation": { "message": "您確定要永久刪除此附檔嗎?" }, @@ -5111,42 +5156,6 @@ "beta": { "message": "測試版" }, - "importantNotice": { - "message": "重要通知" - }, - "setupTwoStepLogin": { - "message": "啟動兩階段登入" - }, - "newDeviceVerificationNoticeContentPage1": { - "message": "從 2025 年 2 月開始,Bitwarden 會傳送代碼到您的帳號電子郵件中來驗證新裝置的登入。" - }, - "newDeviceVerificationNoticeContentPage2": { - "message": "您可以啟動兩階段認證來保護您的帳號或更改您可以存取的電子郵件位址。" - }, - "remindMeLater": { - "message": "稍後再提醒我" - }, - "newDeviceVerificationNoticePageOneFormContent": { - "message": "您可以存取您的電子郵件位址 $EMAIL$ 嗎?", - "placeholders": { - "email": { - "content": "$1", - "example": "your_name@email.com" - } - } - }, - "newDeviceVerificationNoticePageOneEmailAccessNo": { - "message": "不,我不行" - }, - "newDeviceVerificationNoticePageOneEmailAccessYes": { - "message": "是,我可以存取我的電子郵件位址" - }, - "turnOnTwoStepLogin": { - "message": "啟動兩階段登入" - }, - "changeAcctEmail": { - "message": "更改帳號電子郵件位址" - }, "extensionWidth": { "message": "擴充套件寬度" }, @@ -5252,8 +5261,20 @@ "newLoginNudgeTitle": { "message": "Save time with autofill" }, - "newLoginNudgeBody": { - "message": "Include a Website so this login appears as an autofill suggestion." + "newLoginNudgeBodyOne": { + "message": "Include a", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyBold": { + "message": "Website", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." + }, + "newLoginNudgeBodyTwo": { + "message": "so this login appears as an autofill suggestion.", + "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", + "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { "message": "Seamless online checkout" @@ -5276,7 +5297,14 @@ "newSshNudgeTitle": { "message": "Developer-friendly SSH access" }, - "newSshNudgeBody": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication." + "newSshNudgeBodyOne": { + "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" + }, + "newSshNudgeBodyTwo": { + "message": "Learn more about SSH agent", + "description": "Two part message", + "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" } } diff --git a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts index a0990485d49..78ca577a69d 100644 --- a/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts +++ b/apps/browser/src/auth/popup/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts @@ -168,18 +168,21 @@ type Story = StoryObj; @Component({ selector: "bit-default-primary-outlet-example-component", template: "

Primary Outlet Example:
your primary component goes here

", + standalone: false, }) class DefaultPrimaryOutletExampleComponent {} @Component({ selector: "bit-default-secondary-outlet-example-component", template: "

Secondary Outlet Example:
your secondary component goes here

", + standalone: false, }) class DefaultSecondaryOutletExampleComponent {} @Component({ selector: "bit-default-env-selector-outlet-example-component", template: "

Env Selector Outlet Example:
your env selector component goes here

", + standalone: false, }) class DefaultEnvSelectorOutletExampleComponent {} @@ -264,6 +267,7 @@ const changedData: ExtensionAnonLayoutWrapperData = { template: ` `, + standalone: false, }) export class DynamicContentExampleComponent { initialData = true; diff --git a/apps/browser/src/auth/popup/set-password.component.ts b/apps/browser/src/auth/popup/set-password.component.ts index accde2e9a09..2a796854531 100644 --- a/apps/browser/src/auth/popup/set-password.component.ts +++ b/apps/browser/src/auth/popup/set-password.component.ts @@ -5,5 +5,6 @@ import { SetPasswordComponent as BaseSetPasswordComponent } from "@bitwarden/ang @Component({ selector: "app-set-password", templateUrl: "set-password.component.html", + standalone: false, }) export class SetPasswordComponent extends BaseSetPasswordComponent {} diff --git a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts b/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts index c56e6578a0b..25a4d01333d 100644 --- a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts +++ b/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts @@ -18,5 +18,6 @@ import { VaultTimeoutInputComponent as VaultTimeoutInputComponentBase } from "@b useExisting: VaultTimeoutInputComponent, }, ], + standalone: false, }) export class VaultTimeoutInputComponent extends VaultTimeoutInputComponentBase {} diff --git a/apps/browser/src/auth/popup/update-temp-password.component.ts b/apps/browser/src/auth/popup/update-temp-password.component.ts index 465bc3f7038..e8cf64b7548 100644 --- a/apps/browser/src/auth/popup/update-temp-password.component.ts +++ b/apps/browser/src/auth/popup/update-temp-password.component.ts @@ -8,6 +8,7 @@ import { postLogoutMessageListener$ } from "./utils/post-logout-message-listener @Component({ selector: "app-update-temp-password", templateUrl: "update-temp-password.component.html", + standalone: false, }) export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent { onSuccessfulChangePassword: () => Promise = this.doOnSuccessfulChangePassword.bind(this); diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 63ae1193737..009efd7ff36 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -17,6 +17,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { UserId } from "@bitwarden/common/types/guid"; +import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; @@ -828,6 +829,7 @@ describe("NotificationBackground", () => { id: "testId", name: "testItemName", login: { username: "testUser" }, + reprompt: CipherRepromptType.None, }); getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); @@ -842,6 +844,7 @@ describe("NotificationBackground", () => { message.edit, sender.tab, "testId", + false, ); expect(updateWithServerSpy).toHaveBeenCalled(); expect(tabSendMessageDataSpy).toHaveBeenCalledWith( @@ -855,6 +858,55 @@ describe("NotificationBackground", () => { ); }); + it("prompts the user for master password entry if the notification message type is for ChangePassword and the cipher reprompt is enabled", async () => { + const tab = createChromeTabMock({ id: 1, url: "https://example.com" }); + const sender = mock({ tab }); + const message: NotificationBackgroundExtensionMessage = { + command: "bgSaveCipher", + edit: false, + folder: "folder-id", + }; + const queueMessage = mock({ + type: NotificationQueueMessageType.ChangePassword, + tab, + domain: "example.com", + newPassword: "newPassword", + }); + notificationBackground["notificationQueue"] = [queueMessage]; + const cipherView = mock({ + id: "testId", + name: "testItemName", + login: { username: "testUser" }, + reprompt: CipherRepromptType.Password, + }); + getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); + + sendMockExtensionMessage(message, sender); + await flushPromises(); + + expect(editItemSpy).not.toHaveBeenCalled(); + expect(autofillService.isPasswordRepromptRequired).toHaveBeenCalled(); + expect(createWithServerSpy).not.toHaveBeenCalled(); + expect(updatePasswordSpy).toHaveBeenCalledWith( + cipherView, + queueMessage.newPassword, + message.edit, + sender.tab, + "testId", + false, + ); + expect(updateWithServerSpy).not.toHaveBeenCalled(); + expect(tabSendMessageDataSpy).not.toHaveBeenCalledWith( + sender.tab, + "saveCipherAttemptCompleted", + { + itemName: "testItemName", + cipherId: cipherView.id, + task: undefined, + }, + ); + }); + it("completes password update notification with a security task notice if any are present for the cipher, and dismisses tasks for the updated cipher", async () => { const mockCipherId = "testId"; const mockOrgId = "testOrgId"; @@ -905,6 +957,7 @@ describe("NotificationBackground", () => { id: mockCipherId, organizationId: mockOrgId, name: "Test Item", + reprompt: CipherRepromptType.None, }); getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); @@ -919,6 +972,7 @@ describe("NotificationBackground", () => { message.edit, sender.tab, mockCipherId, + false, ); expect(updateWithServerSpy).toHaveBeenCalled(); expect(tabSendMessageDataSpy).toHaveBeenCalledWith( @@ -1000,6 +1054,7 @@ describe("NotificationBackground", () => { message.edit, sender.tab, "testId", + false, ); expect(editItemSpy).toHaveBeenCalled(); expect(updateWithServerSpy).not.toHaveBeenCalled(); @@ -1170,7 +1225,7 @@ describe("NotificationBackground", () => { newPassword: "newPassword", }); notificationBackground["notificationQueue"] = [queueMessage]; - const cipherView = mock(); + const cipherView = mock({ reprompt: CipherRepromptType.None }); getDecryptedCipherByIdSpy.mockResolvedValueOnce(cipherView); const errorMessage = "fetch error"; updateWithServerSpy.mockImplementation(() => { diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 339b033809d..a73141b7e4d 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -14,6 +14,7 @@ import { ExtensionCommand, ExtensionCommandType, NOTIFICATION_BAR_LIFESPAN_MS, + UPDATE_PASSWORD, } from "@bitwarden/common/autofill/constants"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { UserNotificationSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/user-notification-settings.service"; @@ -104,6 +105,8 @@ export default class NotificationBackground { this.removeTabFromNotificationQueue(sender.tab), bgReopenUnlockPopout: ({ sender }) => this.openUnlockPopout(sender.tab), bgSaveCipher: ({ message, sender }) => this.handleSaveCipherMessage(message, sender), + bgHandleReprompt: ({ message, sender }: any) => + this.handleCipherUpdateRepromptResponse(message), bgUnlockPopoutOpened: ({ message, sender }) => this.unlockVault(message, sender.tab), checkNotificationQueue: ({ sender }) => this.checkNotificationQueue(sender.tab), collectPageDetailsResponse: ({ message }) => @@ -542,10 +545,15 @@ export default class NotificationBackground { * @param tab - The tab that the message was sent from */ private async unlockVault(message: NotificationBackgroundExtensionMessage, tab: chrome.tabs.Tab) { + const notificationRefreshFlagEnabled = await this.getNotificationFlag(); if (message.data?.skipNotification) { return; } + if (notificationRefreshFlagEnabled) { + return; + } + const currentAuthStatus = await this.getAuthStatus(); if (currentAuthStatus !== AuthenticationStatus.Locked || this.notificationQueue.length) { return; @@ -626,6 +634,17 @@ export default class NotificationBackground { await this.saveOrUpdateCredentials(sender.tab, message.edit, message.folder); } + async handleCipherUpdateRepromptResponse(message: NotificationBackgroundExtensionMessage) { + if (message.success) { + await this.saveOrUpdateCredentials(message.tab, false, undefined, true); + } else { + await BrowserApi.tabSendMessageData(message.tab, "saveCipherAttemptCompleted", { + error: "Password reprompt failed", + }); + return; + } + } + /** * Saves or updates credentials based on the message within the * notification queue that is associated with the specified tab. @@ -634,7 +653,12 @@ export default class NotificationBackground { * @param edit - Identifies if the credentials should be edited or simply added * @param folderId - The folder to add the cipher to */ - private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, edit: boolean, folderId?: string) { + private async saveOrUpdateCredentials( + tab: chrome.tabs.Tab, + edit: boolean, + folderId?: string, + skipReprompt: boolean = false, + ) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; if ( @@ -649,18 +673,26 @@ export default class NotificationBackground { continue; } - this.notificationQueue.splice(i, 1); - const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(getOptionalUserId), ); if (queueMessage.type === NotificationQueueMessageType.ChangePassword) { const cipherView = await this.getDecryptedCipherById(queueMessage.cipherId, activeUserId); - await this.updatePassword(cipherView, queueMessage.newPassword, edit, tab, activeUserId); + + await this.updatePassword( + cipherView, + queueMessage.newPassword, + edit, + tab, + activeUserId, + skipReprompt, + ); return; } + this.notificationQueue.splice(i, 1); + // If the vault was locked, check if a cipher needs updating instead of creating a new one if (queueMessage.wasVaultLocked) { const allCiphers = await this.cipherService.getAllDecryptedForUrl( @@ -720,6 +752,7 @@ export default class NotificationBackground { edit: boolean, tab: chrome.tabs.Tab, userId: UserId, + skipReprompt: boolean = false, ) { cipherView.login.password = newPassword; @@ -732,8 +765,10 @@ export default class NotificationBackground { const cipher = await this.cipherService.encrypt(cipherView, userId); const shouldGetTasks = await this.getNotificationFlag(); - try { + if (!cipherView.edit) { + throw new Error("You do not have permission to edit this cipher."); + } const tasks = shouldGetTasks ? await this.getSecurityTasks(userId) : []; const updatedCipherTask = tasks.find((task) => task.cipherId === cipherView?.id); const cipherHasTask = !!updatedCipherTask?.id; @@ -751,6 +786,12 @@ export default class NotificationBackground { } : undefined; + if (cipherView.reprompt && !skipReprompt) { + await this.autofillService.isPasswordRepromptRequired(cipherView, tab, UPDATE_PASSWORD); + + return; + } + await this.cipherService.updateWithServer(cipher); await BrowserApi.tabSendMessageData(tab, "saveCipherAttemptCompleted", { @@ -853,9 +894,7 @@ export default class NotificationBackground { private async getDecryptedCipherById(cipherId: string, userId: UserId) { const cipher = await this.cipherService.get(cipherId, userId); if (cipher != null && cipher.type === CipherType.Login) { - return await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, userId), - ); + return await this.cipherService.decrypt(cipher, userId); } return null; } 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 881b44b4785..41d92a0449d 100644 --- a/apps/browser/src/autofill/content/components/buttons/action-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts @@ -5,17 +5,19 @@ import { Theme } from "@bitwarden/common/platform/enums"; import { border, themes, typography, spacing } from "../constants/styles"; +export type ActionButtonProps = { + buttonText: string | TemplateResult; + disabled?: boolean; + theme: Theme; + handleClick: (e: Event) => void; +}; + export function ActionButton({ buttonText, disabled = false, theme, handleClick, -}: { - buttonText: string | TemplateResult; - disabled?: boolean; - theme: Theme; - handleClick: (e: Event) => void; -}) { +}: ActionButtonProps) { const handleButtonClick = (event: Event) => { if (!disabled) { handleClick(event); diff --git a/apps/browser/src/autofill/content/components/buttons/badge-button.ts b/apps/browser/src/autofill/content/components/buttons/badge-button.ts index 3b3b84f8166..9852c07d47b 100644 --- a/apps/browser/src/autofill/content/components/buttons/badge-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/badge-button.ts @@ -5,17 +5,19 @@ import { Theme } from "@bitwarden/common/platform/enums"; import { border, themes, typography, spacing } from "../constants/styles"; +export type BadgeButtonProps = { + buttonAction: (e: Event) => void; + buttonText: string; + disabled?: boolean; + theme: Theme; +}; + export function BadgeButton({ buttonAction, buttonText, disabled = false, theme, -}: { - buttonAction: (e: Event) => void; - buttonText: string; - disabled?: boolean; - theme: Theme; -}) { +}: BadgeButtonProps) { const handleButtonClick = (event: Event) => { if (!disabled) { buttonAction(event); diff --git a/apps/browser/src/autofill/content/components/buttons/close-button.ts b/apps/browser/src/autofill/content/components/buttons/close-button.ts index 05a12d4f453..71743c3992a 100644 --- a/apps/browser/src/autofill/content/components/buttons/close-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/close-button.ts @@ -6,13 +6,12 @@ import { Theme } from "@bitwarden/common/platform/enums"; import { spacing, themes } from "../constants/styles"; import { Close as CloseIcon } from "../icons"; -export function CloseButton({ - handleCloseNotification, - theme, -}: { +export type CloseButtonProps = { handleCloseNotification: (e: Event) => void; theme: Theme; -}) { +}; + +export function CloseButton({ handleCloseNotification, theme }: CloseButtonProps) { return html` @@ -88,30 +73,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the inline menu with @@ -139,30 +109,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the inline menu with @@ -190,30 +145,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the inline menu with @@ -248,13 +188,19 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f aria-hidden="true" fill="none" height="24" - viewBox="0 0 23 24" - width="23" + viewBox="0 0 24 24" + width="24" xmlns="http://www.w3.org/2000/svg" > + @@ -283,29 +229,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -323,30 +263,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -404,29 +329,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -473,29 +392,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -528,29 +441,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -575,15 +482,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -613,29 +520,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -683,29 +584,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -753,29 +648,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -876,29 +765,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -958,29 +841,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1027,29 +904,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1082,29 +953,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1129,15 +994,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1167,29 +1032,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1237,29 +1096,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1307,29 +1160,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1389,29 +1236,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1458,29 +1299,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1513,29 +1348,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1560,15 +1389,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1598,29 +1427,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1668,29 +1491,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1738,29 +1555,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1814,19 +1625,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1842,29 +1649,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1903,19 +1704,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1931,29 +1728,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -1992,19 +1783,15 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2026,29 +1813,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2099,29 +1880,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2169,29 +1944,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2239,29 +2008,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2287,10 +2050,10 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f > @@ -2407,29 +2170,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2525,29 +2282,23 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the list of ciphers f @@ -2578,29 +2329,21 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the locked inline men unlockAccount @@ -2623,17 +2366,22 @@ exports[`AutofillInlineMenuList initAutofillInlineMenuList the password generato diff --git a/apps/browser/src/autofill/popup/fido2/fido2.component.html b/apps/browser/src/autofill/popup/fido2/fido2.component.html index 80ea6726cb9..8d8394641e9 100644 --- a/apps/browser/src/autofill/popup/fido2/fido2.component.html +++ b/apps/browser/src/autofill/popup/fido2/fido2.component.html @@ -14,7 +14,7 @@ (click)="addCipher()" slot="end" > - + {{ "new" | i18n }} diff --git a/apps/browser/src/autofill/popup/fido2/fido2.component.ts b/apps/browser/src/autofill/popup/fido2/fido2.component.ts index 0471d460fd5..6b7d9120195 100644 --- a/apps/browser/src/autofill/popup/fido2/fido2.component.ts +++ b/apps/browser/src/autofill/popup/fido2/fido2.component.ts @@ -216,9 +216,7 @@ export class Fido2Component implements OnInit, OnDestroy { this.ciphers = await Promise.all( message.cipherIds.map(async (cipherId) => { const cipher = await this.cipherService.get(cipherId, activeUserId); - return cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + return this.cipherService.decrypt(cipher, activeUserId); }), ); @@ -237,9 +235,7 @@ export class Fido2Component implements OnInit, OnDestroy { this.ciphers = await Promise.all( message.existingCipherIds.map(async (cipherId) => { const cipher = await this.cipherService.get(cipherId, activeUserId); - return cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + return this.cipherService.decrypt(cipher, activeUserId); }), ); diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.html b/apps/browser/src/autofill/popup/settings/autofill.component.html index 4fd85ddce33..264b04b039b 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.html +++ b/apps/browser/src/autofill/popup/settings/autofill.component.html @@ -6,6 +6,16 @@
+
+ +

{{ "autofillSuggestionsSectionTitle" | i18n }}

diff --git a/apps/browser/src/autofill/popup/settings/autofill.component.ts b/apps/browser/src/autofill/popup/settings/autofill.component.ts index c30f150e71d..2d29067cf0f 100644 --- a/apps/browser/src/autofill/popup/settings/autofill.component.ts +++ b/apps/browser/src/autofill/popup/settings/autofill.component.ts @@ -4,16 +4,18 @@ import { CommonModule } from "@angular/common"; import { Component, DestroyRef, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { + FormBuilder, + FormControl, + FormGroup, FormsModule, ReactiveFormsModule, - FormBuilder, - FormGroup, - FormControl, } from "@angular/forms"; import { RouterModule } from "@angular/router"; -import { firstValueFrom } from "rxjs"; +import { filter, firstValueFrom, Observable, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { AutofillOverlayVisibility, BrowserClientVendors, @@ -53,7 +55,9 @@ import { SelectModule, TypographyModule, } from "@bitwarden/components"; +import { NudgesService, NudgeType, SpotlightComponent } from "@bitwarden/vault"; +import { AutofillBrowserSettingsService } from "../../../autofill/services/autofill-browser-settings.service"; import { BrowserApi } from "../../../platform/browser/browser-api"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; @@ -81,6 +85,7 @@ import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.co SelectModule, TypographyModule, ReactiveFormsModule, + SpotlightComponent, ], }) export class AutofillComponent implements OnInit { @@ -100,6 +105,12 @@ export class AutofillComponent implements OnInit { protected browserClientIsUnknown: boolean; protected autofillOnPageLoadFromPolicy$ = this.autofillSettingsService.activateAutofillOnPageLoadFromPolicy$; + protected showSpotlightNudge$: Observable = this.accountService.activeAccount$.pipe( + filter((account): account is Account => account !== null), + switchMap((account) => + this.nudgesService.showNudgeSpotlight$(NudgeType.AutofillNudge, account.id), + ), + ); protected autofillOnPageLoadForm = new FormGroup({ autofillOnPageLoad: new FormControl(), @@ -142,6 +153,9 @@ export class AutofillComponent implements OnInit { private configService: ConfigService, private formBuilder: FormBuilder, private destroyRef: DestroyRef, + private nudgesService: NudgesService, + private accountService: AccountService, + private autofillBrowserSettingsService: AutofillBrowserSettingsService, ) { this.autofillOnPageLoadOptions = [ { name: this.i18nService.t("autoFillOnPageLoadYes"), value: true }, @@ -165,7 +179,7 @@ export class AutofillComponent implements OnInit { { name: i18nService.t("never"), value: UriMatchStrategy.Never }, ]; - this.browserClientVendor = this.getBrowserClientVendor(); + this.browserClientVendor = BrowserApi.getBrowserClientVendor(window); this.disablePasswordManagerURI = DisablePasswordManagerUris[this.browserClientVendor]; this.browserShortcutsURI = BrowserShortcutsUris[this.browserClientVendor]; this.browserClientIsUnknown = this.browserClientVendor === BrowserClientVendors.Unknown; @@ -173,7 +187,11 @@ export class AutofillComponent implements OnInit { async ngOnInit() { this.canOverrideBrowserAutofillSetting = !this.browserClientIsUnknown; - this.defaultBrowserAutofillDisabled = await this.browserAutofillSettingCurrentlyOverridden(); + + this.defaultBrowserAutofillDisabled = + await this.autofillBrowserSettingsService.isBrowserAutofillSettingOverridden( + this.browserClientVendor, + ); this.inlineMenuVisibility = await firstValueFrom( this.autofillSettingsService.inlineMenuVisibility$, @@ -308,6 +326,27 @@ export class AutofillComponent implements OnInit { ); } + get spotlightButtonIcon() { + if (this.browserClientVendor === BrowserClientVendors.Unknown) { + return "bwi-external-link"; + } + return null; + } + + get spotlightButtonText() { + if (this.browserClientVendor === BrowserClientVendors.Unknown) { + return this.i18nService.t("turnOffAutofill"); + } + return this.i18nService.t("turnOffBrowserAutofill", this.browserClientVendor); + } + + async dismissSpotlight() { + await this.nudgesService.dismissNudge( + NudgeType.AutofillNudge, + await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)), + ); + } + async updateInlineMenuVisibility() { if (!this.enableInlineMenu) { this.enableInlineMenuOnIconSelect = false; @@ -346,26 +385,6 @@ export class AutofillComponent implements OnInit { } } - private getBrowserClientVendor(): BrowserClientVendor { - if (this.platformUtilsService.isChrome()) { - return BrowserClientVendors.Chrome; - } - - if (this.platformUtilsService.isOpera()) { - return BrowserClientVendors.Opera; - } - - if (this.platformUtilsService.isEdge()) { - return BrowserClientVendors.Edge; - } - - if (this.platformUtilsService.isVivaldi()) { - return BrowserClientVendors.Vivaldi; - } - - return BrowserClientVendors.Unknown; - } - protected async openURI(event: Event, uri: BrowserShortcutsUri | DisablePasswordManagerUri) { event.preventDefault(); @@ -422,7 +441,7 @@ export class AutofillComponent implements OnInit { if ( this.inlineMenuVisibility === AutofillOverlayVisibility.Off || !this.canOverrideBrowserAutofillSetting || - (await this.browserAutofillSettingCurrentlyOverridden()) + this.defaultBrowserAutofillDisabled ) { return; } @@ -460,6 +479,9 @@ export class AutofillComponent implements OnInit { } await BrowserApi.updateDefaultBrowserAutofillSettings(!this.defaultBrowserAutofillDisabled); + this.autofillBrowserSettingsService.setDefaultBrowserAutofillDisabled( + this.defaultBrowserAutofillDisabled, + ); } private handleOverrideDialogAccept = async () => { @@ -467,18 +489,6 @@ export class AutofillComponent implements OnInit { await this.updateDefaultBrowserAutofillDisabled(); }; - async browserAutofillSettingCurrentlyOverridden() { - if (!this.canOverrideBrowserAutofillSetting) { - return false; - } - - if (!(await this.privacyPermissionGranted())) { - return false; - } - - return await BrowserApi.browserAutofillSettingsOverridden(); - } - async privacyPermissionGranted(): Promise { return await BrowserApi.permissionsGranted(["privacy"]); } diff --git a/apps/browser/src/autofill/services/abstractions/autofill.service.ts b/apps/browser/src/autofill/services/abstractions/autofill.service.ts index 5b1b4b3b8bb..daafd871789 100644 --- a/apps/browser/src/autofill/services/abstractions/autofill.service.ts +++ b/apps/browser/src/autofill/services/abstractions/autofill.service.ts @@ -87,5 +87,9 @@ export abstract class AutofillService { cipherType?: CipherType, ) => Promise; setAutoFillOnPageLoadOrgPolicy: () => Promise; - isPasswordRepromptRequired: (cipher: CipherView, tab: chrome.tabs.Tab) => Promise; + isPasswordRepromptRequired: ( + cipher: CipherView, + tab: chrome.tabs.Tab, + action?: string, + ) => Promise; } diff --git a/apps/browser/src/autofill/services/autofill-browser-settings.service.ts b/apps/browser/src/autofill/services/autofill-browser-settings.service.ts new file mode 100644 index 00000000000..ba59a655b77 --- /dev/null +++ b/apps/browser/src/autofill/services/autofill-browser-settings.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from "@angular/core"; +import { BehaviorSubject, Observable } from "rxjs"; + +import { BrowserClientVendors } from "@bitwarden/common/autofill/constants"; +import { BrowserClientVendor } from "@bitwarden/common/autofill/types"; + +import { BrowserApi } from "../../platform/browser/browser-api"; + +/** + * Service class for various Autofill-related browser API operations. + */ +@Injectable({ + providedIn: "root", +}) +export class AutofillBrowserSettingsService { + async isBrowserAutofillSettingOverridden(browserClient: BrowserClientVendor) { + return ( + browserClient !== BrowserClientVendors.Unknown && + (await BrowserApi.browserAutofillSettingsOverridden()) + ); + } + + private _defaultBrowserAutofillDisabled$ = new BehaviorSubject(false); + + defaultBrowserAutofillDisabled$: Observable = + this._defaultBrowserAutofillDisabled$.asObservable(); + + setDefaultBrowserAutofillDisabled(value: boolean) { + this._defaultBrowserAutofillDisabled$.next(value); + } +} diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index da46ceb0864..525010bacc1 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -593,15 +593,20 @@ export default class AutofillService implements AutofillServiceInterface { * * @param cipher - The cipher to autofill * @param tab - The tab to autofill + * @param action - override for default action once reprompt is completed successfully */ - async isPasswordRepromptRequired(cipher: CipherView, tab: chrome.tabs.Tab): Promise { + async isPasswordRepromptRequired( + cipher: CipherView, + tab: chrome.tabs.Tab, + action?: string, + ): Promise { const userHasMasterPasswordAndKeyHash = await this.userVerificationService.hasMasterPasswordAndMasterKeyHash(); if (cipher.reprompt === CipherRepromptType.Password && userHasMasterPasswordAndKeyHash) { if (!this.isDebouncingPasswordRepromptPopout()) { await this.openVaultItemPasswordRepromptPopout(tab, { cipherId: cipher.id, - action: "autofill", + action: action ?? "autofill", }); } diff --git a/apps/browser/src/autofill/shared/styles/variables.scss b/apps/browser/src/autofill/shared/styles/variables.scss index ae6a060798a..1e804ed8fd2 100644 --- a/apps/browser/src/autofill/shared/styles/variables.scss +++ b/apps/browser/src/autofill/shared/styles/variables.scss @@ -1,6 +1,6 @@ $dark-icon-themes: "theme_dark"; -$font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-sans-serif: Roboto, "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-source-code-pro: "Source Code Pro", monospace; $font-size-base: 14px; diff --git a/apps/browser/src/autofill/utils/svg-icons.ts b/apps/browser/src/autofill/utils/svg-icons.ts index b04d18608ec..343acc00b06 100644 --- a/apps/browser/src/autofill/utils/svg-icons.ts +++ b/apps/browser/src/autofill/utils/svg-icons.ts @@ -5,34 +5,34 @@ export const logoLockedIcon = ''; export const globeIcon = - ''; + ''; export const creditCardIcon = - ''; + ''; export const idCardIcon = - ''; + ''; export const lockIcon = - ''; + ''; export const plusIcon = - ''; + ''; export const viewCipherIcon = - ''; + ''; export const passkeyIcon = - ''; + ''; export const circleCheckIcon = - ''; + ''; export const spinnerIcon = - ''; + ''; export const keyIcon = - ''; + ''; export const refreshIcon = - ''; + ''; diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index da47542ee6b..a724f857cd1 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -39,7 +39,6 @@ import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/ import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; import { UserVerificationService as UserVerificationServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; 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"; @@ -184,6 +183,7 @@ import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-st import { SendService } from "@bitwarden/common/tools/send/services/send.service"; import { InternalSendService as InternalSendServiceAbstraction } from "@bitwarden/common/tools/send/services/send.service.abstraction"; import { UserId } from "@bitwarden/common/types/guid"; +import { CipherEncryptionService } from "@bitwarden/common/vault/abstractions/cipher-encryption.service"; import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherFileUploadService as CipherFileUploadServiceAbstraction } from "@bitwarden/common/vault/abstractions/file-upload/cipher-file-upload.service"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; @@ -200,6 +200,7 @@ import { DefaultCipherAuthorizationService, } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; +import { DefaultCipherEncryptionService } from "@bitwarden/common/vault/services/default-cipher-encryption.service"; import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; import { FolderApiService } from "@bitwarden/common/vault/services/folder/folder-api.service"; import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; @@ -409,6 +410,7 @@ export default class MainBackground { endUserNotificationService: EndUserNotificationService; inlineMenuFieldQualificationService: InlineMenuFieldQualificationService; taskService: TaskService; + cipherEncryptionService: CipherEncryptionService; ipcContentScriptManagerService: IpcContentScriptManagerService; ipcService: IpcService; @@ -721,6 +723,7 @@ export default class MainBackground { this.logService, (logoutReason: LogoutReason, userId?: UserId) => this.logout(logoutReason, userId), this.vaultTimeoutSettingsService, + { createRequest: (url, request) => new Request(url, request) }, ); this.fileUploadService = new FileUploadService(this.logService, this.apiService); @@ -856,6 +859,11 @@ export default class MainBackground { this.bulkEncryptService = new FallbackBulkEncryptService(this.encryptService); + this.cipherEncryptionService = new DefaultCipherEncryptionService( + this.sdkService, + this.logService, + ); + this.cipherService = new CipherService( this.keyService, this.domainSettingsService, @@ -871,6 +879,7 @@ export default class MainBackground { this.stateProvider, this.accountService, this.logService, + this.cipherEncryptionService, ); this.folderService = new FolderService( this.keyService, @@ -1511,9 +1520,6 @@ export default class MainBackground { } nextAccountStatus = await this.authService.getAuthStatus(userId); - const forcePasswordReset = - (await firstValueFrom(this.masterPasswordService.forceSetPasswordReason$(userId))) != - ForceSetPasswordReason.None; await this.systemService.clearPendingClipboard(); @@ -1521,8 +1527,6 @@ export default class MainBackground { this.messagingService.send("goHome"); } else if (nextAccountStatus === AuthenticationStatus.Locked) { this.messagingService.send("locked", { userId: userId }); - } else if (forcePasswordReset) { - this.messagingService.send("update-temp-password", { userId: userId }); } else { this.messagingService.send("unlocked", { userId: userId }); await this.refreshBadge(); diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index d92826765db..7172b98d727 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -357,7 +357,7 @@ export class NativeMessagingBackground { await this.secureCommunication(); } - return await this.encryptService.encrypt( + return await this.encryptService.encryptString( JSON.stringify(message), this.secureChannel!.sharedSecret!, ); @@ -401,10 +401,9 @@ export class NativeMessagingBackground { return; } message = JSON.parse( - await this.encryptService.decryptToUtf8( + await this.encryptService.decryptString( rawMessage as EncString, this.secureChannel.sharedSecret, - "ipc-desktop-ipc-channel-key", ), ); } else { diff --git a/apps/browser/src/images/app-store.png b/apps/browser/src/images/app-store.png new file mode 100644 index 00000000000..7b3c9759ef9 Binary files /dev/null and b/apps/browser/src/images/app-store.png differ diff --git a/apps/browser/src/images/download-qr.png b/apps/browser/src/images/download-qr.png new file mode 100644 index 00000000000..4362c1616f4 Binary files /dev/null and b/apps/browser/src/images/download-qr.png differ diff --git a/apps/browser/src/images/google-play.png b/apps/browser/src/images/google-play.png new file mode 100644 index 00000000000..3ff87a25d5c Binary files /dev/null and b/apps/browser/src/images/google-play.png differ diff --git a/apps/browser/src/key-management/key-connector/remove-password.component.ts b/apps/browser/src/key-management/key-connector/remove-password.component.ts index 3ca9d3a5669..1b07f04ba8a 100644 --- a/apps/browser/src/key-management/key-connector/remove-password.component.ts +++ b/apps/browser/src/key-management/key-connector/remove-password.component.ts @@ -5,5 +5,6 @@ import { RemovePasswordComponent as BaseRemovePasswordComponent } from "@bitward @Component({ selector: "app-remove-password", templateUrl: "remove-password.component.html", + standalone: false, }) export class RemovePasswordComponent extends BaseRemovePasswordComponent {} diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index fca62568048..97b94e06fec 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": "Bitwarden", - "version": "2025.4.0", + "version": "2025.5.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 47e0cc465ef..0f44b4af26d 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": "Bitwarden", - "version": "2025.4.0", + "version": "2025.5.0", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index 4b4cec7e7da..4ef72fa0077 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -2,6 +2,8 @@ // @ts-strict-ignore import { Observable } from "rxjs"; +import { BrowserClientVendors } from "@bitwarden/common/autofill/constants"; +import { BrowserClientVendor } from "@bitwarden/common/autofill/types"; import { DeviceType } from "@bitwarden/common/enums"; import { isBrowserSafariApi } from "@bitwarden/platform"; @@ -131,6 +133,27 @@ export class BrowserApi { }); } + static getBrowserClientVendor(clientWindow: Window): BrowserClientVendor { + const device = BrowserPlatformUtilsService.getDevice(clientWindow); + + switch (device) { + case DeviceType.ChromeExtension: + case DeviceType.ChromeBrowser: + return BrowserClientVendors.Chrome; + case DeviceType.OperaExtension: + case DeviceType.OperaBrowser: + return BrowserClientVendors.Opera; + case DeviceType.EdgeExtension: + case DeviceType.EdgeBrowser: + return BrowserClientVendors.Edge; + case DeviceType.VivaldiExtension: + case DeviceType.VivaldiBrowser: + return BrowserClientVendors.Vivaldi; + default: + return BrowserClientVendors.Unknown; + } + } + /** * Gets the tab with the given id. * @@ -641,6 +664,10 @@ export class BrowserApi { * Identifies if the browser autofill settings are overridden by the extension. */ static async browserAutofillSettingsOverridden(): Promise { + if (!(await BrowserApi.permissionsGranted(["privacy"]))) { + return false; + } + const checkOverrideStatus = (details: chrome.types.ChromeSettingGetResult) => details.levelOfControl === "controlled_by_this_extension" && !details.value; diff --git a/apps/browser/src/platform/ipc/background-communication-backend.ts b/apps/browser/src/platform/ipc/background-communication-backend.ts deleted file mode 100644 index 1ebb835fa3b..00000000000 --- a/apps/browser/src/platform/ipc/background-communication-backend.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IpcMessage, isIpcMessage } from "@bitwarden/common/platform/ipc"; -import { MessageQueue } from "@bitwarden/common/platform/ipc/message-queue"; -import { CommunicationBackend, IncomingMessage, OutgoingMessage } from "@bitwarden/sdk-internal"; - -import { BrowserApi } from "../browser/browser-api"; - -export class BackgroundCommunicationBackend implements CommunicationBackend { - private queue = new MessageQueue(); - - constructor() { - BrowserApi.messageListener("platform.ipc", (message, sender) => { - if (!isIpcMessage(message)) { - return; - } - - if (sender.tab?.id === undefined || sender.tab.id === chrome.tabs.TAB_ID_NONE) { - // Ignore messages from non-tab sources - return; - } - - void this.queue.enqueue( - new IncomingMessage(message.message.payload, message.message.destination, { - Web: { id: sender.tab.id }, - }), - ); - }); - } - - async send(message: OutgoingMessage): Promise { - if (typeof message.destination === "object" && "Web" in message.destination) { - await BrowserApi.tabSendMessage( - { id: message.destination.Web.id } as chrome.tabs.Tab, - { type: "bitwarden-ipc-message", message } satisfies IpcMessage, - { frameId: 0 }, - ); - return; - } - - throw new Error("Destination not supported."); - } - - async receive(): Promise { - return this.queue.dequeue(); - } -} diff --git a/apps/browser/src/platform/ipc/ipc-background.service.ts b/apps/browser/src/platform/ipc/ipc-background.service.ts index a87f6bb4acb..155966898f9 100644 --- a/apps/browser/src/platform/ipc/ipc-background.service.ts +++ b/apps/browser/src/platform/ipc/ipc-background.service.ts @@ -1,12 +1,17 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service"; -import { IpcService } from "@bitwarden/common/platform/ipc"; -import { IpcClient } from "@bitwarden/sdk-internal"; +import { IpcMessage, isIpcMessage, IpcService } from "@bitwarden/common/platform/ipc"; +import { + IpcClient, + IpcCommunicationBackend, + IncomingMessage, + OutgoingMessage, +} from "@bitwarden/sdk-internal"; -import { BackgroundCommunicationBackend } from "./background-communication-backend"; +import { BrowserApi } from "../browser/browser-api"; export class IpcBackgroundService extends IpcService { - private communicationProvider?: BackgroundCommunicationBackend; + private communicationBackend?: IpcCommunicationBackend; constructor(private logService: LogService) { super(); @@ -16,9 +21,46 @@ export class IpcBackgroundService extends IpcService { try { // This function uses classes and functions defined in the SDK, so we need to wait for the SDK to load. await SdkLoadService.Ready; - this.communicationProvider = new BackgroundCommunicationBackend(); + this.communicationBackend = new IpcCommunicationBackend({ + async send(message: OutgoingMessage): Promise { + if (typeof message.destination === "object") { + await BrowserApi.tabSendMessage( + { id: message.destination.Web.id } as chrome.tabs.Tab, + { + type: "bitwarden-ipc-message", + message: { + destination: message.destination, + payload: message.payload, + topic: message.topic, + }, + } satisfies IpcMessage, + { frameId: 0 }, + ); + return; + } - await super.initWithClient(new IpcClient(this.communicationProvider)); + throw new Error("Destination not supported."); + }, + }); + + BrowserApi.messageListener("platform.ipc", (message, sender) => { + if (!isIpcMessage(message)) { + return; + } + + if (sender.tab?.id === undefined || sender.tab.id === chrome.tabs.TAB_ID_NONE) { + // Ignore messages from non-tab sources + return; + } + + this.communicationBackend?.deliver_message( + new IncomingMessage(message.message.payload, message.message.destination, { + Web: { id: sender.tab.id }, + }), + ); + }); + + await super.initWithClient(new IpcClient(this.communicationBackend)); } catch (e) { this.logService.error("[IPC] Initialization failed", e); } diff --git a/apps/browser/src/platform/popup/layout/popup-header.component.html b/apps/browser/src/platform/popup/layout/popup-header.component.html index ac52a630900..c58bc258bf6 100644 --- a/apps/browser/src/platform/popup/layout/popup-header.component.html +++ b/apps/browser/src/platform/popup/layout/popup-header.component.html @@ -11,7 +11,7 @@
`, @@ -405,26 +406,26 @@ const navButtons = (showBerry = false) => [ { label: "vault", page: "/tabs/vault", - iconKey: "lock", - iconKeyActive: "lock-f", + icon: Icons.VaultInactive, + iconActive: Icons.VaultActive, }, { label: "generator", page: "/tabs/generator", - iconKey: "generate", - iconKeyActive: "generate-f", + icon: Icons.GeneratorInactive, + iconActive: Icons.GeneratorActive, }, { label: "send", page: "/tabs/send", - iconKey: "send", - iconKeyActive: "send-f", + icon: Icons.SendInactive, + iconActive: Icons.SendActive, }, { label: "settings", page: "/tabs/settings", - iconKey: "cog", - iconKeyActive: "cog-f", + icon: Icons.SettingsInactive, + iconActive: Icons.SettingsActive, showBerry: showBerry, }, ]; diff --git a/apps/browser/src/platform/popup/layout/popup-size.service.ts b/apps/browser/src/platform/popup/layout/popup-size.service.ts index 3ae9a633cab..69d3102d24e 100644 --- a/apps/browser/src/platform/popup/layout/popup-size.service.ts +++ b/apps/browser/src/platform/popup/layout/popup-size.service.ts @@ -50,17 +50,40 @@ export class PopupSizeService { PopupSizeService.setStyle(width); localStorage.setItem(PopupSizeService.LocalStorageKey, width); }); + } + async setHeight() { const isInChromeTab = await BrowserPopupUtils.isInTab(); + /** + * To support both browser default zoom and system default zoom, we need to take into account + * the full screen height. When system default zoom is >100%, window.innerHeight still outputs + * a height equivalent to what it would be at 100%, which can cause the extension window to + * render as too tall. So if the screen height is smaller than the max possible extension height, + * we should use that to set our extension height. Otherwise, we want to use the window.innerHeight + * to support browser zoom. + * + * This is basically a workaround for what we consider a bug with browsers reporting the wrong + * available innerHeight when system zoom is turned on. If that gets fixed, we can remove the code + * checking the screen height. + */ + const MAX_EXT_HEIGHT = 600; + const extensionInnerHeight = window.innerHeight; + // Use a 100px offset when calculating screen height to account for browser container elements + const screenAvailHeight = window.screen.availHeight - 100; + const availHeight = + screenAvailHeight < MAX_EXT_HEIGHT ? screenAvailHeight : extensionInnerHeight; + if (!BrowserPopupUtils.inPopup(window) || isInChromeTab) { - window.document.body.classList.add("body-full"); - } else if (window.innerHeight < 400) { - window.document.body.classList.add("body-xxs"); - } else if (window.innerHeight < 500) { - window.document.body.classList.add("body-xs"); - } else if (window.innerHeight < 600) { - window.document.body.classList.add("body-sm"); + window.document.documentElement.classList.add("body-full"); + } else if (availHeight < 300) { + window.document.documentElement.classList.add("body-3xs"); + } else if (availHeight < 400) { + window.document.documentElement.classList.add("body-xxs"); + } else if (availHeight < 500) { + window.document.documentElement.classList.add("body-xs"); + } else if (availHeight < 600) { + window.document.documentElement.classList.add("body-sm"); } } diff --git a/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.html b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.html index 27b546738c3..1170725a4b7 100644 --- a/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.html +++ b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.html @@ -7,7 +7,7 @@
  • diff --git a/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.ts b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.ts index f4b82dc56fc..4984d3749a1 100644 --- a/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.ts +++ b/apps/browser/src/platform/popup/layout/popup-tab-navigation.component.ts @@ -4,13 +4,13 @@ import { RouterModule } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LinkModule } from "@bitwarden/components"; +import { Icon, IconModule, LinkModule } from "@bitwarden/components"; export type NavButton = { label: string; page: string; - iconKey: string; - iconKeyActive: string; + icon: Icon; + iconActive: Icon; showBerry?: boolean; }; @@ -18,7 +18,7 @@ export type NavButton = { selector: "popup-tab-navigation", templateUrl: "popup-tab-navigation.component.html", standalone: true, - imports: [CommonModule, LinkModule, RouterModule, JslibModule], + imports: [CommonModule, LinkModule, RouterModule, JslibModule, IconModule], host: { class: "tw-block tw-h-full tw-w-full tw-flex tw-flex-col", }, diff --git a/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts b/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts index 3215893c634..aa0c0854eff 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.service.ts @@ -8,8 +8,9 @@ import { NavigationEnd, Router, UrlSerializer, + UrlTree, } from "@angular/router"; -import { filter, first, firstValueFrom, map, Observable, switchMap, tap } from "rxjs"; +import { filter, first, firstValueFrom, map, Observable, of, switchMap, tap } from "rxjs"; import { GlobalStateProvider } from "@bitwarden/common/platform/state"; @@ -31,6 +32,11 @@ export class PopupRouterCacheService { private hasNavigated = false; + private _hasRestoredCache = false; + get hasRestoredCache() { + return this._hasRestoredCache; + } + constructor() { // init history with existing state this.history$() @@ -107,21 +113,34 @@ export class PopupRouterCacheService { // if no history is present, fallback to vault page await this.router.navigate([""]); } + + /** + * Mark the cache as restored to prevent the router `popupRouterCacheGuard` from + * redirecting to the last visited route again this session. + */ + markCacheRestored() { + this._hasRestoredCache = true; + } } /** * Redirect to the last visited route. Should be applied to root route. **/ -export const popupRouterCacheGuard = (() => { +export const popupRouterCacheGuard = ((): Observable => { const popupHistoryService = inject(PopupRouterCacheService); const urlSerializer = inject(UrlSerializer); + if (popupHistoryService.hasRestoredCache) { + return of(true); + } + return popupHistoryService.last$().pipe( map((url: string) => { if (!url) { return true; } + popupHistoryService.markCacheRestored(); return urlSerializer.parse(url); }), ); diff --git a/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts b/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts index 465a6e6c69c..22fb7bf99b9 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-router-cache.spec.ts @@ -13,7 +13,10 @@ import { PopupRouterCacheService, popupRouterCacheGuard } from "./popup-router-c const flushPromises = async () => await new Promise(process.nextTick); -@Component({ template: "" }) +@Component({ + template: "", + standalone: false, +}) export class EmptyComponent {} describe("Popup router cache guard", () => { 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 6fc3e11493c..2a946982990 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 @@ -19,7 +19,7 @@ import { FormCacheOptions, SignalCacheOptions, ViewCacheService, -} from "@bitwarden/angular/platform/abstractions/view-cache.service"; +} from "@bitwarden/angular/platform/view-cache"; import { MessageSender } from "@bitwarden/common/platform/messaging"; import { GlobalStateProvider } from "@bitwarden/common/platform/state"; @@ -82,7 +82,7 @@ export class PopupViewCacheService implements ViewCacheService { initialValue, persistNavigation, } = options; - const cachedValue = this.cache[key] + const cachedValue = this.cache[key]?.value ? deserializer(JSON.parse(this.cache[key].value)) : initialValue; const _signal = signal(cachedValue); diff --git a/apps/browser/src/platform/popup/view-cache/popup-view-cache.spec.ts b/apps/browser/src/platform/popup/view-cache/popup-view-cache.spec.ts index 2ec75791d1b..60baf94eeae 100644 --- a/apps/browser/src/platform/popup/view-cache/popup-view-cache.spec.ts +++ b/apps/browser/src/platform/popup/view-cache/popup-view-cache.spec.ts @@ -19,10 +19,16 @@ import { import { PopupViewCacheService } from "./popup-view-cache.service"; -@Component({ template: "" }) +@Component({ + template: "", + standalone: false, +}) export class EmptyComponent {} -@Component({ template: "" }) +@Component({ + template: "", + standalone: false, +}) export class TestComponent { private viewCacheService = inject(PopupViewCacheService); diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts index c9200ecc1a4..22708d8e425 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -26,6 +26,10 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic return this.deviceCache; } + // ORDERING MATTERS HERE + // Ordered from most specific to least specific. We try to discern the greatest detail + // for the type of extension the user is on by checking specific cases first and as we go down + // the list we hope to catch all by the most generic clients they could be on. if (BrowserPlatformUtilsService.isFirefox()) { this.deviceCache = DeviceType.FirefoxExtension; } else if (BrowserPlatformUtilsService.isOpera(globalContext)) { diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index 45619454d1b..cdeb40866be 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -15,7 +15,6 @@ import { tdeDecryptionRequiredGuard, unauthGuardFn, } from "@bitwarden/angular/auth/guards"; -import { NewDeviceVerificationNoticeGuard } from "@bitwarden/angular/vault/guards"; import { AnonLayoutWrapperComponent, AnonLayoutWrapperData, @@ -43,11 +42,6 @@ import { VaultIcon, } from "@bitwarden/auth/angular"; import { LockComponent } from "@bitwarden/key-management-ui"; -import { - NewDeviceVerificationNoticePageOneComponent, - NewDeviceVerificationNoticePageTwoComponent, - VaultIcons, -} from "@bitwarden/vault"; import { fido2AuthGuard } from "../auth/guards/fido2-auth.guard"; import { AccountSwitcherComponent } from "../auth/popup/account-switching/account-switcher.component"; @@ -73,7 +67,6 @@ import { SendAddEditComponent as SendAddEditV2Component } from "../tools/popup/s import { SendCreatedComponent } from "../tools/popup/send-v2/send-created/send-created.component"; import { SendV2Component } from "../tools/popup/send-v2/send-v2.component"; import { AboutPageV2Component } from "../tools/popup/settings/about-page/about-page-v2.component"; -import { MoreFromBitwardenPageV2Component } from "../tools/popup/settings/about-page/more-from-bitwarden-page-v2.component"; import { ExportBrowserV2Component } from "../tools/popup/settings/export/export-browser-v2.component"; import { ImportBrowserV2Component } from "../tools/popup/settings/import/import-browser-v2.component"; import { SettingsV2Component } from "../tools/popup/settings/settings-v2.component"; @@ -90,7 +83,9 @@ import { VaultV2Component } from "../vault/popup/components/vault-v2/vault-v2.co import { ViewV2Component } from "../vault/popup/components/vault-v2/view-v2/view-v2.component"; import { AppearanceV2Component } from "../vault/popup/settings/appearance-v2.component"; import { ArchiveComponent } from "../vault/popup/settings/archive.component"; +import { DownloadBitwardenComponent } from "../vault/popup/settings/download-bitwarden.component"; import { FoldersV2Component } from "../vault/popup/settings/folders-v2.component"; +import { MoreFromBitwardenPageV2Component } from "../vault/popup/settings/more-from-bitwarden-page-v2.component"; import { TrashComponent } from "../vault/popup/settings/trash.component"; import { VaultSettingsV2Component } from "../vault/popup/settings/vault-settings-v2.component"; @@ -590,6 +585,12 @@ const routes: Routes = [ canActivate: [authGuard], data: { elevation: 2 } satisfies RouteDataProperties, }, + { + path: "download-bitwarden", + component: DownloadBitwardenComponent, + canActivate: [authGuard], + data: { elevation: 2 } satisfies RouteDataProperties, + }, { path: "intro-carousel", component: ExtensionAnonLayoutWrapperComponent, @@ -606,34 +607,6 @@ const routes: Routes = [ }, ], }, - { - path: "new-device-notice", - component: ExtensionAnonLayoutWrapperComponent, - canActivate: [], - children: [ - { - path: "", - component: NewDeviceVerificationNoticePageOneComponent, - data: { - pageIcon: VaultIcons.ExclamationTriangle, - pageTitle: { - key: "importantNotice", - }, - hideFooter: true, - }, - }, - { - path: "setup", - component: NewDeviceVerificationNoticePageTwoComponent, - data: { - pageIcon: VaultIcons.UserLock, - pageTitle: { - key: "setupTwoStepLogin", - }, - }, - }, - ], - }, { path: "tabs", component: TabsV2Component, @@ -651,7 +624,7 @@ const routes: Routes = [ { path: "vault", component: VaultV2Component, - canActivate: [authGuard, NewDeviceVerificationNoticeGuard], + canActivate: [authGuard], canDeactivate: [clearVaultStateGuard], data: { elevation: 0 } satisfies RouteDataProperties, }, diff --git a/apps/browser/src/popup/app.component.ts b/apps/browser/src/popup/app.component.ts index 6a08bf007bb..5f7fbc1fad7 100644 --- a/apps/browser/src/popup/app.component.ts +++ b/apps/browser/src/popup/app.component.ts @@ -26,6 +26,7 @@ import { import { BiometricsService, BiometricStateService } from "@bitwarden/key-management"; import { PopupCompactModeService } from "../platform/popup/layout/popup-compact-mode.service"; +import { PopupSizeService } from "../platform/popup/layout/popup-size.service"; import { initPopupClosedListener } from "../platform/services/popup-view-cache-background.service"; import { VaultBrowserStateService } from "../vault/services/vault-browser-state.service"; @@ -42,6 +43,7 @@ import { DesktopSyncVerificationDialogComponent } from "./components/desktop-syn
`, + standalone: false, }) export class AppComponent implements OnInit, OnDestroy { private compactModeService = inject(PopupCompactModeService); @@ -71,6 +73,7 @@ export class AppComponent implements OnInit, OnDestroy { private biometricStateService: BiometricStateService, private biometricsService: BiometricsService, private deviceTrustToastService: DeviceTrustToastService, + private popupSizeService: PopupSizeService, ) { this.deviceTrustToastService.setupListeners$.pipe(takeUntilDestroyed()).subscribe(); } @@ -79,6 +82,7 @@ export class AppComponent implements OnInit, OnDestroy { initPopupClosedListener(); this.compactModeService.init(); + await this.popupSizeService.setHeight(); // Component states must not persist between closing and reopening the popup, otherwise they become dead objects // Clear them aggressively to make sure this doesn't occur @@ -160,10 +164,6 @@ export class AppComponent implements OnInit, OnDestroy { // 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(["/remove-password"]); - } else if (msg.command == "update-temp-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.router.navigate(["/update-temp-password"]); } }), takeUntil(this.destroy$), diff --git a/apps/browser/src/popup/components/user-verification.component.ts b/apps/browser/src/popup/components/user-verification.component.ts index 6befc8973b0..f6cb6cdff12 100644 --- a/apps/browser/src/popup/components/user-verification.component.ts +++ b/apps/browser/src/popup/components/user-verification.component.ts @@ -22,5 +22,6 @@ import { UserVerificationComponent as BaseComponent } from "@bitwarden/angular/a transition(":enter", [style({ opacity: 0 }), animate("100ms", style({ opacity: 1 }))]), ]), ], + standalone: false, }) export class UserVerificationComponent extends BaseComponent {} diff --git a/apps/browser/src/popup/images/loading.svg b/apps/browser/src/popup/images/loading.svg index 3f2033303db..5f4102a5921 100644 --- a/apps/browser/src/popup/images/loading.svg +++ b/apps/browser/src/popup/images/loading.svg @@ -1,5 +1,5 @@  - Loading... diff --git a/apps/browser/src/popup/scss/base.scss b/apps/browser/src/popup/scss/base.scss index 59893b5050d..80ada61f868 100644 --- a/apps/browser/src/popup/scss/base.scss +++ b/apps/browser/src/popup/scss/base.scss @@ -8,6 +8,34 @@ html { overflow: hidden; + min-height: 600px; + height: 100%; + + &.body-sm { + min-height: 500px; + } + + &.body-xs { + min-height: 400px; + } + + &.body-xxs { + min-height: 300px; + } + + &.body-3xs { + min-height: 240px; + } + + &.body-full { + min-height: unset; + width: 100%; + height: 100%; + + & body { + width: 100%; + } + } } html, @@ -20,9 +48,9 @@ body { body { width: 380px; - height: 600px; + height: 100%; position: relative; - min-height: 100vh; + min-height: inherit; overflow: hidden; color: $text-color; background-color: $background-color; @@ -31,23 +59,6 @@ body { color: themed("textColor"); background-color: themed("backgroundColor"); } - - &.body-sm { - height: 500px; - } - - &.body-xs { - height: 400px; - } - - &.body-xxs { - height: 300px; - } - - &.body-full { - width: 100%; - height: 100%; - } } h1, diff --git a/apps/browser/src/popup/scss/misc.scss b/apps/browser/src/popup/scss/misc.scss index 8aace90d0a6..006e1d35f6a 100644 --- a/apps/browser/src/popup/scss/misc.scss +++ b/apps/browser/src/popup/scss/misc.scss @@ -211,12 +211,6 @@ p.lead { } } -#hcaptcha_iframe { - width: 100%; - border: none; - transition: height 0.25s linear; -} - body.linux-webauthn { width: 485px !important; #web-authn-frame { diff --git a/apps/browser/src/popup/scss/variables.scss b/apps/browser/src/popup/scss/variables.scss index b78f06f2f3f..aea69e26436 100644 --- a/apps/browser/src/popup/scss/variables.scss +++ b/apps/browser/src/popup/scss/variables.scss @@ -1,6 +1,6 @@ $dark-icon-themes: "theme_dark"; -$font-family-sans-serif: "DM Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-sans-serif: Roboto, "Helvetica Neue", Helvetica, Arial, sans-serif; $font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; $font-size-base: 16px; $font-size-large: 18px; diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 00b8ae81cf9..6ede88dfc13 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -5,9 +5,9 @@ import { Router } from "@angular/router"; import { merge, of, Subject } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; -import { ViewCacheService } from "@bitwarden/angular/platform/abstractions/view-cache.service"; import { AngularThemingService } from "@bitwarden/angular/platform/services/theming/angular-theming.service"; import { SafeProvider, safeProvider } from "@bitwarden/angular/platform/utils/safe-provider"; +import { ViewCacheService } from "@bitwarden/angular/platform/view-cache"; import { CLIENT_TYPE, DEFAULT_VAULT_TIMEOUT, diff --git a/apps/browser/src/popup/tabs-v2.component.ts b/apps/browser/src/popup/tabs-v2.component.ts index 24ce9d8cb12..0ca763d510d 100644 --- a/apps/browser/src/popup/tabs-v2.component.ts +++ b/apps/browser/src/popup/tabs-v2.component.ts @@ -1,53 +1,61 @@ import { Component } from "@angular/core"; -import { combineLatest, map } from "rxjs"; +import { combineLatest, map, Observable, switchMap } from "rxjs"; +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 { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { HasNudgeService } from "@bitwarden/vault"; +import { Icons } from "@bitwarden/components"; +import { NudgesService } from "@bitwarden/vault"; + +import { NavButton } from "../platform/popup/layout/popup-tab-navigation.component"; @Component({ selector: "app-tabs-v2", templateUrl: "./tabs-v2.component.html", - providers: [HasNudgeService], + standalone: false, }) export class TabsV2Component { - constructor( - private readonly hasNudgeService: HasNudgeService, - private readonly configService: ConfigService, - ) {} - - protected navButtons$ = combineLatest([ + private hasActiveBadges$ = this.accountService.activeAccount$ + .pipe(getUserId) + .pipe(switchMap((userId) => this.nudgesService.hasActiveBadges$(userId))); + protected navButtons$: Observable = combineLatest([ this.configService.getFeatureFlag$(FeatureFlag.PM8851_BrowserOnboardingNudge), - this.hasNudgeService.nudgeStatus$(), + this.hasActiveBadges$, ]).pipe( - map(([onboardingFeatureEnabled, nudgeStatus]) => { + map(([onboardingFeatureEnabled, hasBadges]) => { return [ { label: "vault", page: "/tabs/vault", - iconKey: "lock", - iconKeyActive: "lock-f", + icon: Icons.VaultInactive, + iconActive: Icons.VaultActive, }, { label: "generator", page: "/tabs/generator", - iconKey: "generate", - iconKeyActive: "generate-f", + icon: Icons.GeneratorInactive, + iconActive: Icons.GeneratorActive, }, { label: "send", page: "/tabs/send", - iconKey: "send", - iconKeyActive: "send-f", + icon: Icons.SendInactive, + iconActive: Icons.SendActive, }, { label: "settings", page: "/tabs/settings", - iconKey: "cog", - iconKeyActive: "cog-f", - showBerry: onboardingFeatureEnabled && !nudgeStatus.hasSpotlightDismissed, + icon: Icons.SettingsInactive, + iconActive: Icons.SettingsActive, + showBerry: onboardingFeatureEnabled && hasBadges, }, ]; }), ); + constructor( + private nudgesService: NudgesService, + private accountService: AccountService, + private readonly configService: ConfigService, + ) {} } diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.ts index 49804abda5d..def425a51a5 100644 --- a/apps/browser/src/tools/popup/send-v2/send-v2.component.ts +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.ts @@ -26,6 +26,8 @@ import { PopOutComponent } from "../../../platform/popup/components/pop-out.comp import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum SendState { Empty, NoResults, diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html index bcc0f12d0d7..839681889a8 100644 --- a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.html @@ -23,7 +23,7 @@ - + {{ "moreFromBitwarden" | i18n }} diff --git a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts index 1d0d4218439..51dbf3685ae 100644 --- a/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/about-page/about-page-v2.component.ts @@ -5,6 +5,8 @@ import { firstValueFrom } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { DeviceType } from "@bitwarden/common/enums"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { DialogService, ItemModule } from "@bitwarden/components"; @@ -47,12 +49,17 @@ export class AboutPageV2Component { private dialogService: DialogService, private environmentService: EnvironmentService, private platformUtilsService: PlatformUtilsService, + private configService: ConfigService, ) {} about() { this.dialogService.open(AboutDialogComponent); } + protected isNudgeFeatureEnabled$ = this.configService.getFeatureFlag$( + FeatureFlag.PM8851_BrowserOnboardingNudge, + ); + async launchHelp() { const confirmed = await this.dialogService.openSimpleDialog({ title: { key: "continueToHelpCenter" }, diff --git a/apps/browser/src/tools/popup/settings/settings-v2.component.html b/apps/browser/src/tools/popup/settings/settings-v2.component.html index b6f98b649fe..dc53f95a7cf 100644 --- a/apps/browser/src/tools/popup/settings/settings-v2.component.html +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.html @@ -17,7 +17,16 @@ - {{ "autofill" | i18n }} +
+

{{ "autofill" | i18n }}

+ 1 +
@@ -32,7 +41,7 @@
@@ -42,9 +51,10 @@ Will make this dynamic when more nudges are added --> 1
@@ -54,7 +64,7 @@
- + {{ "appearance" | i18n }} @@ -66,5 +76,28 @@ + + + +
+

{{ "downloadBitwardenOnAllDevices" | i18n }}

+ 1 + +
+ +
+
+ + + + {{ "moreFromBitwarden" | i18n }} + + + diff --git a/apps/browser/src/tools/popup/settings/settings-v2.component.ts b/apps/browser/src/tools/popup/settings/settings-v2.component.ts index 737d79ea4ca..211be82c9ed 100644 --- a/apps/browser/src/tools/popup/settings/settings-v2.component.ts +++ b/apps/browser/src/tools/popup/settings/settings-v2.component.ts @@ -1,16 +1,27 @@ import { CommonModule } from "@angular/common"; import { Component, OnInit } from "@angular/core"; import { RouterModule } from "@angular/router"; -import { firstValueFrom, Observable } from "rxjs"; +import { + combineLatest, + filter, + firstValueFrom, + map, + Observable, + shareReplay, + switchMap, +} from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { UserId } from "@bitwarden/common/types/guid"; import { BadgeComponent, ItemModule } from "@bitwarden/components"; -import { NudgeStatus, VaultNudgesService, VaultNudgeType } from "@bitwarden/vault"; +import { NudgesService, NudgeType } from "@bitwarden/vault"; import { CurrentAccountComponent } from "../../../auth/popup/account-switching/current-account.component"; +import { AutofillBrowserSettingsService } from "../../../autofill/services/autofill-browser-settings.service"; +import { BrowserApi } from "../../../platform/browser/browser-api"; 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"; @@ -31,25 +42,62 @@ import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.co ], }) export class SettingsV2Component implements OnInit { - VaultNudgeType = VaultNudgeType; - showVaultBadge$: Observable = new Observable(); + NudgeType = NudgeType; activeUserId: UserId | null = null; + protected isBrowserAutofillSettingOverridden = false; + + private authenticatedAccount$: Observable = this.accountService.activeAccount$.pipe( + filter((account): account is Account => account !== null), + shareReplay({ bufferSize: 1, refCount: true }), + ); + + downloadBitwardenNudgeStatus$: Observable = this.authenticatedAccount$.pipe( + switchMap((account) => + this.nudgesService.showNudgeBadge$(NudgeType.DownloadBitwarden, account.id), + ), + ); + + showVaultBadge$: Observable = this.authenticatedAccount$.pipe( + switchMap((account) => + this.nudgesService.showNudgeBadge$(NudgeType.EmptyVaultNudge, account.id), + ), + ); + + showAutofillBadge$: Observable = combineLatest([ + this.autofillBrowserSettingsService.defaultBrowserAutofillDisabled$, + this.authenticatedAccount$, + ]).pipe( + switchMap(([defaultBrowserAutofillDisabled, account]) => + this.nudgesService.showNudgeBadge$(NudgeType.AutofillNudge, account.id).pipe( + map((badgeStatus) => { + return !defaultBrowserAutofillDisabled && badgeStatus; + }), + ), + ), + ); + + protected isNudgeFeatureEnabled$ = this.configService.getFeatureFlag$( + FeatureFlag.PM8851_BrowserOnboardingNudge, + ); constructor( - private readonly vaultNudgesService: VaultNudgesService, + private readonly nudgesService: NudgesService, private readonly accountService: AccountService, + private readonly autofillBrowserSettingsService: AutofillBrowserSettingsService, + private readonly configService: ConfigService, ) {} + async ngOnInit() { - this.activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); - this.showVaultBadge$ = this.vaultNudgesService.showNudge$( - VaultNudgeType.EmptyVaultNudge, - this.activeUserId, - ); + this.isBrowserAutofillSettingOverridden = + await this.autofillBrowserSettingsService.isBrowserAutofillSettingOverridden( + BrowserApi.getBrowserClientVendor(window), + ); } - async dismissBadge(type: VaultNudgeType) { - if (!(await firstValueFrom(this.showVaultBadge$)).hasBadgeDismissed) { - await this.vaultNudgesService.dismissNudge(type, this.activeUserId as UserId, true); + async dismissBadge(type: NudgeType) { + if (await firstValueFrom(this.showVaultBadge$)) { + const account = await firstValueFrom(this.authenticatedAccount$); + await this.nudgesService.dismissNudge(type, account.id as UserId, true); } } } diff --git a/apps/browser/src/vault/guards/at-risk-passwords.guard.ts b/apps/browser/src/vault/guards/at-risk-passwords.guard.ts index 6bcdddfde81..fc302dd6c36 100644 --- a/apps/browser/src/vault/guards/at-risk-passwords.guard.ts +++ b/apps/browser/src/vault/guards/at-risk-passwords.guard.ts @@ -1,6 +1,6 @@ import { inject } from "@angular/core"; -import { CanActivateFn } from "@angular/router"; -import { switchMap, tap } from "rxjs"; +import { CanActivateFn, Router } from "@angular/router"; +import { map, switchMap } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -13,18 +13,22 @@ export const canAccessAtRiskPasswords: CanActivateFn = () => { const taskService = inject(TaskService); const toastService = inject(ToastService); const i18nService = inject(I18nService); + const router = inject(Router); return accountService.activeAccount$.pipe( filterOutNullish(), switchMap((user) => taskService.tasksEnabled$(user.id)), - tap((tasksEnabled) => { + map((tasksEnabled) => { if (!tasksEnabled) { toastService.showToast({ variant: "error", title: "", - message: i18nService.t("accessDenied"), + message: i18nService.t("noPermissionsViewPage"), }); + + return router.createUrlTree(["/tabs/vault"]); } + return true; }), ); }; diff --git a/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts index fcca125c2b6..0133bccd25c 100644 --- a/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts +++ b/apps/browser/src/vault/popup/components/at-risk-carousel-dialog/at-risk-carousel-dialog.component.ts @@ -10,6 +10,8 @@ import { import { I18nPipe } from "@bitwarden/ui-common"; import { DarkImageSourceDirective, VaultCarouselModule } from "@bitwarden/vault"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum AtRiskCarouselDialogResult { Dismissed = "dismissed", } diff --git a/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts index 27f3b7e5e18..7052be5ea62 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/assign-collections/assign-collections.component.ts @@ -11,7 +11,6 @@ import { CollectionService } from "@bitwarden/admin-console/common"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { OrganizationId } from "@bitwarden/common/types/guid"; -import { OrgKey, UserKey } from "@bitwarden/common/types/key"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { @@ -66,11 +65,7 @@ export class AssignCollections { route.queryParams.pipe( switchMap(async ({ cipherId }) => { const cipherDomain = await this.cipherService.get(cipherId, userId); - const key: UserKey | OrgKey = await this.cipherService.getKeyForCipherKeyDecryption( - cipherDomain, - userId, - ); - return cipherDomain.decrypt(key); + return await this.cipherService.decrypt(cipherDomain, userId); }), ), ), diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts index 66d9096cd5c..ec5c93feb9e 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts @@ -81,6 +81,7 @@ describe("OpenAttachmentsComponent", () => { useValue: { get: getCipher, getKeyForCipherKeyDecryption: () => Promise.resolve(null), + decrypt: jest.fn().mockResolvedValue(cipherView), }, }, { diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts index 1bc7e22e6d5..9189ea51313 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.ts @@ -81,9 +81,7 @@ export class OpenAttachmentsComponent implements OnInit { this.accountService.activeAccount$.pipe(map((a) => a?.id)), ); const cipherDomain = await this.cipherService.get(this.cipherId, activeUserId); - const cipher = await cipherDomain.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipherDomain, activeUserId), - ); + const cipher = await this.cipherService.decrypt(cipherDomain, activeUserId); if (!cipher.organizationId) { this.cipherIsAPartOfFreeOrg = false; diff --git a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.html b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.html index bb3a7b12096..576f6b7def6 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/item-copy-action/item-copy-actions.component.html @@ -40,12 +40,9 @@ type="button" bitIconButton="bwi-clone" size="small" - [appA11yTitle]=" - 'copyFieldValue' | i18n: singleCopiableLogin.key : singleCopiableLogin.value - " - [appCopyClick]="singleCopiableLogin.value" - [valueLabel]="singleCopiableLogin.key" - showToast + [appA11yTitle]="singleCopiableLogin.key" + [appCopyField]="$any(singleCopiableLogin.field)" + [cipher]="cipher" > 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 deleted file mode 100644 index 6cc60eed6d5..00000000000 --- a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.html +++ /dev/null @@ -1,29 +0,0 @@ - - - -
- {{ "newCustomizationOptionsCalloutContent" | i18n }} - - {{ "newCustomizationOptionsCalloutLink" | i18n }} - -
-
-
diff --git a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts b/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts deleted file mode 100644 index 713dc21c424..00000000000 --- a/apps/browser/src/vault/popup/components/vault-v2/new-settings-callout/new-settings-callout.component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { Component, OnDestroy, OnInit } from "@angular/core"; -import { Router } from "@angular/router"; -import { firstValueFrom } 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 { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { UserId } from "@bitwarden/common/types/guid"; -import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service"; -import { ButtonModule, PopoverModule } from "@bitwarden/components"; - -import { VaultPopupCopyButtonsService } from "../../../services/vault-popup-copy-buttons.service"; -import { VaultPageService } from "../vault-page.service"; - -@Component({ - selector: "new-settings-callout", - templateUrl: "new-settings-callout.component.html", - standalone: true, - imports: [PopoverModule, JslibModule, CommonModule, ButtonModule], - providers: [VaultPageService], -}) -export class NewSettingsCalloutComponent implements OnInit, OnDestroy { - protected showNewCustomizationSettingsCallout = false; - protected activeUserId: UserId | null = null; - - constructor( - private accountService: AccountService, - private vaultProfileService: VaultProfileService, - private vaultPageService: VaultPageService, - private router: Router, - private logService: LogService, - private copyButtonService: VaultPopupCopyButtonsService, - private vaultSettingsService: VaultSettingsService, - ) {} - - async ngOnInit() { - this.activeUserId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); - - const showQuickCopyActions = await firstValueFrom(this.copyButtonService.showQuickCopyActions$); - const clickItemsToAutofillVaultView = await firstValueFrom( - this.vaultSettingsService.clickItemsToAutofillVaultView$, - ); - - let profileCreatedDate: Date; - - try { - profileCreatedDate = await this.vaultProfileService.getProfileCreationDate(this.activeUserId); - } catch (e) { - this.logService.error("Error getting profile creation date", e); - // Default to before the cutoff date to ensure the callout is shown - profileCreatedDate = new Date("2024-12-24"); - } - - const hasCalloutBeenDismissed = await firstValueFrom( - this.vaultPageService.isCalloutDismissed(this.activeUserId), - ); - - this.showNewCustomizationSettingsCallout = - !showQuickCopyActions && - !clickItemsToAutofillVaultView && - !hasCalloutBeenDismissed && - profileCreatedDate < new Date("2024-12-25"); - } - - async goToAppearance() { - await this.router.navigate(["/appearance"]); - } - - async dismissCallout() { - if (this.activeUserId) { - await this.vaultPageService.dismissCallout(this.activeUserId); - } - } - - async ngOnDestroy() { - await this.dismissCallout(); - } -} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.ts index 137f2a9dac3..4daffa6a9b8 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-generator-dialog/vault-generator-dialog.component.ts @@ -30,6 +30,8 @@ export interface GeneratorDialogResult { generatedValue?: string; } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum GeneratorDialogAction { Selected = "selected", Canceled = "canceled", diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.html b/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.html index c61562f9f90..ba4cbf71251 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.html +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-list-filters/vault-list-filters.component.html @@ -20,7 +20,7 @@ *ngIf="collections.length" fullWidth formControlName="collection" - placeholderIcon="bwi-collection" + placeholderIcon="bwi-collection-shared" [placeholderText]="'collection' | i18n" [options]="collections" > diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts deleted file mode 100644 index a7c52ed4c51..00000000000 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-page.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { inject, Injectable } from "@angular/core"; -import { map, Observable } from "rxjs"; - -import { - BANNERS_DISMISSED_DISK, - StateProvider, - UserKeyDefinition, -} from "@bitwarden/common/platform/state"; -import { UserId } from "@bitwarden/common/types/guid"; - -export const NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY = new UserKeyDefinition( - BANNERS_DISMISSED_DISK, - "newCustomizationOptionsCalloutDismissed", - { - deserializer: (calloutDismissed) => calloutDismissed, - clearOn: [], // Do not clear dismissed callouts - }, -); - -@Injectable() -export class VaultPageService { - private stateProvider = inject(StateProvider); - - isCalloutDismissed(userId: UserId): Observable { - return this.stateProvider - .getUser(userId, NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY) - .state$.pipe(map((dismissed) => !!dismissed)); - } - - async dismissCallout(userId: UserId): Promise { - await this.stateProvider - .getUser(userId, NEW_CUSTOMIZATION_OPTIONS_CALLOUT_DISMISSED_KEY) - .update(() => true); - } -} diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts index 5d315775b10..d0eef20f044 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-password-history-v2/vault-password-history-v2.component.ts @@ -69,8 +69,6 @@ export class PasswordHistoryV2Component implements OnInit { const activeUserId = activeAccount.id as UserId; const cipher = await this.cipherService.get(cipherId, activeUserId); - this.cipher = await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + this.cipher = await this.cipherService.decrypt(cipher, activeUserId); } } 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 894f27245b2..42e772be062 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 @@ -36,7 +36,7 @@ [subtitle]="'emptyVaultNudgeBody' | i18n" [buttonText]="'emptyVaultNudgeButton' | i18n" (onButtonClick)="navigateToImport()" - (onDismiss)="dismissVaultNudgeSpotlight(VaultNudgeType.EmptyVaultNudge)" + (onDismiss)="dismissVaultNudgeSpotlight(NudgeType.EmptyVaultNudge)" >
@@ -44,9 +44,13 @@
+
    +
  • {{ "hasItemsVaultNudgeBodyOne" | i18n }}
  • +
  • {{ "hasItemsVaultNudgeBodyTwo" | i18n }}
  • +
  • {{ "hasItemsVaultNudgeBodyThree" | i18n }}
  • +
- 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 64805a02394..8dc4c639574 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 @@ -19,16 +19,23 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; 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 { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { CipherId, CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherType } from "@bitwarden/common/vault/enums"; -import { ButtonModule, DialogService, Icons, NoItemsModule } from "@bitwarden/components"; +import { + ButtonModule, + DialogService, + Icons, + NoItemsModule, + TypographyModule, +} from "@bitwarden/components"; import { DecryptionFailureDialogComponent, + NudgesService, + NudgeType, SpotlightComponent, VaultIcons, - VaultNudgesService, - VaultNudgeType, } from "@bitwarden/vault"; import { CurrentAccountComponent } from "../../../../auth/popup/account-switching/current-account.component"; @@ -49,12 +56,12 @@ import { NewItemDropdownV2Component, NewItemInitialValues, } from "./new-item-dropdown/new-item-dropdown-v2.component"; -import { NewSettingsCalloutComponent } from "./new-settings-callout/new-settings-callout.component"; import { VaultHeaderV2Component } from "./vault-header/vault-header-v2.component"; -import { VaultPageService } from "./vault-page.service"; import { AutofillVaultListItemsComponent, VaultListItemsContainerComponent } from "."; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums enum VaultState { Empty, NoResults, @@ -81,27 +88,24 @@ enum VaultState { ScrollingModule, VaultHeaderV2Component, AtRiskPasswordCalloutComponent, - NewSettingsCalloutComponent, SpotlightComponent, RouterModule, + TypographyModule, ], - providers: [VaultPageService], }) export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { @ViewChild(CdkVirtualScrollableElement) virtualScrollElement?: CdkVirtualScrollableElement; - VaultNudgeType = VaultNudgeType; + NudgeType = NudgeType; cipherType = CipherType; private activeUserId$ = this.accountService.activeAccount$.pipe(getUserId); showEmptyVaultSpotlight$: Observable = this.activeUserId$.pipe( switchMap((userId) => - this.vaultNudgesService.showNudge$(VaultNudgeType.EmptyVaultNudge, userId), + this.nudgesService.showNudgeSpotlight$(NudgeType.EmptyVaultNudge, userId), ), - map((nudgeStatus) => !nudgeStatus.hasSpotlightDismissed), ); showHasItemsVaultSpotlight$: Observable = this.activeUserId$.pipe( - switchMap((userId) => this.vaultNudgesService.showNudge$(VaultNudgeType.HasVaultItems, userId)), - map((nudgeStatus) => !nudgeStatus.hasSpotlightDismissed), + switchMap((userId) => this.nudgesService.showNudgeSpotlight$(NudgeType.HasVaultItems, userId)), ); activeUserId: UserId | null = null; @@ -142,7 +146,6 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { protected noResultsIcon = Icons.NoResults; protected VaultStateEnum = VaultState; - protected showNewCustomizationSettingsCallout = false; constructor( private vaultPopupItemsService: VaultPopupItemsService, @@ -154,8 +157,9 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { private dialogService: DialogService, private vaultCopyButtonsService: VaultPopupCopyButtonsService, private introCarouselService: IntroCarouselService, - private vaultNudgesService: VaultNudgesService, + private nudgesService: NudgesService, private router: Router, + private i18nService: I18nService, ) { combineLatest([ this.vaultPopupItemsService.emptyVault$, @@ -223,8 +227,8 @@ export class VaultV2Component implements OnInit, AfterViewInit, OnDestroy { } } - async dismissVaultNudgeSpotlight(type: VaultNudgeType) { - await this.vaultNudgesService.dismissNudge(type, this.activeUserId as UserId); + async dismissVaultNudgeSpotlight(type: NudgeType) { + await this.nudgesService.dismissNudge(type, this.activeUserId as UserId); } protected readonly FeatureFlag = FeatureFlag; diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts index 44874221a59..3222f39a162 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.spec.ts @@ -82,6 +82,7 @@ describe("ViewV2Component", () => { getKeyForCipherKeyDecryption: jest.fn().mockResolvedValue({}), deleteWithServer: jest.fn().mockResolvedValue(undefined), softDeleteWithServer: jest.fn().mockResolvedValue(undefined), + decrypt: jest.fn().mockResolvedValue(mockCipher), }; beforeEach(async () => { diff --git a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts index 56db47619b0..0a71caf5aee 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/view-v2/view-v2.component.ts @@ -19,6 +19,7 @@ import { COPY_USERNAME_ID, COPY_VERIFICATION_CODE_ID, SHOW_AUTOFILL_BUTTON, + UPDATE_PASSWORD, } from "@bitwarden/common/autofill/constants"; import { EventType } from "@bitwarden/common/enums"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; @@ -49,6 +50,7 @@ import { PasswordRepromptService, } from "@bitwarden/vault"; +import { sendExtensionMessage } from "../../../../../autofill/utils/index"; import { BrowserApi } from "../../../../../platform/browser/browser-api"; import BrowserPopupUtils from "../../../../../platform/popup/browser-popup-utils"; import { PopOutComponent } from "../../../../../platform/popup/components/pop-out.component"; @@ -72,7 +74,8 @@ type LoadAction = | typeof SHOW_AUTOFILL_BUTTON | typeof COPY_USERNAME_ID | typeof COPY_PASSWORD_ID - | typeof COPY_VERIFICATION_CODE_ID; + | typeof COPY_VERIFICATION_CODE_ID + | typeof UPDATE_PASSWORD; @Component({ selector: "app-view-v2", @@ -200,9 +203,7 @@ export class ViewV2Component { async getCipherData(id: string, userId: UserId) { const cipher = await this.cipherService.get(id, userId); - return await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, userId), - ); + return await this.cipherService.decrypt(cipher, userId); } async editCipher() { @@ -294,7 +295,7 @@ export class ViewV2Component { // Both vaultPopupAutofillService and copyCipherFieldService will perform password re-prompting internally. switch (loadAction) { - case "show-autofill-button": + case SHOW_AUTOFILL_BUTTON: // This action simply shows the cipher view, no need to do anything. if ( this.cipher.reprompt !== CipherRepromptType.None && @@ -303,30 +304,42 @@ export class ViewV2Component { await closeViewVaultItemPopout(`${VaultPopoutType.viewVaultItem}_${this.cipher.id}`); } return; - case "autofill": + case AUTOFILL_ID: actionSuccess = await this.vaultPopupAutofillService.doAutofill(this.cipher, false); break; - case "copy-username": + case COPY_USERNAME_ID: actionSuccess = await this.copyCipherFieldService.copy( this.cipher.login.username, "username", this.cipher, ); break; - case "copy-password": + case COPY_PASSWORD_ID: actionSuccess = await this.copyCipherFieldService.copy( this.cipher.login.password, "password", this.cipher, ); break; - case "copy-totp": + case COPY_VERIFICATION_CODE_ID: actionSuccess = await this.copyCipherFieldService.copy( this.cipher.login.totp, "totp", this.cipher, ); break; + case UPDATE_PASSWORD: { + const repromptSuccess = await this.passwordRepromptService.showPasswordPrompt(); + + await sendExtensionMessage("bgHandleReprompt", { + tab: await chrome.tabs.get(senderTabId), + success: repromptSuccess, + }); + + await closeViewVaultItemPopout(`${VaultPopoutType.viewVaultItem}_${this.cipher.id}`); + + break; + } } if (BrowserPopupUtils.inPopout(window)) { diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts index f9785bccd00..621ec795157 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts @@ -4,6 +4,7 @@ import { FormBuilder } from "@angular/forms"; import { BehaviorSubject, skipWhile } from "rxjs"; import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; +import { ViewCacheService } from "@bitwarden/angular/platform/view-cache"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; @@ -20,8 +21,6 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; -import { PopupViewCacheService } from "../../../platform/popup/view-cache/popup-view-cache.service"; - import { CachedFilterState, MY_VAULT_ID, @@ -123,7 +122,7 @@ describe("VaultPopupListFiltersService", () => { useValue: accountService, }, { - provide: PopupViewCacheService, + provide: ViewCacheService, useValue: viewCacheService, }, ], @@ -362,7 +361,7 @@ describe("VaultPopupListFiltersService", () => { it("sets collection icon", (done) => { service.collections$.subscribe((collections) => { - expect(collections.every(({ icon }) => icon === "bwi-collection")).toBeTruthy(); + expect(collections.every(({ icon }) => icon === "bwi-collection-shared")).toBeTruthy(); done(); }); }); diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts index f11fa0f63f0..db4cfeefe9f 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts @@ -15,6 +15,7 @@ import { } from "rxjs"; import { CollectionService, CollectionView } from "@bitwarden/admin-console/common"; +import { ViewCacheService } from "@bitwarden/angular/platform/view-cache"; import { DynamicTreeNode } from "@bitwarden/angular/vault/vault-filter/models/dynamic-tree-node.model"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -40,8 +41,6 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { ServiceUtils } from "@bitwarden/common/vault/service-utils"; import { ChipSelectOption } from "@bitwarden/components"; -import { PopupViewCacheService } from "../../../platform/popup/view-cache/popup-view-cache.service"; - const FILTER_VISIBILITY_KEY = new KeyDefinition(VAULT_SETTINGS_DISK, "filterVisibility", { deserializer: (obj) => obj, }); @@ -178,7 +177,7 @@ export class VaultPopupListFiltersService { private policyService: PolicyService, private stateProvider: StateProvider, private accountService: AccountService, - private viewCacheService: PopupViewCacheService, + private viewCacheService: ViewCacheService, ) { this.filterForm.controls.organization.valueChanges .pipe(takeUntilDestroyed()) @@ -461,7 +460,7 @@ export class VaultPopupListFiltersService { }); }), map((collections) => - collections.nestedList.map((c) => this.convertToChipSelectOption(c, "bwi-collection")), + collections.nestedList.map((c) => this.convertToChipSelectOption(c, "bwi-collection-shared")), ), shareReplay({ refCount: true, bufferSize: 1 }), ); diff --git a/apps/browser/src/vault/popup/settings/download-bitwarden.component.html b/apps/browser/src/vault/popup/settings/download-bitwarden.component.html new file mode 100644 index 00000000000..20896a3c782 --- /dev/null +++ b/apps/browser/src/vault/popup/settings/download-bitwarden.component.html @@ -0,0 +1,64 @@ + + + + + + +

+ {{ "getTheMobileApp" | i18n }} +

+ + + {{ "getTheMobileAppDesc" | i18n }} + +
+ +
+ +
+ +

+ {{ "getTheDesktopApp" | i18n }} +

+ + {{ "getTheDesktopAppDesc" | i18n }} + + {{ "downloadFromBitwardenNow" | i18n }} + + + +
diff --git a/apps/browser/src/vault/popup/settings/download-bitwarden.component.ts b/apps/browser/src/vault/popup/settings/download-bitwarden.component.ts new file mode 100644 index 00000000000..a79aa1d3f14 --- /dev/null +++ b/apps/browser/src/vault/popup/settings/download-bitwarden.component.ts @@ -0,0 +1,43 @@ +import { CommonModule } from "@angular/common"; +import { Component, OnInit } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { firstValueFrom } from "rxjs"; + +import { JslibModule } from "@bitwarden/angular/jslib.module"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { CardComponent, LinkModule, TypographyModule } from "@bitwarden/components"; +import { NudgesService, NudgeType } 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"; + +@Component({ + templateUrl: "download-bitwarden.component.html", + standalone: true, + imports: [ + CommonModule, + JslibModule, + RouterModule, + PopupPageComponent, + PopupHeaderComponent, + PopOutComponent, + CardComponent, + TypographyModule, + CurrentAccountComponent, + LinkModule, + ], +}) +export class DownloadBitwardenComponent implements OnInit { + constructor( + private nudgesService: NudgesService, + private accountService: AccountService, + ) {} + + async ngOnInit() { + const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.nudgesService.dismissNudge(NudgeType.DownloadBitwarden, userId); + } +} 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 552547c0230..8cea05f9c17 100644 --- a/apps/browser/src/vault/popup/settings/folders-v2.component.html +++ b/apps/browser/src/vault/popup/settings/folders-v2.component.html @@ -8,7 +8,7 @@ type="button" (click)="openAddEditFolderDialog()" > - + {{ "new" | i18n }} @@ -47,7 +47,7 @@ (click)="openAddEditFolderDialog()" data-testid="empty-new-folder-button" > - + {{ "newFolder" | i18n }} diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html b/apps/browser/src/vault/popup/settings/more-from-bitwarden-page-v2.component.html similarity index 100% rename from apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.html rename to apps/browser/src/vault/popup/settings/more-from-bitwarden-page-v2.component.html diff --git a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts b/apps/browser/src/vault/popup/settings/more-from-bitwarden-page-v2.component.ts similarity index 90% rename from apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts rename to apps/browser/src/vault/popup/settings/more-from-bitwarden-page-v2.component.ts index a3d1c553977..b1269963f70 100644 --- a/apps/browser/src/tools/popup/settings/about-page/more-from-bitwarden-page-v2.component.ts +++ b/apps/browser/src/vault/popup/settings/more-from-bitwarden-page-v2.component.ts @@ -11,11 +11,11 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { DialogService, ItemModule } from "@bitwarden/components"; -import { FamiliesPolicyService } from "../../../../billing/services/families-policy.service"; -import { BrowserApi } from "../../../../platform/browser/browser-api"; -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 { FamiliesPolicyService } from "../../../billing/services/families-policy.service"; +import { BrowserApi } from "../../../platform/browser/browser-api"; +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"; @Component({ templateUrl: "more-from-bitwarden-page-v2.component.html", diff --git a/apps/browser/store/locales/vi/copy.resx b/apps/browser/store/locales/vi/copy.resx index f1a65d0fed5..c262c9bffd7 100644 --- a/apps/browser/store/locales/vi/copy.resx +++ b/apps/browser/store/locales/vi/copy.resx @@ -121,7 +121,7 @@ Trình quản lý mật khẩu Bitwarden - At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information. + Ở nhà, trên cơ quan, hay trên đường đi, Bitwarden có thể dễ dàng bảo về tất cả những mật khẩu, mã khoá, và thông tin cá nhân của bạn. Recognized as the best password manager by PCMag, WIRED, The Verge, CNET, G2, and more! diff --git a/apps/cli/package.json b/apps/cli/package.json index 79d4786a23c..b01c96b23d1 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -64,13 +64,14 @@ ] }, "dependencies": { - "@koa/multer": "3.0.2", + "@koa/multer": "3.1.0", "@koa/router": "13.1.0", "argon2": "0.41.1", "big-integer": "1.6.52", "browser-hrtime": "1.1.8", "chalk": "4.1.2", "commander": "11.1.0", + "core-js": "3.40.0", "form-data": "4.0.1", "https-proxy-agent": "7.0.6", "inquirer": "8.2.6", @@ -81,7 +82,7 @@ "koa-json": "2.0.2", "lowdb": "1.0.0", "lunr": "2.3.9", - "multer": "1.4.5-lts.1", + "multer": "1.4.5-lts.2", "node-fetch": "2.6.12", "node-forge": "1.3.1", "open": "8.4.2", diff --git a/apps/cli/src/admin-console/commands/share.command.ts b/apps/cli/src/admin-console/commands/share.command.ts index 6d9e6c8b6c0..540bc2659c9 100644 --- a/apps/cli/src/admin-console/commands/share.command.ts +++ b/apps/cli/src/admin-console/commands/share.command.ts @@ -59,15 +59,11 @@ export class ShareCommand { return Response.badRequest("This item already belongs to an organization."); } - const cipherView = await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + const cipherView = await this.cipherService.decrypt(cipher, activeUserId); try { await this.cipherService.shareWithServer(cipherView, organizationId, req, activeUserId); const updatedCipher = await this.cipherService.get(cipher.id, activeUserId); - const decCipher = await updatedCipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(updatedCipher, activeUserId), - ); + const decCipher = await this.cipherService.decrypt(updatedCipher, activeUserId); const res = new CipherResponse(decCipher); return Response.success(res); } catch (e) { diff --git a/apps/cli/src/auth/commands/login.command.ts b/apps/cli/src/auth/commands/login.command.ts index 8a94cc4175a..cd5c8ef9bcd 100644 --- a/apps/cli/src/auth/commands/login.command.ts +++ b/apps/cli/src/auth/commands/login.command.ts @@ -32,7 +32,7 @@ import { UpdateTempPasswordRequest } from "@bitwarden/common/auth/models/request import { ClientType } from "@bitwarden/common/enums"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; import { KeyConnectorService } from "@bitwarden/common/key-management/key-connector/abstractions/key-connector.service"; -import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; +import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; @@ -77,6 +77,7 @@ export class LoginCommand { protected logoutCallback: () => Promise, protected kdfConfigService: KdfConfigService, protected ssoUrlService: SsoUrlService, + protected masterPasswordService: MasterPasswordServiceAbstraction, ) {} async run(email: string, password: string, options: OptionValues) { @@ -105,6 +106,8 @@ export class LoginCommand { return Response.badRequest("client_secret is required."); } } else if (options.sso != null && this.canInteract) { + // If the optional Org SSO Identifier isn't provided, the option value is `true`. + const orgSsoIdentifier = options.sso === true ? null : options.sso; const passwordOptions: any = { type: "password", length: 64, @@ -118,7 +121,7 @@ export class LoginCommand { const codeVerifierHash = await this.cryptoFunctionService.hash(ssoCodeVerifier, "sha256"); const codeChallenge = Utils.fromBufferToUrlB64(codeVerifierHash); try { - const ssoParams = await this.openSsoPrompt(codeChallenge, state); + const ssoParams = await this.openSsoPrompt(codeChallenge, state, orgSsoIdentifier); ssoCode = ssoParams.ssoCode; orgIdentifier = ssoParams.orgIdentifier; } catch { @@ -220,7 +223,7 @@ export class LoginCommand { ); } else { response = await this.loginStrategyService.logIn( - new PasswordLoginCredentials(email, password, null, twoFactor), + new PasswordLoginCredentials(email, password, twoFactor), ); } if (response.requiresEncryptionKeyMigration) { @@ -228,17 +231,6 @@ export class LoginCommand { "Encryption key migration required. Please login through the web vault to update your encryption key.", ); } - if (response.captchaSiteKey) { - const credentials = new PasswordLoginCredentials(email, password); - const handledResponse = await this.handleCaptchaRequired(twoFactor, credentials); - - // Error Response - if (handledResponse instanceof Response) { - return handledResponse; - } else { - response = handledResponse; - } - } if (response.requiresTwoFactor) { const twoFactorProviders = await this.twoFactorService.getSupportedProviders(null); if (twoFactorProviders.length === 0) { @@ -310,7 +302,6 @@ export class LoginCommand { response = await this.loginStrategyService.logInTwoFactor( new TokenTwoFactorRequest(selectedProvider.type, twoFactorToken), - null, ); } @@ -334,18 +325,6 @@ export class LoginCommand { response = await this.loginStrategyService.logInNewDeviceVerification(newDeviceToken); } - if (response.captchaSiteKey) { - const twoFactorRequest = new TokenTwoFactorRequest(selectedProvider.type, twoFactorToken); - const handledResponse = await this.handleCaptchaRequired(twoFactorRequest); - - // Error Response - if (handledResponse instanceof Response) { - return handledResponse; - } else { - response = handledResponse; - } - } - if (response.requiresTwoFactor) { return Response.error("Login failed."); } @@ -361,14 +340,14 @@ export class LoginCommand { await this.syncService.fullSync(true); // Handle updating passwords if NOT using an API Key for authentication - if ( - response.forcePasswordReset != ForceSetPasswordReason.None && - clientId == null && - clientSecret == null - ) { - if (response.forcePasswordReset === ForceSetPasswordReason.AdminForcePasswordReset) { + if (clientId == null && clientSecret == null) { + const forceSetPasswordReason = await firstValueFrom( + this.masterPasswordService.forceSetPasswordReason$(response.userId), + ); + + if (forceSetPasswordReason === ForceSetPasswordReason.AdminForcePasswordReset) { return await this.updateTempPassword(response.userId); - } else if (response.forcePasswordReset === ForceSetPasswordReason.WeakMasterPassword) { + } else if (forceSetPasswordReason === ForceSetPasswordReason.WeakMasterPassword) { return await this.updateWeakPassword(response.userId, password); } } @@ -627,48 +606,6 @@ export class LoginCommand { return { newPasswordHash, newUserKey: newUserKey, hint: masterPasswordHint }; } - private async handleCaptchaRequired( - twoFactorRequest: TokenTwoFactorRequest, - credentials: PasswordLoginCredentials = null, - ): Promise { - const badCaptcha = Response.badRequest( - "Your authentication request has been flagged and will require user interaction to proceed.\n" + - "Please use your API key to validate this request and ensure BW_CLIENTSECRET is correct, if set.\n" + - "(https://bitwarden.com/help/cli-auth-challenges)", - ); - - try { - const captchaClientSecret = await this.apiClientSecret(true); - if (Utils.isNullOrWhitespace(captchaClientSecret)) { - return badCaptcha; - } - - let authResultResponse: AuthResult = null; - if (credentials != null) { - credentials.captchaToken = captchaClientSecret; - credentials.twoFactor = twoFactorRequest; - authResultResponse = await this.loginStrategyService.logIn(credentials); - } else { - authResultResponse = await this.loginStrategyService.logInTwoFactor( - twoFactorRequest, - captchaClientSecret, - ); - } - - return authResultResponse; - } catch (e) { - if ( - e instanceof ErrorResponse || - (e.constructor.name === ErrorResponse.name && - (e as ErrorResponse).message.includes("Captcha is invalid")) - ) { - return badCaptcha; - } else { - return Response.error(e); - } - } - } - private async apiClientId(): Promise { let clientId: string = null; @@ -729,6 +666,7 @@ export class LoginCommand { private async openSsoPrompt( codeChallenge: string, state: string, + orgSsoIdentifier: string, ): Promise<{ ssoCode: string; orgIdentifier: string }> { const env = await firstValueFrom(this.environmentService.environment$); @@ -777,6 +715,8 @@ export class LoginCommand { this.ssoRedirectUri, state, codeChallenge, + null, + orgSsoIdentifier, ); this.platformUtilsService.launchUri(webAppSsoUrl); }); diff --git a/apps/cli/src/commands/edit.command.ts b/apps/cli/src/commands/edit.command.ts index 2d4a854135d..4dcf805661d 100644 --- a/apps/cli/src/commands/edit.command.ts +++ b/apps/cli/src/commands/edit.command.ts @@ -90,9 +90,7 @@ export class EditCommand { return Response.notFound(); } - let cipherView = await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + let cipherView = await this.cipherService.decrypt(cipher, activeUserId); if (cipherView.isDeleted) { return Response.badRequest("You may not edit a deleted item. Use the restore command first."); } @@ -100,9 +98,7 @@ export class EditCommand { const encCipher = await this.cipherService.encrypt(cipherView, activeUserId); try { const updatedCipher = await this.cipherService.updateWithServer(encCipher); - const decCipher = await updatedCipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(updatedCipher, activeUserId), - ); + const decCipher = await this.cipherService.decrypt(updatedCipher, activeUserId); const res = new CipherResponse(decCipher); return Response.success(res); } catch (e) { @@ -132,12 +128,7 @@ export class EditCommand { cipher, activeUserId, ); - const decCipher = await updatedCipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption( - updatedCipher, - await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)), - ), - ); + const decCipher = await this.cipherService.decrypt(updatedCipher, activeUserId); const res = new CipherResponse(decCipher); return Response.success(res); } catch (e) { diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 1bdbd051585..c3ba6044f8a 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -116,9 +116,7 @@ export class GetCommand extends DownloadCommand { if (Utils.isGuid(id)) { const cipher = await this.cipherService.get(id, activeUserId); if (cipher != null) { - decCipher = await cipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(cipher, activeUserId), - ); + decCipher = await this.cipherService.decrypt(cipher, activeUserId); } } else if (id.trim() !== "") { let ciphers = await this.cipherService.getAllDecrypted(activeUserId); diff --git a/apps/cli/src/platform/services/node-api.service.ts b/apps/cli/src/platform/services/node-api.service.ts index 8c7629fb3d9..d695272364b 100644 --- a/apps/cli/src/platform/services/node-api.service.ts +++ b/apps/cli/src/platform/services/node-api.service.ts @@ -39,6 +39,7 @@ export class NodeApiService extends ApiService { logService, logoutCallback, vaultTimeoutSettingsService, + { createRequest: (url, request) => new Request(url, request) }, customUserAgent, ); } diff --git a/apps/cli/src/program.ts b/apps/cli/src/program.ts index c6b79c7dff2..d85f1b366e6 100644 --- a/apps/cli/src/program.ts +++ b/apps/cli/src/program.ts @@ -118,7 +118,10 @@ export class Program extends BaseProgram { .description("Log into a user account.") .option("--method ", "Two-step login method.") .option("--code ", "Two-step login code.") - .option("--sso", "Log in with Single-Sign On.") + .option( + "--sso [identifier]", + "Log in with Single-Sign On with optional organization identifier.", + ) .option("--apikey", "Log in with an Api Key.") .option("--passwordenv ", "Environment variable storing your password") .option( @@ -172,6 +175,7 @@ export class Program extends BaseProgram { async () => await this.serviceContainer.logout(), this.serviceContainer.kdfConfigService, this.serviceContainer.ssoUrlService, + this.serviceContainer.masterPasswordService, ); const response = await command.run(email, password, options); this.processResponse(response, true); diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index fe2f506f229..cdf6c4bbfda 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -139,12 +139,14 @@ import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.s import { SendStateProvider } from "@bitwarden/common/tools/send/services/send-state.provider"; import { SendService } from "@bitwarden/common/tools/send/services/send.service"; import { UserId } from "@bitwarden/common/types/guid"; +import { CipherEncryptionService } from "@bitwarden/common/vault/abstractions/cipher-encryption.service"; import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherAuthorizationService, DefaultCipherAuthorizationService, } from "@bitwarden/common/vault/services/cipher-authorization.service"; import { CipherService } from "@bitwarden/common/vault/services/cipher.service"; +import { DefaultCipherEncryptionService } from "@bitwarden/common/vault/services/default-cipher-encryption.service"; import { CipherFileUploadService } from "@bitwarden/common/vault/services/file-upload/cipher-file-upload.service"; import { FolderApiService } from "@bitwarden/common/vault/services/folder/folder-api.service"; import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service"; @@ -284,6 +286,7 @@ export class ServiceContainer { ssoUrlService: SsoUrlService; masterPasswordApiService: MasterPasswordApiServiceAbstraction; bulkEncryptService: FallbackBulkEncryptService; + cipherEncryptionService: CipherEncryptionService; constructor() { let p = null; @@ -679,6 +682,11 @@ export class ServiceContainer { this.accountService, ); + this.cipherEncryptionService = new DefaultCipherEncryptionService( + this.sdkService, + this.logService, + ); + this.cipherService = new CipherService( this.keyService, this.domainSettingsService, @@ -694,6 +702,7 @@ export class ServiceContainer { this.stateProvider, this.accountService, this.logService, + this.cipherEncryptionService, ); this.folderService = new FolderService( diff --git a/apps/cli/src/vault/create.command.ts b/apps/cli/src/vault/create.command.ts index 713471356c9..b1536e23748 100644 --- a/apps/cli/src/vault/create.command.ts +++ b/apps/cli/src/vault/create.command.ts @@ -93,9 +93,7 @@ export class CreateCommand { const cipher = await this.cipherService.encrypt(CipherExport.toView(req), activeUserId); try { const newCipher = await this.cipherService.createWithServer(cipher); - const decCipher = await newCipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(newCipher, activeUserId), - ); + const decCipher = await this.cipherService.decrypt(newCipher, activeUserId); const res = new CipherResponse(decCipher); return Response.success(res); } catch (e) { @@ -162,9 +160,7 @@ export class CreateCommand { new Uint8Array(fileBuf).buffer, activeUserId, ); - const decCipher = await updatedCipher.decrypt( - await this.cipherService.getKeyForCipherKeyDecryption(updatedCipher, activeUserId), - ); + const decCipher = await this.cipherService.decrypt(updatedCipher, activeUserId); return Response.success(new CipherResponse(decCipher)); } catch (e) { return Response.error(e); @@ -227,7 +223,7 @@ export class CreateCommand { (u) => new SelectionReadOnlyRequest(u.id, u.readOnly, u.hidePasswords, u.manage), ); const request = new CollectionRequest(); - request.name = (await this.encryptService.encrypt(req.name, orgKey)).encryptedString; + request.name = (await this.encryptService.encryptString(req.name, orgKey)).encryptedString; request.externalId = req.externalId; request.groups = groups; request.users = users; diff --git a/apps/cli/src/vault/delete.command.ts b/apps/cli/src/vault/delete.command.ts index 9e648cd9bb0..d1b0b093cf8 100644 --- a/apps/cli/src/vault/delete.command.ts +++ b/apps/cli/src/vault/delete.command.ts @@ -106,6 +106,7 @@ export class DeleteCommand { cipher.id, attachments[0].id, activeUserId, + false, ); return Response.success(); } catch (e) { diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index c225dc49f73..a08764fc9d8 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -120,9 +120,9 @@ checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arboard" -version = "3.4.1" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" dependencies = [ "clipboard-win", "log", @@ -130,6 +130,7 @@ dependencies = [ "objc2-app-kit", "objc2-foundation", "parking_lot", + "percent-encoding", "wl-clipboard-rs", "x11rb", ] @@ -147,6 +148,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ashpd" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.1", + "serde", + "serde_repr", + "tokio", + "url", + "zbus 5.6.0", +] + [[package]] name = "askama" version = "0.12.1" @@ -266,17 +284,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - [[package]] name = "async-process" version = "2.3.0" @@ -459,15 +466,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2", -] - [[package]] name = "blocking" version = "1.6.1" @@ -559,12 +557,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -707,25 +699,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -739,7 +712,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -880,17 +853,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive-new" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "desktop_core" version = "0.0.0" @@ -917,7 +879,7 @@ dependencies = [ "oo7", "pin-project", "pkcs8", - "rand", + "rand 0.9.1", "rsa", "russh-cryptovec", "scopeguard", @@ -935,8 +897,9 @@ dependencies = [ "widestring", "windows 0.61.1", "windows-future", - "zbus", + "zbus 4.4.0", "zbus_polkit", + "zeroizing-alloc", ] [[package]] @@ -1019,6 +982,27 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "doctest-file" version = "1.0.0" @@ -1053,12 +1037,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "either" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" - [[package]] name = "embed_plist" version = "1.2.2" @@ -1165,6 +1143,15 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "fs-err" version = "2.11.0" @@ -1407,11 +1394,150 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bdbbd5bc8c5749697ccaa352fa45aff8730cf21c68029c0eef1ffed7c3d6ba2" dependencies = [ "cfg-if", - "nix 0.29.0", + "nix", "widestring", "windows 0.57.0", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "indexmap" version = "2.7.1" @@ -1536,6 +1662,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "lock_api" version = "0.4.12" @@ -1692,18 +1824,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", -] - [[package]] name = "nix" version = "0.29.0" @@ -1712,7 +1832,7 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", "memoffset", ] @@ -1772,7 +1892,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "serde", "smallvec", "zeroize", @@ -1843,60 +1963,49 @@ dependencies = [ "libc", ] -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - [[package]] name = "objc2" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" dependencies = [ - "objc-sys", "objc2-encode", ] [[package]] name = "objc2-app-kit" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ "bitflags", - "block2", - "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags", - "block2", "objc2", + "objc2-core-graphics", "objc2-foundation", ] [[package]] -name = "objc2-core-image" -version = "0.2.2" +name = "objc2-core-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "block2", + "bitflags", + "dispatch2", "objc2", - "objc2-foundation", - "objc2-metal", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] @@ -1907,39 +2016,34 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ "bitflags", - "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +dependencies = [ "libc", - "objc2", + "objc2-core-foundation", ] [[package]] -name = "objc2-metal" -version = "0.2.2" +name = "objc2-io-surface" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" dependencies = [ "bitflags", - "block2", "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags", - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", + "objc2-core-foundation", ] [[package]] @@ -1959,35 +2063,33 @@ checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "oo7" -version = "0.3.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc6ce4692fbfd044ce22ca07dcab1a30fa12432ca2aa5b1294eca50d3332a24" +checksum = "6cb23d3ec3527d65a83be1c1795cb883c52cfa57147d42acc797127df56fc489" dependencies = [ "aes", - "async-fs", - "async-io", - "async-lock", - "async-net", - "blocking", + "ashpd", "cbc", "cipher", "digest", "endi", - "futures-lite", "futures-util", + "getrandom 0.3.1", "hkdf", "hmac", "md-5", "num", "num-bigint-dig", "pbkdf2", - "rand", + "rand 0.9.1", "serde", "sha2", "subtle", - "zbus", + "tokio", + "zbus 5.6.0", + "zbus_macros 5.6.0", "zeroize", - "zvariant", + "zvariant 5.5.1", ] [[package]] @@ -2069,7 +2171,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2098,6 +2200,12 @@ dependencies = [ "base64ct", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "petgraph" version = "0.6.5" @@ -2185,7 +2293,7 @@ checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "pkcs5", - "rand_core", + "rand_core 0.6.4", "spki", ] @@ -2297,8 +2405,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -2308,7 +2426,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -2321,23 +2449,12 @@ dependencies = [ ] [[package]] -name = "rayon" -version = "1.10.0" +name = "rand_core" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "getrandom 0.3.1", ] [[package]] @@ -2408,7 +2525,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sha2", "signature", "spki", @@ -2637,7 +2754,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -2741,7 +2858,7 @@ dependencies = [ "bcrypt-pbkdf", "ed25519-dalek", "num-bigint-dig", - "rand_core", + "rand_core 0.6.4", "rsa", "sha2", "signature", @@ -2751,6 +2868,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2781,17 +2904,28 @@ dependencies = [ ] [[package]] -name = "sysinfo" -version = "0.33.1" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sysinfo" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b897c8ea620e181c7955369a31be5f48d9a9121cb59fd33ecef9ff2a34323422" dependencies = [ - "core-foundation-sys", "libc", "memchr", "ntapi", - "rayon", - "windows 0.57.0", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.61.1", ] [[package]] @@ -2900,18 +3034,30 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.43.1" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", + "tracing", "windows-sys 0.52.0", ] @@ -3201,6 +3347,30 @@ dependencies = [ "subtle", ] +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3255,9 +3425,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.31.2" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ "bitflags", "wayland-backend", @@ -3267,9 +3437,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.2.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ "bitflags", "wayland-backend", @@ -3309,9 +3479,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -3398,7 +3568,7 @@ dependencies = [ "windows-interface 0.59.1", "windows-link", "windows-result 0.3.2", - "windows-strings 0.4.0", + "windows-strings", ] [[package]] @@ -3473,13 +3643,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "ad1da3e436dc7653dfdf3da67332e22bff09bb0e28b0239e1624499c7830842e" dependencies = [ + "windows-link", "windows-result 0.3.2", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] @@ -3500,15 +3670,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-strings" version = "0.4.0" @@ -3560,29 +3721,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3595,12 +3740,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3613,12 +3752,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3631,24 +3764,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3661,12 +3782,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_plugin_authenticator" version = "0.0.0" @@ -3688,12 +3803,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3706,12 +3815,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3724,12 +3827,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.7.3" @@ -3750,15 +3847,14 @@ dependencies = [ [[package]] name = "wl-clipboard-rs" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" +checksum = "2a083daad7e8a4b8805ad73947ccadabe62afe37ce0e9787a56ff373d34762c7" dependencies = [ - "derive-new", "libc", "log", - "nix 0.28.0", "os_pipe", + "rustix", "tempfile", "thiserror 1.0.69", "tree_magic_mini", @@ -3768,6 +3864,18 @@ dependencies = [ "wayland-protocols-wlr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x11rb" version = "0.13.1" @@ -3795,6 +3903,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zbus" version = "4.4.0" @@ -3817,9 +3949,9 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.29.0", + "nix", "ordered-stream", - "rand", + "rand 0.8.5", "serde", "serde_repr", "sha1", @@ -3828,9 +3960,37 @@ dependencies = [ "uds_windows", "windows-sys 0.52.0", "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus" +version = "5.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2522b82023923eecb0b366da727ec883ace092e7887b61d3da5139f26b44da58" +dependencies = [ + "async-broadcast", + "async-recursion", + "async-trait", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tokio", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow", + "zbus_macros 5.6.0", + "zbus_names 4.2.0", + "zvariant 5.5.1", ] [[package]] @@ -3843,7 +4003,22 @@ dependencies = [ "proc-macro2", "quote", "syn", - "zvariant_utils", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d2e12843c75108c00c618c2e8ef9675b50b6ec095b36dc965f2e5aed463c15" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names 4.2.0", + "zvariant 5.5.1", + "zvariant_utils 3.2.0", ] [[package]] @@ -3854,7 +4029,19 @@ checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", - "zvariant", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow", + "zvariant 5.5.1", ] [[package]] @@ -3867,7 +4054,7 @@ dependencies = [ "serde", "serde_repr", "static_assertions", - "zbus", + "zbus 4.4.0", ] [[package]] @@ -3891,6 +4078,27 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -3911,6 +4119,34 @@ dependencies = [ "syn", ] +[[package]] +name = "zeroizing-alloc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebff5e6b81c1c7dca2d0bd333b2006da48cb37dbcae5a8da888f31fcb3c19934" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zvariant" version = "4.2.0" @@ -3921,7 +4157,22 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "zvariant_derive", + "zvariant_derive 4.2.0", +] + +[[package]] +name = "zvariant" +version = "5.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557e89d54880377a507c94cd5452f20e35d14325faf9d2958ebeadce0966c1b2" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow", + "zvariant_derive 5.5.1", + "zvariant_utils 3.2.0", ] [[package]] @@ -3934,7 +4185,20 @@ dependencies = [ "proc-macro2", "quote", "syn", - "zvariant_utils", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757779842a0d242061d24c28be589ce392e45350dfb9186dfd7a042a2e19870c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils 3.2.0", ] [[package]] @@ -3947,3 +4211,17 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zvariant_utils" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn", + "winnow", +] diff --git a/apps/desktop/desktop_native/Cargo.toml b/apps/desktop/desktop_native/Cargo.toml index d9e61124864..e22b584bb65 100644 --- a/apps/desktop/desktop_native/Cargo.toml +++ b/apps/desktop/desktop_native/Cargo.toml @@ -11,7 +11,7 @@ publish = false [workspace.dependencies] aes = "=0.8.4" anyhow = "=1.0.94" -arboard = { version = "=3.4.1", default-features = false } +arboard = { version = "=3.5.0", default-features = false } argon2 = "=0.5.3" base64 = "=0.22.1" bindgen = "0.71.1" @@ -33,11 +33,11 @@ log = "=0.4.25" napi = "=2.16.15" napi-build = "=2.1.4" napi-derive = "=2.16.13" -oo7 = "=0.3.3" +oo7 = "=0.4.3" oslog = "=0.2.0" pin-project = "=1.1.10" pkcs8 = "=0.10.2" -rand = "=0.8.5" +rand = "=0.9.1" rsa = "=0.9.8" russh-cryptovec = "=0.7.3" scopeguard = "=1.2.0" @@ -49,17 +49,18 @@ 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.1" +sysinfo = "0.35.0" +thiserror = "=2.0.12" +tokio = "=1.45.0" tokio-stream = "=0.1.15" tokio-util = "=0.7.13" typenum = "=1.18.0" uniffi = "=0.28.3" -widestring = "=1.1.0" +widestring = "=1.2.0" windows = "=0.61.1" windows-core = "=0.61.0" windows-future = "=0.2.0" -windows-registry = "=0.4.0" +windows-registry = "=0.5.1" zbus = "=4.4.0" zbus_polkit = "=4.0.0" +zeroizing-alloc = "=0.1.0" diff --git a/apps/desktop/desktop_native/core/Cargo.toml b/apps/desktop/desktop_native/core/Cargo.toml index a8a8e0a2a44..b71081aaa1f 100644 --- a/apps/desktop/desktop_native/core/Cargo.toml +++ b/apps/desktop/desktop_native/core/Cargo.toml @@ -55,6 +55,7 @@ rsa = { workspace = true } ed25519 = { workspace = true, features = ["pkcs8"] } bytes = { workspace = true } sysinfo = { workspace = true, features = ["windows"] } +zeroizing-alloc = { workspace = true } [target.'cfg(windows)'.dependencies] widestring = { workspace = true, optional = true } diff --git a/apps/desktop/desktop_native/core/src/biometric/unix.rs b/apps/desktop/desktop_native/core/src/biometric/unix.rs index e57b77515e3..60392adc9d7 100644 --- a/apps/desktop/desktop_native/core/src/biometric/unix.rs +++ b/apps/desktop/desktop_native/core/src/biometric/unix.rs @@ -104,6 +104,6 @@ impl super::BiometricTrait for Biometric { fn random_challenge() -> [u8; 16] { let mut challenge = [0u8; 16]; - rand::thread_rng().fill_bytes(&mut challenge); + rand::rng().fill_bytes(&mut challenge); challenge } diff --git a/apps/desktop/desktop_native/core/src/biometric/windows.rs b/apps/desktop/desktop_native/core/src/biometric/windows.rs index b9fea345c16..4c2e2c8ae25 100644 --- a/apps/desktop/desktop_native/core/src/biometric/windows.rs +++ b/apps/desktop/desktop_native/core/src/biometric/windows.rs @@ -174,7 +174,7 @@ impl super::BiometricTrait for Biometric { fn random_challenge() -> [u8; 16] { let mut challenge = [0u8; 16]; - rand::thread_rng().fill_bytes(&mut challenge); + rand::rng().fill_bytes(&mut challenge); challenge } diff --git a/apps/desktop/desktop_native/core/src/lib.rs b/apps/desktop/desktop_native/core/src/lib.rs index 4a6686cc1f5..0a16ee65be3 100644 --- a/apps/desktop/desktop_native/core/src/lib.rs +++ b/apps/desktop/desktop_native/core/src/lib.rs @@ -8,3 +8,8 @@ pub mod password; pub mod powermonitor; pub mod process_isolation; pub mod ssh_agent; + +use zeroizing_alloc::ZeroAlloc; + +#[global_allocator] +static ALLOC: ZeroAlloc = ZeroAlloc(std::alloc::System); diff --git a/apps/desktop/electron-builder.json b/apps/desktop/electron-builder.json index d51d9412d80..1e96198d4ad 100644 --- a/apps/desktop/electron-builder.json +++ b/apps/desktop/electron-builder.json @@ -243,7 +243,7 @@ }, "snap": { "summary": "Bitwarden is a secure and free password manager for all of your devices.", - "description": "**Installation**\nBitwarden requires access to the `password-manager-service`. Please enable it through permissions or by running `sudo snap connect bitwarden:password-manager-service` after installation. See https://btwrdn.com/install-snap for details.", + "description": "Password Manager\n**Installation**\nBitwarden requires access to the `password-manager-service`. Please enable it through permissions or by running `sudo snap connect bitwarden:password-manager-service` after installation. See https://btwrdn.com/install-snap for details.", "autoStart": true, "base": "core22", "confinement": "strict", diff --git a/apps/desktop/native-messaging-test-runner/package-lock.json b/apps/desktop/native-messaging-test-runner/package-lock.json index d506e109e94..8b39fd9805e 100644 --- a/apps/desktop/native-messaging-test-runner/package-lock.json +++ b/apps/desktop/native-messaging-test-runner/package-lock.json @@ -17,7 +17,7 @@ "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "22.14.1", + "@types/node": "22.15.3", "typescript": "5.4.2" } }, @@ -101,9 +101,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" diff --git a/apps/desktop/native-messaging-test-runner/package.json b/apps/desktop/native-messaging-test-runner/package.json index f67ab259d3b..ea6b1b3e7a8 100644 --- a/apps/desktop/native-messaging-test-runner/package.json +++ b/apps/desktop/native-messaging-test-runner/package.json @@ -22,7 +22,7 @@ "yargs": "17.7.2" }, "devDependencies": { - "@types/node": "22.14.1", + "@types/node": "22.15.3", "typescript": "5.4.2" }, "_moduleAliases": { diff --git a/apps/desktop/native-messaging-test-runner/src/ipc.service.ts b/apps/desktop/native-messaging-test-runner/src/ipc.service.ts index b02ff1a4225..d8616e9757a 100644 --- a/apps/desktop/native-messaging-test-runner/src/ipc.service.ts +++ b/apps/desktop/native-messaging-test-runner/src/ipc.service.ts @@ -15,6 +15,8 @@ const DEFAULT_MESSAGE_TIMEOUT = 10 * 1000; // 10 seconds export type MessageHandler = (MessageCommon) => void; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum IPCConnectionState { Disconnected = "disconnected", Connecting = "connecting", diff --git a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts index c01d581afe8..c2356f93e28 100644 --- a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts +++ b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts @@ -220,7 +220,7 @@ export default class NativeMessageService { const sharedKey = await this.getSharedKeyForKey(key); - return this.encryptService.encrypt(commandDataString, sharedKey); + return this.encryptService.encryptString(commandDataString, sharedKey); } private async decryptResponsePayload( @@ -228,11 +228,7 @@ export default class NativeMessageService { key: string, ): Promise { const sharedKey = await this.getSharedKeyForKey(key); - const decrypted = await this.encryptService.decryptToUtf8( - payload, - sharedKey, - "native-messaging-session", - ); + const decrypted = await this.encryptService.decryptString(payload, sharedKey); return JSON.parse(decrypted); } diff --git a/apps/desktop/src/app/accounts/settings.component.html b/apps/desktop/src/app/accounts/settings.component.html index bcbd9969f96..e56615c9122 100644 --- a/apps/desktop/src/app/accounts/settings.component.html +++ b/apps/desktop/src/app/accounts/settings.component.html @@ -440,6 +440,22 @@ "enableSshAgentDesc" | i18n }} +
+ + + {{ + "sshAgentPromptBehaviorDesc" | i18n + }} +
diff --git a/apps/desktop/src/vault/app/vault/add-edit-custom-fields.component.ts b/apps/desktop/src/vault/app/vault/add-edit-custom-fields.component.ts index 6992455a8a6..b4be2406c4b 100644 --- a/apps/desktop/src/vault/app/vault/add-edit-custom-fields.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit-custom-fields.component.ts @@ -7,6 +7,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic @Component({ selector: "app-vault-add-edit-custom-fields", templateUrl: "add-edit-custom-fields.component.html", + standalone: false, }) export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent { constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) { 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 7904d7b7f34..8457e72bdc1 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.html +++ b/apps/desktop/src/vault/app/vault/add-edit.component.html @@ -519,7 +519,7 @@ appA11yTitle="{{ 'importSshKeyFromClipboard' | i18n }}" (click)="importSshKeyFromClipboard()" > - + 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 2c8b5a8321a..eb04003a418 100644 --- a/apps/desktop/src/vault/app/vault/add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/add-edit.component.ts @@ -30,6 +30,7 @@ const BroadcasterSubscriptionId = "AddEditComponent"; @Component({ selector: "app-vault-add-edit", templateUrl: "add-edit.component.html", + standalone: false, }) export class AddEditComponent extends BaseAddEditComponent implements OnInit, OnChanges, OnDestroy { @ViewChild("form") diff --git a/apps/desktop/src/vault/app/vault/attachments.component.ts b/apps/desktop/src/vault/app/vault/attachments.component.ts index ea4f49b8431..a116a4d2acb 100644 --- a/apps/desktop/src/vault/app/vault/attachments.component.ts +++ b/apps/desktop/src/vault/app/vault/attachments.component.ts @@ -5,6 +5,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.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 { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; @@ -17,6 +18,7 @@ import { KeyService } from "@bitwarden/key-management"; @Component({ selector: "app-vault-attachments", templateUrl: "attachments.component.html", + standalone: false, }) export class AttachmentsComponent extends BaseAttachmentsComponent { constructor( @@ -33,6 +35,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { billingAccountProfileStateService: BillingAccountProfileStateService, accountService: AccountService, toastService: ToastService, + configService: ConfigService, ) { super( cipherService, @@ -49,6 +52,7 @@ export class AttachmentsComponent extends BaseAttachmentsComponent { billingAccountProfileStateService, accountService, toastService, + configService, ); } } diff --git a/apps/desktop/src/vault/app/vault/collections.component.ts b/apps/desktop/src/vault/app/vault/collections.component.ts index e7684c3c07a..46455d04cd2 100644 --- a/apps/desktop/src/vault/app/vault/collections.component.ts +++ b/apps/desktop/src/vault/app/vault/collections.component.ts @@ -13,6 +13,7 @@ import { ToastService } from "@bitwarden/components"; @Component({ selector: "app-vault-collections", templateUrl: "collections.component.html", + standalone: false, }) export class CollectionsComponent extends BaseCollectionsComponent { constructor( diff --git a/apps/desktop/src/vault/app/vault/credential-generator-dialog.component.ts b/apps/desktop/src/vault/app/vault/credential-generator-dialog.component.ts index 2858d7330e5..204615443ba 100644 --- a/apps/desktop/src/vault/app/vault/credential-generator-dialog.component.ts +++ b/apps/desktop/src/vault/app/vault/credential-generator-dialog.component.ts @@ -31,6 +31,8 @@ export interface CredentialGeneratorDialogResult { generatedValue?: string; } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum CredentialGeneratorDialogAction { Selected = "selected", Canceled = "canceled", diff --git a/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts b/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts index cdb879693c0..cecd5cd671c 100644 --- a/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts +++ b/apps/desktop/src/vault/app/vault/folder-add-edit.component.ts @@ -14,6 +14,7 @@ import { KeyService } from "@bitwarden/key-management"; @Component({ selector: "app-folder-add-edit", templateUrl: "folder-add-edit.component.html", + standalone: false, }) export class FolderAddEditComponent extends BaseFolderAddEditComponent { constructor( diff --git a/apps/desktop/src/vault/app/vault/item-footer.component.html b/apps/desktop/src/vault/app/vault/item-footer.component.html index 6915555c08b..5a067da372e 100644 --- a/apps/desktop/src/vault/app/vault/item-footer.component.html +++ b/apps/desktop/src/vault/app/vault/item-footer.component.html @@ -2,14 +2,13 @@ @@ -115,7 +114,7 @@ id="newItemDropdown" appA11yTitle="{{ 'new' | i18n }}" > - + {{ "new" | i18n }} @@ -140,7 +139,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 7efb79ebdb6..4c129e325c5 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 @@ -117,7 +117,7 @@ export class VaultHeaderComponent { } get icon() { - return this.filter.collectionId !== undefined ? "bwi-collection" : ""; + return this.filter.collectionId !== undefined ? "bwi-collection-shared" : ""; } protected get showBreadcrumbs() { 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 22da9a566f4..e8782ca0f2d 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 @@ -153,6 +153,3 @@ - - - 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 edf93e3c953..96c00faceb2 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 @@ -132,6 +132,8 @@ import { VaultHeaderComponent } from "./vault-header/vault-header.component"; const BroadcasterSubscriptionId = "OrgVaultComponent"; const SearchTextDebounceInterval = 200; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums enum AddAccessStatusType { All = 0, AddAccess = 1, @@ -853,6 +855,7 @@ export class VaultComponent implements OnInit, OnDestroy { const dialogRef = AttachmentsV2Component.open(this.dialogService, { cipherId: cipher.id as CipherId, organizationId: cipher.organizationId as OrganizationId, + admin: true, }); const result = await firstValueFrom(dialogRef.closed); diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts b/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts index fc168f842dc..cd14b73a156 100644 --- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts +++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.ts @@ -9,6 +9,7 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv @Component({ selector: "app-org-info", templateUrl: "organization-information.component.html", + standalone: false, }) export class OrganizationInformationComponent implements OnInit { @Input() nameOnly = false; diff --git a/apps/web/src/app/admin-console/organizations/guards/is-enterprise-org.guard.spec.ts b/apps/web/src/app/admin-console/organizations/guards/is-enterprise-org.guard.spec.ts index f5fce0e5e42..bc4a942301a 100644 --- a/apps/web/src/app/admin-console/organizations/guards/is-enterprise-org.guard.spec.ts +++ b/apps/web/src/app/admin-console/organizations/guards/is-enterprise-org.guard.spec.ts @@ -21,16 +21,19 @@ import { isEnterpriseOrgGuard } from "./is-enterprise-org.guard"; @Component({ template: "

This is the home screen!

", + standalone: false, }) export class HomescreenComponent {} @Component({ template: "

This component can only be accessed by a enterprise organization!

", + standalone: false, }) export class IsEnterpriseOrganizationComponent {} @Component({ template: "

This is the organization upgrade screen!

", + standalone: false, }) export class OrganizationUpgradeScreenComponent {} diff --git a/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.spec.ts b/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.spec.ts index 8efed8cefa2..ab5fd79321a 100644 --- a/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.spec.ts +++ b/apps/web/src/app/admin-console/organizations/guards/is-paid-org.guard.spec.ts @@ -20,16 +20,19 @@ import { isPaidOrgGuard } from "./is-paid-org.guard"; @Component({ template: "

This is the home screen!

", + standalone: false, }) export class HomescreenComponent {} @Component({ template: "

This component can only be accessed by a paid organization!

", + standalone: false, }) export class PaidOrganizationOnlyComponent {} @Component({ template: "

This is the organization upgrade screen!

", + standalone: false, }) export class OrganizationUpgradeScreenComponent {} diff --git a/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.spec.ts b/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.spec.ts index fa348867a86..9dc084484f3 100644 --- a/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.spec.ts +++ b/apps/web/src/app/admin-console/organizations/guards/org-redirect.guard.spec.ts @@ -19,16 +19,19 @@ import { organizationRedirectGuard } from "./org-redirect.guard"; @Component({ template: "

This is the home screen!

", + standalone: false, }) export class HomescreenComponent {} @Component({ template: "

This is the admin console!

", + standalone: false, }) export class AdminConsoleComponent {} @Component({ template: "

This is a subroute of the admin console!

", + standalone: false, }) export class AdminConsoleSubrouteComponent {} diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html index fec790dabcb..24be9a16090 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.html @@ -6,6 +6,7 @@ icon="bwi-filter" *ngIf="organization.useRiskInsights" [text]="'accessIntelligence' | i18n" + route="access-intelligence" > diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts index ec67a17bce9..9c3912b98fd 100644 --- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts +++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts @@ -55,7 +55,6 @@ export class OrganizationLayoutComponent implements OnInit { protected readonly logo = AdminConsoleLogo; protected orgFilter = (org: Organization) => canAccessOrgAdmin(org); - protected domainVerificationNavigationTextKey: string; protected integrationPageEnabled$: Observable; @@ -146,12 +145,6 @@ export class OrganizationLayoutComponent implements OnInit { this.integrationPageEnabled$ = this.organization$.pipe(map((org) => org.canAccessIntegrations)); - this.domainVerificationNavigationTextKey = (await this.configService.getFeatureFlag( - FeatureFlag.AccountDeprovisioning, - )) - ? "claimedDomains" - : "domainVerification"; - this.canShowPoliciesTab$ = this.organization$.pipe( switchMap((organization) => this.organizationBillingService diff --git a/apps/web/src/app/admin-console/organizations/manage/events.component.ts b/apps/web/src/app/admin-console/organizations/manage/events.component.ts index 737a38ee2ab..3daa6c17d07 100644 --- a/apps/web/src/app/admin-console/organizations/manage/events.component.ts +++ b/apps/web/src/app/admin-console/organizations/manage/events.component.ts @@ -48,6 +48,7 @@ const EVENT_SYSTEM_USER_TO_TRANSLATION: Record = { @Component({ selector: "app-org-events", templateUrl: "events.component.html", + standalone: false, }) export class EventsComponent extends BaseEventsComponent implements OnInit, OnDestroy { exportFileName = "org-events"; diff --git a/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.ts b/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.ts index 2a5af32ecc2..53a6a3cf196 100644 --- a/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.ts +++ b/apps/web/src/app/admin-console/organizations/manage/group-add-edit.component.ts @@ -58,6 +58,8 @@ import { AddEditGroupDetail } from "./../core/views/add-edit-group-detail"; /** * Indices for the available tabs in the dialog */ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum GroupAddEditTabType { Info = 0, Members = 1, @@ -82,6 +84,8 @@ export interface GroupAddEditDialogParams { initialTab?: GroupAddEditTabType; } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum GroupAddEditDialogResultType { Saved = "saved", Canceled = "canceled", @@ -106,6 +110,7 @@ export const openGroupAddEditDialog = ( @Component({ selector: "app-group-add-edit", templateUrl: "group-add-edit.component.html", + standalone: false, }) export class GroupAddEditComponent implements OnInit, OnDestroy { private organization$ = this.accountService.activeAccount$.pipe( 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 82ad2c36b8c..4518513ba7d 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 @@ -22,7 +22,7 @@

{{ "noGroupsInList" | i18n }}

- + @@ -93,7 +93,8 @@ {{ "members" | i18n }} - - - - diff --git a/apps/web/src/app/admin-console/organizations/manage/organization-trust.component.ts b/apps/web/src/app/admin-console/organizations/manage/organization-trust.component.ts deleted file mode 100644 index 3f013c9fc74..00000000000 --- a/apps/web/src/app/admin-console/organizations/manage/organization-trust.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; -import { Component, OnInit, Inject } from "@angular/core"; -import { FormBuilder } from "@angular/forms"; - -import { OrganizationManagementPreferencesService } from "@bitwarden/common/admin-console/abstractions/organization-management-preferences/organization-management-preferences.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { DialogService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -type OrganizationTrustDialogData = { - /** display name of the organization */ - name: string; - /** identifies the organization */ - orgId: string; - /** org public key */ - publicKey: Uint8Array; -}; -@Component({ - selector: "organization-trust", - templateUrl: "organization-trust.component.html", -}) -export class OrganizationTrustComponent implements OnInit { - loading = true; - fingerprint: string = ""; - confirmForm = this.formBuilder.group({}); - - constructor( - @Inject(DIALOG_DATA) protected params: OrganizationTrustDialogData, - private formBuilder: FormBuilder, - private keyService: KeyService, - protected organizationManagementPreferencesService: OrganizationManagementPreferencesService, - private logService: LogService, - private dialogRef: DialogRef, - ) {} - - async ngOnInit() { - try { - const fingerprint = await this.keyService.getFingerprint( - this.params.orgId, - this.params.publicKey, - ); - if (fingerprint != null) { - this.fingerprint = fingerprint.join("-"); - } - } catch (e) { - this.logService.error(e); - } - this.loading = false; - } - - submit = async () => { - if (this.loading) { - return; - } - - this.dialogRef.close(true); - }; - - /** - * Strongly typed helper to open a OrganizationTrustComponent - * @param dialogService Instance of the dialog service that will be used to open the dialog - * @param data The data to pass to the dialog - */ - static open(dialogService: DialogService, data: OrganizationTrustDialogData) { - return dialogService.open(OrganizationTrustComponent, { - data, - }); - } -} diff --git a/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts b/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts index b5068ba55a6..03b77cfaa71 100644 --- a/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts +++ b/apps/web/src/app/admin-console/organizations/manage/user-confirm.component.ts @@ -18,6 +18,7 @@ export type UserConfirmDialogData = { @Component({ selector: "app-user-confirm", templateUrl: "user-confirm.component.html", + standalone: false, }) export class UserConfirmComponent implements OnInit { name: string; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts index c19984f980d..4ec50799ae0 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-confirm-dialog.component.ts @@ -33,6 +33,7 @@ type BulkConfirmDialogParams = { @Component({ templateUrl: "bulk-confirm-dialog.component.html", + standalone: false, }) export class BulkConfirmDialogComponent extends BaseBulkConfirmComponent { organizationId: string; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts index 27caea3ebd3..8fb60e85b08 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-delete-dialog.component.ts @@ -1,12 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Component, Inject } from "@angular/core"; -import { firstValueFrom } from "rxjs"; import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; import { OrganizationUserStatusType } from "@bitwarden/common/admin-console/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 { DIALOG_DATA, DialogConfig, DialogService } from "@bitwarden/components"; @@ -21,6 +18,7 @@ type BulkDeleteDialogParams = { @Component({ templateUrl: "bulk-delete-dialog.component.html", + standalone: false, }) export class BulkDeleteDialogComponent { organizationId: string; @@ -35,7 +33,6 @@ export class BulkDeleteDialogComponent { @Inject(DIALOG_DATA) protected dialogParams: BulkDeleteDialogParams, protected i18nService: I18nService, private organizationUserApiService: OrganizationUserApiService, - private configService: ConfigService, private deleteManagedMemberWarningService: DeleteManagedMemberWarningService, ) { this.organizationId = dialogParams.organizationId; @@ -43,11 +40,7 @@ export class BulkDeleteDialogComponent { } async submit() { - if ( - await firstValueFrom(this.configService.getFeatureFlag$(FeatureFlag.AccountDeprovisioning)) - ) { - await this.deleteManagedMemberWarningService.acknowledgeWarning(this.organizationId); - } + await this.deleteManagedMemberWarningService.acknowledgeWarning(this.organizationId); try { this.loading = true; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-enable-sm-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-enable-sm-dialog.component.ts index e01809789f3..9132625c587 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-enable-sm-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-enable-sm-dialog.component.ts @@ -22,6 +22,7 @@ export type BulkEnableSecretsManagerDialogData = { @Component({ templateUrl: `bulk-enable-sm-dialog.component.html`, + standalone: false, }) export class BulkEnableSecretsManagerDialogComponent implements OnInit { protected dataSource = new TableDataSource(); diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-remove-dialog.component.ts b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-remove-dialog.component.ts index 00711e355cb..5bbc6f093f0 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-remove-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-remove-dialog.component.ts @@ -21,6 +21,7 @@ type BulkRemoveDialogParams = { @Component({ templateUrl: "bulk-remove-dialog.component.html", + standalone: false, }) export class BulkRemoveDialogComponent extends BaseBulkRemoveComponent { organizationId: string; diff --git a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html index 4925c210039..1b711b366d6 100644 --- a/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html +++ b/apps/web/src/app/admin-console/organizations/members/components/bulk/bulk-restore-revoke.component.html @@ -1,12 +1,6 @@ - + - {{ bulkMemberTitle }} - - {{ bulkTitle }} - + {{ bulkTitle }}
@@ -20,7 +14,7 @@ {{ "nonCompliantMembersError" | i18n }} @@ -50,7 +44,7 @@ - {{ (accountDeprovisioning.enabled ? "member" : "user") | i18n }} + {{ "member" | i18n }} {{ "details" | i18n }} @@ -82,7 +76,7 @@ - {{ (accountDeprovisioning.enabled ? "member" : "user") | i18n }} + {{ "member" | i18n }} {{ "status" | i18n }} @@ -113,7 +107,7 @@ [bitAction]="submit" buttonType="primary" > - {{ accountDeprovisioning.enabled ? bulkMemberTitle : bulkTitle }} + {{ bulkTitle }} - - - diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts index 57892442c16..b376c48b39a 100644 --- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; +import { Component, OnDestroy, OnInit } from "@angular/core"; import { FormBuilder, Validators } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { @@ -41,13 +41,9 @@ import { DeleteOrganizationDialogResult, openDeleteOrganizationDialog } from "./ @Component({ selector: "app-org-account", templateUrl: "account.component.html", + standalone: false, }) export class AccountComponent implements OnInit, OnDestroy { - @ViewChild("apiKeyTemplate", { read: ViewContainerRef, static: true }) - apiKeyModalRef: ViewContainerRef; - @ViewChild("rotateApiKeyTemplate", { read: ViewContainerRef, static: true }) - rotateApiKeyModalRef: ViewContainerRef; - selfHosted = false; canEditSubscription = true; loading = true; diff --git a/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts index c23dcf2c8f2..e942eecbd37 100644 --- a/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/settings/components/delete-organization-dialog.component.ts @@ -71,6 +71,8 @@ export interface DeleteOrganizationDialogParams { requestType: "InvalidFamiliesForEnterprise" | "RegularDelete"; } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum DeleteOrganizationDialogResult { Deleted = "deleted", Canceled = "canceled", 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 014b8e3a3ef..020a16dd932 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 @@ -29,6 +29,7 @@ import { TwoFactorVerifyComponent } from "../../../auth/settings/two-factor/two- @Component({ selector: "app-two-factor-setup", templateUrl: "../../../auth/settings/two-factor/two-factor-setup.component.html", + standalone: false, }) export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent implements OnInit { tabbedHeader = false; @@ -118,7 +119,7 @@ export class TwoFactorSetupComponent extends BaseTwoFactorSetupComponent impleme return this.apiService.getTwoFactorOrganizationProviders(this.organizationId); } - protected filterProvider(type: TwoFactorProviderType) { + protected filterProvider(type: TwoFactorProviderType): boolean { return type !== TwoFactorProviderType.OrganizationDuo; } } diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts index bb25cd90875..366df34b2b8 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.component.ts @@ -26,6 +26,8 @@ import { Permission, } from "./access-selector.models"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum PermissionMode { /** * No permission controls or column present. No permission values are emitted. @@ -53,6 +55,7 @@ export enum PermissionMode { multi: true, }, ], + standalone: false, }) export class AccessSelectorComponent implements ControlValueAccessor, OnInit, OnDestroy { private destroy$ = new Subject(); @@ -310,7 +313,7 @@ export class AccessSelectorComponent implements ControlValueAccessor, OnInit, On protected itemIcon(item: AccessItemView) { switch (item.type) { case AccessItemType.Collection: - return "bwi-collection"; + return "bwi-collection-shared"; case AccessItemType.Group: return "bwi-users"; case AccessItemType.Member: diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts index 8702c0f7a6c..884483d32b0 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/access-selector.models.ts @@ -15,6 +15,8 @@ import { GroupView } from "../../../core"; /** * Permission options that replace/correspond with manage, readOnly, and hidePassword server fields. */ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum CollectionPermission { View = "view", ViewExceptPass = "viewExceptPass", @@ -23,6 +25,8 @@ export enum CollectionPermission { Manage = "manage", } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum AccessItemType { Collection, Group, diff --git a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/user-type.pipe.ts b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/user-type.pipe.ts index 3d43c63efb0..673d09ec0f0 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/access-selector/user-type.pipe.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/access-selector/user-type.pipe.ts @@ -5,6 +5,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic @Pipe({ name: "userType", + standalone: false, }) export class UserTypePipe implements PipeTransform { constructor(private i18nService: I18nService) {} diff --git a/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html index 984d21bf251..12d7a920a2d 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html +++ b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.html @@ -48,14 +48,14 @@ diff --git a/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.ts b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.ts index 37d0ebbd195..9806f99d90e 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/collection-dialog/collection-dialog.component.ts @@ -65,6 +65,8 @@ import { } from "../access-selector/access-selector.models"; import { AccessSelectorModule } from "../access-selector/access-selector.module"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum CollectionDialogTabType { Info = 0, Access = 1, @@ -76,6 +78,8 @@ export enum CollectionDialogTabType { * @readonly * @enum {string} */ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums enum ButtonType { /** Displayed when the user has reached the maximum number of collections allowed for the organization. */ Upgrade = "upgrade", @@ -103,6 +107,8 @@ export interface CollectionDialogResult { collection: CollectionResponse | CollectionView; } +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum CollectionDialogAction { Saved = "saved", Canceled = "canceled", @@ -607,5 +613,5 @@ export function openCollectionDialog( dialogService: DialogService, config: DialogConfig>, ) { - return dialogService.open(CollectionDialogComponent, config); + return dialogService.open(CollectionDialogComponent, config); } diff --git a/apps/web/src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.ts b/apps/web/src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.ts index 7ceaed28f80..4df6defe8ad 100644 --- a/apps/web/src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.ts +++ b/apps/web/src/app/admin-console/organizations/sponsorships/accept-family-sponsorship.component.ts @@ -19,6 +19,7 @@ import { BaseAcceptComponent } from "../../../common/base.accept.component"; @Component({ selector: "app-accept-family-sponsorship", templateUrl: "accept-family-sponsorship.component.html", + standalone: false, }) export class AcceptFamilySponsorshipComponent extends BaseAcceptComponent { protected logo = BitwardenLogo; diff --git a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts index 15e7af1cd2d..b63171ae6e6 100644 --- a/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts +++ b/apps/web/src/app/admin-console/organizations/users/enroll-master-password-reset.component.ts @@ -18,8 +18,8 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService, ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; +import { AccountRecoveryTrustComponent } from "@bitwarden/key-management-ui"; -import { OrganizationTrustComponent } from "../manage/organization-trust.component"; import { OrganizationUserResetPasswordService } from "../members/services/organization-user-reset-password/organization-user-reset-password.service"; interface EnrollMasterPasswordResetData { @@ -62,7 +62,7 @@ export class EnrollMasterPasswordReset { await userVerificationService.buildRequest( secret, ); - const dialogRef = OrganizationTrustComponent.open(dialogService, { + const dialogRef = AccountRecoveryTrustComponent.open(dialogService, { name: data.organization.name, orgId: data.organization.id, publicKey, diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 55e2595e0f7..cac0487d05d 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -3,25 +3,20 @@ 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 { Router } from "@angular/router"; 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"; import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -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 { 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"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; @@ -29,11 +24,9 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { NotificationsService } from "@bitwarden/common/platform/notifications"; import { StateEventRunnerService } from "@bitwarden/common/platform/state"; -import { SyncService } from "@bitwarden/common/platform/sync"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { DialogService, ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { KeyService, BiometricStateService } from "@bitwarden/key-management"; import { PolicyListService } from "./admin-console/core/policy-list.service"; @@ -56,6 +49,7 @@ const IdleTimeout = 60000 * 10; // 10 minutes @Component({ selector: "app-root", templateUrl: "app.component.html", + standalone: false, }) export class AppComponent implements OnDestroy, OnInit { private lastActivity: Date = null; @@ -69,8 +63,6 @@ export class AppComponent implements OnDestroy, OnInit { @Inject(DOCUMENT) private document: Document, private broadcasterService: BroadcasterService, private folderService: InternalFolderService, - private syncService: SyncService, - private passwordGenerationService: PasswordGenerationServiceAbstraction, private cipherService: CipherService, private authService: AuthService, private router: Router, @@ -85,17 +77,13 @@ export class AppComponent implements OnDestroy, OnInit { private notificationsService: NotificationsService, private stateService: StateService, private eventUploadService: EventUploadService, - private policyService: InternalPolicyService, protected policyListService: PolicyListService, - private keyConnectorService: KeyConnectorService, protected configService: ConfigService, private dialogService: DialogService, private biometricStateService: BiometricStateService, private stateEventRunnerService: StateEventRunnerService, private organizationService: InternalOrganizationServiceAbstraction, private accountService: AccountService, - private apiService: ApiService, - private appIdService: AppIdService, private processReloadService: ProcessReloadServiceAbstraction, private deviceTrustToastService: DeviceTrustToastService, ) { @@ -247,15 +235,6 @@ export class AppComponent implements OnDestroy, OnInit { }); }); - this.router.events.pipe(takeUntil(this.destroy$)).subscribe((event) => { - if (event instanceof NavigationEnd) { - const modals = Array.from(document.querySelectorAll(".modal")); - for (const modal of modals) { - (jq(modal) as any).modal("hide"); - } - } - }); - this.policyListService.addPolicies([ new TwoFactorAuthenticationPolicy(), new MasterPasswordPolicy(), diff --git a/apps/web/src/app/auth/core/enums/webauthn-login-credential-prf-status.enum.ts b/apps/web/src/app/auth/core/enums/webauthn-login-credential-prf-status.enum.ts index 7dc8217fde5..3073917e57b 100644 --- a/apps/web/src/app/auth/core/enums/webauthn-login-credential-prf-status.enum.ts +++ b/apps/web/src/app/auth/core/enums/webauthn-login-credential-prf-status.enum.ts @@ -1,3 +1,5 @@ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum WebauthnLoginCredentialPrfStatus { Enabled = 0, Supported = 1, diff --git a/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts b/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts index aa02e28b3b3..edce551342e 100644 --- a/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts +++ b/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts @@ -172,7 +172,6 @@ describe("WebRegistrationFinishService", () => { let userKey: UserKey; let userKeyEncString: EncString; let userKeyPair: [string, EncString]; - let capchaBypassToken: string; let orgInvite: OrganizationInvite; let orgSponsoredFreeFamilyPlanToken: string; @@ -198,7 +197,6 @@ describe("WebRegistrationFinishService", () => { userKeyEncString = new EncString("userKeyEncrypted"); userKeyPair = ["publicKey", new EncString("privateKey")]; - capchaBypassToken = "capchaBypassToken"; orgInvite = new OrganizationInvite(); orgInvite.organizationUserId = "organizationUserId"; @@ -219,19 +217,13 @@ describe("WebRegistrationFinishService", () => { ); }); - it("registers the user and returns a captcha bypass token when given valid email verification input", async () => { + it("registers the user when given valid email verification input", async () => { keyService.makeUserKey.mockResolvedValue([userKey, userKeyEncString]); keyService.makeKeyPair.mockResolvedValue(userKeyPair); - accountApiService.registerFinish.mockResolvedValue(capchaBypassToken); + accountApiService.registerFinish.mockResolvedValue(); acceptOrgInviteService.getOrganizationInvite.mockResolvedValue(null); - const result = await service.finishRegistration( - email, - passwordInputResult, - emailVerificationToken, - ); - - expect(result).toEqual(capchaBypassToken); + await service.finishRegistration(email, passwordInputResult, emailVerificationToken); expect(keyService.makeUserKey).toHaveBeenCalledWith(masterKey); expect(keyService.makeKeyPair).toHaveBeenCalledWith(userKey); @@ -261,15 +253,13 @@ describe("WebRegistrationFinishService", () => { ); }); - it("it registers the user and returns a captcha bypass token when given an org invite", async () => { + it("it registers the user when given an org invite", async () => { keyService.makeUserKey.mockResolvedValue([userKey, userKeyEncString]); keyService.makeKeyPair.mockResolvedValue(userKeyPair); - accountApiService.registerFinish.mockResolvedValue(capchaBypassToken); + accountApiService.registerFinish.mockResolvedValue(); acceptOrgInviteService.getOrganizationInvite.mockResolvedValue(orgInvite); - const result = await service.finishRegistration(email, passwordInputResult); - - expect(result).toEqual(capchaBypassToken); + await service.finishRegistration(email, passwordInputResult); expect(keyService.makeUserKey).toHaveBeenCalledWith(masterKey); expect(keyService.makeKeyPair).toHaveBeenCalledWith(userKey); @@ -299,21 +289,19 @@ describe("WebRegistrationFinishService", () => { ); }); - it("registers the user and returns a captcha bypass token when given an org sponsored free family plan token", async () => { + it("registers the user when given an org sponsored free family plan token", async () => { keyService.makeUserKey.mockResolvedValue([userKey, userKeyEncString]); keyService.makeKeyPair.mockResolvedValue(userKeyPair); - accountApiService.registerFinish.mockResolvedValue(capchaBypassToken); + accountApiService.registerFinish.mockResolvedValue(); acceptOrgInviteService.getOrganizationInvite.mockResolvedValue(null); - const result = await service.finishRegistration( + await service.finishRegistration( email, passwordInputResult, undefined, orgSponsoredFreeFamilyPlanToken, ); - expect(result).toEqual(capchaBypassToken); - expect(keyService.makeUserKey).toHaveBeenCalledWith(masterKey); expect(keyService.makeKeyPair).toHaveBeenCalledWith(userKey); expect(accountApiService.registerFinish).toHaveBeenCalledWith( @@ -342,13 +330,13 @@ describe("WebRegistrationFinishService", () => { ); }); - it("registers the user and returns a captcha bypass token when given an emergency access invite token", async () => { + it("registers the user when given an emergency access invite token", async () => { keyService.makeUserKey.mockResolvedValue([userKey, userKeyEncString]); keyService.makeKeyPair.mockResolvedValue(userKeyPair); - accountApiService.registerFinish.mockResolvedValue(capchaBypassToken); + accountApiService.registerFinish.mockResolvedValue(); acceptOrgInviteService.getOrganizationInvite.mockResolvedValue(null); - const result = await service.finishRegistration( + await service.finishRegistration( email, passwordInputResult, undefined, @@ -357,8 +345,6 @@ describe("WebRegistrationFinishService", () => { emergencyAccessId, ); - expect(result).toEqual(capchaBypassToken); - expect(keyService.makeUserKey).toHaveBeenCalledWith(masterKey); expect(keyService.makeKeyPair).toHaveBeenCalledWith(userKey); expect(accountApiService.registerFinish).toHaveBeenCalledWith( @@ -387,13 +373,13 @@ describe("WebRegistrationFinishService", () => { ); }); - it("registers the user and returns a captcha bypass token when given a provider invite token", async () => { + it("registers the user when given a provider invite token", async () => { keyService.makeUserKey.mockResolvedValue([userKey, userKeyEncString]); keyService.makeKeyPair.mockResolvedValue(userKeyPair); - accountApiService.registerFinish.mockResolvedValue(capchaBypassToken); + accountApiService.registerFinish.mockResolvedValue(); acceptOrgInviteService.getOrganizationInvite.mockResolvedValue(null); - const result = await service.finishRegistration( + await service.finishRegistration( email, passwordInputResult, undefined, @@ -404,8 +390,6 @@ describe("WebRegistrationFinishService", () => { providerUserId, ); - expect(result).toEqual(capchaBypassToken); - expect(keyService.makeUserKey).toHaveBeenCalledWith(masterKey); expect(keyService.makeKeyPair).toHaveBeenCalledWith(userKey); expect(accountApiService.registerFinish).toHaveBeenCalledWith( diff --git a/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts b/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts index ef78e09e6b9..0a150b26ae2 100644 --- a/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts +++ b/apps/web/src/app/auth/core/services/rotateable-key-set.service.ts @@ -58,7 +58,7 @@ export class RotateableKeySetService { throw new Error("failed to rotate key set: newUserKey is required"); } - const publicKey = await this.encryptService.decryptToBytes( + const publicKey = await this.encryptService.unwrapEncapsulationKey( keySet.encryptedPublicKey, oldUserKey, ); diff --git a/apps/web/src/app/auth/emergency-access/enums/emergency-access-status-type.ts b/apps/web/src/app/auth/emergency-access/enums/emergency-access-status-type.ts index 94400f34e6e..16aa2546101 100644 --- a/apps/web/src/app/auth/emergency-access/enums/emergency-access-status-type.ts +++ b/apps/web/src/app/auth/emergency-access/enums/emergency-access-status-type.ts @@ -1,3 +1,5 @@ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum EmergencyAccessStatusType { Invited = 0, Accepted = 1, diff --git a/apps/web/src/app/auth/emergency-access/enums/emergency-access-type.ts b/apps/web/src/app/auth/emergency-access/enums/emergency-access-type.ts index 61a366c433e..ecb0c5a3d07 100644 --- a/apps/web/src/app/auth/emergency-access/enums/emergency-access-type.ts +++ b/apps/web/src/app/auth/emergency-access/enums/emergency-access-type.ts @@ -1,3 +1,5 @@ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum EmergencyAccessType { View = 0, Takeover = 1, diff --git a/apps/web/src/app/auth/guards/deep-link.guard.spec.ts b/apps/web/src/app/auth/guards/deep-link.guard.spec.ts index f9ced556e47..82ed004cf54 100644 --- a/apps/web/src/app/auth/guards/deep-link.guard.spec.ts +++ b/apps/web/src/app/auth/guards/deep-link.guard.spec.ts @@ -13,16 +13,19 @@ import { deepLinkGuard } from "./deep-link.guard"; @Component({ template: "", + standalone: false, }) export class GuardedRouteTestComponent {} @Component({ template: "", + standalone: false, }) export class LockTestComponent {} @Component({ template: "", + standalone: false, }) export class RedirectTestComponent {} diff --git a/apps/web/src/app/auth/login/login-via-webauthn/login-via-webauthn.component.ts b/apps/web/src/app/auth/login/login-via-webauthn/login-via-webauthn.component.ts index 8f3a5ca3c37..d4a381159ab 100644 --- a/apps/web/src/app/auth/login/login-via-webauthn/login-via-webauthn.component.ts +++ b/apps/web/src/app/auth/login/login-via-webauthn/login-via-webauthn.component.ts @@ -7,6 +7,7 @@ import { CreatePasskeyIcon } from "@bitwarden/angular/auth/icons/create-passkey. @Component({ selector: "app-login-via-webauthn", templateUrl: "login-via-webauthn.component.html", + standalone: false, }) export class LoginViaWebAuthnComponent extends BaseLoginViaWebAuthnComponent { protected readonly Icons = { CreatePasskeyIcon, CreatePasskeyFailedIcon }; diff --git a/apps/web/src/app/auth/organization-invite/accept-organization.component.ts b/apps/web/src/app/auth/organization-invite/accept-organization.component.ts index 197b4031998..838a3029711 100644 --- a/apps/web/src/app/auth/organization-invite/accept-organization.component.ts +++ b/apps/web/src/app/auth/organization-invite/accept-organization.component.ts @@ -14,6 +14,7 @@ import { OrganizationInvite } from "./organization-invite"; @Component({ templateUrl: "accept-organization.component.html", + standalone: false, }) export class AcceptOrganizationComponent extends BaseAcceptComponent { orgName$ = this.acceptOrganizationInviteService.orgName$; diff --git a/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts b/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts index 0a30aa16478..253328b0c04 100644 --- a/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts +++ b/apps/web/src/app/auth/organization-invite/accept-organization.service.spec.ts @@ -95,7 +95,7 @@ describe("AcceptOrganizationInviteService", () => { encryptService.wrapDecapsulationKey.mockResolvedValue({ encryptedString: "string", } as EncString); - encryptService.encrypt.mockResolvedValue({ encryptedString: "string" } as EncString); + encryptService.encryptString.mockResolvedValue({ encryptedString: "string" } as EncString); const invite = createOrgInvite({ initOrganization: true }); const result = await sut.validateAndAcceptInvite(invite); diff --git a/apps/web/src/app/auth/organization-invite/accept-organization.service.ts b/apps/web/src/app/auth/organization-invite/accept-organization.service.ts index b6a7719c548..c68b174166d 100644 --- a/apps/web/src/app/auth/organization-invite/accept-organization.service.ts +++ b/apps/web/src/app/auth/organization-invite/accept-organization.service.ts @@ -145,7 +145,7 @@ export class AcceptOrganizationInviteService { const [encryptedOrgKey, orgKey] = await this.keyService.makeOrgKey(); const [orgPublicKey, encryptedOrgPrivateKey] = await this.keyService.makeKeyPair(orgKey); - const collection = await this.encryptService.encrypt( + const collection = await this.encryptService.encryptString( this.i18nService.t("defaultCollection"), orgKey, ); diff --git a/apps/web/src/app/auth/recover-delete.component.ts b/apps/web/src/app/auth/recover-delete.component.ts index 6b45421911d..7381d526879 100644 --- a/apps/web/src/app/auth/recover-delete.component.ts +++ b/apps/web/src/app/auth/recover-delete.component.ts @@ -13,6 +13,7 @@ import { ToastService } from "@bitwarden/components"; @Component({ selector: "app-recover-delete", templateUrl: "recover-delete.component.html", + standalone: false, }) export class RecoverDeleteComponent { protected recoverDeleteForm = new FormGroup({ 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 bf6d47e09e5..5977d994521 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 @@ -16,7 +16,6 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { ToastService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; import { I18nPipe } from "@bitwarden/ui-common"; -import { NewDeviceVerificationNoticeService } from "@bitwarden/vault"; import { RecoverTwoFactorComponent } from "./recover-two-factor.component"; @@ -35,7 +34,6 @@ describe("RecoverTwoFactorComponent", () => { let mockConfigService: MockProxy; let mockLoginSuccessHandlerService: MockProxy; let mockLogService: MockProxy; - let mockNewDeviceVerificationNoticeService: MockProxy; beforeEach(() => { mockRouter = mock(); @@ -48,7 +46,6 @@ describe("RecoverTwoFactorComponent", () => { mockConfigService = mock(); mockLoginSuccessHandlerService = mock(); mockLogService = mock(); - mockNewDeviceVerificationNoticeService = mock(); TestBed.configureTestingModule({ declarations: [RecoverTwoFactorComponent], @@ -63,10 +60,6 @@ describe("RecoverTwoFactorComponent", () => { { provide: ConfigService, useValue: mockConfigService }, { provide: LoginSuccessHandlerService, useValue: mockLoginSuccessHandlerService }, { provide: LogService, useValue: mockLogService }, - { - provide: NewDeviceVerificationNoticeService, - useValue: mockNewDeviceVerificationNoticeService, - }, ], imports: [I18nPipe], // FIXME(PM-18598): Replace unknownElements and unknownProperties with actual imports @@ -102,9 +95,6 @@ describe("RecoverTwoFactorComponent", () => { title: "", message: mockI18nService.t("youHaveBeenLoggedIn"), }); - expect( - mockNewDeviceVerificationNoticeService.updateNewDeviceVerificationSkipNoticeState, - ).toHaveBeenCalledWith(authResult.userId, true); expect(mockRouter.navigate).toHaveBeenCalledWith(["/settings/security/two-factor"]); }); 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 35aa1aab7c1..a69da0a66bf 100644 --- a/apps/web/src/app/auth/recover-two-factor.component.ts +++ b/apps/web/src/app/auth/recover-two-factor.component.ts @@ -12,11 +12,11 @@ import { TokenTwoFactorRequest } from "@bitwarden/common/auth/models/request/ide import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { ToastService } from "@bitwarden/components"; -import { NewDeviceVerificationNoticeService } from "@bitwarden/vault"; @Component({ selector: "app-recover-two-factor", templateUrl: "recover-two-factor.component.html", + standalone: false, }) export class RecoverTwoFactorComponent implements OnInit { protected formGroup = new FormGroup({ @@ -37,7 +37,6 @@ export class RecoverTwoFactorComponent implements OnInit { private toastService: ToastService, private loginSuccessHandlerService: LoginSuccessHandlerService, private logService: LogService, - private newDeviceVerificationNoticeService: NewDeviceVerificationNoticeService, ) {} async ngOnInit() { @@ -82,12 +81,7 @@ export class RecoverTwoFactorComponent implements OnInit { remember: false, }; - const credentials = new PasswordLoginCredentials( - email, - this.masterPassword, - "", - twoFactorRequest, - ); + const credentials = new PasswordLoginCredentials(email, this.masterPassword, twoFactorRequest); try { const authResult = await this.loginStrategyService.logIn(credentials); @@ -104,13 +98,6 @@ export class RecoverTwoFactorComponent implements OnInit { await this.loginSuccessHandlerService.run(authResult.userId); - // Before routing, set the state to skip the new device notification. This is a temporary - // fix and will be cleaned up in PM-18485. - await this.newDeviceVerificationNoticeService.updateNewDeviceVerificationSkipNoticeState( - authResult.userId, - true, - ); - await this.router.navigate(["/settings/security/two-factor"]); } catch (error) { // If login errors, redirect to login page per product. Don't show error diff --git a/apps/web/src/app/auth/set-password.component.ts b/apps/web/src/app/auth/set-password.component.ts index ccd329dd640..e297426f2c1 100644 --- a/apps/web/src/app/auth/set-password.component.ts +++ b/apps/web/src/app/auth/set-password.component.ts @@ -11,6 +11,7 @@ import { AcceptOrganizationInviteService } from "./organization-invite/accept-or @Component({ selector: "app-set-password", templateUrl: "set-password.component.html", + standalone: false, }) export class SetPasswordComponent extends BaseSetPasswordComponent { routerService = inject(RouterService); diff --git a/apps/web/src/app/auth/settings/account/account.component.html b/apps/web/src/app/auth/settings/account/account.component.html index c5edc021614..74fa02f5f93 100644 --- a/apps/web/src/app/auth/settings/account/account.component.html +++ b/apps/web/src/app/auth/settings/account/account.component.html @@ -51,7 +51,4 @@ {{ "deleteAccount" | i18n }} - - - diff --git a/apps/web/src/app/auth/settings/account/account.component.ts b/apps/web/src/app/auth/settings/account/account.component.ts index 37bf535062f..cfc01f17674 100644 --- a/apps/web/src/app/auth/settings/account/account.component.ts +++ b/apps/web/src/app/auth/settings/account/account.component.ts @@ -1,20 +1,10 @@ import { Component, OnInit, OnDestroy } from "@angular/core"; -import { - combineLatest, - firstValueFrom, - from, - lastValueFrom, - map, - Observable, - Subject, - takeUntil, -} from "rxjs"; +import { firstValueFrom, from, lastValueFrom, map, Observable, Subject, takeUntil } from "rxjs"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { DialogService } from "@bitwarden/components"; @@ -27,6 +17,7 @@ import { SetAccountVerifyDevicesDialogComponent } from "./set-account-verify-dev @Component({ selector: "app-account", templateUrl: "account.component.html", + standalone: false, }) export class AccountComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); @@ -47,10 +38,6 @@ export class AccountComponent implements OnInit, OnDestroy { async ngOnInit() { const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - const isAccountDeprovisioningEnabled$ = this.configService.getFeatureFlag$( - FeatureFlag.AccountDeprovisioning, - ); - const userIsManagedByOrganization$ = this.organizationService .organizations$(userId) .pipe( @@ -61,25 +48,14 @@ export class AccountComponent implements OnInit, OnDestroy { this.showChangeEmail$ = hasMasterPassword$; - this.showPurgeVault$ = combineLatest([ - isAccountDeprovisioningEnabled$, - userIsManagedByOrganization$, - ]).pipe( - map( - ([isAccountDeprovisioningEnabled, userIsManagedByOrganization]) => - !isAccountDeprovisioningEnabled || !userIsManagedByOrganization, - ), + this.showPurgeVault$ = userIsManagedByOrganization$.pipe( + map((userIsManagedByOrganization) => !userIsManagedByOrganization), ); - this.showDeleteAccount$ = combineLatest([ - isAccountDeprovisioningEnabled$, - userIsManagedByOrganization$, - ]).pipe( - map( - ([isAccountDeprovisioningEnabled, userIsManagedByOrganization]) => - !isAccountDeprovisioningEnabled || !userIsManagedByOrganization, - ), + this.showDeleteAccount$ = userIsManagedByOrganization$.pipe( + map((userIsManagedByOrganization) => !userIsManagedByOrganization), ); + this.accountService.accountVerifyNewDeviceLogin$ .pipe(takeUntil(this.destroy$)) .subscribe((verifyDevices) => { diff --git a/apps/web/src/app/auth/settings/account/change-avatar-dialog.component.ts b/apps/web/src/app/auth/settings/account/change-avatar-dialog.component.ts index ba2a34c7143..5d71333c0de 100644 --- a/apps/web/src/app/auth/settings/account/change-avatar-dialog.component.ts +++ b/apps/web/src/app/auth/settings/account/change-avatar-dialog.component.ts @@ -31,6 +31,7 @@ type ChangeAvatarDialogData = { @Component({ templateUrl: "change-avatar-dialog.component.html", encapsulation: ViewEncapsulation.None, + standalone: false, }) export class ChangeAvatarDialogComponent implements OnInit, OnDestroy { profile: ProfileResponse; diff --git a/apps/web/src/app/auth/settings/account/change-email.component.ts b/apps/web/src/app/auth/settings/account/change-email.component.ts index caf7e0933b0..c86c8c2f4f7 100644 --- a/apps/web/src/app/auth/settings/account/change-email.component.ts +++ b/apps/web/src/app/auth/settings/account/change-email.component.ts @@ -17,6 +17,7 @@ import { KdfConfigService, KeyService } from "@bitwarden/key-management"; @Component({ selector: "app-change-email", templateUrl: "change-email.component.html", + standalone: false, }) export class ChangeEmailComponent implements OnInit { tokenSent = false; diff --git a/apps/web/src/app/auth/settings/account/danger-zone.component.ts b/apps/web/src/app/auth/settings/account/danger-zone.component.ts index 1abea314b50..91f22c7d08f 100644 --- a/apps/web/src/app/auth/settings/account/danger-zone.component.ts +++ b/apps/web/src/app/auth/settings/account/danger-zone.component.ts @@ -1,12 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { CommonModule } from "@angular/common"; -import { Component, OnInit } from "@angular/core"; -import { Observable } from "rxjs"; +import { Component } from "@angular/core"; 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 { TypographyModule } from "@bitwarden/components"; /** @@ -18,13 +15,4 @@ import { TypographyModule } from "@bitwarden/components"; standalone: true, imports: [TypographyModule, JslibModule, CommonModule], }) -export class DangerZoneComponent implements OnInit { - constructor(private configService: ConfigService) {} - accountDeprovisioningEnabled$: Observable; - - ngOnInit(): void { - this.accountDeprovisioningEnabled$ = this.configService.getFeatureFlag$( - FeatureFlag.AccountDeprovisioning, - ); - } -} +export class DangerZoneComponent {} diff --git a/apps/web/src/app/auth/settings/account/deauthorize-sessions.component.ts b/apps/web/src/app/auth/settings/account/deauthorize-sessions.component.ts index a7c466d4ffc..da4d2dce9d7 100644 --- a/apps/web/src/app/auth/settings/account/deauthorize-sessions.component.ts +++ b/apps/web/src/app/auth/settings/account/deauthorize-sessions.component.ts @@ -12,6 +12,7 @@ import { DialogService, ToastService } from "@bitwarden/components"; @Component({ selector: "app-deauthorize-sessions", templateUrl: "deauthorize-sessions.component.html", + standalone: false, }) export class DeauthorizeSessionsComponent { deauthForm = this.formBuilder.group({ diff --git a/apps/web/src/app/auth/settings/account/delete-account-dialog.component.ts b/apps/web/src/app/auth/settings/account/delete-account-dialog.component.ts index 07e6052e0a1..8a3575af5ba 100644 --- a/apps/web/src/app/auth/settings/account/delete-account-dialog.component.ts +++ b/apps/web/src/app/auth/settings/account/delete-account-dialog.component.ts @@ -11,6 +11,7 @@ import { DialogRef, DialogService, ToastService } from "@bitwarden/components"; @Component({ templateUrl: "delete-account-dialog.component.html", + standalone: false, }) export class DeleteAccountDialogComponent { deleteForm = this.formBuilder.group({ diff --git a/apps/web/src/app/auth/settings/account/profile.component.ts b/apps/web/src/app/auth/settings/account/profile.component.ts index 72731363806..dc3997f58bb 100644 --- a/apps/web/src/app/auth/settings/account/profile.component.ts +++ b/apps/web/src/app/auth/settings/account/profile.component.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { Component, OnDestroy, OnInit } from "@angular/core"; import { FormControl, FormGroup } from "@angular/forms"; -import { firstValueFrom, map, Observable, of, Subject, switchMap, takeUntil } from "rxjs"; +import { firstValueFrom, map, Observable, Subject, takeUntil } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; @@ -10,9 +10,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UpdateProfileRequest } from "@bitwarden/common/auth/models/request/update-profile.request"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ProfileResponse } from "@bitwarden/common/models/response/profile.response"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { DialogService, ToastService } from "@bitwarden/components"; @@ -21,6 +19,7 @@ import { ChangeAvatarDialogComponent } from "./change-avatar-dialog.component"; @Component({ selector: "app-profile", templateUrl: "profile.component.html", + standalone: false, }) export class ProfileComponent implements OnInit, OnDestroy { loading = true; @@ -40,7 +39,6 @@ export class ProfileComponent implements OnInit, OnDestroy { private accountService: AccountService, private dialogService: DialogService, private toastService: ToastService, - private configService: ConfigService, private organizationService: OrganizationService, ) {} @@ -53,21 +51,12 @@ export class ProfileComponent implements OnInit, OnDestroy { const userId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); - this.managingOrganization$ = this.configService - .getFeatureFlag$(FeatureFlag.AccountDeprovisioning) + this.managingOrganization$ = this.organizationService + .organizations$(userId) .pipe( - switchMap((isAccountDeprovisioningEnabled) => - isAccountDeprovisioningEnabled - ? this.organizationService - .organizations$(userId) - .pipe( - map((organizations) => - organizations.find((o) => o.userIsManagedByOrganization === true), - ), - ) - : of(null), - ), + map((organizations) => organizations.find((o) => o.userIsManagedByOrganization === true)), ); + this.formGroup.get("name").setValue(this.profile.name); this.formGroup.get("email").setValue(this.profile.email); diff --git a/apps/web/src/app/components/selectable-avatar.component.ts b/apps/web/src/app/auth/settings/account/selectable-avatar.component.ts similarity index 98% rename from apps/web/src/app/components/selectable-avatar.component.ts rename to apps/web/src/app/auth/settings/account/selectable-avatar.component.ts index 7a746481563..33c307882c5 100644 --- a/apps/web/src/app/components/selectable-avatar.component.ts +++ b/apps/web/src/app/auth/settings/account/selectable-avatar.component.ts @@ -24,6 +24,7 @@ import { Component, EventEmitter, Input, Output } from "@angular/core"; > `, + standalone: false, }) export class SelectableAvatarComponent { @Input() id: string; 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 ffa5247ad08..f1ba9281f69 100644 --- a/apps/web/src/app/auth/settings/change-password.component.ts +++ b/apps/web/src/app/auth/settings/change-password.component.ts @@ -32,6 +32,7 @@ import { UserKeyRotationService } from "../../key-management/key-rotation/user-k @Component({ selector: "app-change-password", templateUrl: "change-password.component.html", + standalone: false, }) export class ChangePasswordComponent extends BaseChangePasswordComponent diff --git a/apps/web/src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.ts b/apps/web/src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.ts index f3fd19a4e8b..cd7a585f3b1 100644 --- a/apps/web/src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/confirm/emergency-access-confirm.component.ts @@ -8,6 +8,8 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { DialogConfig, DialogRef, DIALOG_DATA, DialogService } from "@bitwarden/components"; import { KeyService } from "@bitwarden/key-management"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum EmergencyAccessConfirmDialogResult { Confirmed = "confirmed", } @@ -24,6 +26,7 @@ type EmergencyAccessConfirmDialogData = { @Component({ selector: "emergency-access-confirm", templateUrl: "emergency-access-confirm.component.html", + standalone: false, }) export class EmergencyAccessConfirmComponent implements OnInit { loading = true; diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.ts b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.ts index cf52969c244..2f3f3a20b04 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access-add-edit.component.ts @@ -26,6 +26,8 @@ export type EmergencyAccessAddEditDialogData = { readOnly: boolean; }; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum EmergencyAccessAddEditDialogResult { Saved = "saved", Canceled = "canceled", @@ -34,6 +36,7 @@ export enum EmergencyAccessAddEditDialogResult { @Component({ selector: "emergency-access-add-edit", templateUrl: "emergency-access-add-edit.component.html", + standalone: false, }) export class EmergencyAccessAddEditComponent implements OnInit { loading = true; diff --git a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html index ab93f0be3bc..8a802e4f6af 100644 --- a/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/emergency-access.component.html @@ -272,7 +272,3 @@ - - - - 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 dc464c18059..23bf0c22bc7 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 @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Component, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { lastValueFrom, Observable, firstValueFrom, switchMap } from "rxjs"; import { UserNamePipe } from "@bitwarden/angular/pipes/user-name.pipe"; @@ -42,14 +42,9 @@ import { @Component({ selector: "emergency-access", templateUrl: "emergency-access.component.html", + standalone: false, }) export class EmergencyAccessComponent implements OnInit { - @ViewChild("addEdit", { read: ViewContainerRef, static: true }) addEditModalRef: ViewContainerRef; - @ViewChild("takeoverTemplate", { read: ViewContainerRef, static: true }) - takeoverModalRef: ViewContainerRef; - @ViewChild("confirmTemplate", { read: ViewContainerRef, static: true }) - confirmModalRef: ViewContainerRef; - loaded = false; canAccessPremium$: Observable; trustedContacts: GranteeEmergencyAccess[]; 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 c80f82ae126..d683545db59 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 @@ -24,6 +24,8 @@ import { KdfType, KdfConfigService, KeyService } from "@bitwarden/key-management import { EmergencyAccessService } from "../../../emergency-access"; +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums export enum EmergencyAccessTakeoverResultType { Done = "done", } @@ -38,6 +40,7 @@ type EmergencyAccessTakeoverDialogData = { @Component({ selector: "emergency-access-takeover", templateUrl: "emergency-access-takeover.component.html", + standalone: false, }) export class EmergencyAccessTakeoverComponent extends ChangePasswordComponent diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html index 87e2643c178..20cc50c4d59 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html @@ -19,7 +19,7 @@ >